diff dwtx/jface/viewers/ViewerComparator.d @ 10:b6c35faf97c8

Viewers
author Frank Benoit <benoit@tionex.de>
date Mon, 31 Mar 2008 00:47:19 +0200
parents
children bade933d6ef6
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwtx/jface/viewers/ViewerComparator.d	Mon Mar 31 00:47:19 2008 +0200
@@ -0,0 +1,199 @@
+/*******************************************************************************
+ * 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
+ * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+ ******************************************************************************/
+
+module dwtx.jface.viewers.ViewerComparator;
+
+import dwtx.jface.viewers.Viewer;
+import dwtx.jface.viewers.ContentViewer;
+import dwtx.jface.viewers.IBaseLabelProvider;
+import dwtx.jface.viewers.ILabelProvider;
+
+// import java.util.Arrays;
+// import java.util.Comparator;
+
+import dwtx.jface.util.Policy;
+
+import dwt.dwthelper.utils;
+import tango.core.Array;
+
+/**
+ * A viewer comparator is used by a {@link StructuredViewer} to
+ * reorder the elements provided by its content provider.
+ * <p>
+ * The default <code>compare</code> method compares elements using two steps.
+ * The first step uses the values returned from <code>category</code>.
+ * By default, all elements are in the same category.
+ * The second level is based on a case insensitive compare of the strings obtained
+ * from the content viewer's label provider via <code>ILabelProvider.getText</code>.
+ * </p>
+ * <p>
+ * Subclasses may implement the <code>isSorterProperty</code> method;
+ * they may reimplement the <code>category</code> method to provide
+ * categorization; and they may override the <code>compare</code> methods
+ * to provide a totally different way of sorting elements.
+ * </p>
+ * @see IStructuredContentProvider
+ * @see StructuredViewer
+ *
+ * @since 3.2
+ */
+public class ViewerComparator {
+    /**
+     * The comparator to use to sort a viewer's contents.
+     */
+    private Comparator comparator;
+
+    /**
+     * Creates a new {@link ViewerComparator}, which uses the default comparator
+     * to sort strings.
+     *
+     */
+    public this(){
+        this(null);
+    }
+
+    /**
+     * Creates a new {@link ViewerComparator}, which uses the given comparator
+     * to sort strings.
+     *
+     * @param comparator
+     */
+    public this(Comparator comparator){
+        this.comparator = comparator;
+    }
+
+    /**
+     * Returns the comparator used to sort strings.
+     *
+     * @return the comparator used to sort strings
+     */
+    protected Comparator getComparator() {
+        if (comparator is null){
+            comparator = Policy.getComparator();
+        }
+        return comparator;
+    }
+
+    /**
+     * Returns the category of the given element. The category is a
+     * number used to allocate elements to bins; the bins are arranged
+     * in ascending numeric order. The elements within a bin are arranged
+     * via a second level sort criterion.
+     * <p>
+     * The default implementation of this framework method returns
+     * <code>0</code>. Subclasses may reimplement this method to provide
+     * non-trivial categorization.
+     * </p>
+     *
+     * @param element the element
+     * @return the category
+     */
+    public int category(Object element) {
+        return 0;
+    }
+
+    /**
+     * Returns a negative, zero, or positive number depending on whether
+     * the first element is less than, equal to, or greater than
+     * the second element.
+     * <p>
+     * The default implementation of this method is based on
+     * comparing the elements' categories as computed by the <code>category</code>
+     * 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
+     * <code>toString</code> values in other cases. Subclasses may override.
+     * </p>
+     *
+     * @param viewer the viewer
+     * @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 <code>0</code> 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 e1, Object e2) {
+        int cat1 = category(e1);
+        int cat2 = category(e2);
+
+        if (cat1 !is cat2) {
+            return cat1 - cat2;
+        }
+
+        String name1;
+        String name2;
+
+        if (viewer is null || !(cast(ContentViewer)viewer )) {
+            name1 = e1.toString();
+            name2 = e2.toString();
+        } else {
+            IBaseLabelProvider prov = (cast(ContentViewer) viewer)
+                    .getLabelProvider();
+            if (auto lprov = cast(ILabelProvider)prov ) {
+                name1 = lprov.getText(e1);
+                name2 = lprov.getText(e2);
+            } else {
+                name1 = e1.toString();
+                name2 = e2.toString();
+            }
+        }
+        if (name1 is null) {
+            name1 = "";//$NON-NLS-1$
+        }
+        if (name2 is null) {
+            name2 = "";//$NON-NLS-1$
+        }
+
+        // use the comparator to compare the strings
+        return getComparator().compare( new ArrayWrapperString(name1), new ArrayWrapperString(name2));
+    }
+
+    /**
+     * Returns whether this viewer sorter would be affected
+     * by a change to the given property of the given element.
+     * <p>
+     * The default implementation of this method returns <code>false</code>.
+     * Subclasses may reimplement.
+     * </p>
+     *
+     * @param element the element
+     * @param property the property
+     * @return <code>true</code> if the sorting would be affected,
+     *    and <code>false</code> if it would be unaffected
+     */
+    public bool isSorterProperty(Object element, String property) {
+        return false;
+    }
+
+    /**
+     * Sorts the given elements in-place, modifying the given array.
+     * <p>
+     * The default implementation of this method uses the
+     * java.util.Arrays#sort algorithm on the given array,
+     * calling <code>compare</code> to compare elements.
+     * </p>
+     * <p>
+     * Subclasses may reimplement this method to provide a more optimized implementation.
+     * </p>
+     *
+     * @param viewer the viewer
+     * @param elements the elements to sort
+     */
+    public void sort(Viewer viewer, Object[] elements) {
+        tango.core.Array.sort(elements, delegate int(Object a, Object b) {
+                return compare(viewer, a, b);
+            }
+        );
+    }
+}