Index: src/org/eclipse/ui/views/markers/internal/ActionDeleteCompleted.java =================================================================== RCS file: /home/eclipse/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/ActionDeleteCompleted.java,v retrieving revision 1.9 diff -u -r1.9 ActionDeleteCompleted.java --- src/org/eclipse/ui/views/markers/internal/ActionDeleteCompleted.java 8 Jul 2004 20:06:58 -0000 1.9 +++ src/org/eclipse/ui/views/markers/internal/ActionDeleteCompleted.java 31 Jan 2005 08:56:59 -0000 @@ -99,11 +99,11 @@ for (int i = 0; i < markers.length; i++) { ConcreteMarker marker = markers[i]; - if (marker instanceof TaskMarker) { - TaskMarker taskMarker = (TaskMarker) marker; + if (marker instanceof ConcreteMarker) { + ConcreteMarker ConcreteMarker = (ConcreteMarker) marker; - if (taskMarker.getDone() == 1) { - completed.add(taskMarker.getMarker()); + if (ConcreteMarker.getDone() == 1) { + completed.add(ConcreteMarker.getMarker()); } } } Index: src/org/eclipse/ui/views/markers/internal/BookmarkFilter.java =================================================================== RCS file: /home/eclipse/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/BookmarkFilter.java,v retrieving revision 1.3 diff -u -r1.3 BookmarkFilter.java --- src/org/eclipse/ui/views/markers/internal/BookmarkFilter.java 8 Jul 2004 20:06:58 -0000 1.3 +++ src/org/eclipse/ui/views/markers/internal/BookmarkFilter.java 31 Jan 2005 08:57:00 -0000 @@ -14,7 +14,7 @@ import org.eclipse.core.resources.IMarker; import org.eclipse.jface.dialogs.IDialogSettings; -public class BookmarkFilter extends MarkerFilter { +public class BookmarkFilter extends MarkerFilterCriteria { private final static String TAG_CONTAINS = "contains"; //$NON-NLS-1$ @@ -34,23 +34,6 @@ super(new String[] { IMarker.BOOKMARK }); } - /** - * Returns true iff the given marker is accepted by this filter - */ - public boolean selectMarker(ConcreteMarker marker) { - return !isEnabled() - || (super.selectMarker(marker) && selectByDescription(marker)); - } - - private boolean selectByDescription(ConcreteMarker marker) { - if (description == null || description.equals("")) //$NON-NLS-1$ - return true; - - String markerDescription = marker.getDescription(); - int index = markerDescription.indexOf(description); - return contains ? (index >= 0) : (index < 0); - } - boolean getContains() { return contains; } @@ -73,6 +56,17 @@ description = DEFAULT_DESCRIPTION; } + /* (non-Javadoc) + * @see org.eclipse.ui.views.markers.internal.MarkerFilterCriteria#getMarkerFilter() + */ + protected MarkerFilter getMarkerFilter() { + MarkerFilter result = super.getMarkerFilter(); + + result.setDescription(description, contains); + + return result; + } + public void restoreState(IDialogSettings dialogSettings) { super.restoreState(dialogSettings); IDialogSettings settings = dialogSettings Index: src/org/eclipse/ui/views/markers/internal/BookmarkMarker.java =================================================================== RCS file: src/org/eclipse/ui/views/markers/internal/BookmarkMarker.java diff -N src/org/eclipse/ui/views/markers/internal/BookmarkMarker.java --- src/org/eclipse/ui/views/markers/internal/BookmarkMarker.java 8 Jul 2004 20:06:58 -0000 1.2 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,30 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2003 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.ui.views.markers.internal; - -import org.eclipse.core.resources.IMarker; - -/** - * Represents a marker visible in the Bookmarks view. Currently, this adds no additional - * fields to the ConcreteMarker class. However, if additional fields were added to the - * bookmark view that are not general to all views, these fields would be added to this - * class. - */ -public class BookmarkMarker extends ConcreteMarker { - - /** - * @param toCopy - */ - public BookmarkMarker(IMarker toCopy) { - super(toCopy); - } - -} \ No newline at end of file Index: src/org/eclipse/ui/views/markers/internal/BookmarkView.java =================================================================== RCS file: /home/eclipse/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/BookmarkView.java,v retrieving revision 1.7 diff -u -r1.7 BookmarkView.java --- src/org/eclipse/ui/views/markers/internal/BookmarkView.java 11 Jan 2005 15:49:09 -0000 1.7 +++ src/org/eclipse/ui/views/markers/internal/BookmarkView.java 31 Jan 2005 08:57:00 -0000 @@ -13,7 +13,6 @@ import org.eclipse.core.resources.IMarker; import org.eclipse.core.resources.IResource; -import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.Platform; import org.eclipse.jface.dialogs.ErrorDialog; @@ -75,9 +74,9 @@ Object data = item.getData(); if (data instanceof ConcreteMarker) { - IMarker marker = ((ConcreteMarker) data).getMarker(); try { + IMarker marker = ((ConcreteMarker) data).getMarker(); if (!marker.getAttribute(property).equals(value)) { if (IMarker.MESSAGE.equals(property)) marker.setAttribute(IMarker.MESSAGE, value); @@ -168,10 +167,6 @@ return ROOT_TYPES; } - protected Object getViewerInput() { - return ResourcesPlugin.getWorkspace().getRoot(); - } - protected IField[] getVisibleFields() { return VISIBLE_FIELDS; } @@ -199,14 +194,16 @@ if (dialog.open() == Window.OK) { bookmarkFilter = (BookmarkFilter) dialog.getFilter(); bookmarkFilter.saveState(getDialogSettings()); - refresh(); + setFilter(dialog.getFilter().getFilter()); + setLimit(getFilterCriteria().getMarkerLimit()); +// refresh(); } } /* (non-Javadoc) * @see org.eclipse.ui.views.markers.internal.MarkerView#getFilter() */ - protected MarkerFilter getFilter() { + protected MarkerFilterCriteria getFilterCriteria() { return bookmarkFilter; } Index: src/org/eclipse/ui/views/markers/internal/ConcreteMarker.java =================================================================== RCS file: /home/eclipse/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/ConcreteMarker.java,v retrieving revision 1.5 diff -u -r1.5 ConcreteMarker.java --- src/org/eclipse/ui/views/markers/internal/ConcreteMarker.java 8 Jul 2004 20:06:58 -0000 1.5 +++ src/org/eclipse/ui/views/markers/internal/ConcreteMarker.java 31 Jan 2005 08:57:00 -0000 @@ -42,15 +42,39 @@ private long creationTime; + private int severity; + private String type; - private IMarker marker; + private boolean isBookmark; + private int priority; + + private int done; + + private boolean isTask; + + private boolean isProblem; + + private IResource resource; + + private long id; + public ConcreteMarker(IMarker toCopy) { - marker = toCopy; + this.id = toCopy.getId(); + this.resource = toCopy.getResource(); + this.type = ""; //$NON-NLS-1$ refresh(); } + public int getPriority() { + return priority; + } + + public int getDone() { + return done; + } + /** * Clears any cached information. This frees up some memory, but will slow down * the next comparison operation. It is a good idea to call this on a set of markers @@ -62,20 +86,43 @@ inFolderKey = null; } + public int getSeverity() { + return severity; + } + + public String getType() { + return type; + } + /** * Refresh the properties of this marker from the underlying IMarker instance */ public void refresh() { clearCache(); + creationTime = 0; + isBookmark = false; + isTask = false; + isProblem = false; + + IMarker marker; + try { + marker = getMarker(); + } catch (CoreException e2) { + return; + } + description = Util.getProperty(IMarker.MESSAGE, marker); resourceName = marker.getResource().getName(); inFolder = Util.getContainerName(marker); line = marker.getAttribute(IMarker.LINE_NUMBER, -1); + try { - creationTime = marker.getCreationTime(); + isBookmark = marker.isSubtypeOf(IMarker.BOOKMARK); + isTask = marker.isSubtypeOf(IMarker.TASK); + isProblem = marker.isSubtypeOf(IMarker.PROBLEM); + creationTime = marker.getCreationTime(); } catch (CoreException e) { - creationTime = 0; } try { @@ -83,14 +130,22 @@ } catch (CoreException e1) { type = ""; //$NON-NLS-1$ } + + priority = marker.getAttribute(IMarker.PRIORITY, + IMarker.PRIORITY_NORMAL); + done = -1; + if (marker.getAttribute(IMarker.USER_EDITABLE, true)) { + done = 0; + if (marker.getAttribute(IMarker.DONE, false)) { + done = 1; + } + } + + severity = marker.getAttribute(IMarker.SEVERITY, -1); } public IResource getResource() { - return marker.getResource(); - } - - public String getType() { - return type; + return resource; } public String getDescription() { @@ -137,10 +192,18 @@ return creationTime; } - public IMarker getMarker() { - return marker; + public String toString() { + return description; } - + + public long getId() { + return id; + } + + public IMarker getMarker() throws CoreException { + return resource.getMarker(getId()); + } + public boolean equals(Object object) { if (!(object instanceof ConcreteMarker)) { return false; @@ -148,10 +211,10 @@ ConcreteMarker other = (ConcreteMarker) object; - return other.getMarker().equals(getMarker()); + return other.getId() == getId() && other.getResource().equals(getResource()); } public int hashCode() { - return getMarker().hashCode(); + return ((int)getId()) + getResource().hashCode(); } } Index: src/org/eclipse/ui/views/markers/internal/DialogMarkerFilter.java =================================================================== RCS file: /home/eclipse/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/DialogMarkerFilter.java,v retrieving revision 1.7 diff -u -r1.7 DialogMarkerFilter.java --- src/org/eclipse/ui/views/markers/internal/DialogMarkerFilter.java 6 Oct 2004 02:01:23 -0000 1.7 +++ src/org/eclipse/ui/views/markers/internal/DialogMarkerFilter.java 31 Jan 2005 08:57:00 -0000 @@ -225,7 +225,7 @@ } } - private MarkerFilter filter; + private MarkerFilterCriteria filter; private CheckboxTableViewer typesViewer; @@ -266,7 +266,7 @@ /** * Creates a new filters dialog. */ - DialogMarkerFilter(Shell parentShell, MarkerFilter filter) { + DialogMarkerFilter(Shell parentShell, MarkerFilterCriteria filter) { super(parentShell); this.filter = filter; } @@ -642,21 +642,21 @@ */ protected void resetPressed() { filterEnabledButton - .setSelection(MarkerFilter.DEFAULT_ACTIVATION_STATUS); + .setSelection(MarkerFilterCriteria.DEFAULT_ACTIVATION_STATUS); filterOnMarkerLimit - .setSelection(MarkerFilter.DEFAULT_FILTER_ON_MARKER_LIMIT); - markerLimit.setText(String.valueOf(MarkerFilter.DEFAULT_MARKER_LIMIT)); + .setSelection(MarkerFilterCriteria.DEFAULT_FILTER_ON_MARKER_LIMIT); + markerLimit.setText(String.valueOf(MarkerFilterCriteria.DEFAULT_MARKER_LIMIT)); typesViewer.setAllChecked(true); - int onResource = MarkerFilter.DEFAULT_ON_RESOURCE; + int onResource = MarkerFilterCriteria.DEFAULT_ON_RESOURCE; anyResourceButton - .setSelection(onResource == MarkerFilter.ON_ANY_RESOURCE); + .setSelection(onResource == MarkerFilterCriteria.ON_ANY_RESOURCE); anyResourceInSameProjectButton - .setSelection(onResource == MarkerFilter.ON_ANY_RESOURCE_OF_SAME_PROJECT); + .setSelection(onResource == MarkerFilterCriteria.ON_ANY_RESOURCE_OF_SAME_PROJECT); selectedResourceButton - .setSelection(onResource == MarkerFilter.ON_SELECTED_RESOURCE_ONLY); + .setSelection(onResource == MarkerFilterCriteria.ON_SELECTED_RESOURCE_ONLY); selectedResourceAndChildrenButton - .setSelection(onResource == MarkerFilter.ON_SELECTED_RESOURCE_AND_CHILDREN); - workingSetGroup.setSelection(onResource == MarkerFilter.ON_WORKING_SET); + .setSelection(onResource == MarkerFilterCriteria.ON_SELECTED_RESOURCE_AND_CHILDREN); + workingSetGroup.setSelection(onResource == MarkerFilterCriteria.ON_WORKING_SET); updateEnabledState(); } @@ -705,20 +705,20 @@ filter.setSelectedTypes(getSelectedTypes()); if (selectedResourceButton.getSelection()) - filter.setOnResource(MarkerFilter.ON_SELECTED_RESOURCE_ONLY); + filter.setOnResource(MarkerFilterCriteria.ON_SELECTED_RESOURCE_ONLY); else if (selectedResourceAndChildrenButton.getSelection()) filter - .setOnResource(MarkerFilter.ON_SELECTED_RESOURCE_AND_CHILDREN); + .setOnResource(MarkerFilterCriteria.ON_SELECTED_RESOURCE_AND_CHILDREN); else if (anyResourceInSameProjectButton.getSelection()) - filter.setOnResource(MarkerFilter.ON_ANY_RESOURCE_OF_SAME_PROJECT); + filter.setOnResource(MarkerFilterCriteria.ON_ANY_RESOURCE_OF_SAME_PROJECT); else if (workingSetGroup.getSelection()) - filter.setOnResource(MarkerFilter.ON_WORKING_SET); + filter.setOnResource(MarkerFilterCriteria.ON_WORKING_SET); else - filter.setOnResource(MarkerFilter.ON_ANY_RESOURCE); + filter.setOnResource(MarkerFilterCriteria.ON_ANY_RESOURCE); filter.setWorkingSet(workingSetGroup.getWorkingSet()); - int markerLimit = MarkerFilter.DEFAULT_MARKER_LIMIT; + int markerLimit = MarkerFilterCriteria.DEFAULT_MARKER_LIMIT; try { markerLimit = Integer.parseInt(this.markerLimit.getText()); @@ -738,14 +738,14 @@ setSelectedTypes(filter.getSelectedTypes()); int on = filter.getOnResource(); - anyResourceButton.setSelection(on == MarkerFilter.ON_ANY_RESOURCE); + anyResourceButton.setSelection(on == MarkerFilterCriteria.ON_ANY_RESOURCE); anyResourceInSameProjectButton - .setSelection(on == MarkerFilter.ON_ANY_RESOURCE_OF_SAME_PROJECT); + .setSelection(on == MarkerFilterCriteria.ON_ANY_RESOURCE_OF_SAME_PROJECT); selectedResourceButton - .setSelection(on == MarkerFilter.ON_SELECTED_RESOURCE_ONLY); + .setSelection(on == MarkerFilterCriteria.ON_SELECTED_RESOURCE_ONLY); selectedResourceAndChildrenButton - .setSelection(on == MarkerFilter.ON_SELECTED_RESOURCE_AND_CHILDREN); - workingSetGroup.setSelection(on == MarkerFilter.ON_WORKING_SET); + .setSelection(on == MarkerFilterCriteria.ON_SELECTED_RESOURCE_AND_CHILDREN); + workingSetGroup.setSelection(on == MarkerFilterCriteria.ON_WORKING_SET); workingSetGroup.setWorkingSet(filter.getWorkingSet()); markerLimit.setText("" + filter.getMarkerLimit()); //$NON-NLS-1$ @@ -777,7 +777,7 @@ dirty = true; } - public void setFilter(MarkerFilter newFilter) { + public void setFilter(MarkerFilterCriteria newFilter) { filter = newFilter; updateUIFromFilter(); } @@ -785,7 +785,7 @@ /** * @return the MarkerFilter associated with the dialog. */ - public MarkerFilter getFilter() { + public MarkerFilterCriteria getFilter() { return filter; } Index: src/org/eclipse/ui/views/markers/internal/FieldDone.java =================================================================== RCS file: /home/eclipse/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/FieldDone.java,v retrieving revision 1.4 diff -u -r1.4 FieldDone.java --- src/org/eclipse/ui/views/markers/internal/FieldDone.java 8 Jul 2004 20:06:58 -0000 1.4 +++ src/org/eclipse/ui/views/markers/internal/FieldDone.java 31 Jan 2005 08:57:00 -0000 @@ -75,10 +75,10 @@ * @see org.eclipse.ui.views.markers.internal.IField#getImage(java.lang.Object) */ public Image getImage(Object obj) { - if (obj == null || !(obj instanceof TaskMarker)) { + if (obj == null || !(obj instanceof ConcreteMarker)) { return null; } - TaskMarker marker = (TaskMarker) obj; + ConcreteMarker marker = (ConcreteMarker) obj; int done = marker.getDone(); if (done == -1) { return null; @@ -94,12 +94,12 @@ * @see org.eclipse.ui.views.markers.internal.IField#compare(java.lang.Object, java.lang.Object) */ public int compare(Object obj1, Object obj2) { - if (obj1 == null || obj2 == null || !(obj1 instanceof TaskMarker) - || !(obj2 instanceof TaskMarker)) { + if (obj1 == null || obj2 == null || !(obj1 instanceof ConcreteMarker) + || !(obj2 instanceof ConcreteMarker)) { return 0; } - TaskMarker marker1 = (TaskMarker) obj1; - TaskMarker marker2 = (TaskMarker) obj2; + ConcreteMarker marker1 = (ConcreteMarker) obj1; + ConcreteMarker marker2 = (ConcreteMarker) obj2; int value1 = marker1.getDone(); int value2 = marker2.getDone(); return value1 - value2; Index: src/org/eclipse/ui/views/markers/internal/FieldPriority.java =================================================================== RCS file: /home/eclipse/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/FieldPriority.java,v retrieving revision 1.4 diff -u -r1.4 FieldPriority.java --- src/org/eclipse/ui/views/markers/internal/FieldPriority.java 8 Jul 2004 20:06:58 -0000 1.4 +++ src/org/eclipse/ui/views/markers/internal/FieldPriority.java 31 Jan 2005 08:57:00 -0000 @@ -76,11 +76,11 @@ * @see org.eclipse.ui.views.markers.internal.IField#getImage(java.lang.Object) */ public Image getImage(Object obj) { - if (obj == null || !(obj instanceof TaskMarker)) { + if (obj == null || !(obj instanceof ConcreteMarker)) { return null; } try { - int priority = ((TaskMarker) obj).getPriority(); + int priority = ((ConcreteMarker) obj).getPriority(); if (priority == IMarker.PRIORITY_HIGH) { return ImageFactory.getImage(HIGH_PRIORITY_IMAGE_PATH); } @@ -98,12 +98,12 @@ * @see org.eclipse.ui.views.markers.internal.IField#compare(java.lang.Object, java.lang.Object) */ public int compare(Object obj1, Object obj2) { - if (obj1 == null || obj2 == null || !(obj1 instanceof TaskMarker) - || !(obj2 instanceof TaskMarker)) { + if (obj1 == null || obj2 == null || !(obj1 instanceof ConcreteMarker) + || !(obj2 instanceof ConcreteMarker)) { return 0; } - int priority1 = ((TaskMarker) obj1).getPriority(); - int priority2 = ((TaskMarker) obj2).getPriority(); + int priority1 = ((ConcreteMarker) obj1).getPriority(); + int priority2 = ((ConcreteMarker) obj2).getPriority(); return priority1 - priority2; } Index: src/org/eclipse/ui/views/markers/internal/FieldSeverity.java =================================================================== RCS file: /home/eclipse/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/FieldSeverity.java,v retrieving revision 1.6 diff -u -r1.6 FieldSeverity.java --- src/org/eclipse/ui/views/markers/internal/FieldSeverity.java 8 Jul 2004 20:06:58 -0000 1.6 +++ src/org/eclipse/ui/views/markers/internal/FieldSeverity.java 31 Jan 2005 08:57:00 -0000 @@ -68,7 +68,7 @@ * @see org.eclipse.ui.views.markers.internal.IField#getValue(java.lang.Object) */ public String getValue(Object obj) { - return "" + ((ProblemMarker) obj).getSeverity(); //$NON-NLS-1$ + return "" + ((ConcreteMarker) obj).getSeverity(); //$NON-NLS-1$ } /* @@ -76,11 +76,11 @@ * @see org.eclipse.ui.views.markers.internal.IField#getImage(java.lang.Object) */ public Image getImage(Object obj) { - if (obj == null || !(obj instanceof ProblemMarker)) { + if (obj == null || !(obj instanceof ConcreteMarker)) { return null; } - int severity = ((ProblemMarker) obj).getSeverity(); + int severity = ((ConcreteMarker) obj).getSeverity(); if (severity == IMarker.SEVERITY_ERROR) { return ImageFactory.getImage(IMAGE_ERROR_PATH); } @@ -98,13 +98,13 @@ * @see org.eclipse.ui.views.markers.internal.IField#compare(java.lang.Object, java.lang.Object) */ public int compare(Object obj1, Object obj2) { - if (obj1 == null || obj2 == null || !(obj1 instanceof ProblemMarker) - || !(obj2 instanceof ProblemMarker)) { + if (obj1 == null || obj2 == null || !(obj1 instanceof ConcreteMarker) + || !(obj2 instanceof ConcreteMarker)) { return 0; } - int severity1 = ((ProblemMarker) obj1).getSeverity(); - int severity2 = ((ProblemMarker) obj2).getSeverity(); + int severity1 = ((ConcreteMarker) obj1).getSeverity(); + int severity2 = ((ConcreteMarker) obj2).getSeverity(); return severity1 - severity2; } Index: src/org/eclipse/ui/views/markers/internal/IFilter.java =================================================================== RCS file: src/org/eclipse/ui/views/markers/internal/IFilter.java diff -N src/org/eclipse/ui/views/markers/internal/IFilter.java --- src/org/eclipse/ui/views/markers/internal/IFilter.java 8 Jul 2004 20:06:58 -0000 1.2 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,36 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2003 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ - -package org.eclipse.ui.views.markers.internal; - -/** - * Generic filtering interface. - */ -public interface IFilter { - - /** - * Filters the list of elements. Removes the elements that need to filtered out from the list. - * - * @param elements - */ - public Object[] filter(Object[] elements); - - /** - * @param item - * @return - * - */ - public boolean select(Object item); - -} \ No newline at end of file Index: src/org/eclipse/ui/views/markers/internal/ITableViewContentProvider.java =================================================================== RCS file: src/org/eclipse/ui/views/markers/internal/ITableViewContentProvider.java diff -N src/org/eclipse/ui/views/markers/internal/ITableViewContentProvider.java --- src/org/eclipse/ui/views/markers/internal/ITableViewContentProvider.java 8 Jul 2004 20:06:58 -0000 1.2 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,26 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2003 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ - -package org.eclipse.ui.views.markers.internal; - -public interface ITableViewContentProvider { - - public Object[] getElements(); - - public IFilter getFilter(); - - public void setFilter(IFilter filter); - - public void addItemsChangedListener(IItemsChangedListener listener); - - public void removeItemsChangedListener(IItemsChangedListener listener); - -} \ No newline at end of file Index: src/org/eclipse/ui/views/markers/internal/MarkerFilter.java =================================================================== RCS file: /home/eclipse/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/MarkerFilter.java,v retrieving revision 1.9 diff -u -r1.9 MarkerFilter.java --- src/org/eclipse/ui/views/markers/internal/MarkerFilter.java 8 Jul 2004 20:06:58 -0000 1.9 +++ src/org/eclipse/ui/views/markers/internal/MarkerFilter.java 31 Jan 2005 08:57:00 -0000 @@ -11,724 +11,248 @@ package org.eclipse.ui.views.markers.internal; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; import java.util.HashSet; import java.util.Iterator; -import java.util.List; import java.util.Set; -import java.util.StringTokenizer; -import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IMarker; -import org.eclipse.core.resources.IProject; -import org.eclipse.core.resources.IResource; -import org.eclipse.core.resources.ResourcesPlugin; -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IAdaptable; -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.jface.dialogs.IDialogSettings; -import org.eclipse.ui.IWorkingSet; -import org.eclipse.ui.internal.WorkbenchPlugin; +import org.eclipse.core.runtime.IPath; +import org.eclipse.jface.viewers.deferred.IFilter; -public class MarkerFilter { +public class MarkerFilter implements IFilter { - private static final String TAG_DIALOG_SECTION = "filter"; //$NON-NLS-1$ - - private static final String TAG_ENABLED = "enabled"; //$NON-NLS-1$ - - private static final String TAG_FILTER_ON_MARKER_LIMIT = "filterOnMarkerLimit"; //$NON-NLS-1$ - - private static final String TAG_MARKER_LIMIT = "markerLimit"; //$NON-NLS-1$ - - private static final String TAG_ON_RESOURCE = "onResource"; //$NON-NLS-1$ - - private static final String TAG_SELECTED_TYPES = "selectedType"; //$NON-NLS-1$ - - private static final String TAG_WORKING_SET = "workingSet"; //$NON-NLS-1$ - - private static final String TAG_TYPES_DELIMITER = ":"; //$NON-NLS-1$ - - static final int ON_ANY_RESOURCE = 0; - - static final int ON_SELECTED_RESOURCE_ONLY = 1; - - static final int ON_SELECTED_RESOURCE_AND_CHILDREN = 2; - - static final int ON_ANY_RESOURCE_OF_SAME_PROJECT = 3; - - static final int ON_WORKING_SET = 4; - - static final int DEFAULT_MARKER_LIMIT = 100; - - static final boolean DEFAULT_FILTER_ON_MARKER_LIMIT = true; - - static final int DEFAULT_ON_RESOURCE = ON_ANY_RESOURCE; - - static final boolean DEFAULT_ACTIVATION_STATUS = true; - - protected List rootTypes = new ArrayList(); - - protected List selectedTypes = new ArrayList(); - - protected IWorkingSet workingSet; - - protected int onResource; - - protected boolean filterOnMarkerLimit; - - protected boolean enabled; - - protected int markerLimit; - - private MarkerTypesModel typesModel; - - private IResource[] focusResource; - - private Set cachedWorkingSet; - - MarkerFilter(String[] rootTypes) { - typesModel = new MarkerTypesModel(); - - for (int i = 0; i < rootTypes.length; i++) { - MarkerType type = typesModel.getType(rootTypes[i]); + final static int DEFAULT_SEVERITY = 0; + final static int SEVERITY_ERROR = 1 << 2; + final static int SEVERITY_WARNING = 1 << 1; + final static int SEVERITY_INFO = 1 << 0; + + final static int PRIORITY_HIGH = 1 << 2; + final static int PRIORITY_NORMAL = 1 << 1; + final static int PRIORITY_LOW = 1 << 0; + + protected String[] requiredTypes; + + private String description = ""; //$NON-NLS-1$ + private boolean contains; + + private boolean selectBySeverity; + private int severity; + + private boolean done; + private int priority; + private boolean selectByPriority; + private boolean selectByDone; + + /** + * Set of IPath containing workspace-relative paths to resources accepted + * by this filter. null if the filter accepts any resource. + */ + private Set resourcePaths; + private boolean includeChildResources = false; + private Set requiredTypeSet; + + MarkerFilter(String[] requiredTypes) { + this.requiredTypes = requiredTypes; + this.resourcePaths = null; + } + +// MarkerFilter(String[] requiredTypes, IResource[] exactResources) { +// this.requiredTypes = requiredTypes; +// this.requiredResources = exactResources; +// } + + /** + * @param resourcePathSet Set of IPath + */ + MarkerFilter(String[] requiredTypes, Set resourcePathSet, boolean includeChildResources) { + this.requiredTypes = requiredTypes; + resourcePaths = resourcePathSet; + this.includeChildResources = includeChildResources; + } + + /* (non-Javadoc) + * @see java.lang.Object#equals(java.lang.Object) + */ + public boolean equals(Object arg0) { + if (!(arg0 instanceof MarkerFilter)) { + return false; + } + + MarkerFilter other = (MarkerFilter)arg0; + + if (!(other.contains == contains + && other.description.equals(description) + && other.selectBySeverity == selectBySeverity + && other.severity == severity + && other.done == done + && other.priority == priority + && other.includeChildResources == includeChildResources + && other.selectByPriority == selectByPriority + && other.selectBySeverity == selectBySeverity + && other.requiredTypes.length == requiredTypes.length)) return false; + + for (int i = 0; i < other.requiredTypes.length; i++) { + String type = other.requiredTypes[i]; + + if (!selectByType(type)) { + return false; + } + } + + if (resourcePaths == null || other.resourcePaths == null) { + // Unless they're both null, the filters aren't equal + if (resourcePaths != other.resourcePaths) { + return false; + } + } else { + if (!includeChildResources) { + if (!resourcePaths.equals(other.resourcePaths)) return false; + } else { + // Check for "resources + children" style matches + for (Iterator iter = resourcePaths.iterator(); iter.hasNext();) { + IPath next = (IPath) iter.next(); + + if (!other.selectByResource(next)) { + return false; + } + } + for (Iterator iter = other.resourcePaths.iterator(); iter.hasNext();) { + IPath next = (IPath) iter.next(); + + if (!selectByResource(next)) { + return false; + } + } + } + } + + return true; + } + + /* (non-Javadoc) + * @see org.eclipse.jface.viewers.deferred.IFilter#select(java.lang.Object) + */ + public boolean select(Object toTest) { + if (!(toTest instanceof ConcreteMarker)) { + return false; + } + ConcreteMarker m = (ConcreteMarker)toTest; + + if (selectByType(m.getType()) && selectByResource(m.getResource().getFullPath()) && selectByDescription(m) && selectBySeverity(m) + && selectByDone(m) && selectByPriority(m)) { + return true; + } + + return false; + } + + private boolean selectByResource(IPath resource) { + + if (resourcePaths == null) { + return true; + } + + if (includeChildResources) { + if (resourcePaths.contains(resource)) { + return true; + } + + if (resource.segmentCount() == 0) { + return false; + } + + return selectByResource(resource.removeLastSegments(1)); + } else { + return resourcePaths.contains(resource); + } + } + + private boolean selectByType(String type) { + if (requiredTypeSet == null) { + requiredTypeSet = new HashSet(); + for (int i = 0; i < requiredTypes.length; i++) { + String next = requiredTypes[i]; + + requiredTypeSet.add(next); + } + } + + return requiredTypeSet.contains(type); + } + + public void setDescription(String description, boolean contains) { + this.description = description; + this.contains = contains; + } + + private boolean selectByDescription(ConcreteMarker marker) { + if (description == null || description.equals("")) //$NON-NLS-1$ + return true; - if (!this.rootTypes.contains(type)) - this.rootTypes.add(type); - } + String markerDescription = marker.getDescription(); + int index = markerDescription.indexOf(description); + return contains ? (index >= 0) : (index < 0); } - - private void addAllSubTypes() { - for (int i = 0; i < rootTypes.size(); i++) { - MarkerType rootType = (MarkerType) rootTypes.get(i); - addAllSubTypes(rootType); - } + + public void setSelectBySeverity(boolean selectBySeverity) { + this.selectBySeverity = selectBySeverity; } - private void addAllSubTypes(MarkerType type) { - if (type == null) - return; - - if (!selectedTypes.contains(type)) - selectedTypes.add(type); - - MarkerType[] subTypes = type.getSubtypes(); - - for (int i = 0; i < subTypes.length; i++) - addAllSubTypes(subTypes[i]); + public void setSeverity(int severity) { + this.severity = severity; } - /** - * Adds all markers in the given set of resources to the given list - * - * @param resultList - * @param resources - * @param markerTypeId - * @param depth - * @throws CoreException - */ - private List findMarkers(IResource[] resources, int depth, int limit, - IProgressMonitor mon, boolean ignoreExceptions) - throws CoreException { - if (resources == null) { - return Collections.EMPTY_LIST; - } - - List resultList = new ArrayList(resources.length * 2); - - // Optimization: if a type appears in the selectedTypes list along with all of its - // subtypes, then combine these in a single search. - - // List of types that haven't been replaced by one of their supertypes - HashSet typesToSearch = new HashSet(selectedTypes.size()); - - // List of types that appeared in selectedTypes along with all of their subtypes - HashSet includeAllSubtypes = new HashSet(selectedTypes.size()); - - typesToSearch.addAll(selectedTypes); - - Iterator iter = selectedTypes.iterator(); - - while (iter.hasNext()) { - MarkerType type = (MarkerType) iter.next(); - - Collection subtypes = Arrays.asList(type.getAllSubTypes()); - - if (selectedTypes.containsAll(subtypes)) { - typesToSearch.removeAll(subtypes); - - includeAllSubtypes.add(type); - } - } - - mon - .beginTask( - Messages.getString("MarkerFilter.searching"), typesToSearch.size() * resources.length); //$NON-NLS-1$ - - // Use this hash set to determine if there are any resources in the - // list that appear along with their parent. - HashSet resourcesToSearch = new HashSet(); - - // Insert all the resources into the hashset - for (int idx = 0; idx < resources.length; idx++) { - IResource next = resources[idx]; - - if (!next.exists()) { - continue; - } - - if (resourcesToSearch.contains(next)) { - mon.worked(typesToSearch.size()); - } else { - resourcesToSearch.add(next); - } - } + private boolean selectBySeverity(ConcreteMarker item) { + if (selectBySeverity) { + int markerSeverity = item.getSeverity(); - // Iterate through all the selected resources - for (int resourceIdx = 0; resourceIdx < resources.length; resourceIdx++) { - iter = typesToSearch.iterator(); - - IResource resource = resources[resourceIdx]; - - // Skip resources that don't exist - if (!resource.isAccessible()) { - continue; - } - - if (depth == IResource.DEPTH_INFINITE) { - // Determine if any parent of this resource is also in our filter - IResource parent = resource.getParent(); - boolean found = false; - while (parent != null) { - if (resourcesToSearch.contains(parent)) { - found = true; - } - - parent = parent.getParent(); - } - - // If a parent of this resource is also in the filter, we can skip it - // because we'll pick up its markers when we search the parent. - if (found) { - continue; - } - } - - // Iterate through all the marker types - while (iter.hasNext()) { - MarkerType markerType = (MarkerType) iter.next(); - - // Only search for subtypes of the marker if we found all of its - // subtypes in the filter criteria. - IMarker[] markers = resource.findMarkers(markerType.getId(), - includeAllSubtypes.contains(markerType), depth); - - mon.worked(1); - - for (int idx = 0; idx < markers.length; idx++) { - ConcreteMarker marker; - try { - marker = MarkerList.createMarker(markers[idx]); - } catch (CoreException e) { - if (ignoreExceptions) { - continue; - } else { - throw e; - } - } - - if (limit != -1 && resultList.size() >= limit) { - return resultList; - } - - if (selectMarker(marker)) { - resultList.add(marker); - } - } - } + if (markerSeverity == IMarker.SEVERITY_ERROR) + return (severity & SEVERITY_ERROR) > 0; + else if (markerSeverity == IMarker.SEVERITY_WARNING) + return (severity & SEVERITY_WARNING) > 0; + else if (markerSeverity == IMarker.SEVERITY_INFO) + return (severity & SEVERITY_INFO) > 0; } - mon.done(); - - return resultList; - } - - /** - * Subclasses should override to determine if the given marker passes the filter. - * - * @param marker - * @return true if the marker passes the filter and false otherwise - */ - protected boolean selectMarker(ConcreteMarker marker) { return true; } - - /** - * Searches the workspace for markers that pass this filter. - * - * @return - */ - ConcreteMarker[] findMarkers(IProgressMonitor mon, boolean ignoreExceptions) - throws CoreException { - - List unfiltered = Collections.EMPTY_LIST; - - if (!isEnabled()) { - unfiltered = findMarkers(new IResource[] { ResourcesPlugin - .getWorkspace().getRoot() }, IResource.DEPTH_INFINITE, -1, - mon, ignoreExceptions); - } else { - //int limit = getFilterOnMarkerLimit() ? getMarkerLimit() + 1 : -1; - int limit = -1; - - switch (getOnResource()) { - case ON_ANY_RESOURCE: { - unfiltered = findMarkers(new IResource[] { ResourcesPlugin - .getWorkspace().getRoot() }, IResource.DEPTH_INFINITE, - limit, mon, ignoreExceptions); - break; - } - case ON_SELECTED_RESOURCE_ONLY: { - unfiltered = findMarkers(focusResource, IResource.DEPTH_ZERO, - limit, mon, ignoreExceptions); - break; - } - case ON_SELECTED_RESOURCE_AND_CHILDREN: { - unfiltered = findMarkers(focusResource, - IResource.DEPTH_INFINITE, limit, mon, ignoreExceptions); - break; - } - case ON_ANY_RESOURCE_OF_SAME_PROJECT: { - unfiltered = findMarkers(getProjects(focusResource), - IResource.DEPTH_INFINITE, limit, mon, ignoreExceptions); - break; - } - case ON_WORKING_SET: { - unfiltered = findMarkers(getResourcesInWorkingSet(), - IResource.DEPTH_INFINITE, limit, mon, ignoreExceptions); - } - } - } - - if (unfiltered == null) { - unfiltered = Collections.EMPTY_LIST; - } - - return (ConcreteMarker[]) unfiltered - .toArray(new ConcreteMarker[unfiltered.size()]); - } - - IResource[] getResourcesInWorkingSet() { - if (workingSet == null) { - return new IResource[0]; - } - - IAdaptable[] elements = workingSet.getElements(); - List result = new ArrayList(elements.length); - - for (int idx = 0; idx < elements.length; idx++) { - IResource next = (IResource) elements[idx] - .getAdapter(IResource.class); - - if (next != null) { - result.add(next); - } - } - - return (IResource[]) result.toArray(new IResource[result.size()]); + + public void setDone(boolean done) { + this.done = done; } - /** - * Returns a set of strings representing the full pathnames to every resource directly - * or indirectly contained in the working set. A resource is in the working set iff its - * path name can be found in this set. - * - * @return - */ - private Set getWorkingSetAsSetOfPaths() { - if (cachedWorkingSet == null) { - HashSet result = new HashSet(); - - addResourcesAndChildren(result, getResourcesInWorkingSet()); - - cachedWorkingSet = result; - } - - return cachedWorkingSet; - } - - /*** - * Adds the paths of all resources in the given array to the given set. - */ - private void addResourcesAndChildren(HashSet result, IResource[] resources) { - for (int idx = 0; idx < resources.length; idx++) { - - IResource currentResource = resources[idx]; - - result.add(currentResource.getFullPath().toString()); - - if (currentResource instanceof IContainer) { - IContainer cont = (IContainer) currentResource; - - try { - addResourcesAndChildren(result, cont.members()); - } catch (CoreException e) { - // Ignore errors - } - } - - } - } - - /** - * Returns the set of projects that contain the given set of resources. - * - * @param resources - * @return - */ - static IProject[] getProjects(IResource[] resources) { - if (resources == null) { - return new IProject[0]; - } - - Collection projects = getProjectsAsCollection(resources); - - return (IProject[]) projects.toArray(new IProject[projects.size()]); - } - - static Collection getProjectsAsCollection(IResource[] resources) { - HashSet projects = new HashSet(); - - for (int idx = 0; idx < resources.length; idx++) { - projects.add(resources[idx].getProject()); - } - - return projects; + public void setPriority(int priority) { + this.priority = priority; } - public boolean select(ConcreteMarker marker) { - if (!isEnabled()) { - return true; - } - - return selectByType(marker) && selectBySelection(marker) - && selectMarker(marker); + public void setSelectByDone(boolean selectByDone) { + this.selectByDone = selectByDone; } - private boolean selectByType(ConcreteMarker marker) { - return selectedTypes.contains(typesModel.getType(marker.getType())); + public void setSelectByPriority(boolean selectByPriority) { + this.selectByPriority = selectByPriority; } - /** - * Returns whether the specified marker should be filter out or not. - * - * @param marker the marker to test - * @return - * true=the marker should not be filtered out - * false=the marker should be filtered out - */ - private boolean selectBySelection(ConcreteMarker marker) { - if (onResource == ON_ANY_RESOURCE || marker == null) - return true; + private boolean selectByDone(ConcreteMarker item) { + if (selectByDone) + return done == (item.getDone() == 1); - if (focusResource == null) - return true; - - IResource resource = marker.getResource(); - - if (onResource == ON_WORKING_SET) { - if (workingSet == null) - return true; - - if (resource != null) - return isEnclosed(resource); - - } else if (onResource == ON_ANY_RESOURCE_OF_SAME_PROJECT) { - IProject project = resource.getProject(); - - if (project == null) { - return false; - } - - for (int i = 0; i < focusResource.length; i++) { - IProject selectedProject = focusResource[i].getProject(); - - if (selectedProject == null) { - continue; - } - - if (project.equals(selectedProject)) - return true; - } - } else if (onResource == ON_SELECTED_RESOURCE_ONLY) { - for (int i = 0; i < focusResource.length; i++) { - if (resource.equals(focusResource[i])) - return true; - } - } else if (onResource == ON_SELECTED_RESOURCE_AND_CHILDREN) { - for (int i = 0; i < focusResource.length; i++) { - IResource parentResource = resource; - - while (parentResource != null) { - if (parentResource.equals(focusResource[i])) - return true; - - parentResource = parentResource.getParent(); - } - } - } - - return false; + return true; } - /** - * Returns if the given resource is enclosed by a working set element. - * Previous versions of this method used IContainmentAdapter for - * containment tests. For performance reasons, this is no longer possible. - * Code that relies on this behavior should be updated appropriately. - * - * @param element resource to test for enclosure by a working set - * element - * @return true if element is enclosed by a working set element and - * false otherwise. - */ - private boolean isEnclosed(IResource element) { - if (workingSet == null) { - return false; + private boolean selectByPriority(ConcreteMarker marker) { + if (priority != 0 && selectByPriority) { + int markerPriority = marker.getPriority(); + + if (markerPriority == IMarker.PRIORITY_HIGH) + return (priority & PRIORITY_HIGH) > 0; + else if (markerPriority == IMarker.PRIORITY_NORMAL) + return (priority & PRIORITY_NORMAL) > 0; + else if (markerPriority == IMarker.PRIORITY_LOW) + return (priority & PRIORITY_LOW) > 0; } - Set workingSetPaths = getWorkingSetAsSetOfPaths(); - - return workingSetPaths.contains(element.getFullPath().toString()); - } - - /** - * @return the defined limit on the number of markers to be displayed. - */ - int getMarkerLimit() { - return markerLimit; - } - - /** - * Sets the limit on the number of markers to be displayed. - * - * @param the new limit - */ - void setMarkerLimit(int markerLimit) { - this.markerLimit = markerLimit; - } - - /** - * @return - */ - int getOnResource() { - return onResource; - } - - /** - * Sets the type of filtering by selection. - * - * @param onResource must be one of: - * - */ - void setOnResource(int onResource) { - if (onResource >= ON_ANY_RESOURCE && onResource <= ON_WORKING_SET) - this.onResource = onResource; - } - - /** - * @return the selected resource(s) withing the workbench. - */ - IResource[] getFocusResource() { - return focusResource; - } - - /** - * Sets the focused resources. - */ - public void setFocusResource(IResource[] resources) { - focusResource = resources; - } - - /** - * @return - * - */ - boolean isEnabled() { - return enabled; - } - - /** - * @return - * - */ - boolean getFilterOnMarkerLimit() { - return filterOnMarkerLimit; - } - - /** - * @return the root marker types. - */ - List getRootTypes() { - return rootTypes; - } - - /** - * @return the selected marker types to be displayed. - */ - List getSelectedTypes() { - return selectedTypes; - } - /** - * @return the current working set or null if no working set is defined. - */ - IWorkingSet getWorkingSet() { - return workingSet; - } - - /** - * Sets the enablement state of the filter. - */ - void setEnabled(boolean enabled) { - this.enabled = enabled; - } - - /** - * Sets the enablement state of filtering by marker limit. - */ - void setFilterOnMarkerLimit(boolean filterOnMarkerLimit) { - this.filterOnMarkerLimit = filterOnMarkerLimit; - } - - /** - * Sets the selected marker types to be displayed. The List MUST ONLY contain - * MarkerType objects. - */ - void setSelectedTypes(List selectedTypes) { - this.selectedTypes = selectedTypes; - } - - /** - * Sets the current working set. - */ - void setWorkingSet(IWorkingSet workingSet) { - this.workingSet = workingSet; - cachedWorkingSet = null; - } - - void resetState() { - enabled = DEFAULT_ACTIVATION_STATUS; - filterOnMarkerLimit = DEFAULT_FILTER_ON_MARKER_LIMIT; - markerLimit = DEFAULT_MARKER_LIMIT; - onResource = DEFAULT_ON_RESOURCE; - selectedTypes.clear(); - addAllSubTypes(); - setWorkingSet(null); - } - - public void restoreState(IDialogSettings dialogSettings) { - resetState(); - IDialogSettings settings = dialogSettings - .getSection(TAG_DIALOG_SECTION); - - if (settings != null) { - String setting = settings.get(TAG_ENABLED); - - if (setting != null) - enabled = Boolean.valueOf(setting).booleanValue(); - - setting = settings.get(TAG_FILTER_ON_MARKER_LIMIT); - - if (setting != null) - filterOnMarkerLimit = Boolean.valueOf(setting).booleanValue(); - - setting = settings.get(TAG_MARKER_LIMIT); - - if (setting != null) - try { - markerLimit = Integer.parseInt(setting); - } catch (NumberFormatException eNumberFormat) { - } - - setting = settings.get(TAG_ON_RESOURCE); - - if (setting != null) - try { - onResource = Integer.parseInt(setting); - } catch (NumberFormatException eNumberFormat) { - } - - setting = settings.get(TAG_SELECTED_TYPES); - - if (setting != null) { - selectedTypes.clear(); - StringTokenizer stringTokenizer = new StringTokenizer(setting); - - while (stringTokenizer.hasMoreTokens()) { - MarkerType markerType = typesModel.getType(stringTokenizer - .nextToken(TAG_TYPES_DELIMITER)); - - if (markerType != null - && !selectedTypes.contains(markerType)) - selectedTypes.add(markerType); - } - } - - setting = settings.get(TAG_WORKING_SET); - - if (setting != null) - setWorkingSet(WorkbenchPlugin.getDefault() - .getWorkingSetManager().getWorkingSet(setting)); - } + return true; } - public void saveState(IDialogSettings dialogSettings) { - if (dialogSettings != null) { - IDialogSettings settings = dialogSettings - .getSection(TAG_DIALOG_SECTION); - - if (settings == null) - settings = dialogSettings.addNewSection(TAG_DIALOG_SECTION); - - settings.put(TAG_ENABLED, enabled); - settings.put(TAG_FILTER_ON_MARKER_LIMIT, filterOnMarkerLimit); - settings.put(TAG_MARKER_LIMIT, markerLimit); - settings.put(TAG_ON_RESOURCE, onResource); - - String markerTypeIds = ""; //$NON-NLS-1$ - - for (int i = 0; i < selectedTypes.size(); i++) { - MarkerType markerType = (MarkerType) selectedTypes.get(i); - markerTypeIds += markerType.getId() + TAG_TYPES_DELIMITER; - } - - settings.put(TAG_SELECTED_TYPES, markerTypeIds); - - if (workingSet != null) - settings.put(TAG_WORKING_SET, workingSet.getName()); - } - } } Index: src/org/eclipse/ui/views/markers/internal/MarkerList.java =================================================================== RCS file: /home/eclipse/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/MarkerList.java,v retrieving revision 1.7 diff -u -r1.7 MarkerList.java --- src/org/eclipse/ui/views/markers/internal/MarkerList.java 8 Jul 2004 20:06:58 -0000 1.7 +++ src/org/eclipse/ui/views/markers/internal/MarkerList.java 31 Jan 2005 08:57:00 -0000 @@ -13,8 +13,6 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; -import java.util.HashMap; -import java.util.Iterator; import java.util.List; import java.util.Map; @@ -22,7 +20,6 @@ import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IProgressMonitor; /** * Represents a list of ConcreteMarkers. @@ -75,45 +72,8 @@ markerTable = null; } - /** - * Returns the marker table or lazily creates it if it doesn't exist yet - * - * @return a map of IMarker onto ConcreteMarker, containing all the ConcreteMarkers in the list - */ - private Map getMarkerMap() { - if (markerTable == null) { - markerTable = new HashMap(); - - for (int idx = 0; idx < markers.length; idx++) { - ConcreteMarker marker = markers[idx]; - markerTable.put(marker.getMarker(), marker); - } - } - - return markerTable; - } - - /** - * Returns an existing marker from the list that is associated with - * the given IMarker - * - * @param toFind the IMarker to lookup in the list - * @return the ConcreteMarker that corresponds to the given IMarker - */ - public ConcreteMarker getMarker(IMarker toFind) { - return (ConcreteMarker) getMarkerMap().get(toFind); - } - - public static ConcreteMarker createMarker(IMarker marker) - throws CoreException { - if (marker.isSubtypeOf(IMarker.TASK)) { - return new TaskMarker(marker); - } else if (marker.isSubtypeOf(IMarker.BOOKMARK)) { - return new BookmarkMarker(marker); - } else if (marker.isSubtypeOf(IMarker.PROBLEM)) { - return new ProblemMarker(marker); - } else - return new ConcreteMarker(marker); + public static ConcreteMarker createMarker(IMarker marker) { + return new ConcreteMarker(marker); } public void refresh() { @@ -127,22 +87,6 @@ return Arrays.asList(markers); } - public MarkerList findMarkers(Collection ofIMarker) { - List result = new ArrayList(ofIMarker.size()); - - Iterator iter = ofIMarker.iterator(); - while (iter.hasNext()) { - IMarker next = (IMarker) iter.next(); - - ConcreteMarker marker = getMarker(next); - if (marker != null) { - result.add(marker); - } - } - - return new MarkerList(result); - } - public static ConcreteMarker[] createMarkers(IMarker[] source) throws CoreException { ConcreteMarker[] result = new ConcreteMarker[source.length]; @@ -155,19 +99,6 @@ } /** - * Computes the set of markers that match the given filter - * @param filter the filter to apply - * @param mon the monitor to update - * @param ignoreExceptions whether or not exception will be shown - * @return MarkerList - * @throws CoreException - */ - public static MarkerList compute(MarkerFilter filter, IProgressMonitor mon, - boolean ignoreExceptions) throws CoreException { - return new MarkerList(filter.findMarkers(mon, ignoreExceptions)); - } - - /** * Returns a new MarkerList containing all markers in the workspace of the specified types * @param types * @return IMarker[] @@ -253,8 +184,8 @@ for (int idx = 0; idx < markers.length; idx++) { ConcreteMarker marker = markers[idx]; - if (marker instanceof ProblemMarker) { - int severity = ((ProblemMarker) markers[idx]).getSeverity(); + if (marker instanceof ConcreteMarker) { + int severity = ((ConcreteMarker) markers[idx]).getSeverity(); if (severity >= 0 && severity <= 2) { markerCounts[severity]++; } Index: src/org/eclipse/ui/views/markers/internal/MarkerRegistry.java =================================================================== RCS file: src/org/eclipse/ui/views/markers/internal/MarkerRegistry.java diff -N src/org/eclipse/ui/views/markers/internal/MarkerRegistry.java --- src/org/eclipse/ui/views/markers/internal/MarkerRegistry.java 8 Jul 2004 20:06:58 -0000 1.4 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,279 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2004 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ - -package org.eclipse.ui.views.markers.internal; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -import org.eclipse.core.resources.IMarker; -import org.eclipse.core.resources.IMarkerDelta; -import org.eclipse.core.resources.IResource; -import org.eclipse.core.resources.IResourceChangeEvent; -import org.eclipse.core.resources.IResourceChangeListener; -import org.eclipse.core.resources.IResourceDelta; -import org.eclipse.core.runtime.CoreException; -import org.eclipse.jface.util.ListenerList; - -/** - * Registry that tracks resource markers and maintains a sorted, filtered list of the markers. - * Notifies listeners of changes in these markers. - */ -public class MarkerRegistry implements IResourceChangeListener, - ITableViewContentProvider { - - private IFilter filter; - - private IResource input; - - private String[] types = new String[0]; - - private ListenerList listeners = new ListenerList(); - - public MarkerRegistry() { - } - - /** - * Disposes the registry, releasing all listeners - * and any other allocated resources. - */ - public void dispose() { - listeners.clear(); - setInput(null); - } - - /** - * @return a filtered, sorted list of markers. - */ - public Object[] getElements() { - Object[] elements = getUnfilteredElements(); - if (filter != null) { - Object[] filteredItems = filter.filter(elements); - return filteredItems; - } - return elements; - } - - /** - * @return an unfiltered list of elements - */ - public Object[] getUnfilteredElements() { - if (input == null) { - return new Object[0]; - } - List elements = new ArrayList(); - for (int i = 0; i < types.length; i++) { - try { - IMarker[] newMarkers = input.findMarkers(types[i], true, - IResource.DEPTH_INFINITE); - elements.addAll(Arrays.asList(newMarkers)); - } catch (CoreException e) { - } - } - return elements.toArray(); - } - - /** - * @return the registry's filter or null if no filter has been assigned - * to the registry. - */ - public IFilter getFilter() { - return filter; - } - - /** - * @return the registry's input resource - */ - public IResource getInput() { - return input; - } - - /** - * Sets the registry's filter - * - * @param filter - */ - public void setFilter(IFilter filter) { - if (this.filter == null || !this.filter.equals(filter)) { - this.filter = filter; - } - } - - /** - * Sets the registry's input resource - * - * @param resource - */ - public void setInput(IResource resource) { - if (input != null) { - if (input.equals(resource)) - return; - input.getWorkspace().removeResourceChangeListener(this); - } - input = resource; - if (input != null) - resource.getWorkspace().addResourceChangeListener(this); - } - - /** - * @return the base marker types that the registry is tracking - */ - public String[] getTypes() { - return types; - } - - /** - * Sets the base marker types to track. By default the registry will search for - * all markers of these types and their subtypes. - * - * @param types - */ - public void setTypes(String[] types) { - if (types == null) - this.types = new String[0]; - else - this.types = types; - } - - /** - * Convenience method used if only interested in one base marker type. - * - * @param type - */ - public void setType(String type) { - setTypes(new String[] { type }); - } - - /* (non-Javadoc) - * @see org.eclipse.core.resources.IResourceChangeListener#resourceChanged(org.eclipse.core.resources.IResourceChangeEvent) - */ - public void resourceChanged(IResourceChangeEvent event) { - - // gather all marker changes from the delta. - // be sure to do this in the calling thread, - // as the delta is destroyed when this method returns - final List additions = new ArrayList(); - final List removals = new ArrayList(); - final List changes = new ArrayList(); - - IResourceDelta delta = event.getDelta(); - if (delta == null) - return; - getMarkerDeltas(delta, additions, removals, changes); - //filter additions and changes but not removals since they have already been deleted - filterList(additions); - filterList(changes); - notifyListeners(additions, removals, changes); - } - - /** - * Recursively walks over the resource delta and gathers all marker deltas. Marker - * deltas are placed into one of the two given lists depending on the type of delta - * (add or remove). - */ - private void getMarkerDeltas(IResourceDelta delta, List additions, - List removals, List changes) { - IMarkerDelta[] markerDeltas = delta.getMarkerDeltas(); - for (int i = 0; i < markerDeltas.length; i++) { - IMarkerDelta markerDelta = markerDeltas[i]; - IMarker marker = markerDelta.getMarker(); - switch (markerDelta.getKind()) { - case IResourceDelta.ADDED: { - boolean added = false; - for (int j = 0; j < types.length && !added; j++) { - if (markerDelta.isSubtypeOf(types[j])) { - additions.add(marker); - added = true; - } - } - break; - } - case IResourceDelta.REMOVED: { - boolean added = false; - for (int j = 0; j < types.length && !added; j++) { - if (markerDelta.isSubtypeOf(types[j])) { - removals.add(marker); - added = true; - } - } - break; - } - case IResourceDelta.CHANGED: { - boolean added = false; - for (int j = 0; j < types.length && !added; j++) { - if (markerDelta.isSubtypeOf(types[j])) { - changes.add(marker); - added = true; - } - } - break; - } - } - } - - //recurse on child deltas - IResourceDelta[] children = delta.getAffectedChildren(); - for (int i = 0; i < children.length; i++) { - getMarkerDeltas(children[i], additions, removals, changes); - } - } - - private void notifyListeners(List additions, List removals, List changes) { - Object[] listeners = this.listeners.getListeners(); - for (int i = 0; i < listeners.length; i++) { - IItemsChangedListener listener = (IItemsChangedListener) listeners[i]; - listener.itemsChanged(additions, removals, changes); - } - } - - /* (non-Javadoc) - * @see org.eclipse.ui.views.internal.tableview.ITableViewContentProvider#addItemsChangedListener(org.eclipse.ui.views.internal.tableview.IItemsChangedListener) - */ - public void addItemsChangedListener(IItemsChangedListener listener) { - listeners.add(listener); - } - - /* (non-Javadoc) - * @see org.eclipse.ui.views.internal.tableview.ITableViewContentProvider#removeItemsChangedListener(org.eclipse.ui.views.internal.tableview.IItemsChangedListener) - */ - public void removeItemsChangedListener(IItemsChangedListener listener) { - listeners.remove(listener); - } - - /** - * @return the number of items - */ - public int getItemCount() { - //TODO do this more efficiently - return getElements().length; - } - - public int getRawItemCount() { - //TODO do this more efficiently - return getUnfilteredElements().length; - } - - private void filterList(List list) { - if (filter == null || list == null) { - return; - } - int i = 0; - while (i < list.size()) { - if (filter.select(list.get(i))) { - i++; - } else { - list.remove(i); - } - } - } - -} \ No newline at end of file Index: src/org/eclipse/ui/views/markers/internal/MarkerView.java =================================================================== RCS file: /home/eclipse/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/MarkerView.java,v retrieving revision 1.25 diff -u -r1.25 MarkerView.java --- src/org/eclipse/ui/views/markers/internal/MarkerView.java 25 Jan 2005 21:27:37 -0000 1.25 +++ src/org/eclipse/ui/views/markers/internal/MarkerView.java 31 Jan 2005 08:57:00 -0000 @@ -11,40 +11,27 @@ package org.eclipse.ui.views.markers.internal; -import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; import java.util.Iterator; import java.util.List; import org.eclipse.core.resources.IMarker; import org.eclipse.core.resources.IMarkerDelta; import org.eclipse.core.resources.IResource; -import org.eclipse.core.resources.IResourceChangeEvent; -import org.eclipse.core.resources.IResourceChangeListener; import org.eclipse.core.resources.IResourceDelta; import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IAdaptable; -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.Platform; -import org.eclipse.core.runtime.Status; -import org.eclipse.core.runtime.SubProgressMonitor; -import org.eclipse.core.runtime.jobs.IJobManager; -import org.eclipse.core.runtime.jobs.Job; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.IToolBarManager; import org.eclipse.jface.action.Separator; -import org.eclipse.jface.operation.IRunnableWithProgress; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.OpenEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TableViewer; +import org.eclipse.jface.viewers.deferred.IConcurrentModel; import org.eclipse.swt.SWT; import org.eclipse.swt.dnd.Clipboard; import org.eclipse.swt.dnd.DND; @@ -73,27 +60,11 @@ import org.eclipse.ui.part.FileEditorInput; import org.eclipse.ui.part.MarkerTransfer; import org.eclipse.ui.progress.IWorkbenchSiteProgressService; -import org.eclipse.ui.progress.WorkbenchJob; import org.eclipse.ui.views.navigator.ShowInNavigatorAction; import org.eclipse.ui.views.tasklist.ITaskListResourceAdapter; public abstract class MarkerView extends TableView { - private static final String WAITING_FOR_WORKSPACE_CHANGES_TO_FINISH = Messages - .getString("MarkerView.waiting_on_changes"); //$NON-NLS-1$ - - private static final String SEARCHING_FOR_MARKERS = Messages - .getString("MarkerView.searching_for_markers"); //$NON-NLS-1$ - - private static final String REFRESHING_MARKER_COUNTS = Messages - .getString("MarkerView.refreshing_counts"); //$NON-NLS-1$ - - private static final String QUEUEING_VIEWER_UPDATES = Messages - .getString("MarkerView.queueing_updates"); //$NON-NLS-1$ - - private static final String FILTERING_ON_MARKER_LIMIT = Messages - .getString("MarkerView.18"); //$NON-NLS-1$ - private static final String TAG_SELECTION = "selection"; //$NON-NLS-1$ private static final String TAG_MARKER = "marker"; //$NON-NLS-1$ @@ -108,39 +79,10 @@ protected IResource[] focusResources; + private IConcurrentModel model; + private Clipboard clipboard; - IResourceChangeListener resourceListener = new IResourceChangeListener() { - public void resourceChanged(IResourceChangeEvent event) { - String[] markerTypes = getMarkerTypes(); - - boolean refreshNeeded = false; - - for (int idx = 0; idx < markerTypes.length; idx++) { - IMarkerDelta[] markerDeltas = event.findMarkerDeltas( - markerTypes[idx], true); - List changes = new ArrayList(markerDeltas.length); - - examineDelta(markerDeltas, changes); - - if (markerDeltas.length != changes.size()) { - refreshNeeded = true; - } - - MarkerList changed = currentMarkers.findMarkers(changes); - changed.refresh(); - - change(changed.asList()); - } - - // Refresh everything if markers were added or removed - if (refreshNeeded) { - markerCountDirty = true; - refresh(); - } - } - }; - protected ActionCopyMarker copyAction; protected ActionPasteMarker pasteAction; @@ -163,129 +105,6 @@ } }; - private MarkerList currentMarkers = new MarkerList(); - - private int totalMarkers = 0; - - private boolean markerCountDirty = true; - - WorkbenchJob uiJob; - - /** - * This job is scheduled whenever a filter or resource change occurs. It computes the new - * set of markers and schedules a UI Job to cause the changes to be reflected in the UI. - */ - - private RestartableJob refreshJob = null; - - private void internalRefresh(IProgressMonitor monitor) - throws InvocationTargetException, InterruptedException { - int markerLimit = getMarkerLimit(); - monitor - .beginTask( - Messages.getString("MarkerView.19"), markerLimit == -1 ? 60 : 100); //$NON-NLS-1$ - - haltTableUpdates(); - IJobManager jobMan = Platform.getJobManager(); - IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot(); - - try { - monitor.subTask(WAITING_FOR_WORKSPACE_CHANGES_TO_FINISH); - - jobMan.beginRule(root, monitor); - - if (monitor.isCanceled()) { - return; - } - - monitor.subTask(SEARCHING_FOR_MARKERS); - SubProgressMonitor subMonitor = new SubProgressMonitor(monitor, 10); - MarkerList markerList = MarkerList.compute(getFilter(), subMonitor, true); - - if (monitor.isCanceled()) { - return; - } - if (markerCountDirty) { - monitor.subTask(REFRESHING_MARKER_COUNTS); - totalMarkers = MarkerList.compute(getMarkerTypes()).length; - markerCountDirty = false; - } - - currentMarkers = markerList; - - } catch (CoreException e) { - throw new InvocationTargetException(e); - } finally { - jobMan.endRule(root); - } - - if (monitor.isCanceled()) { - return; - } - - // Exit immediately if the markers have changed in the meantime. - - Collection markers = Arrays.asList(currentMarkers.toArray()); - - if (markerLimit != -1) { - - monitor.subTask(FILTERING_ON_MARKER_LIMIT); - SubProgressMonitor mon = new SubProgressMonitor(monitor, 40); - - markers = SortUtil.getFirst(markers, getSorter(), markerLimit, mon); - if (monitor.isCanceled()) - return; - currentMarkers = new MarkerList(markers); - } - - monitor.subTask(QUEUEING_VIEWER_UPDATES); - - SubProgressMonitor sub = new SubProgressMonitor(monitor, 50); - setContents(markers, sub); - if (monitor.isCanceled()) - return; - - uiJob.schedule(); - try { - uiJob.join(); - } catch (InterruptedException e) { - uiJob.cancel(); - monitor.done(); - } finally { - if (monitor.isCanceled()) { - uiJob.cancel(); - } - } - - monitor.done(); - } - - /** - * Causes the view to re-sync its contents with the workspace. Note that - * changes will be scheduled in a background job, and may not take effect - * immediately. - */ - protected void refresh() { - - if (uiJob == null) - createUIJob(); - - if (refreshJob == null) { - - refreshJob = new RestartableJob(Messages.format( - "MarkerView.refreshTitle", new Object[] { getTitle() }),//$NON-NLS-1$ - new IRunnableWithProgress() { - public void run(IProgressMonitor monitor) - throws InvocationTargetException, - InterruptedException { - internalRefresh(monitor); - } - }, getProgressService()); - } - - refreshJob.restart(); - } - /* (non-Javadoc) * @see org.eclipse.ui.views.internal.tableview.TableView#init(org.eclipse.ui.IViewSite, org.eclipse.ui.IMemento) */ @@ -306,16 +125,17 @@ public void createPartControl(Composite parent) { clipboard = new Clipboard(parent.getDisplay()); + setFilter(getFilterCriteria().getFilter()); + setLimit(getFilterCriteria().getMarkerLimit()); + super.createPartControl(parent); + initDragAndDrop(); getSite().getPage().addSelectionListener(focusListener); focusSelectionChanged(getSite().getPage().getActivePart(), getSite() .getPage().getSelection()); - ResourcesPlugin.getWorkspace().addResourceChangeListener( - resourceListener); - refresh(); // Set help on the view itself getViewer().getControl().addHelpListener(new HelpListener() { @@ -329,8 +149,12 @@ ConcreteMarker marker = (ConcreteMarker) ((IStructuredSelection) getViewer() .getSelection()).getFirstElement(); if (marker != null) { - contextId = IDE.getMarkerHelpRegistry().getHelp( - marker.getMarker()); + try { + contextId = IDE.getMarkerHelpRegistry().getHelp( + marker.getMarker()); + } catch (CoreException e1) { + contextId = null; + } } if (contextId == null) { @@ -348,13 +172,18 @@ Object[] rawSelection = selection.toArray(); - IMarker[] markers = new IMarker[rawSelection.length]; - + ArrayList markers = new ArrayList(rawSelection.length); + for (int idx = 0; idx < rawSelection.length; idx++) { - markers[idx] = ((ConcreteMarker) rawSelection[idx]).getMarker(); + IMarker next; + try { + next = ((ConcreteMarker) rawSelection[idx]).getMarker(); + markers.add(next); + } catch (CoreException e) { + } } - setSelection(new StructuredSelection(markers)); + setSelection(new StructuredSelection(markers.toArray())); updateStatusMessage(selection); } @@ -364,8 +193,6 @@ */ public void dispose() { super.dispose(); - ResourcesPlugin.getWorkspace().removeResourceChangeListener( - resourceListener); getSite().getPage().removeSelectionListener(focusListener); //dispose of selection provider actions @@ -377,6 +204,11 @@ showInNavigatorAction.dispose(); propertiesAction.dispose(); clipboard.dispose(); + + if (model != null) { + MarkerProvider.releaseRef(model); + model = null; + } } /* (non-Javadoc) @@ -497,7 +329,7 @@ /* (non-Javadoc) * @see org.eclipse.ui.views.internal.tableview.TableView#getFilter() */ - protected abstract MarkerFilter getFilter(); + protected abstract MarkerFilterCriteria getFilterCriteria(); /* (non-Javadoc) * @see org.eclipse.ui.views.internal.tableview.TableView#handleKeyPressed(org.eclipse.swt.events.KeyEvent) @@ -526,10 +358,9 @@ for (Iterator iterator = selection.iterator(); iterator.hasNext();) { ConcreteMarker marker = (ConcreteMarker) iterator.next(); IMemento elementMem = selectionMem.createChild(TAG_MARKER); - elementMem.putString(TAG_RESOURCE, marker.getMarker().getResource() + elementMem.putString(TAG_RESOURCE, marker.getResource() .getFullPath().toString()); - elementMem.putString(TAG_ID, String.valueOf(marker.getMarker() - .getId())); + elementMem.putString(TAG_ID, String.valueOf(marker.getId())); } } @@ -545,6 +376,7 @@ if (selectionMemento == null) { return new StructuredSelection(); } + ArrayList selectionList = new ArrayList(); IMemento[] markerMems = selectionMemento.getChildren(TAG_MARKER); for (int i = 0; i < markerMems.length; i++) { @@ -554,8 +386,9 @@ .getString(TAG_RESOURCE)); if (resource != null) { IMarker marker = resource.findMarker(id); - if (marker != null) - selectionList.add(currentMarkers.getMarker(marker)); + if (marker != null) { + selectionList.add(MarkerList.createMarker(marker)); + } } } catch (CoreException e) { } @@ -605,6 +438,7 @@ } } + IResource[] focus = new IResource[resources.size()]; resources.toArray(focus); updateFocusResource(focus); @@ -617,51 +451,56 @@ protected abstract void updateFilterSelection(IResource[] resources); void updateFocusResource(IResource[] resources) { - boolean updateNeeded = updateNeeded(focusResources, resources); - if (updateNeeded) { - focusResources = resources; - updateFilterSelection(resources); - refresh(); - } - } - - private boolean updateNeeded(IResource[] oldResources, - IResource[] newResources) { - //determine if an update if refiltering is required - MarkerFilter filter = getFilter(); - if (!filter.isEnabled()) { - return false; - } - - int onResource = filter.getOnResource(); - if (onResource == MarkerFilter.ON_ANY_RESOURCE - || onResource == MarkerFilter.ON_WORKING_SET) { - return false; - } - if (newResources == null || newResources.length < 1) { - return false; - } - if (oldResources == null || oldResources.length < 1) { - return true; - } - if (Arrays.equals(oldResources, newResources)) { - return false; - } - if (onResource == MarkerFilter.ON_ANY_RESOURCE_OF_SAME_PROJECT) { - Collection oldProjects = MarkerFilter - .getProjectsAsCollection(oldResources); - Collection newProjects = MarkerFilter - .getProjectsAsCollection(newResources); - - if (oldProjects.size() == newProjects.size()) { - return !newProjects.containsAll(oldProjects); - } else { - return true; - } - } - - return true; - } + if (resources.length > 0) { + updateFilterSelection(resources); + setFilter(getFilterCriteria().getFilter()); + } + +// boolean updateNeeded = updateNeeded(focusResources, resources); +// if (updateNeeded) { +// focusResources = resources; +// updateFilterSelection(resources); +// setFilter(getFilterCriteria().getFilter()); +// } + } + +// private boolean updateNeeded(IResource[] oldResources, +// IResource[] newResources) { +// //determine if an update if refiltering is required +// MarkerFilterCriteria filter = getFilterCriteria(); +// if (!filter.isEnabled()) { +// return false; +// } +// +// int onResource = filter.getOnResource(); +// if (onResource == MarkerFilterCriteria.ON_ANY_RESOURCE +// || onResource == MarkerFilterCriteria.ON_WORKING_SET) { +// return false; +// } +// if (newResources == null || newResources.length < 1) { +// return false; +// } +// if (oldResources == null || oldResources.length < 1) { +// return true; +// } +// if (Arrays.equals(oldResources, newResources)) { +// return false; +// } +// if (onResource == MarkerFilterCriteria.ON_ANY_RESOURCE_OF_SAME_PROJECT) { +// Collection oldProjects = MarkerFilterCriteria +// .getProjectsAsCollection(oldResources); +// Collection newProjects = MarkerFilterCriteria +// .getProjectsAsCollection(newResources); +// +// if (oldProjects.size() == newProjects.size()) { +// return !newProjects.containsAll(oldProjects); +// } else { +// return true; +// } +// } +// +// return true; +// } /** * Returns the marker limit or -1 if unlimited @@ -669,7 +508,7 @@ * @return */ private int getMarkerLimit() { - MarkerFilter filter = getFilter(); + MarkerFilterCriteria filter = getFilterCriteria(); if (!filter.isEnabled() || !filter.getFilterOnMarkerLimit()) { return -1; @@ -684,22 +523,23 @@ return (limit == -1 || toTest <= limit); } + // TODO: FIX ME void updateTitle() { - String currentTitle = getTitle(); - String viewName = getConfigurationElement().getAttribute("name"); //$NON-NLS-1$ - String status = ""; //$NON-NLS-1$ - int filteredCount = currentMarkers.getItemCount(); - int totalCount = getTotalMarkers(); - if (filteredCount == totalCount) { - status = Messages - .format( - "filter.itemsMessage", new Object[] { new Integer(totalCount) }); //$NON-NLS-1$ - } else { - status = Messages - .format( - "filter.matchedMessage", new Object[] { new Integer(filteredCount), new Integer(totalCount) }); //$NON-NLS-1$ - } - setContentDescription(status); +// String currentTitle = getTitle(); +// String viewName = getConfigurationElement().getAttribute("name"); //$NON-NLS-1$ +// String status = ""; //$NON-NLS-1$ +// int filteredCount = currentMarkers.getItemCount(); +// int totalCount = getTotalMarkers(); +// if (filteredCount == totalCount) { +// status = Messages +// .format( +// "filter.itemsMessage", new Object[] { new Integer(totalCount) }); //$NON-NLS-1$ +// } else { +// status = Messages +// .format( +// "filter.matchedMessage", new Object[] { new Integer(filteredCount), new Integer(totalCount) }); //$NON-NLS-1$ +// } +// setContentDescription(status); } /** @@ -796,8 +636,7 @@ for (Iterator i = structuredSelection.iterator(); i.hasNext();) { Object next = i.next(); if (next instanceof IMarker) { - ConcreteMarker marker = currentMarkers - .getMarker((IMarker) next); + ConcreteMarker marker = MarkerList.createMarker((IMarker) next); if (marker != null) { newSelection.add(marker); } @@ -808,42 +647,31 @@ viewer.setSelection(new StructuredSelection(newSelection), reveal); } - /* (non-Javadoc) - * @see org.eclipse.ui.views.markers.internal.TableView#setContents(java.util.Collection) - */ - void setContents(Collection contents, IProgressMonitor mon) { - if (withinMarkerLimit(contents.size())) { - super.setContents(contents, mon); - } else { - super.setContents(Collections.EMPTY_LIST, mon); - } - } - - protected MarkerList getVisibleMarkers() { - return currentMarkers; - } - - /** - * Returns the total number of markers. Should not be called while the marker - * list is still updating. - * - * @return the total number of markers in the workspace (including everything that doesn't pass the filters) - */ - int getTotalMarkers() { - // The number of visible markers should never exceed the total number of markers in - // the workspace. If this assertation fails, it probably indicates some sort of concurrency problem - // (most likely, getTotalMarkers was called while we were still computing the marker lists) - //Assert.isTrue(totalMarkers >= currentMarkers.getItemCount()); - - return totalMarkers; - } - - /* (non-Javadoc) - * @see org.eclipse.ui.views.markers.internal.TableView#sorterChanged() - */ - protected void sorterChanged() { - refresh(); - } +// protected MarkerList getVisibleMarkers() { +// return currentMarkers; +// } +// +// /** +// * Returns the total number of markers. Should not be called while the marker +// * list is still updating. +// * +// * @return the total number of markers in the workspace (including everything that doesn't pass the filters) +// */ +// int getTotalMarkers() { +// // The number of visible markers should never exceed the total number of markers in +// // the workspace. If this assertation fails, it probably indicates some sort of concurrency problem +// // (most likely, getTotalMarkers was called while we were still computing the marker lists) +// //Assert.isTrue(totalMarkers >= currentMarkers.getItemCount()); +// +// return totalMarkers; +// } + +// /* (non-Javadoc) +// * @see org.eclipse.ui.views.markers.internal.TableView#sorterChanged() +// */ +// protected void sorterChanged() { +// refresh(); +// } private static void examineDelta(IMarkerDelta[] deltas, List changes) { for (int idx = 0; idx < deltas.length; idx++) { @@ -856,37 +684,45 @@ } } - /* (non-Javadoc) - * @see org.eclipse.ui.part.WorkbenchPart#showBusy(boolean) - */ - public void showBusy(boolean busy) { - super.showBusy(busy); - - if (busy) { - preBusyMarkers = totalMarkers; - } else {//Only bold if there has been a change in count - if (totalMarkers != preBusyMarkers) - getProgressService().warnOfContentChange(); - } - - } - - /** - * Create the UIJob used in the receiver for updates. - * - */ - private void createUIJob() { - uiJob = new WorkbenchJob(Messages - .getString("MarkerView.refreshProgress")) { //$NON-NLS-1$ - - public IStatus runInUIThread(IProgressMonitor monitor) { - updateStatusMessage(); - updateTitle(); - return Status.OK_STATUS; - } - }; - uiJob.setPriority(Job.INTERACTIVE); - uiJob.setSystem(true); - } +// /* (non-Javadoc) +// * @see org.eclipse.ui.part.WorkbenchPart#showBusy(boolean) +// */ +// public void showBusy(boolean busy) { +// super.showBusy(busy); +// +// if (busy) { +// preBusyMarkers = totalMarkers; +// } else {//Only bold if there has been a change in count +// if (totalMarkers != preBusyMarkers) +// getProgressService().warnOfContentChange(); +// } +// +// } + + protected IConcurrentModel getViewerInput() { + if (model == null) { + model = MarkerProvider.getRef(); + } + + return model; + } + +// /** +// * Create the UIJob used in the receiver for updates. +// * +// */ +// private void createUIJob() { +// uiJob = new WorkbenchJob(Messages +// .getString("MarkerView.refreshProgress")) { //$NON-NLS-1$ +// +// public IStatus runInUIThread(IProgressMonitor monitor) { +// updateStatusMessage(); +// updateTitle(); +// return Status.OK_STATUS; +// } +// }; +// uiJob.setPriority(Job.INTERACTIVE); +// uiJob.setSystem(true); +// } } Index: src/org/eclipse/ui/views/markers/internal/ProblemFilter.java =================================================================== RCS file: /home/eclipse/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/ProblemFilter.java,v retrieving revision 1.3 diff -u -r1.3 ProblemFilter.java --- src/org/eclipse/ui/views/markers/internal/ProblemFilter.java 8 Jul 2004 20:06:58 -0000 1.3 +++ src/org/eclipse/ui/views/markers/internal/ProblemFilter.java 31 Jan 2005 08:57:00 -0000 @@ -14,7 +14,7 @@ import org.eclipse.core.resources.IMarker; import org.eclipse.jface.dialogs.IDialogSettings; -public class ProblemFilter extends MarkerFilter { +public class ProblemFilter extends MarkerFilterCriteria { private static final String TAG_CONTAINS = "contains"; //$NON-NLS-1$ @@ -52,41 +52,18 @@ super(new String[] { IMarker.PROBLEM }); } - public boolean selectMarker(ConcreteMarker marker) { - if (!(marker instanceof ProblemMarker)) { - return false; - } - - ProblemMarker problemMarker = (ProblemMarker) marker; - - return !isEnabled() - || (super.selectMarker(problemMarker) - && selectByDescription(problemMarker) && selectBySeverity(problemMarker)); - } - - private boolean selectByDescription(ConcreteMarker item) { - if (description == null || description.equals("")) //$NON-NLS-1$ - return true; - - String markerDescription = item.getDescription(); - int index = markerDescription.indexOf(description); - return contains ? (index >= 0) : (index < 0); - } - - private boolean selectBySeverity(ProblemMarker item) { - if (selectBySeverity) { - int markerSeverity = item.getSeverity(); - - if (markerSeverity == IMarker.SEVERITY_ERROR) - return (severity & SEVERITY_ERROR) > 0; - else if (markerSeverity == IMarker.SEVERITY_WARNING) - return (severity & SEVERITY_WARNING) > 0; - else if (markerSeverity == IMarker.SEVERITY_INFO) - return (severity & SEVERITY_INFO) > 0; - } - - return true; - } + /* (non-Javadoc) + * @see org.eclipse.ui.views.markers.internal.MarkerFilterCriteria#getMarkerFilter() + */ + protected MarkerFilter getMarkerFilter() { + MarkerFilter result = super.getMarkerFilter(); + + result.setSeverity(severity); + result.setSelectBySeverity(selectBySeverity); + result.setDescription(description, contains); + + return result; + } public boolean getContains() { return contains; Index: src/org/eclipse/ui/views/markers/internal/ProblemMarker.java =================================================================== RCS file: src/org/eclipse/ui/views/markers/internal/ProblemMarker.java diff -N src/org/eclipse/ui/views/markers/internal/ProblemMarker.java --- src/org/eclipse/ui/views/markers/internal/ProblemMarker.java 8 Jul 2004 20:06:58 -0000 1.4 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,38 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2004 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.ui.views.markers.internal; - -import org.eclipse.core.resources.IMarker; - -/** - * - */ -public class ProblemMarker extends ConcreteMarker { - - private int severity; - - public ProblemMarker(IMarker toCopy) { - super(toCopy); - - } - - /* (non-Javadoc) - * @see org.eclipse.ui.views.markers.internal.ConcreteMarker#refresh() - */ - public void refresh() { - super.refresh(); - severity = getMarker().getAttribute(IMarker.SEVERITY, -1); - } - - public int getSeverity() { - return severity; - } -} \ No newline at end of file Index: src/org/eclipse/ui/views/markers/internal/ProblemView.java =================================================================== RCS file: /home/eclipse/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/ProblemView.java,v retrieving revision 1.10 diff -u -r1.10 ProblemView.java --- src/org/eclipse/ui/views/markers/internal/ProblemView.java 11 Jan 2005 15:49:09 -0000 1.10 +++ src/org/eclipse/ui/views/markers/internal/ProblemView.java 31 Jan 2005 08:57:00 -0000 @@ -13,7 +13,6 @@ import org.eclipse.core.resources.IMarker; import org.eclipse.core.resources.IResource; -import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.Platform; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.Separator; @@ -167,9 +166,9 @@ return sorter; } - protected Object getViewerInput() { - return ResourcesPlugin.getWorkspace().getRoot(); - } +// protected Object getViewerInput() { +// return ResourcesPlugin.getWorkspace().getRoot(); +// } protected IField[] getVisibleFields() { return VISIBLE_FIELDS; @@ -179,17 +178,17 @@ super.initMenu(menu); } - void updateTitle() { - MarkerList visibleMarkers = getVisibleMarkers(); - String breakdown = formatSummaryBreakDown(visibleMarkers); - int filteredCount = visibleMarkers.getItemCount(); - int totalCount = getTotalMarkers(); - if (filteredCount != totalCount) - breakdown = Messages.format("problem.filter.matchedMessage", //$NON-NLS-1$ - new Object[] { breakdown, new Integer(filteredCount), - new Integer(totalCount) }); - setContentDescription(breakdown); - } +// void updateTitle() { +// MarkerList visibleMarkers = getVisibleMarkers(); +// String breakdown = formatSummaryBreakDown(visibleMarkers); +// int filteredCount = visibleMarkers.getItemCount(); +// int totalCount = getTotalMarkers(); +// if (filteredCount != totalCount) +// breakdown = Messages.format("problem.filter.matchedMessage", //$NON-NLS-1$ +// new Object[] { breakdown, new Integer(filteredCount), +// new Integer(totalCount) }); +// setContentDescription(breakdown); +// } private String formatSummaryBreakDown(MarkerList visibleMarkers) { return Messages.format("problem.statusSummaryBreakdown", //$NON-NLS-1$ @@ -229,7 +228,7 @@ /* (non-Javadoc) * @see org.eclipse.ui.views.markers.internal.MarkerView#getFilter() */ - protected MarkerFilter getFilter() { + protected MarkerFilterCriteria getFilterCriteria() { return problemFilter; } @@ -243,7 +242,8 @@ if (dialog.open() == Window.OK) { problemFilter = (ProblemFilter) dialog.getFilter(); problemFilter.saveState(getDialogSettings()); - refresh(); + setFilter(dialog.getFilter().getFilter()); + setLimit(getFilterCriteria().getMarkerLimit()); } } Index: src/org/eclipse/ui/views/markers/internal/TableView.java =================================================================== RCS file: /home/eclipse/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/TableView.java,v retrieving revision 1.6 diff -u -r1.6 TableView.java --- src/org/eclipse/ui/views/markers/internal/TableView.java 8 Jul 2004 20:06:58 -0000 1.6 +++ src/org/eclipse/ui/views/markers/internal/TableView.java 31 Jan 2005 08:57:00 -0000 @@ -12,11 +12,9 @@ package org.eclipse.ui.views.markers.internal; import java.util.Arrays; -import java.util.Collection; import java.util.HashMap; import java.util.Map; -import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.jface.action.IAction; import org.eclipse.jface.action.IMenuListener; import org.eclipse.jface.action.IMenuManager; @@ -33,6 +31,10 @@ import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.TableLayout; import org.eclipse.jface.viewers.TableViewer; +import org.eclipse.jface.viewers.deferred.AcceptAllFilter; +import org.eclipse.jface.viewers.deferred.DeferredContentProvider; +import org.eclipse.jface.viewers.deferred.IConcurrentModel; +import org.eclipse.jface.viewers.deferred.IFilter; import org.eclipse.swt.SWT; import org.eclipse.swt.events.KeyAdapter; import org.eclipse.swt.events.KeyEvent; @@ -55,7 +57,7 @@ public abstract class TableView extends ViewPart { - private TableContentProvider content; + private DeferredContentProvider content; private static final String TAG_COLUMN_WIDTH = "columnWidth"; //$NON-NLS-1$ @@ -78,7 +80,10 @@ private ISelectionProvider selectionProvider = new SelectionProviderAdapter(); private TableSorter sorter; - + private int limit = -1; + + private IFilter filter = AcceptAllFilter.getInstance(); + /* (non-Javadoc) * Method declared on IViewPart. */ @@ -87,28 +92,30 @@ this.memento = memento; } - /** - * - */ - void haltTableUpdates() { - content.cancelPendingChanges(); - } - - void change(Collection toRefresh) { - content.change(toRefresh); - } - - void setContents(Collection contents, IProgressMonitor mon) { - content.set(contents, mon); - } - protected ISelectionProvider getSelectionProvider() { return selectionProvider; } abstract protected void viewerSelectionChanged( IStructuredSelection selection); - + + protected void setFilter(IFilter newFilter) { + if (filter.equals(newFilter)) { + return; + } + filter = newFilter; + if (content != null) { + content.setFilter(filter); + } + } + + protected void setLimit(int newLimit) { + limit = newLimit; + if (content != null) { + content.setLimit(newLimit); + } + } + /* (non-Javadoc) * @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite) */ @@ -118,10 +125,9 @@ viewer = new TableViewer(createTable(parent)); restoreColumnWidths(memento); createColumns(viewer.getTable()); - content = new TableContentProvider(viewer, Messages.format( - "TableView.populating", //$NON-NLS-1$ - new Object[] { getTitle() }), getProgressService()); - + content = new DeferredContentProvider(getSorter()); + content.setFilter(filter); + content.setLimit(limit); viewer.setContentProvider(content); viewer.setLabelProvider(new TableViewLabelProvider(getVisibleFields())); @@ -190,9 +196,8 @@ TableSorter newSorter = new TableSorter(sorter2); sorter = newSorter; - content.setSorter(newSorter); newSorter.saveState(getDialogSettings()); - sorterChanged(); + content.setSortOrder(newSorter); } /* (non-Javadoc) @@ -205,9 +210,9 @@ /** * Creates the table control. */ - protected Table createTable(Composite parent) { + private Table createTable(Composite parent) { Table table = new Table(parent, SWT.H_SCROLL | SWT.V_SCROLL | SWT.MULTI - | SWT.FULL_SELECTION); + | SWT.FULL_SELECTION | SWT.VIRTUAL); table.setLinesVisible(true); table.setFont(parent.getFont()); return table; @@ -322,7 +327,7 @@ return fields; } - protected abstract Object getViewerInput(); + protected abstract IConcurrentModel getViewerInput(); protected abstract IField[] getVisibleFields(); @@ -363,23 +368,21 @@ return null; } - protected void sorterChanged() { - - viewer.setSorter(getSorter()); - - final TableViewer viewer = getViewer(); - if (viewer == null) { - return; - } - - getSite().getShell().getDisplay().asyncExec(new Runnable() { - public void run() { - viewer.getControl().setRedraw(false); - viewer.refresh(false); - viewer.getControl().setRedraw(true); - } - }); - } +// protected void sorterChanged() { +// +// final TableViewer viewer = getViewer(); +// if (viewer == null) { +// return; +// } +// +// getSite().getShell().getDisplay().asyncExec(new Runnable() { +// public void run() { +// viewer.getControl().setRedraw(false); +// viewer.refresh(false); +// viewer.getControl().setRedraw(true); +// } +// }); +// } protected abstract void handleKeyPressed(KeyEvent event); Index: src/org/eclipse/ui/views/markers/internal/TaskFilter.java =================================================================== RCS file: /home/eclipse/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/TaskFilter.java,v retrieving revision 1.3 diff -u -r1.3 TaskFilter.java --- src/org/eclipse/ui/views/markers/internal/TaskFilter.java 8 Jul 2004 20:06:58 -0000 1.3 +++ src/org/eclipse/ui/views/markers/internal/TaskFilter.java 31 Jan 2005 08:57:00 -0000 @@ -14,7 +14,7 @@ import org.eclipse.core.resources.IMarker; import org.eclipse.jface.dialogs.IDialogSettings; -public class TaskFilter extends MarkerFilter { +public class TaskFilter extends MarkerFilterCriteria { private static final String TAG_CONTAINS = "contains"; //$NON-NLS-1$ @@ -64,49 +64,21 @@ super(new String[] { IMarker.TASK }); } - public boolean selectMarker(ConcreteMarker marker) { - if (!(marker instanceof TaskMarker)) { - return false; - } - - TaskMarker taskMarker = (TaskMarker) marker; - - return !isEnabled() - || (super.selectMarker(taskMarker) - && selectByDescription(taskMarker) - && selectByDone(taskMarker) && selectByPriority(taskMarker)); - } - - private boolean selectByDescription(ConcreteMarker marker) { - if (description == null || description.equals("")) //$NON-NLS-1$ - return true; - - int index = marker.getDescription().indexOf(description); - return contains ? (index >= 0) : (index < 0); - } - - private boolean selectByDone(TaskMarker item) { - if (selectByDone) - return done == (item.getDone() == 1); - - return true; - } - - private boolean selectByPriority(TaskMarker marker) { - if (priority != 0 && selectByPriority) { - int markerPriority = marker.getPriority(); - - if (markerPriority == IMarker.PRIORITY_HIGH) - return (priority & PRIORITY_HIGH) > 0; - else if (markerPriority == IMarker.PRIORITY_NORMAL) - return (priority & PRIORITY_NORMAL) > 0; - else if (markerPriority == IMarker.PRIORITY_LOW) - return (priority & PRIORITY_LOW) > 0; - } - - return true; - } - + /* (non-Javadoc) + * @see org.eclipse.ui.views.markers.internal.MarkerFilterCriteria#getMarkerFilter() + */ + protected MarkerFilter getMarkerFilter() { + MarkerFilter result = super.getMarkerFilter(); + + result.setPriority(priority); + result.setSelectByPriority(selectByPriority); + result.setDone(done); + result.setSelectByDone(selectByDone); + result.setDescription(description, contains); + + return result; + } + public boolean getContains() { return contains; } Index: src/org/eclipse/ui/views/markers/internal/TaskMarker.java =================================================================== RCS file: src/org/eclipse/ui/views/markers/internal/TaskMarker.java diff -N src/org/eclipse/ui/views/markers/internal/TaskMarker.java --- src/org/eclipse/ui/views/markers/internal/TaskMarker.java 8 Jul 2004 20:06:58 -0000 1.5 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,55 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2004 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.ui.views.markers.internal; - -import org.eclipse.core.resources.IMarker; - -/** - * Represents a marker visible in the Tasks view. Additional members should be added - * to this class if new fields are added to the Tasks view. Such members should be - * initialized in the constructor, and accessed via get methods rather than accessing - * the IMarker instance directly. This is necessary to support sorting in a reasonable - * time bound. - */ -public class TaskMarker extends ConcreteMarker { - - private int priority; - - private int done; - - /** - * @param toCopy - */ - public TaskMarker(IMarker toCopy) { - super(toCopy); - } - - public void refresh() { - super.refresh(); - priority = getMarker().getAttribute(IMarker.PRIORITY, - IMarker.PRIORITY_NORMAL); - done = -1; - if (getMarker().getAttribute(IMarker.USER_EDITABLE, true)) { - done = 0; - if (getMarker().getAttribute(IMarker.DONE, false)) { - done = 1; - } - } - } - - public int getPriority() { - return priority; - } - - public int getDone() { - return done; - } -} \ No newline at end of file Index: src/org/eclipse/ui/views/markers/internal/TaskView.java =================================================================== RCS file: /home/eclipse/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/TaskView.java,v retrieving revision 1.9 diff -u -r1.9 TaskView.java --- src/org/eclipse/ui/views/markers/internal/TaskView.java 11 Jan 2005 15:49:09 -0000 1.9 +++ src/org/eclipse/ui/views/markers/internal/TaskView.java 31 Jan 2005 08:57:00 -0000 @@ -13,7 +13,6 @@ import org.eclipse.core.resources.IMarker; import org.eclipse.core.resources.IResource; -import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.Platform; import org.eclipse.jface.action.IMenuManager; @@ -73,7 +72,12 @@ private ICellModifier cellModifier = new ICellModifier() { public Object getValue(Object element, String property) { if (element instanceof ConcreteMarker) { - IMarker marker = ((ConcreteMarker) element).getMarker(); + IMarker marker; + try { + marker = ((ConcreteMarker) element).getMarker(); + } catch (CoreException e) { + return null; + } if (COMPLETION.equals(property)) return new Boolean(marker.getAttribute(IMarker.DONE, false)); @@ -91,7 +95,11 @@ } public boolean canModify(Object element, String property) { - return Util.isEditable(((ConcreteMarker) element).getMarker()); + try { + return Util.isEditable(((ConcreteMarker) element).getMarker()); + } catch (CoreException e) { + return false; + } } public void modify(Object element, String property, Object value) { @@ -102,9 +110,8 @@ if (data instanceof ConcreteMarker) { ConcreteMarker concreteMarker = (ConcreteMarker) data; - IMarker marker = concreteMarker.getMarker(); - try { + IMarker marker = concreteMarker.getMarker(); Object oldValue = getValue(data, property); if (oldValue != null && !oldValue.equals(value)) { if (COMPLETION.equals(property)) @@ -265,9 +272,9 @@ return ROOT_TYPES; } - protected Object getViewerInput() { - return ResourcesPlugin.getWorkspace().getRoot(); - } +// protected Object getViewerInput() { +// return ResourcesPlugin.getWorkspace().getRoot(); +// } protected IField[] getVisibleFields() { return VISIBLE_FIELDS; @@ -294,7 +301,7 @@ /* (non-Javadoc) * @see org.eclipse.ui.views.markers.internal.MarkerView#getFilter() */ - protected MarkerFilter getFilter() { + protected MarkerFilterCriteria getFilterCriteria() { return taskFilter; } @@ -308,7 +315,8 @@ if (dialog.open() == Window.OK) { taskFilter = (TaskFilter) dialog.getFilter(); taskFilter.saveState(getDialogSettings()); - refresh(); + setFilter(dialog.getFilter().getFilter()); + setLimit(getFilterCriteria().getMarkerLimit()); } } Index: src/org/eclipse/ui/views/markers/internal/MarkerFilterCriteria.java =================================================================== RCS file: src/org/eclipse/ui/views/markers/internal/MarkerFilterCriteria.java diff -N src/org/eclipse/ui/views/markers/internal/MarkerFilterCriteria.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ src/org/eclipse/ui/views/markers/internal/MarkerFilterCriteria.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,528 @@ +/******************************************************************************* + * Copyright (c) 2000, 2004 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Common Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/cpl-v10.html + * + * Contributors: + * IBM Corporation - initial API and implementation + *******************************************************************************/ + +package org.eclipse.ui.views.markers.internal; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Set; +import java.util.StringTokenizer; + +import org.eclipse.core.resources.IContainer; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.IResource; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IAdaptable; +import org.eclipse.core.runtime.IPath; +import org.eclipse.jface.dialogs.IDialogSettings; +import org.eclipse.jface.util.Assert; +import org.eclipse.jface.viewers.deferred.AcceptAllFilter; +import org.eclipse.jface.viewers.deferred.IFilter; +import org.eclipse.ui.IWorkingSet; +import org.eclipse.ui.internal.WorkbenchPlugin; + +public class MarkerFilterCriteria { + + private static final String TAG_DIALOG_SECTION = "filter"; //$NON-NLS-1$ + + private static final String TAG_ENABLED = "enabled"; //$NON-NLS-1$ + + private static final String TAG_FILTER_ON_MARKER_LIMIT = "filterOnMarkerLimit"; //$NON-NLS-1$ + + private static final String TAG_MARKER_LIMIT = "markerLimit"; //$NON-NLS-1$ + + private static final String TAG_ON_RESOURCE = "onResource"; //$NON-NLS-1$ + + private static final String TAG_SELECTED_TYPES = "selectedType"; //$NON-NLS-1$ + + private static final String TAG_WORKING_SET = "workingSet"; //$NON-NLS-1$ + + private static final String TAG_TYPES_DELIMITER = ":"; //$NON-NLS-1$ + + static final int ON_ANY_RESOURCE = 0; + + static final int ON_SELECTED_RESOURCE_ONLY = 1; + + static final int ON_SELECTED_RESOURCE_AND_CHILDREN = 2; + + static final int ON_ANY_RESOURCE_OF_SAME_PROJECT = 3; + + static final int ON_WORKING_SET = 4; + + static final int DEFAULT_MARKER_LIMIT = 100; + + static final boolean DEFAULT_FILTER_ON_MARKER_LIMIT = true; + + static final int DEFAULT_ON_RESOURCE = ON_ANY_RESOURCE; + + static final boolean DEFAULT_ACTIVATION_STATUS = true; + + protected List rootTypes = new ArrayList(); + + protected List selectedTypes = new ArrayList(); + + protected IWorkingSet workingSet; + + protected int onResource; + + protected boolean filterOnMarkerLimit; + + protected boolean enabled; + + protected int markerLimit; + + private MarkerTypesModel typesModel; + + private IResource[] focusResource = new IResource[0]; + + private Set cachedWorkingSet; + + MarkerFilterCriteria(String[] rootTypes) { + typesModel = new MarkerTypesModel(); + + for (int i = 0; i < rootTypes.length; i++) { + MarkerType type = typesModel.getType(rootTypes[i]); + + if (!this.rootTypes.contains(type)) + this.rootTypes.add(type); + } + } + + private void addAllSubTypes() { + for (int i = 0; i < rootTypes.size(); i++) { + MarkerType rootType = (MarkerType) rootTypes.get(i); + addAllSubTypes(rootType); + } + } + + private void addAllSubTypes(MarkerType type) { + if (type == null) + return; + + if (!selectedTypes.contains(type)) + selectedTypes.add(type); + + MarkerType[] subTypes = type.getSubtypes(); + + for (int i = 0; i < subTypes.length; i++) + addAllSubTypes(subTypes[i]); + } + + IResource[] getResourcesInWorkingSet() { + if (workingSet == null) { + return new IResource[0]; + } + + IAdaptable[] elements = workingSet.getElements(); + List result = new ArrayList(elements.length); + + for (int idx = 0; idx < elements.length; idx++) { + IResource next = (IResource) elements[idx] + .getAdapter(IResource.class); + + if (next != null) { + result.add(next); + } + } + + return (IResource[]) result.toArray(new IResource[result.size()]); + } + + /** + * Returns a set of strings representing the full pathnames to every resource directly + * or indirectly contained in the working set. A resource is in the working set iff its + * path name can be found in this set. + * + * @return + */ + private Set getWorkingSetAsSetOfPaths() { + if (cachedWorkingSet == null) { + HashSet result = new HashSet(); + + addResourcesAndChildren(result, getResourcesInWorkingSet()); + + cachedWorkingSet = result; + } + + return cachedWorkingSet; + } + + /*** + * Adds the paths of all resources in the given array to the given set. + */ + private void addResourcesAndChildren(Set result, IResource[] resources) { + for (int idx = 0; idx < resources.length; idx++) { + + IResource currentResource = resources[idx]; + + IPath next = currentResource.getFullPath(); + if (result.contains(next)) { + return; + } + result.add(next); + + if (currentResource instanceof IContainer) { + IContainer cont = (IContainer) currentResource; + + try { + addResourcesAndChildren(result, cont.members()); + } catch (CoreException e) { + // Ignore errors + } + } + + } + } + + /** + * Returns the set of projects that contain the given set of resources. + * + * @param resources + * @return + */ + static IProject[] getProjects(IResource[] resources) { + if (resources == null) { + return new IProject[0]; + } + + Collection projects = getProjectsAsCollection(resources); + + return (IProject[]) projects.toArray(new IProject[projects.size()]); + } + + static Collection getProjectsAsCollection(IResource[] resources) { + HashSet projects = new HashSet(); + + for (int idx = 0; idx < resources.length; idx++) { + projects.add(resources[idx].getProject()); + } + + return projects; + } + + /** + * Returns if the given resource is enclosed by a working set element. + * Previous versions of this method used IContainmentAdapter for + * containment tests. For performance reasons, this is no longer possible. + * Code that relies on this behavior should be updated appropriately. + * + * @param element resource to test for enclosure by a working set + * element + * @return true if element is enclosed by a working set element and + * false otherwise. + */ + private boolean isEnclosed(IResource element) { + if (workingSet == null) { + return false; + } + Set workingSetPaths = getWorkingSetAsSetOfPaths(); + + return workingSetPaths.contains(element.getFullPath().toString()); + } + + /** + * @return the defined limit on the number of markers to be displayed. + */ + int getMarkerLimit() { + return markerLimit; + } + + /** + * Sets the limit on the number of markers to be displayed. + * + * @param the new limit + */ + void setMarkerLimit(int markerLimit) { + this.markerLimit = markerLimit; + } + + /** + * @return + */ + int getOnResource() { + return onResource; + } + + /** + * Sets the type of filtering by selection. + * + * @param onResource must be one of: + * + */ + void setOnResource(int onResource) { + if (onResource >= ON_ANY_RESOURCE && onResource <= ON_WORKING_SET) + this.onResource = onResource; + } + + /** + * @return the selected resource(s) withing the workbench. + */ + IResource[] getFocusResource() { + return focusResource; + } + + /** + * Sets the focused resources. + */ + public void setFocusResource(IResource[] resources) { + Assert.isNotNull(resources); + focusResource = resources; + } + + /** + * @return + * + */ + boolean isEnabled() { + return enabled; + } + + /** + * @return + * + */ + boolean getFilterOnMarkerLimit() { + return filterOnMarkerLimit; + } + + /** + * @return the root marker types. + */ + List getRootTypes() { + return rootTypes; + } + + /** + * @return the selected marker types to be displayed. + */ + List getSelectedTypes() { + return selectedTypes; + } + + /** + * @return the current working set or null if no working set is defined. + */ + IWorkingSet getWorkingSet() { + return workingSet; + } + + /** + * Sets the enablement state of the filter. + */ + void setEnabled(boolean enabled) { + this.enabled = enabled; + } + + /** + * Sets the enablement state of filtering by marker limit. + */ + void setFilterOnMarkerLimit(boolean filterOnMarkerLimit) { + this.filterOnMarkerLimit = filterOnMarkerLimit; + } + + /** + * Sets the selected marker types to be displayed. The List MUST ONLY contain + * MarkerType objects. + */ + void setSelectedTypes(List selectedTypes) { + this.selectedTypes = selectedTypes; + } + + /** + * Sets the current working set. + */ + void setWorkingSet(IWorkingSet workingSet) { + this.workingSet = workingSet; + cachedWorkingSet = null; + } + + void resetState() { + enabled = DEFAULT_ACTIVATION_STATUS; + filterOnMarkerLimit = DEFAULT_FILTER_ON_MARKER_LIMIT; + markerLimit = DEFAULT_MARKER_LIMIT; + onResource = DEFAULT_ON_RESOURCE; + selectedTypes.clear(); + addAllSubTypes(); + setWorkingSet(null); + } + + protected MarkerFilter getMarkerFilter() { + + List typesList = new ArrayList(); + + for (Iterator iter = selectedTypes.iterator(); iter.hasNext();) { + MarkerType type = (MarkerType) iter.next(); + + typesList.add(type.getId()); + } + String[] types = (String[]) typesList.toArray(new String[typesList.size()]); + + Set resources; + + switch(onResource) { + case ON_ANY_RESOURCE_OF_SAME_PROJECT: { + resources = new HashSet(); + + for (int i = 0; i < focusResource.length; i++) { + IProject selectedProject = focusResource[i].getProject(); + + if (selectedProject == null) { + continue; + } + + resources.add(selectedProject.getFullPath()); + } + return new MarkerFilter(types, resources, true); + } + case ON_SELECTED_RESOURCE_AND_CHILDREN: { + resources = new HashSet(); + + for (int i = 0; i < focusResource.length; i++) { + IResource res = focusResource[i]; + + resources.add(res.getFullPath()); + } + return new MarkerFilter(types, resources, true); + } + case ON_SELECTED_RESOURCE_ONLY: { + resources = new HashSet(); + + for (int i = 0; i < focusResource.length; i++) { + IResource res = focusResource[i]; + + resources.add(res.getFullPath()); + } + return new MarkerFilter(types, resources, false); + } + case ON_WORKING_SET: { + return new MarkerFilter(types, getWorkingSetAsSetOfPaths(), false); + } + default: + return new MarkerFilter(types); + } + + } + + public final IFilter getFilter() { + if (!isEnabled()) { + return AcceptAllFilter.getInstance(); + } + + return getMarkerFilter(); + } + + public void restoreState(IDialogSettings dialogSettings) { + resetState(); + IDialogSettings settings = dialogSettings + .getSection(TAG_DIALOG_SECTION); + + if (settings != null) { + String setting = settings.get(TAG_ENABLED); + + if (setting != null) + enabled = Boolean.valueOf(setting).booleanValue(); + + setting = settings.get(TAG_FILTER_ON_MARKER_LIMIT); + + if (setting != null) + filterOnMarkerLimit = Boolean.valueOf(setting).booleanValue(); + + setting = settings.get(TAG_MARKER_LIMIT); + + if (setting != null) + try { + markerLimit = Integer.parseInt(setting); + } catch (NumberFormatException eNumberFormat) { + } + + setting = settings.get(TAG_ON_RESOURCE); + + if (setting != null) + try { + onResource = Integer.parseInt(setting); + } catch (NumberFormatException eNumberFormat) { + } + + setting = settings.get(TAG_SELECTED_TYPES); + + if (setting != null) { + selectedTypes.clear(); + StringTokenizer stringTokenizer = new StringTokenizer(setting); + + while (stringTokenizer.hasMoreTokens()) { + MarkerType markerType = typesModel.getType(stringTokenizer + .nextToken(TAG_TYPES_DELIMITER)); + + if (markerType != null + && !selectedTypes.contains(markerType)) + selectedTypes.add(markerType); + } + } + + setting = settings.get(TAG_WORKING_SET); + + if (setting != null) + setWorkingSet(WorkbenchPlugin.getDefault() + .getWorkingSetManager().getWorkingSet(setting)); + } + } + + public void saveState(IDialogSettings dialogSettings) { + if (dialogSettings != null) { + IDialogSettings settings = dialogSettings + .getSection(TAG_DIALOG_SECTION); + + if (settings == null) + settings = dialogSettings.addNewSection(TAG_DIALOG_SECTION); + + settings.put(TAG_ENABLED, enabled); + settings.put(TAG_FILTER_ON_MARKER_LIMIT, filterOnMarkerLimit); + settings.put(TAG_MARKER_LIMIT, markerLimit); + settings.put(TAG_ON_RESOURCE, onResource); + + String markerTypeIds = ""; //$NON-NLS-1$ + + for (int i = 0; i < selectedTypes.size(); i++) { + MarkerType markerType = (MarkerType) selectedTypes.get(i); + markerTypeIds += markerType.getId() + TAG_TYPES_DELIMITER; + } + + settings.put(TAG_SELECTED_TYPES, markerTypeIds); + + if (workingSet != null) + settings.put(TAG_WORKING_SET, workingSet.getName()); + } + } +} Index: src/org/eclipse/ui/views/markers/internal/MarkerProvider.java =================================================================== RCS file: src/org/eclipse/ui/views/markers/internal/MarkerProvider.java diff -N src/org/eclipse/ui/views/markers/internal/MarkerProvider.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ src/org/eclipse/ui/views/markers/internal/MarkerProvider.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,228 @@ +/******************************************************************************* + * Copyright (c) 2004 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Common Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/cpl-v10.html + * + * Contributors: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.ui.views.markers.internal; + +import java.util.ArrayList; +import java.util.List; + +import org.eclipse.core.resources.IMarker; +import org.eclipse.core.resources.IMarkerDelta; +import org.eclipse.core.resources.IResource; +import org.eclipse.core.resources.IResourceChangeEvent; +import org.eclipse.core.resources.IResourceChangeListener; +import org.eclipse.core.resources.IResourceDelta; +import org.eclipse.core.resources.IWorkspaceRoot; +import org.eclipse.core.resources.ResourcesPlugin; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Platform; +import org.eclipse.core.runtime.Status; +import org.eclipse.core.runtime.jobs.IJobManager; +import org.eclipse.core.runtime.jobs.Job; +import org.eclipse.jface.viewers.deferred.AbstractConcurrentModel; +import org.eclipse.jface.viewers.deferred.IConcurrentModel; +import org.eclipse.jface.viewers.deferred.IConcurrentModelListener; + +/** + * @since 3.1 + */ +public class MarkerProvider extends AbstractConcurrentModel { + + private static final String WAITING_FOR_WORKSPACE_CHANGES_TO_FINISH = Messages + .getString("MarkerView.waiting_on_changes"); //$NON-NLS-1$ + + private static final String SEARCHING_FOR_MARKERS = Messages + .getString("MarkerView.searching_for_markers"); //$NON-NLS-1$ + + private static final String REFRESHING_MARKER_COUNTS = Messages + .getString("MarkerView.refreshing_counts"); //$NON-NLS-1$ + + private IWorkspaceRoot getWorkspaceRoot() { + return ResourcesPlugin.getWorkspace().getRoot(); + } + + private Job searchJob = new Job(SEARCHING_FOR_MARKERS) { + /* (non-Javadoc) + * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor) + */ + protected IStatus run(IProgressMonitor monitor) { + doRefresh(monitor); + return Status.OK_STATUS; + } + }; + + private int totalMarkers = 0; + private ArrayList awaitingRefresh = new ArrayList(); + private volatile boolean refreshScheduled = false; + + IResourceChangeListener resourceListener = new IResourceChangeListener() { + public void resourceChanged(IResourceChangeEvent event) { + MarkerProvider.this.resourceChanged(event); + } + }; + + + private static int refCount = 0; + private static MarkerProvider singleton = null; + + public static IConcurrentModel getRef() { + if (singleton == null) { + singleton = new MarkerProvider(); + } + + refCount++; + return singleton; + } + + public static void releaseRef(IConcurrentModel toRelease) { + refCount--; + if (refCount == 0) { + singleton.dispose(); + singleton = null; + } + } + + + private MarkerProvider() { + ResourcesPlugin.getWorkspace().addResourceChangeListener(resourceListener); + searchJob.setSystem(true); + } + + public void resourceChanged(IResourceChangeEvent event) { + String[] markerTypes = getMarkerTypes(); + + boolean refreshNeeded = false; + + for (int idx = 0; idx < markerTypes.length; idx++) { + IMarkerDelta[] markerDeltas = event.findMarkerDeltas( + markerTypes[idx], true); + List changes = new ArrayList(markerDeltas.length / 3); + List additions = new ArrayList(markerDeltas.length / 3); + List removals = new ArrayList(markerDeltas.length / 3); + + examineDelta(markerDeltas, changes, additions, removals); + + fireRemove(removals.toArray()); + fireAdd(additions.toArray()); + fireUpdate(changes.toArray()); + } + } + + private void examineDelta(IMarkerDelta[] deltas, List changes, List additions, List removals) { + for (int idx = 0; idx < deltas.length; idx++) { + IMarkerDelta delta = deltas[idx]; + int kind = delta.getKind(); + + if (kind == IResourceDelta.CHANGED) { + changes.add(MarkerList.createMarker(deltas[idx].getMarker())); + } else if (kind == IResourceDelta.ADDED) { + additions.add(MarkerList.createMarker(deltas[idx].getMarker())); + } else if (kind == IResourceDelta.REMOVED) { + removals.add(MarkerList.createMarker(deltas[idx].getMarker())); + } + } + } + + public void dispose() { + ResourcesPlugin.getWorkspace().removeResourceChangeListener(resourceListener); + } + + public int getTotalMarkers() { + return totalMarkers; + } + + private String[] getMarkerTypes() { + return new String[] {IMarker.MARKER}; + } + + /* (non-Javadoc) + * @see org.eclipse.jface.viewers.deferred.IConcurrentContentProvider#getElements(org.eclipse.core.runtime.IProgressMonitor) + */ + public void doRefresh(IProgressMonitor monitor) { + IJobManager jobMan = Platform.getJobManager(); + IWorkspaceRoot root = getWorkspaceRoot(); + + ArrayList result = new ArrayList(); + + try { + monitor.subTask(WAITING_FOR_WORKSPACE_CHANGES_TO_FINISH); + + jobMan.beginRule(root, monitor); + + if (monitor.isCanceled()) { + throw new InterruptedException(); + } + + monitor.subTask(SEARCHING_FOR_MARKERS); + IMarker[] markers = root.findMarkers(IMarker.MARKER, + true, IResource.DEPTH_INFINITE); + + for (int i = 0; i < markers.length; i++) { + IMarker marker = markers[i]; + + ConcreteMarker next = MarkerList.createMarker(marker); + + result.add(next); + } + + IConcurrentModelListener[] listeners; + synchronized(awaitingRefresh) { + listeners = (IConcurrentModelListener[]) awaitingRefresh.toArray(new IConcurrentModelListener[awaitingRefresh.size()]); + + awaitingRefresh.clear(); + refreshScheduled = false; + } + + Object[] newContents = result.toArray(); + for (int i = 0; i < listeners.length; i++) { + IConcurrentModelListener listener = listeners[i]; + + listener.setContents(newContents); + } + + } catch (CoreException e) { + // TODO: SHOULD LOG THIS!!!!!!!!!!!! + } catch (InterruptedException e) { + } finally { + jobMan.endRule(root); + } + + } + + /* (non-Javadoc) + * @see org.eclipse.jface.viewers.deferred.AbstractConcurrentModel#removeListener(org.eclipse.jface.viewers.deferred.IConcurrentModelListener) + */ + public void removeListener(IConcurrentModelListener listener) { + super.removeListener(listener); + // If this listener is waiting for a refresh, cancel it + synchronized(awaitingRefresh) { + awaitingRefresh.remove(listener); + } + + } + + /* (non-Javadoc) + * @see org.eclipse.jface.viewers.deferred.IConcurrentContentProvider#requestUpdate(org.eclipse.jface.viewers.deferred.IConcurrentContentProviderListener) + */ + public void requestUpdate(IConcurrentModelListener listener) { + synchronized(awaitingRefresh) { + if (!awaitingRefresh.contains(listener)) { + awaitingRefresh.add(listener); + // Ensure we don't reschedule the refresh job if it's already running + if (!refreshScheduled) { + refreshScheduled = true; + searchJob.schedule(); + } + } + } + } +}