]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.ui/src/org/simantics/ui/workbench/dialogs/ElementListSelectionDialog.java
Fixed all line endings of the repository
[simantics/platform.git] / bundles / org.simantics.ui / src / org / simantics / ui / workbench / dialogs / ElementListSelectionDialog.java
index fe7537012e262f9614df0ee64ebe8b57db6ba0cd..a2c71f9da319cc694054eea134c8027210702e39 100644 (file)
-/*******************************************************************************\r
- * Copyright (c) 2007, 2010 Association for Decentralized Information Management\r
- * in Industry THTH ry.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- *     VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-/*\r
- * 7.6.2006\r
- */\r
-package org.simantics.ui.workbench.dialogs;\r
-\r
-import java.util.ArrayList;\r
-import java.util.Arrays;\r
-import java.util.Collection;\r
-import java.util.Comparator;\r
-import java.util.HashMap;\r
-import java.util.List;\r
-import java.util.Map;\r
-\r
-import org.eclipse.jface.viewers.ILabelProvider;\r
-import org.eclipse.swt.widgets.Composite;\r
-import org.eclipse.swt.widgets.Control;\r
-import org.eclipse.swt.widgets.Display;\r
-import org.eclipse.swt.widgets.Label;\r
-import org.eclipse.swt.widgets.Shell;\r
-import org.eclipse.swt.widgets.Text;\r
-import org.eclipse.ui.dialogs.AbstractElementListSelectionDialog;\r
-import org.eclipse.ui.dialogs.FilteredList;\r
-\r
-/**\r
- * ElementListSelectionDialog. This dialog component automatically sorts\r
- * previously selected objects to the top of the list. \r
- * <p>\r
- * The component uses title as key for distinguishing different dialog types.\r
- * \r
- * @author Toni Kalajainen\r
- * @author Tuukka Lehtonen\r
- */\r
-public class ElementListSelectionDialog extends AbstractElementListSelectionDialog {\r
-\r
-    /** The number of previously selected objects to be remembered */\r
-    protected static final int REMEMBER_NUM             = 128;\r
-\r
-    /** The number of previously selected objects to be prioritized in the list */\r
-    protected static final int PRIORITIZE_NUM           = 5;\r
-    \r
-    protected String           title                    = "";\r
-\r
-    protected List<Object>     elementList              = new ArrayList<Object>();\r
-\r
-    protected ILabelProvider   labelProvider;\r
-\r
-    protected boolean          usePreviousSelectionSort = true;\r
-\r
-    protected Label            messageLabel;\r
-\r
-    protected Text             filterText;\r
-\r
-\r
-    /**\r
-     * Creates a list selection dialog.\r
-     * \r
-     * @param parent the parent widget.\r
-     * @param labelProvider the label provider.\r
-     */\r
-    public ElementListSelectionDialog(Shell parent, ILabelProvider labelProvider) {\r
-        super(parent, labelProvider);\r
-        this.labelProvider = labelProvider;\r
-        this.setIgnoreCase(true);\r
-    }\r
-\r
-    /**\r
-     * Sets the elements of the list.\r
-     * @param elements the elements of the list.\r
-     */\r
-    public void setElements(Object... elements) {\r
-        elementList = null;\r
-        addElements(elements);\r
-    }\r
-\r
-    public void addElements(Object... elements) {\r
-        if (elementList==null)\r
-            elementList = new ArrayList<Object>();\r
-        for (Object e : elements)\r
-            elementList.add(e);\r
-    }\r
-\r
-    /**\r
-     * Sets the elements of the list.\r
-     * @param elements the elements of the list.\r
-     */\r
-    @SuppressWarnings("rawtypes")\r
-    public void setElements(Collection c) {\r
-        elementList = null;\r
-        addElements(c);\r
-    }\r
-\r
-    @SuppressWarnings("rawtypes")\r
-    public void addElements(Collection c) {\r
-        if (elementList==null)\r
-            elementList = new ArrayList<Object>();\r
-        for (Object e : c)\r
-            elementList.add(e);\r
-    }\r
-\r
-    public void updateList() {\r
-        // Make sure that the filtered list exists before trying to update it.\r
-        if (fFilteredList != null && elementList != null) {\r
-            Object[] objs = elementList.toArray(new Object[elementList.size()]);\r
-            final boolean isEmpty = objs.length == 0;\r
-            setListElements(objs);\r
-            Runnable r = new Runnable() {\r
-                public void run() {\r
-                    handleListChange(isEmpty);\r
-                }\r
-            };\r
-            Display d = getShell().getDisplay();\r
-            if (Thread.currentThread() == d.getThread())\r
-                r.run();\r
-            else\r
-                d.asyncExec(r);\r
-        }\r
-    }\r
-\r
-    protected void handleListChange(boolean isEmpty) {\r
-        boolean wasEnabled = filterText.isEnabled();\r
-        boolean enable = !isEmpty;\r
-        messageLabel.setEnabled(enable);\r
-        filterText.setEnabled(enable);\r
-        fFilteredList.setEnabled(enable);\r
-        if (!wasEnabled)\r
-            filterText.setFocus();\r
-        updateOkState();\r
-    }\r
-\r
-    /**\r
-     * Do alphabetical sort for list elements\r
-     */\r
-    public void sortElements() {\r
-        if (elementList==null) return;\r
-        \r
-        Object[] objects = elementList.toArray(new Object[0]);\r
-        Arrays.sort(objects, new Comparator<Object>() {\r
-            public int compare(Object o1, Object o2) {\r
-                String n1 = labelProvider.getText(o1).toLowerCase();\r
-                String n2 = labelProvider.getText(o2).toLowerCase();\r
-                return n1.compareTo(n2);\r
-            }});\r
-        \r
-        elementList = new ArrayList<Object>(objects.length);\r
-        for (Object o : objects)\r
-            elementList.add(o);\r
-    }\r
-\r
-    /*\r
-     * @see SelectionStatusDialog#computeResult()\r
-     */\r
-    protected void computeResult() {\r
-        setResult(Arrays.asList(getSelectedElements()));\r
-    }\r
-\r
-    @Override\r
-    public void setTitle(String title) {\r
-        super.setTitle(title);\r
-        this.title = title;\r
-    }\r
-\r
-    public void setInitialSelection(Object selectedElement) {\r
-        this.setInitialSelections(new Object[] {selectedElement});\r
-    }\r
-\r
-    /**\r
-     * Overridden just to get a hold of the message area label.\r
-     * \r
-     * @see org.eclipse.ui.dialogs.AbstractElementListSelectionDialog#createMessageArea(org.eclipse.swt.widgets.Composite)\r
-     */\r
-    @Override\r
-    protected Label createMessageArea(Composite composite) {\r
-        messageLabel = super.createMessageArea(composite);\r
-        return messageLabel;\r
-    }\r
-\r
-    /**\r
-     * Overridden just to get a hold of the filter text.\r
-     *\r
-     * @see org.eclipse.ui.dialogs.AbstractElementListSelectionDialog#createFilterText(org.eclipse.swt.widgets.Composite)\r
-     */\r
-    @Override\r
-    protected Text createFilterText(Composite parent) {\r
-        filterText = super.createFilterText(parent);\r
-        return filterText;\r
-    }\r
-\r
-    @Override\r
-    protected FilteredList createFilteredList(Composite parent) {\r
-        FilteredList flist = super.createFilteredList(parent);\r
-\r
-        if (usePreviousSelectionSort) \r
-        {\r
-            List<Object> prioritizeList = new ArrayList<Object>();\r
-            int[] previousSelections = getPreviousSelections( title );\r
-            for (int i=0; i<previousSelections.length; i++)\r
-                for (int j=0; j<elementList.size(); j++)\r
-                    if (elementList.get(j).hashCode()==previousSelections[i])\r
-                    {\r
-                        String name = labelProvider.getText(elementList.get(j));\r
-                        if (name==null) continue;\r
-                        prioritizeList.add(name);\r
-                        if (prioritizeList.size()>PRIORITIZE_NUM)\r
-                            break;\r
-                    }\r
-        \r
-            flist.setComparator(new PrioritizeComparator(prioritizeList, isCaseIgnored()));\r
-        } else {\r
-        }\r
-        return flist;\r
-    }\r
-\r
-    protected void createControls(Composite contents) {\r
-        createMessageArea(contents);\r
-        createFilterText(contents);\r
-        createFilteredList(contents);\r
-    }\r
-    \r
-    /*\r
-     * @see Dialog#createDialogArea(Composite)\r
-     */\r
-    protected Control createDialogArea(Composite parent) {\r
-        Composite contents = (Composite) super.createDialogArea(parent);\r
-\r
-        createControls(contents);\r
-\r
-        setListElements(elementList.toArray(new Object[elementList.size()]));\r
-\r
-        // Select items\r
-        setSelection(getInitialElementSelections().toArray());\r
-\r
-        // If nothing is selected, select the first element\r
-        //if (getSelectionIndices()==null || getSelectionIndices().length==0)\r
-        //    this.fFilteredList.setSelection(new int[] {0});        \r
-\r
-        return contents;\r
-    }\r
-    \r
-    @Override\r
-    protected void okPressed() {\r
-        super.okPressed();\r
-        for (Object o : getResult())\r
-            addSelection(title, o);\r
-    }\r
-    \r
-    protected static Map<String, List<Integer>> previousSelections =\r
-         new HashMap<String, List<Integer>>();\r
-    \r
-    protected static synchronized int[] getPreviousSelections(String key)\r
-    {\r
-        List<Integer> list = previousSelections.get(key);\r
-        if (list==null) return new int[0];\r
-        int result[] = new int[list.size()];\r
-        for (int i=0; i<list.size(); i++)\r
-            result[i] = list.get(i);\r
-        return result;\r
-    }\r
-    \r
-    protected static synchronized void addSelection(String key, Object o)\r
-    {\r
-        List<Integer> list = previousSelections.get(key);\r
-        if (list==null) {\r
-            list = new ArrayList<Integer>();\r
-            previousSelections.put(key, list);\r
-        }\r
-        int hash = o.hashCode();\r
-        // remove previous\r
-        for (int i=0; i<list.size(); i++)\r
-            if (list.get(i)==hash)\r
-            {\r
-                list.remove(i);\r
-            }\r
-        // Add as first\r
-        list.add(0, o.hashCode());\r
-        \r
-        // remove last\r
-        if (list.size()>REMEMBER_NUM)\r
-            list.remove(list.size()-1);\r
-    }    \r
-    \r
-    public int[] getSelectionIndices() {\r
-        return super.getSelectionIndices();\r
-    }\r
-\r
-    public boolean isUsePreviousSelectionSort() {\r
-        return usePreviousSelectionSort;\r
-    }\r
-\r
-    /**\r
-     * Set usage for sorting of previous selections.\r
-     * When this sorting is enabled, the items that have been selected\r
-     * the items that have been selected previously in this same dialog\r
-     * are prioritized to appear first in the list\r
-     * \r
-     * (Dialogs are distinguished by their title :X)\r
-     * \r
-     * @param usePreviousSelectionSort\r
-     */\r
-    public void setUsePreviousSelectionSort(boolean usePreviousSelectionSort) {\r
-        this.usePreviousSelectionSort = usePreviousSelectionSort;\r
-    }\r
-    \r
-}\r
-\r
-class PrioritizeComparator implements Comparator<Object>\r
-{    \r
-    private final List<Object> prioritizeList;\r
-    private final boolean ignoreCase;\r
-    public PrioritizeComparator(List<Object> prioritizeList, boolean ignoreCase)\r
-    {\r
-        this.prioritizeList = prioritizeList;\r
-        this.ignoreCase = ignoreCase;\r
-    }\r
-    \r
-    public int getIndex(Object o)\r
-    {\r
-        for (int i=0; i<prioritizeList.size(); i++)\r
-            if (o==prioritizeList.get(i))\r
-                return i;\r
-        return Integer.MAX_VALUE/4;\r
-    }\r
-    \r
-    public int compare(Object o1, Object o2) {\r
-        int p1 = getIndex(o1);\r
-        int p2 = getIndex(o2);\r
-        if (p1==p2)            \r
-            return (ignoreCase?o1.toString().compareToIgnoreCase(o2.toString()):o1.toString().compareTo(o2.toString()));     \r
-        \r
-        return p1-p2;\r
-    }\r
-    \r
-}\r
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 Association for Decentralized Information Management
+ * in Industry THTH ry.
+ * 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:
+ *     VTT Technical Research Centre of Finland - initial API and implementation
+ *******************************************************************************/
+/*
+ * 7.6.2006
+ */
+package org.simantics.ui.workbench.dialogs;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.dialogs.AbstractElementListSelectionDialog;
+import org.eclipse.ui.dialogs.FilteredList;
+
+/**
+ * ElementListSelectionDialog. This dialog component automatically sorts
+ * previously selected objects to the top of the list. 
+ * <p>
+ * The component uses title as key for distinguishing different dialog types.
+ * 
+ * @author Toni Kalajainen
+ * @author Tuukka Lehtonen
+ */
+public class ElementListSelectionDialog extends AbstractElementListSelectionDialog {
+
+    /** The number of previously selected objects to be remembered */
+    protected static final int REMEMBER_NUM             = 128;
+
+    /** The number of previously selected objects to be prioritized in the list */
+    protected static final int PRIORITIZE_NUM           = 5;
+    
+    protected String           title                    = "";
+
+    protected List<Object>     elementList              = new ArrayList<Object>();
+
+    protected ILabelProvider   labelProvider;
+
+    protected boolean          usePreviousSelectionSort = true;
+
+    protected Label            messageLabel;
+
+    protected Text             filterText;
+
+
+    /**
+     * Creates a list selection dialog.
+     * 
+     * @param parent the parent widget.
+     * @param labelProvider the label provider.
+     */
+    public ElementListSelectionDialog(Shell parent, ILabelProvider labelProvider) {
+        super(parent, labelProvider);
+        this.labelProvider = labelProvider;
+        this.setIgnoreCase(true);
+    }
+
+    /**
+     * Sets the elements of the list.
+     * @param elements the elements of the list.
+     */
+    public void setElements(Object... elements) {
+        elementList = null;
+        addElements(elements);
+    }
+
+    public void addElements(Object... elements) {
+        if (elementList==null)
+            elementList = new ArrayList<Object>();
+        for (Object e : elements)
+            elementList.add(e);
+    }
+
+    /**
+     * Sets the elements of the list.
+     * @param elements the elements of the list.
+     */
+    @SuppressWarnings("rawtypes")
+    public void setElements(Collection c) {
+        elementList = null;
+        addElements(c);
+    }
+
+    @SuppressWarnings("rawtypes")
+    public void addElements(Collection c) {
+        if (elementList==null)
+            elementList = new ArrayList<Object>();
+        for (Object e : c)
+            elementList.add(e);
+    }
+
+    public void updateList() {
+        // Make sure that the filtered list exists before trying to update it.
+        if (fFilteredList != null && elementList != null) {
+            Object[] objs = elementList.toArray(new Object[elementList.size()]);
+            final boolean isEmpty = objs.length == 0;
+            setListElements(objs);
+            Runnable r = new Runnable() {
+                public void run() {
+                    handleListChange(isEmpty);
+                }
+            };
+            Display d = getShell().getDisplay();
+            if (Thread.currentThread() == d.getThread())
+                r.run();
+            else
+                d.asyncExec(r);
+        }
+    }
+
+    protected void handleListChange(boolean isEmpty) {
+        boolean wasEnabled = filterText.isEnabled();
+        boolean enable = !isEmpty;
+        messageLabel.setEnabled(enable);
+        filterText.setEnabled(enable);
+        fFilteredList.setEnabled(enable);
+        if (!wasEnabled)
+            filterText.setFocus();
+        updateOkState();
+    }
+
+    /**
+     * Do alphabetical sort for list elements
+     */
+    public void sortElements() {
+        if (elementList==null) return;
+        
+        Object[] objects = elementList.toArray(new Object[0]);
+        Arrays.sort(objects, new Comparator<Object>() {
+            public int compare(Object o1, Object o2) {
+                String n1 = labelProvider.getText(o1).toLowerCase();
+                String n2 = labelProvider.getText(o2).toLowerCase();
+                return n1.compareTo(n2);
+            }});
+        
+        elementList = new ArrayList<Object>(objects.length);
+        for (Object o : objects)
+            elementList.add(o);
+    }
+
+    /*
+     * @see SelectionStatusDialog#computeResult()
+     */
+    protected void computeResult() {
+        setResult(Arrays.asList(getSelectedElements()));
+    }
+
+    @Override
+    public void setTitle(String title) {
+        super.setTitle(title);
+        this.title = title;
+    }
+
+    public void setInitialSelection(Object selectedElement) {
+        this.setInitialSelections(new Object[] {selectedElement});
+    }
+
+    /**
+     * Overridden just to get a hold of the message area label.
+     * 
+     * @see org.eclipse.ui.dialogs.AbstractElementListSelectionDialog#createMessageArea(org.eclipse.swt.widgets.Composite)
+     */
+    @Override
+    protected Label createMessageArea(Composite composite) {
+        messageLabel = super.createMessageArea(composite);
+        return messageLabel;
+    }
+
+    /**
+     * Overridden just to get a hold of the filter text.
+     *
+     * @see org.eclipse.ui.dialogs.AbstractElementListSelectionDialog#createFilterText(org.eclipse.swt.widgets.Composite)
+     */
+    @Override
+    protected Text createFilterText(Composite parent) {
+        filterText = super.createFilterText(parent);
+        return filterText;
+    }
+
+    @Override
+    protected FilteredList createFilteredList(Composite parent) {
+        FilteredList flist = super.createFilteredList(parent);
+
+        if (usePreviousSelectionSort) 
+        {
+            List<Object> prioritizeList = new ArrayList<Object>();
+            int[] previousSelections = getPreviousSelections( title );
+            for (int i=0; i<previousSelections.length; i++)
+                for (int j=0; j<elementList.size(); j++)
+                    if (elementList.get(j).hashCode()==previousSelections[i])
+                    {
+                        String name = labelProvider.getText(elementList.get(j));
+                        if (name==null) continue;
+                        prioritizeList.add(name);
+                        if (prioritizeList.size()>PRIORITIZE_NUM)
+                            break;
+                    }
+        
+            flist.setComparator(new PrioritizeComparator(prioritizeList, isCaseIgnored()));
+        } else {
+        }
+        return flist;
+    }
+
+    protected void createControls(Composite contents) {
+        createMessageArea(contents);
+        createFilterText(contents);
+        createFilteredList(contents);
+    }
+    
+    /*
+     * @see Dialog#createDialogArea(Composite)
+     */
+    protected Control createDialogArea(Composite parent) {
+        Composite contents = (Composite) super.createDialogArea(parent);
+
+        createControls(contents);
+
+        setListElements(elementList.toArray(new Object[elementList.size()]));
+
+        // Select items
+        setSelection(getInitialElementSelections().toArray());
+
+        // If nothing is selected, select the first element
+        //if (getSelectionIndices()==null || getSelectionIndices().length==0)
+        //    this.fFilteredList.setSelection(new int[] {0});        
+
+        return contents;
+    }
+    
+    @Override
+    protected void okPressed() {
+        super.okPressed();
+        for (Object o : getResult())
+            addSelection(title, o);
+    }
+    
+    protected static Map<String, List<Integer>> previousSelections =
+         new HashMap<String, List<Integer>>();
+    
+    protected static synchronized int[] getPreviousSelections(String key)
+    {
+        List<Integer> list = previousSelections.get(key);
+        if (list==null) return new int[0];
+        int result[] = new int[list.size()];
+        for (int i=0; i<list.size(); i++)
+            result[i] = list.get(i);
+        return result;
+    }
+    
+    protected static synchronized void addSelection(String key, Object o)
+    {
+        List<Integer> list = previousSelections.get(key);
+        if (list==null) {
+            list = new ArrayList<Integer>();
+            previousSelections.put(key, list);
+        }
+        int hash = o.hashCode();
+        // remove previous
+        for (int i=0; i<list.size(); i++)
+            if (list.get(i)==hash)
+            {
+                list.remove(i);
+            }
+        // Add as first
+        list.add(0, o.hashCode());
+        
+        // remove last
+        if (list.size()>REMEMBER_NUM)
+            list.remove(list.size()-1);
+    }    
+    
+    public int[] getSelectionIndices() {
+        return super.getSelectionIndices();
+    }
+
+    public boolean isUsePreviousSelectionSort() {
+        return usePreviousSelectionSort;
+    }
+
+    /**
+     * Set usage for sorting of previous selections.
+     * When this sorting is enabled, the items that have been selected
+     * the items that have been selected previously in this same dialog
+     * are prioritized to appear first in the list
+     * 
+     * (Dialogs are distinguished by their title :X)
+     * 
+     * @param usePreviousSelectionSort
+     */
+    public void setUsePreviousSelectionSort(boolean usePreviousSelectionSort) {
+        this.usePreviousSelectionSort = usePreviousSelectionSort;
+    }
+    
+}
+
+class PrioritizeComparator implements Comparator<Object>
+{    
+    private final List<Object> prioritizeList;
+    private final boolean ignoreCase;
+    public PrioritizeComparator(List<Object> prioritizeList, boolean ignoreCase)
+    {
+        this.prioritizeList = prioritizeList;
+        this.ignoreCase = ignoreCase;
+    }
+    
+    public int getIndex(Object o)
+    {
+        for (int i=0; i<prioritizeList.size(); i++)
+            if (o==prioritizeList.get(i))
+                return i;
+        return Integer.MAX_VALUE/4;
+    }
+    
+    public int compare(Object o1, Object o2) {
+        int p1 = getIndex(o1);
+        int p2 = getIndex(o2);
+        if (p1==p2)            
+            return (ignoreCase?o1.toString().compareToIgnoreCase(o2.toString()):o1.toString().compareTo(o2.toString()));     
+        
+        return p1-p2;
+    }
+    
+}