### Eclipse Workspace Patch 1.0
#P org.eclipse.ui.navigator
Index: src/org/eclipse/ui/navigator/internal/DelegateTreeViewerSorter.java
===================================================================
RCS file: src/org/eclipse/ui/navigator/internal/DelegateTreeViewerSorter.java
diff -N src/org/eclipse/ui/navigator/internal/DelegateTreeViewerSorter.java
--- src/org/eclipse/ui/navigator/internal/DelegateTreeViewerSorter.java 3 Feb 2006 20:24:45 -0000 1.1
+++ /dev/null 1 Jan 1970 00:00:00 -0000
@@ -1,67 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.navigator.internal;
-
-import java.text.Collator;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerSorter;
-import org.eclipse.ui.navigator.TreeViewerSorter;
-
-/**
- * @since 3.2
- *
- */
-public class DelegateTreeViewerSorter extends TreeViewerSorter {
-
- private ViewerSorter delegateSorter;
-
- public DelegateTreeViewerSorter(ViewerSorter aSorter) {
- super();
- Assert.isNotNull(aSorter);
- delegateSorter = aSorter;
- }
-
- public int category(Object element) {
- return delegateSorter.category(element);
- }
-
- public int compare(Viewer viewer, Object e1, Object e2) {
- return delegateSorter.compare(viewer, e1, e2);
- }
-
- public boolean equals(Object obj) {
- return delegateSorter.equals(obj);
- }
-
- public Collator getCollator() {
- return delegateSorter.getCollator();
- }
-
- public int hashCode() {
- return delegateSorter.hashCode();
- }
-
- public boolean isSorterProperty(Object element, String property) {
- return delegateSorter.isSorterProperty(element, property);
- }
-
- public void sort(Viewer viewer, Object[] elements) {
- delegateSorter.sort(viewer, elements);
- }
-
- public String toString() {
- return delegateSorter.toString();
- }
-
-}
Index: src/org/eclipse/ui/navigator/CommonViewerSorter.java
===================================================================
RCS file: /cvsroot/eclipse/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/CommonViewerSorter.java,v
retrieving revision 1.1
diff -u -r1.1 CommonViewerSorter.java
--- src/org/eclipse/ui/navigator/CommonViewerSorter.java 3 Feb 2006 20:24:37 -0000 1.1
+++ src/org/eclipse/ui/navigator/CommonViewerSorter.java 6 Feb 2006 00:44:27 -0000
@@ -11,12 +11,9 @@
package org.eclipse.ui.navigator;
-import java.util.Arrays;
-import java.util.Comparator;
-import java.util.Set;
+import java.util.*;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerSorter;
+import org.eclipse.jface.viewers.*;
import org.eclipse.ui.navigator.internal.NavigatorContentService;
import org.eclipse.ui.navigator.internal.extensions.NavigatorContentDescriptor;
@@ -52,7 +49,7 @@
* @since 3.2
*
*/
-public final class CommonViewerSorter extends TreeViewerSorter {
+public final class CommonViewerSorter extends TreePathViewerSorter {
private NavigatorContentService contentService;
@@ -83,21 +80,18 @@
: Priority.LOW_PRIORITY_VALUE;
}
- public void sort(final Viewer viewer, final Object parent, Object[] elements) {
-
- Arrays.sort(elements, new Comparator() {
- public int compare(Object a, Object b) {
- return CommonViewerSorter.this.compare(viewer, parent, a, b);
- }
- });
- }
-
- public int compare(Viewer viewer, Object parent, Object e1, Object e2) {
+ public int compare(Viewer viewer, TreePath parentPath, Object e1, Object e2) {
INavigatorContentDescriptor sourceOfLvalue = getSource(e1);
INavigatorContentDescriptor sourceOfRvalue = getSource(e2);
// identity comparison
if (sourceOfLvalue != null && sourceOfLvalue == sourceOfRvalue) {
+ Object parent;
+ if (parentPath == null) {
+ parent = viewer.getInput();
+ } else {
+ parent = parentPath.getLastSegment();
+ }
ViewerSorter sorter = sorterService.findSorter(sourceOfLvalue, parent, e1, e2);
if(sorter != null)
return sorter.compare(viewer, e1, e2);
@@ -106,7 +100,7 @@
if (categoryDelta == 0) {
super.compare(viewer, e1, e2);
}
- return categoryDelta;
+ return -1 * categoryDelta;
}
private INavigatorContentDescriptor getSource(Object o) {
Index: src/org/eclipse/ui/navigator/CommonViewer.java
===================================================================
RCS file: /cvsroot/eclipse/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/CommonViewer.java,v
retrieving revision 1.7
diff -u -r1.7 CommonViewer.java
--- src/org/eclipse/ui/navigator/CommonViewer.java 3 Feb 2006 20:24:37 -0000 1.7
+++ src/org/eclipse/ui/navigator/CommonViewer.java 6 Feb 2006 00:44:27 -0000
@@ -13,22 +13,11 @@
import java.util.ArrayList;
import java.util.List;
-import org.eclipse.jface.viewers.DecoratingLabelProvider;
-import org.eclipse.jface.viewers.IBaseLabelProvider;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.LabelProviderChangedEvent;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.ViewerSorter;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.dnd.DND;
-import org.eclipse.swt.dnd.FileTransfer;
-import org.eclipse.swt.dnd.Transfer;
+import org.eclipse.jface.viewers.*;
+import org.eclipse.swt.dnd.*;
import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Item;
-import org.eclipse.swt.widgets.Widget;
+import org.eclipse.swt.widgets.*;
import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.navigator.internal.DelegateTreeViewerSorter;
import org.eclipse.ui.navigator.internal.NavigatorContentService;
import org.eclipse.ui.navigator.internal.dnd.CommonNavigatorDragAdapter;
import org.eclipse.ui.navigator.internal.dnd.CommonNavigatorDropAdapter;
@@ -151,28 +140,6 @@
}
/**
- * Returns the sorted and filtered set of children of the given element. The
- * resulting array must not be modified, as it may come directly from the
- * model's internal state.
- *
- * @param parent
- * the parent element
- * @return a sorted and filtered array of child elements
- */
- protected Object[] getSortedChildren(Object parent) {
- Object[] result = getFilteredChildren(parent);
- ViewerSorter sorter = getSorter();
- if (sorter != null) {
- // be sure we're not modifying the original array from the model
- result = (Object[]) result.clone();
- // safe caste due to setSorter();
- ((TreeViewerSorter) sorter).sort(this, parent, result);
-
- }
- return result;
- }
-
- /**
* Sets this viewer's sorter and triggers refiltering and resorting of this
* viewer's element. Passing null
turns sorting off.
*
@@ -182,211 +149,9 @@
public void setSorter(ViewerSorter sorter) {
if (sorter != null && sorter instanceof CommonViewerSorter)
((CommonViewerSorter) sorter).setContentService(contentService);
-
- if (sorter == null || sorter instanceof TreeViewerSorter)
- super.setSorter(sorter);
- else /* we wrap the sorter for convenience (now we can always cast to TreeViewerSorter) */
- super.setSorter(new DelegateTreeViewerSorter(sorter));
+ super.setSorter(sorter);
}
-
- // Had to pull down the following code to tap into the sorting
-
- /**
- * Adds the given child elements to this viewer as children of the given
- * parent element.
- *
- * EXPERIMENTAL. Not to be used except by JDT. This method was added to - * support JDT's explorations into grouping by working sets, which requires - * viewers to support multiple equal elements. See bug 76482 for more - * details. This support will likely be removed in Eclipse 3.2 in favour of - * proper support for multiple equal elements. - *
- * - * @param widget - * the widget for the parent element - * @param parentElement - * the parent element - * @param childElements - * the child elements to add - * @since 3.1 - */ - protected void internalAdd(Widget widget, Object parentElement, - Object[] childElements) { - - // optimization! - // if the widget is not expanded we just invalidate the subtree - if (widget instanceof Item) { - Item ti = (Item) widget; - if (!getExpanded(ti)) { - boolean needDummy = isExpandable(parentElement); - boolean haveDummy = false; - // remove all children - Item[] items = getItems(ti); - for (int i = 0; i < items.length; i++) { - if (items[i].getData() != null) { - disassociate(items[i]); - items[i].dispose(); - } else { - if (needDummy && !haveDummy) { - haveDummy = true; - } else { - items[i].dispose(); - } - } - } - // append a dummy if necessary - if (needDummy && !haveDummy) - newItem(ti, SWT.NULL, -1); - return; - } - } - - if (childElements.length > 0) { - Object[] filtered = filter(childElements); - if (getSorter() != null) - ((TreeViewerSorter) getSorter()).sort(this, parentElement, - filtered); - createAddedElements(widget, parentElement, filtered); - } - } - - /** - * See if element is the data of one of the elements in items. - * - * @param items - * @param element - * @returntrue
if the element matches.
- */
- private boolean itemExists(Item[] items, Object element) {
- if (usingElementMap())// if we can do a constant time lookup find it
- return findItem(element) != null;
- for (int i = 0; i < items.length; i++) {
- if (items[i].getData().equals(element))
- return true;
- }
- return false;
- }
-
- /**
- * Create the new elements in the parent widget. If the child already exists
- * do nothing.
- *
- * @param widget
- * @param elements
- * Sorted list of elements to add.
- */
- private void createAddedElements(Widget widget, Object parent,
- Object[] elements) {
-
- if (elements.length == 1) {
- if (equals(elements[0], widget.getData()))
- return;
- }
-
- // safe caste due to setSorter();
- TreeViewerSorter sorter = (TreeViewerSorter) getSorter();
- Item[] items = getChildren(widget);
-
- // As the items are sorted already we optimize for a
- // start position
- int lastInsertion = 0;
-
- // Optimize for the empty case
- if (items.length == 0) {
- for (int i = 0; i < elements.length; i++) {
- createTreeItem(widget, elements[i], -1);
- }
- return;
- }
-
- for (int i = 0; i < elements.length; i++) {
- boolean newItem = true;
- Object element = elements[i];
- int index;
- if (getSorter() == null) {
- if (itemExists(items, element)) {
- refresh(element);
- newItem = false;
- }
- index = -1;
- } else {
- lastInsertion = insertionPosition(items, lastInsertion, sorter,
- parent, element);
- // As we are only searching the original array we keep track of
- // those positions only
- if (lastInsertion == items.length)
- index = -1;
- else {// See if we should just refresh
- while (lastInsertion < items.length
- && sorter.compare(this, parent, element,
- items[lastInsertion].getData()) == 0) {
- // As we cannot assume the sorter is consistent with
- // equals() - therefore we can
- // just check against the item prior to this index (if
- // any)
- if (items[lastInsertion].getData().equals(element)) {
- // refresh the element in case it has new children
- refresh(element);
- newItem = false;
- }
- lastInsertion++;// We had an insertion so increment
- }
- // Did we get to the end?
- if (lastInsertion == items.length)
- index = -1;
- else
- index = lastInsertion + i; // Add the index as the
- // array is growing
- }
- }
- if (newItem)
- createTreeItem(widget, element, index);
- }
- }
-
- /**
- * Returns the index where the item should be inserted. It uses sorter to
- * determine the correct position, if sorter is not assigned, returns the
- * index of the element after the last.
- *
- * @param items
- * the items to search
- * @param lastInsertion
- * the start index to start search for position from this allows
- * optimising search for multiple elements that are sorted
- * themself.
- * @param element
- * element to find position for.
- * @return the index to use when inserting the element.
- *
- */
-
- private int insertionPosition(Item[] items, int lastInsertion,
- TreeViewerSorter sorter, Object parent, Object element) {
-
- int size = items.length;
- if (getSorter() == null)
- return size;
- int min = lastInsertion, max = size - 1;
-
- while (min <= max) {
- int mid = (min + max) / 2;
- Object data = items[mid].getData();
- int compare = sorter.compare(this, parent, data, element);
- if (compare == 0) {
- return mid;// Return if we already match
- }
- if (compare < 0)
- min = mid + 1;
- else
- max = mid - 1;
- }
- return min;
-
- }
-
- // End of pulled down code
-
+
/**
* * Adds DND support to the Navigator. Uses hooks into the extensible Index: src/org/eclipse/ui/navigator/TreeViewerSorter.java =================================================================== RCS file: src/org/eclipse/ui/navigator/TreeViewerSorter.java diff -N src/org/eclipse/ui/navigator/TreeViewerSorter.java --- src/org/eclipse/ui/navigator/TreeViewerSorter.java 3 Feb 2006 20:24:36 -0000 1.1 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,93 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2006 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - ******************************************************************************/ - -package org.eclipse.ui.navigator; - -import org.eclipse.jface.viewers.Viewer; -import org.eclipse.jface.viewers.ViewerSorter; - -/** - * - * Provides context sensitive sorting of elements based on their parent in the - * tree. - * - *
- * Clients may extend this class. - *
- * - *- * EXPERIMENTAL. This class or interface has been added as - * part of a work in progress. There is a guarantee neither that this API will - * work nor that it will remain the same. Please do not use this API without - * consulting with the Platform/UI team. - *
- * - * @since 3.2 - * - */ -public class TreeViewerSorter extends ViewerSorter { - - /** - * Sorts the given elements in-place taking into account the parent of the - * elements, modifying the given array. - *
- * The default implementation of this method uses the java.util.Arrays#sort
- * algorithm on the given array, calling compare
to compare
- * elements, and the parent does not affect sorting algorithm.
- *
- * Subclasses may reimplement this method to provide a more optimized - * implementation. - *
- *- * - * - * @param viewer - * the viewer - * @param parent - * The parent element in the tree of both children. - * @param elements - * the elements to sort - */ - public void sort(final Viewer viewer, final Object parent, Object[] elements) { - super.sort(viewer, elements); - } - - /** - * Returns a negative, zero, or positive number depending on whether the - * first element is less than, equal to, or greater than the second element. - *
- * The default implementation of this method is based on comparing the
- * elements' categories as computed by the category
framework
- * method. Elements within the same category are further subjected to a case
- * insensitive compare of their label strings, either as computed by the
- * content viewer's label provider, or their toString
values
- * in other cases. Subclasses may override.
- *
0
if the first element is equal
- * to the second element; and a positive number if the first element
- * is greater than the second element
- */
- public int compare(Viewer viewer, Object parent, Object e1, Object e2) {
- return super.compare(viewer, e1, e2);
- }
-
-}
#P org.eclipse.jface
Index: src/org/eclipse/jface/viewers/AbstractTreeViewer.java
===================================================================
RCS file: /cvsroot/eclipse/org.eclipse.jface/src/org/eclipse/jface/viewers/AbstractTreeViewer.java,v
retrieving revision 1.79
diff -u -r1.79 AbstractTreeViewer.java
--- src/org/eclipse/jface/viewers/AbstractTreeViewer.java 26 Jan 2006 15:47:36 -0000 1.79
+++ src/org/eclipse/jface/viewers/AbstractTreeViewer.java 6 Feb 2006 00:44:28 -0000
@@ -201,6 +201,7 @@
}
ViewerSorter sorter = getSorter ();
+ TreePath parentPath = internalGetSorterParentPath(widget, sorter);
Item[] items = getChildren(widget);
//As the items are sorted already we optimize for a
@@ -227,12 +228,12 @@
index = -1;
}
else{
- lastInsertion = insertionPosition(items,sorter,lastInsertion, element);
+ lastInsertion = insertionPosition(items,sorter,lastInsertion, element, parentPath);
//As we are only searching the original array we keep track of those positions only
if(lastInsertion == items.length)
index = -1;
else{//See if we should just refresh
- while(lastInsertion < items.length && sorter.compare(this,element,items[lastInsertion].getData()) == 0){
+ while(lastInsertion < items.length && internalCompare(sorter,parentPath,element,items[lastInsertion].getData()) == 0){
//As we cannot assume the sorter is consistent with equals() - therefore we can
// just check against the item prior to this index (if any)
if (items[lastInsertion].getData().equals(element)) {
@@ -285,12 +286,14 @@
* themself.
* @param element
* element to find position for.
+ * @param parentPath the tree path for the element's parent or null
+ * if the element is a root element or the sorter is not a {@link TreePathViewerSorter}
* @return the index to use when inserting the element.
*
*/
- private int insertionPosition(Item[] items, ViewerSorter sorter, int lastInsertion, Object element) {
-
+ private int insertionPosition(Item[] items, ViewerSorter sorter, int lastInsertion, Object element, TreePath parentPath) {
+
int size = items.length;
if (sorter == null)
return size;
@@ -299,7 +302,7 @@
while (min <= max) {
int mid = (min + max) / 2;
Object data = items[mid].getData();
- int compare = sorter.compare(this, data, element);
+ int compare = internalCompare(sorter, parentPath, data, element);
if (compare == 0) {
return mid;//Return if we already match
}
@@ -343,7 +346,7 @@
*/
protected int indexForElement(Widget parent, Object element) {
ViewerSorter sorter = getSorter();
-
+ TreePath parentPath = internalGetSorterParentPath(parent, sorter);
Item[] items = getChildren(parent);
int count = items.length;
@@ -355,7 +358,7 @@
while (min <= max) {
int mid = (min + max) / 2;
Object data = items[mid].getData();
- int compare = sorter.compare(this, data, element);
+ int compare = internalCompare(sorter, parentPath, data, element);
if (compare == 0) {
// find first item > element
while (compare == 0) {
@@ -364,7 +367,7 @@
break;
}
data = items[mid].getData();
- compare = sorter.compare(this, data, element);
+ compare = internalCompare(sorter, parentPath, data, element);
}
return mid;
}
@@ -377,6 +380,108 @@
}
/**
+ * Return the tree path that should be used as the parent path for the
+ * given widget and sorter. A null
is returned if either
+ * the sorter is not a {@link TreePathViewerSorter} or if the parent
+ * widget is not an {@link Item} (i.e. is the root of the tree).
+ *
+ * @param parent the parent widget
+ * @param sorter the sorter
+ * @return the tree path that should be used as the parent path for the
+ * given widget and sorter
+ */
+ private TreePath internalGetSorterParentPath(Widget parent, ViewerSorter sorter) {
+ TreePath path;
+ if (sorter instanceof TreePathViewerSorter && parent instanceof Item) {
+ Item item = (Item) parent;
+ path = getTreePathFromItem(item);
+ } else {
+ path = null;
+ }
+ return path;
+ }
+
+ /**
+ * Compare the two elements using the given sorter. If the
+ * sorter is a {@link TreePathViewerSorter}, the provided
+ * tree path will be used. If the tree path is null and the
+ * sorter is a tree path sorter, then the elements are root elements
+ * @param sorter the sorter
+ * @param parentPath the path of the elements' parent
+ * @param e1 the first element
+ * @param e2 the seocnd element
+ * @return the result of comparing the two elements
+ */
+ private int internalCompare(ViewerSorter sorter, TreePath parentPath, Object e1, Object e2) {
+ if (sorter instanceof TreePathViewerSorter) {
+ TreePathViewerSorter tpvs = (TreePathViewerSorter) sorter;
+ return tpvs.compare(this, parentPath, e1, e2);
+ }
+ return sorter.compare(this, e1, e2);
+ }
+
+ /**
+ * Return the sorted children for the given tree path. The
+ * path is relative to the viewer input.
+ * A path of null
indicates that the children for
+ * the input of the viewer are desired.
+ * @param parentPath the parent path
+ * @return the sorted children
+ * @since 3.2
+ */
+ protected Object[] getSortedChildren(TreePath parentPath) {
+ ViewerSorter sorter = getSorter();
+ Object parent;
+ if (parentPath == null) {
+ parent = getInput();
+ } else {
+ parent = parentPath.getLastSegment();
+ }
+ if (sorter instanceof TreePathViewerSorter) {
+ TreePathViewerSorter tpvs = (TreePathViewerSorter) sorter;
+ Object[] result = getFilteredChildren(parent);
+ // be sure we're not modifying the original array from the model
+ result = (Object[]) result.clone();
+ tpvs.sort(this, parentPath, result);
+ return result;
+ }
+ return super.getSortedChildren(parent);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.StructuredViewer#getSortedChildren(java.lang.Object)
+ */
+ protected Object[] getSortedChildren(Object parent) {
+ ViewerSorter sorter = getSorter();
+ if (sorter instanceof TreePathViewerSorter) {
+ Widget w = internalGetWidgetToSelect(parent);
+ if (w != null)
+ return getSortedChildren(w, parent);
+ }
+ return super.getSortedChildren(parent);
+ }
+
+ /**
+ * Get the sorted children for the parent using a
+ * {@link TreePathViewerSorter} if there is one and
+ * {@link StructuredViewer#getSortedChildren(Object)} if there isn't.
+ *
+ * @param widget
+ * the widget for the parent
+ * @param parent
+ * the parent element
+ * @return the sorted children
+ */
+ private Object[] getSortedChildren(Widget widget, Object parent) {
+ ViewerSorter sorter = getSorter();
+ TreePath parentPath = internalGetSorterParentPath(widget, sorter);
+ if (sorter instanceof TreePathViewerSorter) {
+ return getSortedChildren(parentPath);
+ }
+ return super.getSortedChildren(parent);
+ }
+
+ /**
* Adds the given child element to this viewer as a child of the given
* parent element. If this viewer does not have a sorter, the element is
* added at the end of the parent's list of children; otherwise, the
@@ -514,7 +619,7 @@
Object d = widget.getData();
if (d != null) {
Object parentElement = d;
- Object[] children = getSortedChildren(parentElement);
+ Object[] children = getSortedChildren(widget, parentElement);
for (int i = 0; i < children.length; i++) {
createTreeItem(widget, children[i], -1);
}
@@ -1953,7 +2058,7 @@
// If the children weren't passed in, get them now since they're needed
// below.
if (elementChildren == null) {
- elementChildren = getSortedChildren(parent);
+ elementChildren = getSortedChildren(widget, parent);
}
Control tree = getControl();
@@ -2083,7 +2188,7 @@
}
}
- /**
+ /**
* Updates the "+"/"-" icon of the tree node from the given element. It
* calls isExpandable
to determine whether an element is
* expandable.
Index: src/org/eclipse/jface/viewers/TreePathViewerSorter.java
===================================================================
RCS file: src/org/eclipse/jface/viewers/TreePathViewerSorter.java
diff -N src/org/eclipse/jface/viewers/TreePathViewerSorter.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ src/org/eclipse/jface/viewers/TreePathViewerSorter.java 1 Jan 1970 00:00:00 -0000
@@ -0,0 +1,109 @@
+/*******************************************************************************
+ * Copyright (c) 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * IBM Corporation - initial API and implementation
+ ******************************************************************************/
+
+package org.eclipse.jface.viewers;
+
+import java.util.Arrays;
+import java.util.Comparator;
+
+/**
+ * A viewer sorter that is provded extra context in the form of the path of the
+ * parent element of the elements being sorted.
+ *
+ * @since 3.2
+ */
+public class TreePathViewerSorter extends ViewerSorter {
+
+ /**
+ * Provide a category for the given element that will have the given parent
+ * path when it is added to the viewer. The provided path is
+ * relative to the viewer input. The parent path will
+ * be null
when the elements are root elements.
+ *
+ * By default, the this method calls
+ * {@link ViewerSorter#category(Object)}. Subclasses may override.
+ *
+ * @param parentPath
+ * the parent path for the element
+ * @param element
+ * the element
+ * @return the category of the element
+ */
+ public int category(TreePath parentPath, Object element) {
+ return category(element);
+ }
+
+ /**
+ * Compare the givcen elements that will have the given parent
+ * path when they are added to the viewer. The provided path is
+ * relative to the viewer input. The parent path will
+ * be null
when the elements are root elements.
+ *
+ * By default, the this method calls
+ * {@link ViewerSorter#sort(Viewer, Object[])}. Subclasses may override.
+ * @param viewer the viewer
+ * @param parentPath the parent path for the two elements
+ * @param e1 the first element
+ * @param e2 the second element
+ * @return a negative number if the first element is less than the
+ * second element; the value 0
if the first element is
+ * equal to the second element; and a positive
+ */
+ public int compare(Viewer viewer, TreePath parentPath, Object e1, Object e2) {
+ return compare(viewer, e1, e2);
+ }
+
+ /**
+ * Returns whether this viewer sorter would be affected
+ * by a change to the given property of the given element.
+ * The provided path is
+ * relative to the viewer input. The parent path will
+ * be null
when the elements are root elements.
+ *
+ * The default implementation of this method calls
+ * {@link ViewerSorter#isSorterProperty(Object, String)}.
+ * Subclasses may reimplement.
+ * @param parentPath the parent path of the element
+ * @param element the element
+ * @param property the property
+ * @return true
if the sorting would be affected,
+ * and false
if it would be unaffected
+ */
+ public boolean isSorterProperty(TreePath parentPath, Object element, String property) {
+ return isSorterProperty(element, property);
+ }
+
+ /**
+ * Sorts the given elements in-place, modifying the given array.
+ * The provided path is
+ * relative to the viewer input. The parent path will
+ * be null
when the elements are root elements.
+ *
+ * The default implementation of this method uses the + * java.util.Arrays#sort algorithm on the given array, + * calling {@link #compare(Viewer, TreePath, Object, Object)} to compare elements. + *
+ *+ * Subclasses may reimplement this method to provide a more optimized implementation. + *
+ * + * @param viewer the viewer + * @param parentPath the parent path of the given elements + * @param elements the elements to sort + */ + public void sort(final Viewer viewer, final TreePath parentPath, Object[] elements) { + Arrays.sort(elements, new Comparator() { + public int compare(Object a, Object b) { + return TreePathViewerSorter.this.compare(viewer, parentPath, a, b); + } + }); + } +}