Taxonomic tree provider substantially re-programmed, cleaned up.
authorp.ciardelli <p.ciardelli@localhost>
Fri, 30 May 2008 16:02:14 +0000 (16:02 +0000)
committerp.ciardelli <p.ciardelli@localhost>
Fri, 30 May 2008 16:02:14 +0000 (16:02 +0000)
.gitattributes
eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/view/ContextMenu.java
eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/view/NameListView.java
eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/view/NameViewer.java
eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/view/SelectTaxonDialog.java
eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/view/TaxonomicTreeLabelProvider.java [new file with mode: 0644]
eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/view/TaxonomicTreeViewer.java
eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/view/nameviewersupport/NameComposite.java
eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/view/nameviewersupport/TaxonCompositeFactory.java

index 8174d795ced960a62853dff6c2c3c9bb7b94b6a4..846ba6949f338adef664cf018943afc5b0337fdc 100644 (file)
@@ -422,6 +422,7 @@ eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/view/NameViewe
 eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/view/PropertySheetViewer.java -text
 eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/view/RecentNamesTableViewer.java -text
 eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/view/SelectTaxonDialog.java -text
+eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/view/TaxonomicTreeLabelProvider.java -text
 eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/view/TaxonomicTreeViewer.java -text
 eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/view/UndoView.java -text
 eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/view/nameviewersupport/AnnotationMarkerAccess.java -text
index 5c001d92e369586004197523a06b460764af636a..49bae8eb69c34884669aab84207ee99270a3d733 100644 (file)
@@ -17,6 +17,7 @@ import org.eclipse.jface.action.Action;
 import org.eclipse.jface.action.IMenuListener;\r
 import org.eclipse.jface.action.IMenuManager;\r
 import org.eclipse.jface.action.MenuManager;\r
+import org.eclipse.jface.action.Separator;\r
 import org.eclipse.swt.widgets.Control;\r
 import org.eclipse.swt.widgets.Menu;\r
 \r
@@ -31,7 +32,7 @@ public class ContextMenu {
        private Control control;\r
        private Menu menu;\r
        private MenuManager menuManager;\r
-       private List<Action> actions;\r
+       private List actions;\r
        \r
        public ContextMenu(Control control) {\r
                this.control = control;\r
@@ -39,7 +40,7 @@ public class ContextMenu {
                createContextMenu();\r
        }\r
        \r
-       public void createContextMenu() {\r
+       private void createContextMenu() {\r
                menuManager = new MenuManager();\r
                menu = menuManager.createContextMenu(control);\r
                control.setMenu(menu);\r
@@ -47,16 +48,21 @@ public class ContextMenu {
                menuManager.setRemoveAllWhenShown(true);\r
                menuManager.addMenuListener(new IMenuListener() {\r
                        public void menuAboutToShow(IMenuManager manager) {\r
-                               for (Action action : getActions()) {\r
-                                       manager.add(action);\r
+                               for (Object action : getActions()) {\r
+                                       if (action instanceof Action) {\r
+                                               manager.add((Action) action);\r
+                                       }\r
+                                       if (action instanceof Separator) {\r
+                                               manager.add((Separator) action);\r
+                                       }\r
                                }\r
                        }\r
                });\r
        }\r
 \r
-       private List<Action> getActions() {\r
+       private List getActions() {\r
                if (actions == null) {\r
-                       actions = new ArrayList<Action>();\r
+                       actions = new ArrayList();\r
                }\r
                return actions;\r
        }\r
@@ -68,4 +74,8 @@ public class ContextMenu {
        public void removeAction(Action action) {\r
                getActions().remove(action);\r
        }\r
+       \r
+       public void addSeparator() {\r
+               getActions().add(new Separator());\r
+       }\r
 }
\ No newline at end of file
index 8ed2030eed51c2b52a0539b0aed0caaf63b55806..1882c8fc41a0ef7821196515fc548fe8d0ad65d7 100644 (file)
@@ -1,5 +1,15 @@
+/**\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
+import org.apache.log4j.Logger;\r
 import org.eclipse.jface.action.IMenuManager;\r
 import org.eclipse.jface.action.IToolBarManager;\r
 import org.eclipse.jface.viewers.TableViewer;\r
@@ -29,10 +39,14 @@ import eu.etaxonomy.taxeditor.ITaxEditorConstants;
 import eu.etaxonomy.taxeditor.TaxEditorPlugin;\r
 \r
 /**\r
+ * The left navigation pane.\r
+ * \r
  * @author p.ciardelli\r
- *\r
+ * @created 27.05.2008\r
+ * @version 1.0\r
  */\r
 public class NameListView extends ViewPart {\r
+       private static final Logger logger = Logger.getLogger(NameListView.class);\r
        \r
        private Text searchText;\r
        private Composite composite;\r
@@ -172,7 +186,6 @@ public class NameListView extends ViewPart {
                recentNamesExpandItem.setControl(recentNamesComposite);\r
 \r
                recentNamesViewer = new RecentNamesTableViewer(recentNamesComposite);\r
-//             recentNamesViewer.getTable().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));\r
        }\r
 \r
        private void createSearchComposite() {\r
index 5007d26794439ecfe90400515c2c615e71d7ae86..f5b90b972b5d1534f845f3afb3d04a30b46b06e4 100644 (file)
@@ -1,8 +1,21 @@
+/**\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
 import java.util.Iterator;\r
 \r
+import org.apache.log4j.Logger;\r
+import org.eclipse.core.runtime.Assert;\r
+import org.eclipse.jface.text.AbstractDocument;\r
 import org.eclipse.jface.text.Document;\r
+import org.eclipse.jface.text.ILineTracker;\r
 import org.eclipse.jface.text.Position;\r
 import org.eclipse.jface.text.source.Annotation;\r
 import org.eclipse.jface.text.source.AnnotationModel;\r
@@ -26,15 +39,19 @@ import eu.etaxonomy.taxeditor.view.nameviewersupport.WarningAnnotation;
  * SourceViewer implementation called by NameComposite.\r
  *  \r
  * @author p.ciardelli\r
- *\r
+ * @created 27.05.2008\r
+ * @version 1.0\r
  */\r
 public class NameViewer extends SourceViewer {\r
+       private static final Logger logger = Logger\r
+                       .getLogger(NameViewer.class);\r
+\r
                \r
        public NameViewer(Composite parent) {\r
                super(parent, null, SWT.WRAP | SWT.MULTI | SWT.RESIZE);\r
                                                        \r
                // Set name viewer's text to name cache\r
-               this.setDocument(new Document(""), new AnnotationModel());\r
+               this.setDocument(new NameViewerDocument(""), new AnnotationModel());\r
 \r
                // Lay out StyledText\r
                StyledText textWidget = this.getTextWidget();\r
@@ -74,10 +91,14 @@ public class NameViewer extends SourceViewer {
                }\r
                \r
                if (hasProblem && text.length() > 0) {\r
+                       logger.warn(text.length());\r
                        this.getAnnotationModel().addAnnotation(\r
                                        new ErrorAnnotation(0, "Could not parse."), \r
                                        new Position(0, text.length()));\r
                }\r
+               \r
+//             ILineTracker tracker = ((NameViewerDocument) this.getDocument()).getTracker();\r
+//             tracker.\r
        }\r
        \r
        public void setLineBreakListener(LineBreakListener lineBreakListener) {\r
@@ -98,4 +119,14 @@ public class NameViewer extends SourceViewer {
        public void setCursorToEOL() {\r
                this.getTextWidget().setCaretOffset(getTextWidget().getText().length());\r
        }\r
+       \r
+       class NameViewerDocument extends Document {\r
+               public NameViewerDocument(String string) {\r
+                       super(string);\r
+               }\r
+\r
+               public ILineTracker getTracker() {\r
+                       return super.getTracker();\r
+               }       \r
+       }\r
 }
\ No newline at end of file
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
diff --git a/eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/view/TaxonomicTreeLabelProvider.java b/eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/view/TaxonomicTreeLabelProvider.java
new file mode 100644 (file)
index 0000000..e8bd46a
--- /dev/null
@@ -0,0 +1,67 @@
+/**\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
+import org.apache.log4j.Logger;\r
+import org.eclipse.core.databinding.beans.BeansObservables;\r
+import org.eclipse.core.databinding.observable.set.IObservableSet;\r
+import org.eclipse.jface.databinding.viewers.ObservableMapLabelProvider;\r
+import org.eclipse.swt.graphics.Image;\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
+ * @author p.ciardelli\r
+ * @created 29.05.2008\r
+ * @version 1.0\r
+ */\r
+public class TaxonomicTreeLabelProvider extends ObservableMapLabelProvider {\r
+       private static final Logger logger = Logger\r
+                       .getLogger(TaxonomicTreeLabelProvider.class);\r
+       \r
+       public TaxonomicTreeLabelProvider(IObservableSet observableTaxonSet) {\r
+               super(BeansObservables.observeMaps(\r
+                               observableTaxonSet, \r
+                               Taxon.class, new String[]{"name"}));\r
+       }\r
+       \r
+       /** \r
+        * \r
+        * @see org.eclipse.jface.databinding.viewers.ObservableMapLabelProvider#getColumnImage(java.lang.Object, int)\r
+        **/\r
+       public Image getColumnImage(Object element, int columnIndex) {\r
+               if (element instanceof Taxon) {\r
+                       TaxonNameBase name = ((Taxon) element).getName();\r
+                       if (name != null && name.getHasProblem()) {\r
+                               return TaxEditorPlugin.getDefault().getImage(ITaxEditorConstants.WARNING_ICON);\r
+                       }\r
+               }\r
+               return null;\r
+       }\r
+       /**\r
+        * JFace databinding syntax makes it to difficult to retrieve\r
+        *      Taxon.getName().getNameCache, so override function that returns\r
+        *  label\r
+        * \r
+        *  (non-Javadoc)\r
+        * @see org.eclipse.jface.databinding.viewers.ObservableMapLabelProvider#getColumnText(java.lang.Object, int)\r
+        **/\r
+       public String getColumnText(Object element, int columnIndex) {\r
+               if (element instanceof Taxon) {\r
+                       return CdmUtil.getDisplayName((Taxon) element);                                 \r
+               }\r
+               return "";\r
+       }                       \r
+\r
+}\r
index 0892e84828ca53de684601be43db3b92c53533a8..98e0679d8ba83a426d96ba7c0db518db6c82672d 100644 (file)
@@ -12,12 +12,14 @@ package eu.etaxonomy.taxeditor.view;
 import org.apache.log4j.Logger;\r
 import org.eclipse.core.databinding.beans.BeansObservables;\r
 import org.eclipse.core.databinding.observable.map.IObservableMap;\r
+import org.eclipse.core.databinding.observable.set.IObservableSet;\r
 import org.eclipse.jface.databinding.viewers.ObservableListContentProvider;\r
 import org.eclipse.jface.databinding.viewers.ObservableMapLabelProvider;\r
 import org.eclipse.jface.viewers.CellEditor;\r
 import org.eclipse.jface.viewers.DoubleClickEvent;\r
 import org.eclipse.jface.viewers.ICellEditorListener;\r
 import org.eclipse.jface.viewers.ICellModifier;\r
+import org.eclipse.jface.viewers.IContentProvider;\r
 import org.eclipse.jface.viewers.IDoubleClickListener;\r
 import org.eclipse.jface.viewers.StructuredSelection;\r
 import org.eclipse.jface.viewers.TextCellEditor;\r
@@ -56,20 +58,20 @@ import org.eclipse.ui.PlatformUI;
 \r
 import com.swtdesigner.ResourceManager;\r
 \r
-import eu.etaxonomy.cdm.model.name.NonViralName;\r
 import eu.etaxonomy.cdm.model.name.TaxonNameBase;\r
 import eu.etaxonomy.cdm.model.taxon.Taxon;\r
 import eu.etaxonomy.cdm.model.taxon.TaxonBase;\r
-import eu.etaxonomy.cdm.strategy.parser.NonViralNameParserImpl;\r
 import eu.etaxonomy.taxeditor.TaxEditorPlugin;\r
 import eu.etaxonomy.taxeditor.actions.ActionAddQuickName;\r
 import eu.etaxonomy.taxeditor.actions.ActionDeleteTaxon;\r
 import eu.etaxonomy.taxeditor.actions.ActionMoveTaxon;\r
 import eu.etaxonomy.taxeditor.actions.ActionOpenNameEditor;\r
 import eu.etaxonomy.taxeditor.actions.ActionOpenNewChildNameEditor;\r
-import eu.etaxonomy.taxeditor.actions.ActionRemoveTaxonFromTree;\r
 import eu.etaxonomy.taxeditor.actions.ActionSaveTaxon;\r
 import eu.etaxonomy.taxeditor.actions.TaxonTransfer;\r
+import eu.etaxonomy.taxeditor.model.CdmUtil;\r
+import eu.etaxonomy.taxeditor.model.NameTreeContentProvider;\r
+import eu.etaxonomy.taxeditor.model.TaxonomicTreeContentProvider;\r
 /**\r
  * Taxon tree viewer which responds to events within individual taxa.\r
  * \r
@@ -95,11 +97,11 @@ public class TaxonomicTreeViewer extends TreeViewer {
                // SW.VIRTUAL causes nodes to be loaded on-demand, improving performance\r
                super(parent, SWT.VIRTUAL);\r
 \r
-               // Tree settings\r
-               final Tree tree = this.getTree();\r
+               tree = this.getTree();\r
                tree.setLinesVisible(false);\r
                tree.setHeaderVisible(false);\r
                \r
+               \r
                createContent();        \r
 //             createDoubleClickListener();\r
 //             createRightClickListener();\r
@@ -257,16 +259,35 @@ public class TaxonomicTreeViewer extends TreeViewer {
                final Tree tree = this.getTree();\r
                final TextCellEditor taxTreeNodeEditor = new TextCellEditor(tree);\r
                taxTreeNodeEditor.addListener(new ICellEditorListener() {\r
-                       public void applyEditorValue() {}\r
+                       public void applyEditorValue() {\r
+                               Object value = taxTreeNodeEditor.getValue();\r
+                               if (value instanceof String) {\r
+                                       String trimmedValue = ((String) value).trim(); \r
+                                       Taxon taxon = (Taxon) tree.getSelection()[0].getData();\r
+                                       \r
+                                       if (trimmedValue.length() == 0) {\r
+                                               TaxEditorPlugin.getDefault().removeSessionTaxon(taxon);\r
+                                               // Hack: for some reason, viewer isn't refreshing after the\r
+                                               //  session taxa listener fires remove item\r
+                                               TaxonomicTreeViewer.this.refresh();\r
+                                       } else {\r
+                                               taxon.setName(CdmUtil.parseFullReference(trimmedValue, null, null));\r
+                                               new ActionSaveTaxon(taxon).run();\r
+                                       }\r
+                               }\r
+                       }\r
                        public void cancelEditor() {\r
-                               // user has pressed ESC - transfer focus to parent item,\r
-                               //  remove taxon from tree\r
+                               // User has pressed ESC - remove taxon from tree\r
                                Taxon taxon = (Taxon) tree.getSelection()[0].getData();\r
-                               tree.setSelection(tree.getSelection()[0].getParentItem());\r
-                               new ActionRemoveTaxonFromTree(taxon).run();\r
+                               TaxEditorPlugin.getDefault().removeSessionTaxon(taxon);\r
+                               // Hack: for some reason, viewer isn't refreshing after the\r
+                               //  session taxa listener fires remove item\r
+                               TaxonomicTreeViewer.this.refresh();\r
                        }\r
                        public void editorValueChanged(boolean oldValidState,\r
-                                       boolean newValidState) {}\r
+                                       boolean newValidState) {\r
+                               logger.warn("ICellEditorListener.editorValueChanged()");\r
+                       }\r
                });\r
                \r
                this.setCellEditors(new CellEditor[] {taxTreeNodeEditor});\r
@@ -275,8 +296,11 @@ public class TaxonomicTreeViewer extends TreeViewer {
                        public boolean canModify(Object element, String property) {\r
                                // If name element has not been initialized,\r
                                //  this is a taxon added with QuickAdd\r
-                               if (((Taxon) element).getName().getTitleCache() == null) {\r
-                                       return true;\r
+                               if (element instanceof Taxon) {\r
+                                       Taxon taxon = (Taxon) element;\r
+                                       if (taxon.getName() == null) {\r
+                                               return true;\r
+                                       }\r
                                }\r
                                return false;\r
                        }\r
@@ -284,28 +308,7 @@ public class TaxonomicTreeViewer extends TreeViewer {
                                // If this node is editable, TitleCache is by definition empty\r
                                return "";\r
                        }\r
-                       public void modify(Object element, String property, Object value) {\r
-                               \r
-                               // Get Taxon object from TreeItem\r
-                               Taxon taxon = (Taxon)((Item) element).getData();\r
-                               \r
-                               String name = ((String) value).trim(); \r
-                               if (name.equals("")) {\r
-                                       // Remove temporary Taxon from tree\r
-                                       tree.setSelection(tree.getSelection()[0].getParentItem());\r
-                                       new ActionRemoveTaxonFromTree(taxon).run();     \r
-                                       \r
-                               } else {\r
-                                       // Set Taxon's TitleCache, save it to CDM\r
-//                                     taxon.getName().setTitleCache((String) value);\r
-                                       NonViralNameParserImpl parser = NonViralNameParserImpl.NewInstance();\r
-                                       NonViralName nonViralName = (NonViralName) taxon.getName();\r
-                                       if (nonViralName != null) {\r
-                                               parser.parseFullName(nonViralName, (String) value, null, true);\r
-                                       }\r
-                                       new ActionSaveTaxon(taxon).run();\r
-                               }\r
-                       }\r
+                       public void modify(Object element, String property, Object value) {}\r
                });\r
                \r
        }\r
@@ -399,45 +402,21 @@ public class TaxonomicTreeViewer extends TreeViewer {
         */\r
        private void createContent() {\r
                // Use custom content provider extended to add tree node retrieval\r
-//             ObservableListContentProvider viewerContentProviderList = new NameTreeContentProvider();\r
-               ObservableListContentProvider viewerContentProviderList = TaxEditorPlugin.getDefault().getNameTreeContentProvider();\r
+               IContentProvider viewerContentProviderList = new TaxonomicTreeContentProvider();\r
                this.setContentProvider(viewerContentProviderList);\r
                                \r
-               // Label provider that listens for changes to name cache\r
-               IObservableMap[] viewerLabelProviderMaps = BeansObservables.observeMaps(viewerContentProviderList.getKnownElements(), \r
-                               Taxon.class, new String[]{"name"});\r
-               this.setLabelProvider(new ObservableMapLabelProvider(viewerLabelProviderMaps) {\r
-                       /* \r
-                        * TODO only show warning if there is something taxonomically amiss \r
-                        * \r
-                        * @see org.eclipse.jface.databinding.viewers.ObservableMapLabelProvider#getColumnImage(java.lang.Object, int)\r
-                        */\r
-                       public Image getColumnImage(Object element, int columnIndex) {\r
-                               if (((Taxon) element).getName().getHasProblem())\r
-                                       return ResourceManager.getPluginImage(TaxEditorPlugin.getDefault(), "icons/warn_tsk.gif");\r
-                               return null;\r
-                       }\r
-                       /*\r
-                        * JFace databinding syntax makes it to difficult to retrieve\r
-                        *      Taxon.getName().getNameCache, so override function that returns\r
-                        *  label\r
-                        * \r
-                        *  (non-Javadoc)\r
-                        * @see org.eclipse.jface.databinding.viewers.ObservableMapLabelProvider#getColumnText(java.lang.Object, int)\r
-                        */\r
-                       public String getColumnText(Object element, int columnIndex) {\r
-                               return ((Taxon) element).getName().getTitleCache();\r
-                       }                               \r
-               });\r
+               // Label provider that listens for changes to name cache                \r
+               IObservableSet observableTaxonSet = TaxEditorPlugin.getDefault().getObservableSessionTaxa();\r
+               this.setLabelProvider(new TaxonomicTreeLabelProvider(observableTaxonSet));\r
                \r
                // TaxonTreeList added to every time a node is opened with its\r
                //  children, or when a new taxon is added\r
-               this.setInput(TaxEditorPlugin.getDefault().getObservableTaxonTreeList());\r
+               this.setInput(TaxEditorPlugin.getDefault().getSessionRootTaxa());\r
                \r
                // Sort according to "getColumnText" above, i.e. by NameCache\r
                this.setComparator(new ViewerComparator());\r
-       }\r
-\r
+       }       \r
+       \r
        /**\r
         * If taxon node in the tree is hidden, open and select it\r
         * \r
@@ -524,5 +503,7 @@ public class TaxonomicTreeViewer extends TreeViewer {
                                }\r
                        }\r
                }\r
-       };      \r
+       };\r
+\r
+       private Tree tree;      \r
 }
\ No newline at end of file
index 278fc73a3656054903cba00930b402dd1dc6c626..4a7dcc23fe571150f579c4c7f0a673f5b973a93f 100644 (file)
@@ -1,39 +1,32 @@
 package eu.etaxonomy.taxeditor.view.nameviewersupport;\r
 \r
-import java.util.Set;\r
-\r
-import org.eclipse.swt.SWT;\r
 import org.eclipse.swt.graphics.Font;\r
 import org.eclipse.swt.graphics.Image;\r
 import org.eclipse.swt.widgets.Composite;\r
 \r
-import com.swtdesigner.SWTResourceManager;\r
-\r
-import eu.etaxonomy.cdm.model.name.NameRelationship;\r
-import eu.etaxonomy.cdm.model.name.NameRelationshipType;\r
-import eu.etaxonomy.cdm.model.taxon.Synonym;\r
 import eu.etaxonomy.taxeditor.ITaxEditorConstants;\r
 import eu.etaxonomy.taxeditor.TaxEditorPlugin;\r
 \r
 public class NameComposite extends EditableGroupedComposite {\r
                \r
+       // TODO is there any reason not to get these directly from Plugin\r
        public static final int ACCEPTED_INDENT = 0;\r
        public static final int SYNONYM_INDENT = 15;\r
        public static final int MISAPPLIEDNAME_INDENT = 15;\r
        \r
-       public static final Font ACCEPTED_FONT = SWTResourceManager.getFont("Georgia", 12, SWT.NONE);\r
-       public static final Font SYNONYM_FONT = SWTResourceManager.getFont("Georgia", 10, SWT.NONE);\r
-       public static final Font MISAPPLIEDNAME_FONT = SWTResourceManager.getFont("Georgia", 10, SWT.NONE);;\r
+       public static final Font ACCEPTED_FONT = TaxEditorPlugin.getDefault().getFont(ITaxEditorConstants.ACCEPTED_TAXON_FONT);\r
+       public static final Font SYNONYM_FONT = TaxEditorPlugin.getDefault().getFont(ITaxEditorConstants.SYNONYM_FONT);\r
+       public static final Font MISAPPLIEDNAME_FONT = TaxEditorPlugin.getDefault().getFont(ITaxEditorConstants.MISAPPLIEDNAME_FONT);\r
        \r
-       public static final Image ACCEPTED_ICON = TaxEditorPlugin.getDefault().getImageRegistry().get(ITaxEditorConstants.ACCEPTED_TAXON_ICON);\r
-       public static final Image HOMOTYPIC_SYNONYM_ICON = TaxEditorPlugin.getDefault().getImageRegistry().get(ITaxEditorConstants.HOMOTYPIC_SYN_ICON);\r
-       public static final Image HOMOTYPIC_SYNONYM_ORIGINAL_COMBINATION_ICON = TaxEditorPlugin.getDefault().getImageRegistry().get(ITaxEditorConstants.HOMOTYPIC_SYN_ORIGINAL_ICON);\r
-       public static final Image HETEROTYPIC_SYNONYM_ICON = TaxEditorPlugin.getDefault().getImageRegistry().get(ITaxEditorConstants.HETEROTYPIC_SYN_ICON);\r
-       public static final Image HETEROTYPIC_SYNONYM_ORIGINAL_COMBINATION_ICON = TaxEditorPlugin.getDefault().getImageRegistry().get(ITaxEditorConstants.HETEROTYPIC_SYN_ORIGINAL_ICON);\r
-       public static final Image MISAPPLIEDNAME_ICON = TaxEditorPlugin.getDefault().getImageRegistry().get(ITaxEditorConstants.MISAPPLIED_NAME_ICON);\r
-       public static final Image AUTONYM_ICON = TaxEditorPlugin.getDefault().getImageRegistry().get(ITaxEditorConstants.AUTONYM_ICON);\r
-       public static final Image BASIONYM_ICON = TaxEditorPlugin.getDefault().getImageRegistry().get(ITaxEditorConstants.BASIONYM_ICON);\r
-       public static final Image MOVE = TaxEditorPlugin.getDefault().getImageRegistry().get(ITaxEditorConstants.MOVE_ICON);\r
+       public static final Image ACCEPTED_ICON = TaxEditorPlugin.getDefault().getImage(ITaxEditorConstants.ACCEPTED_TAXON_ICON);\r
+       public static final Image HOMOTYPIC_SYNONYM_ICON = TaxEditorPlugin.getDefault().getImage(ITaxEditorConstants.HOMOTYPIC_SYN_ICON);\r
+       public static final Image HOMOTYPIC_SYNONYM_ORIGINAL_COMBINATION_ICON = TaxEditorPlugin.getDefault().getImage(ITaxEditorConstants.HOMOTYPIC_SYN_ORIGINAL_ICON);\r
+       public static final Image HETEROTYPIC_SYNONYM_ICON = TaxEditorPlugin.getDefault().getImage(ITaxEditorConstants.HETEROTYPIC_SYN_ICON);\r
+       public static final Image HETEROTYPIC_SYNONYM_ORIGINAL_COMBINATION_ICON = TaxEditorPlugin.getDefault().getImage(ITaxEditorConstants.HETEROTYPIC_SYN_ORIGINAL_ICON);\r
+       public static final Image MISAPPLIEDNAME_ICON = TaxEditorPlugin.getDefault().getImage(ITaxEditorConstants.MISAPPLIED_NAME_ICON);\r
+       public static final Image AUTONYM_ICON = TaxEditorPlugin.getDefault().getImage(ITaxEditorConstants.AUTONYM_ICON);\r
+       public static final Image BASIONYM_ICON = TaxEditorPlugin.getDefault().getImage(ITaxEditorConstants.BASIONYM_ICON);\r
+       public static final Image MOVE = TaxEditorPlugin.getDefault().getImage(ITaxEditorConstants.MOVE_ICON);\r
        \r
        public NameComposite(Composite parent) {\r
                super(parent);\r
index d64561b2a3f48ec9f23436c742e2a3998ecb7134..ec644c4b451353a50c14e40f751401373cb37946 100644 (file)
@@ -30,14 +30,12 @@ import org.eclipse.ui.forms.IManagedForm;
 import org.eclipse.ui.views.properties.IPropertySource;\r
 \r
 import eu.etaxonomy.cdm.model.name.HomotypicalGroup;\r
-import eu.etaxonomy.cdm.model.name.NomenclaturalCode;\r
 import eu.etaxonomy.cdm.model.name.NonViralName;\r
 import eu.etaxonomy.cdm.model.name.TaxonNameBase;\r
 import eu.etaxonomy.cdm.model.taxon.Synonym;\r
 import eu.etaxonomy.cdm.model.taxon.SynonymRelationship;\r
 import eu.etaxonomy.cdm.model.taxon.Taxon;\r
 import eu.etaxonomy.cdm.model.taxon.TaxonBase;\r
-import eu.etaxonomy.cdm.strategy.parser.NonViralNameParserImpl;\r
 import eu.etaxonomy.taxeditor.ITaxEditorConstants;\r
 import eu.etaxonomy.taxeditor.actions.ChangeTaxonToSynonymAction;\r
 import eu.etaxonomy.taxeditor.actions.cdm.AddBasionymAction;\r
@@ -407,10 +405,13 @@ public class TaxonCompositeFactory {
                                                }\r
                                        }\r
                                });\r
-\r
+               \r
+               contextMenu.addSeparator();\r
+               \r
                if (!CdmUtil.isSynonymBasionym(taxon, synonym)) {\r
                        Action addBasionymAction = new AddBasionymAction(synonym.getName(),\r
                                        taxon);\r
+                       addBasionymAction.setEnabled(false);\r
                        contextMenu.addAction(addBasionymAction);\r
                        addBasionymAction\r
                                        .addPropertyChangeListener(new IPropertyChangeListener() {\r
@@ -486,11 +487,7 @@ public class TaxonCompositeFactory {
 \r
                        @Override\r
                        public void handleSplitText(String text) {\r
-                               NonViralNameParserImpl parser = NonViralNameParserImpl\r
-                                               .NewInstance();\r
-                               NomenclaturalCode nomCode = null;\r
-                               NonViralName name = parser.parseFullReference(text, nomCode,\r
-                                               null);\r
+                               NonViralName name = (NonViralName) CdmUtil.parseFullReference(text, null, null);\r
 \r
                                SynonymRelationship synonymRelation = taxon\r
                                                .addHeterotypicSynonymName(name);\r
@@ -510,11 +507,9 @@ public class TaxonCompositeFactory {
 \r
                                TaxonBase taxonBase = (TaxonBase) nameComposite.getData();\r
 \r
-                               NonViralNameParserImpl parser = NonViralNameParserImpl\r
-                                               .NewInstance();\r
                                NonViralName nonViralName = (NonViralName) taxonBase.getName();\r
                                if (nonViralName != null) {\r
-                                       parser.parseFullName(nonViralName, text, null, true);\r
+                                       CdmUtil.parseFullName(nonViralName, text, null, true);\r
                                        nameViewer.setShowError(nonViralName.getHasProblem());\r
                                }\r
                        }\r