Taxonomic tree provider substantially re-programmed, cleaned up.
[taxeditor.git] / eclipseprojects / eu.etaxonomy.taxeditor / src / eu / etaxonomy / taxeditor / view / SelectTaxonDialog.java
index 15f38cb1798b1df58953e1cbac32964bc28f41ae..641ae1f5d0e0f939c413b67f253ac3ffbcb98c92 100644 (file)
@@ -1,11 +1,11 @@
 /**\r
-* Copyright (C) 2007 EDIT\r
-* European Distributed Institute of Taxonomy \r
-* http://www.e-taxonomy.eu\r
-* \r
-* The contents of this file are subject to the Mozilla Public License Version 1.1\r
-* See LICENSE.TXT at the top of this package for the full license terms.\r
-*/\r
+ * Copyright (C) 2007 EDIT\r
+ * European Distributed Institute of Taxonomy \r
+ * http://www.e-taxonomy.eu\r
+ \r
+ * The contents of this file are subject to the Mozilla Public License Version 1.1\r
+ * See LICENSE.TXT at the top of this package for the full license terms.\r
+ */\r
 \r
 package eu.etaxonomy.taxeditor.view;\r
 \r
@@ -13,6 +13,7 @@ import java.util.ArrayList;
 import java.util.List;\r
 \r
 import org.apache.log4j.Logger;\r
+import org.eclipse.core.databinding.observable.set.IObservableSet;\r
 import org.eclipse.jface.dialogs.Dialog;\r
 import org.eclipse.jface.dialogs.IDialogConstants;\r
 import org.eclipse.jface.viewers.DoubleClickEvent;\r
@@ -24,6 +25,8 @@ import org.eclipse.swt.events.FocusEvent;
 import org.eclipse.swt.events.FocusListener;\r
 import org.eclipse.swt.events.SelectionAdapter;\r
 import org.eclipse.swt.events.SelectionEvent;\r
+import org.eclipse.swt.graphics.Font;\r
+import org.eclipse.swt.graphics.FontData;\r
 import org.eclipse.swt.graphics.Point;\r
 import org.eclipse.swt.layout.FillLayout;\r
 import org.eclipse.swt.layout.GridData;\r
@@ -34,37 +37,41 @@ import org.eclipse.swt.widgets.Button;
 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.Event;\r
 import org.eclipse.swt.widgets.Group;\r
 import org.eclipse.swt.widgets.Label;\r
+import org.eclipse.swt.widgets.Listener;\r
 import org.eclipse.swt.widgets.Shell;\r
 import org.eclipse.swt.widgets.Text;\r
+import org.eclipse.swt.widgets.TreeItem;\r
 \r
-import com.swtdesigner.ResourceManager;\r
 import com.swtdesigner.SWTResourceManager;\r
 \r
 import eu.etaxonomy.cdm.model.name.TaxonNameBase;\r
 import eu.etaxonomy.cdm.model.taxon.Taxon;\r
+import eu.etaxonomy.taxeditor.ITaxEditorConstants;\r
 import eu.etaxonomy.taxeditor.TaxEditorPlugin;\r
+import eu.etaxonomy.taxeditor.model.CdmUtil;\r
 \r
 /**\r
- * This is a generic dialog that allows the user to choose a\r
- *  taxon via the taxonomic tree, recently selected names, or search.  \r
+ * This is a generic dialog that allows the user to choose a taxon via the\r
+ * taxonomic tree, recently selected names, or search.\r
  * \r
  * @author p.ciardelli\r
  * @created 27.05.2008\r
  * @version 1.0\r
  */\r
 public class SelectTaxonDialog extends Dialog {\r
-       private Text taxonNameText;\r
        private static final Logger logger = Logger\r
                        .getLogger(SelectTaxonDialog.class);\r
-       \r
+\r
        public static final String TAXON_TO_SYNONYM = "taxontosynonym";\r
 \r
        private String dialogType;\r
        private String shellText;\r
        private String descriptionText;\r
-       \r
+       private Text taxonNameText;\r
+\r
        private TaxonomicTreeViewer treeViewer;\r
        private Taxon taxon;\r
        private Taxon destinationTaxon;\r
@@ -72,23 +79,23 @@ public class SelectTaxonDialog extends Dialog {
        private List<Button> buttons = new ArrayList<Button>();\r
 \r
        private Composite selectComposite;\r
-       \r
+\r
        public SelectTaxonDialog(Shell parentShell, String dialogType) {\r
                super(parentShell);\r
                this.dialogType = dialogType;\r
        }\r
-       \r
+\r
        public Taxon open(Taxon taxon) {\r
                this.taxon = taxon;\r
-               \r
+\r
                if (dialogType.equals(TAXON_TO_SYNONYM)) {\r
                        this.shellText = "Choose an accepted name for \""\r
-                                       + taxon.getName().getTitleCache() + "\"";\r
+                                       + CdmUtil.getDisplayName(taxon) + "\"";\r
                        this.descriptionText = "You have chosen to turn \""\r
-                                       + taxon.getName().getTitleCache()\r
+                                       + CdmUtil.getDisplayName(taxon)\r
                                        + "\" into a synonym. Please choose a new accepted name from one of the following options.";\r
                }\r
-               \r
+\r
                int returnCode = super.open();\r
                if (returnCode == OK) {\r
                        return destinationTaxon;\r
@@ -98,6 +105,7 @@ public class SelectTaxonDialog extends Dialog {
 \r
        /**\r
         * Create contents of the dialog\r
+        * \r
         * @param parent\r
         */\r
        @Override\r
@@ -109,8 +117,8 @@ public class SelectTaxonDialog extends Dialog {
                container.setLayout(gridLayout);\r
 \r
                final Label descriptionLabel = new Label(container, SWT.WRAP);\r
-               descriptionLabel.setLayoutData(new GridData(SWT.LEFT, SWT.FILL,\r
-                               true, false, 2, 1));\r
+               descriptionLabel.setLayoutData(new GridData(SWT.LEFT, SWT.FILL, true,\r
+                               false, 2, 1));\r
                descriptionLabel.setText(descriptionText);\r
 \r
                final Group taxTreeGroup = new Group(container, SWT.NONE);\r
@@ -119,11 +127,10 @@ public class SelectTaxonDialog extends Dialog {
                gd_group_1.heightHint = 83;\r
                taxTreeGroup.setLayoutData(gd_group_1);\r
 \r
-               final Button chooseTreeButton = new Button(taxTreeGroup,\r
-                               SWT.RADIO);\r
+               final Button chooseTreeButton = new Button(taxTreeGroup, SWT.RADIO);\r
                buttons.add(chooseTreeButton);\r
-               chooseTreeButton.setLayoutData(new GridData(SWT.FILL,\r
-                               SWT.CENTER, true, false));\r
+               chooseTreeButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true,\r
+                               false));\r
                chooseTreeButton.setText("Choose from taxonomic tree");\r
 \r
                Composite taxTreeComposite = new Composite(taxTreeGroup, SWT.BORDER);\r
@@ -134,13 +141,39 @@ public class SelectTaxonDialog extends Dialog {
                                SWT.COLOR_WHITE));\r
 \r
                treeViewer = new TaxonomicTreeViewer(taxTreeComposite);\r
+\r
+               IObservableSet observableTaxonSet = TaxEditorPlugin.getDefault()\r
+                               .getObservableSessionTaxa();\r
+               treeViewer.setLabelProvider(new TaxonomicTreeLabelProvider(\r
+                               observableTaxonSet) {\r
+\r
+               });\r
                treeViewer.getTree().addFocusListener(\r
                                new SelectButtonFocusListener(chooseTreeButton));\r
                treeViewer.addDoubleClickListener(new SelectTaxonDoubleClickListener());\r
+               treeViewer.getTree().addListener(SWT.PaintItem, new Listener() {\r
+                       \r
+                       /** If MenuItem with taxon is being drawn, put it in italics.\r
+                        * \r
+                        * @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)\r
+                        **/\r
+                       public void handleEvent(Event event) {\r
+                               Object data = event.item.getData();\r
+                               if (data instanceof Taxon && ((Taxon) data).equals(taxon)) {\r
+                                       ((TreeItem) event.item).setFont(TaxEditorPlugin.getDefault().getFont\r
+                                                       (ITaxEditorConstants.MENU_ITEM_ITALICS));\r
+                               }\r
+                       }\r
+               });\r
+\r
+               // Open up tree to reveal taxon\r
+               treeViewer.revealTaxon(taxon);\r
 \r
                final Composite rightPaneComposite = new Composite(container, SWT.NONE);\r
-               rightPaneComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));\r
-               rightPaneComposite.setLayout(new FillLayout(SWT.VERTICAL | SWT.HORIZONTAL));\r
+               rightPaneComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true,\r
+                               true));\r
+               rightPaneComposite.setLayout(new FillLayout(SWT.VERTICAL\r
+                               | SWT.HORIZONTAL));\r
 \r
                final Group recentNamesGroup = new Group(rightPaneComposite, SWT.NONE);\r
                recentNamesGroup.setLayout(new GridLayout());\r
@@ -205,11 +238,10 @@ public class SelectTaxonDialog extends Dialog {
                searchButton.setLayoutData(new GridData());\r
                searchButton.setText("Search");\r
 \r
-               \r
                selectComposite = new Composite(container, SWT.NONE);\r
                selectComposite.setLayout(new RowLayout());\r
-               selectComposite.setLayoutData(new GridData(SWT.RIGHT, SWT.BOTTOM,\r
-                               true, false, 2, 1));                            \r
+               selectComposite.setLayoutData(new GridData(SWT.RIGHT, SWT.BOTTOM, true,\r
+                               false, 2, 1));\r
 \r
                taxonNameText = new Text(selectComposite, SWT.BORDER);\r
                taxonNameText.setFont(SWTResourceManager.getFont("", 12, SWT.BOLD));\r
@@ -226,20 +258,21 @@ public class SelectTaxonDialog extends Dialog {
        }\r
 \r
        public void setSelectedTaxon(Taxon taxon) {\r
-               \r
+\r
                this.destinationTaxon = taxon;\r
                TaxonNameBase taxonName = taxon.getName();\r
                if (taxonName == null) {\r
                        return;\r
                }\r
-                               \r
+\r
                taxonNameText.setText(taxonName.getTitleCache());\r
-               \r
+\r
                setOkEnabled(true);\r
-       }       \r
-       \r
+       }\r
+\r
        /**\r
         * Create contents of the button bar\r
+        * \r
         * @param parent\r
         */\r
        @Override\r
@@ -254,7 +287,7 @@ public class SelectTaxonDialog extends Dialog {
        public void setOkEnabled(boolean enabled) {\r
                getButton(IDialogConstants.OK_ID).setEnabled(enabled);\r
        }\r
-       \r
+\r
        private void initButtons() {\r
                for (Button button : buttons) {\r
                        button.addSelectionListener(new SelectionAdapter() {\r
@@ -264,7 +297,7 @@ public class SelectTaxonDialog extends Dialog {
                        });\r
                }\r
        }\r
-       \r
+\r
        /**\r
         * Since buttons are not in the same layout group, the others are not\r
         * automatically deselected when one is selected. This method takes care of\r
@@ -280,7 +313,7 @@ public class SelectTaxonDialog extends Dialog {
                                button.setSelection(false);\r
                }\r
        }\r
-       \r
+\r
        /**\r
         * Return the initial size of the dialog\r
         */\r
@@ -288,16 +321,20 @@ public class SelectTaxonDialog extends Dialog {
        protected Point getInitialSize() {\r
                return new Point(700, 500);\r
        }\r
+\r
        protected void configureShell(Shell newShell) {\r
                super.configureShell(newShell);\r
-               newShell.setImage(ResourceManager.getPluginImage(TaxEditorPlugin\r
-                               .getDefault(), "icons/edit_16x16.ico"));\r
+               newShell.setImage(TaxEditorPlugin.getDefault().getImage(\r
+                               ITaxEditorConstants.EDIT_ICON));\r
                newShell.setText(shellText);\r
-       }       \r
-       \r
+       }\r
+\r
        class SelectButtonFocusListener implements FocusListener {\r
 \r
-               Button button; // the button that should be selected\r
+               /**\r
+                * The button whose group has gained focus.\r
+                */\r
+               Button button;\r
 \r
                SelectButtonFocusListener(Button button) {\r
                        this.button = button;\r
@@ -323,8 +360,11 @@ public class SelectTaxonDialog extends Dialog {
                                e.printStackTrace();\r
                                taxon = null;\r
                        }\r
-                       \r
+                       if (taxon.equals(SelectTaxonDialog.this.taxon)) {\r
+                               return;\r
+                       }\r
+\r
                        setSelectedTaxon(taxon);\r
                }\r
-       }       \r
+       }\r
 }\r