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 - *
true
if the item will make it through the filter.false
if the item will not make it through the filter.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 MarkerFilter.ON_ANY_RESOURCE
if showing items associated with any resource.MarkerFilter.ON_SELECTED_RESOURCE_ONLY
if showing items associated with
- * the selected resource within the workbench.MarkerFilter.ON_SELECTED_RESOURCE_AND_CHILDREN
if showing items associated with
- * the selected resource within the workbench and its children.MarkerFilter.ON_ANY_RESOURCE_OF_SAME_PROJECT
if showing items in the same project
- * as the selected resource within the workbench.MarkerFilter.ON_WORKING_SET
if showing items in some working set.MarkerFilter.ON_ANY_RESOURCE
MarkerFilter.ON_SELECTED_RESOURCE_ONLY
MarkerFilter.ON_SELECTED_RESOURCE_AND_CHILDREN
MarkerFilter.ON_ANY_RESOURCE_OF_SAME_PROJECT
MarkerFilter.ON_WORKING_SET
true
if the filter is enabled.false
if the filter is not enabled.true
if filtering by marker limit is enabled.false
if filtering by marker limit is not enabled.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 MarkerFilter.ON_ANY_RESOURCE
if showing items associated with any resource.MarkerFilter.ON_SELECTED_RESOURCE_ONLY
if showing items associated with
+ * the selected resource within the workbench.MarkerFilter.ON_SELECTED_RESOURCE_AND_CHILDREN
if showing items associated with
+ * the selected resource within the workbench and its children.MarkerFilter.ON_ANY_RESOURCE_OF_SAME_PROJECT
if showing items in the same project
+ * as the selected resource within the workbench.MarkerFilter.ON_WORKING_SET
if showing items in some working set.MarkerFilter.ON_ANY_RESOURCE
MarkerFilter.ON_SELECTED_RESOURCE_ONLY
MarkerFilter.ON_SELECTED_RESOURCE_AND_CHILDREN
MarkerFilter.ON_ANY_RESOURCE_OF_SAME_PROJECT
MarkerFilter.ON_WORKING_SET
true
if the filter is enabled.false
if the filter is not enabled.true
if filtering by marker limit is enabled.false
if filtering by marker limit is not enabled.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();
+ }
+ }
+ }
+ }
+}