Taxonomic tree and recent name data binding works, including for adding taxonomic...
[taxeditor.git] / eclipseprojects / eu.etaxonomy.taxeditor.prototype2 / src / eu / etaxonomy / taxeditor / prototype2 / view / NameEditorView.java
index 10cee8fab631fbda12a3604381c3b37c9dbaecc1..48b18b1644386ffeb611e5d9c54e4e281b325ce6 100644 (file)
@@ -1,8 +1,11 @@
 package eu.etaxonomy.taxeditor.prototype2.view;\r
 \r
 import java.beans.IntrospectionException;\r
+import java.beans.PropertyChangeEvent;\r
+import java.beans.PropertyChangeListener;\r
 import java.beans.PropertyDescriptor;\r
 import java.lang.reflect.InvocationTargetException;\r
+import java.lang.reflect.Method;\r
 import java.util.ArrayList;\r
 import java.util.List;\r
 \r
@@ -52,13 +55,18 @@ import org.eclipse.ui.IEditorInput;
 import org.eclipse.ui.IEditorSite;\r
 import org.eclipse.ui.PartInitException;\r
 import org.eclipse.ui.part.EditorPart;\r
+import org.eclipse.ui.part.WorkbenchPart;\r
 \r
 import com.swtdesigner.ResourceManager;\r
 import com.swtdesigner.SWTResourceManager;\r
 \r
 import eu.etaxonomy.cdm.model.name.BotanicalName;\r
+import eu.etaxonomy.cdm.model.name.NameRelationshipType;\r
 import eu.etaxonomy.cdm.model.name.TaxonNameBase;\r
+import eu.etaxonomy.cdm.model.taxon.SynonymRelationship;\r
+import eu.etaxonomy.cdm.model.taxon.SynonymRelationshipType;\r
 import eu.etaxonomy.cdm.model.taxon.Taxon;\r
+import eu.etaxonomy.cdm.model.taxon.TaxonRelationship;\r
 import eu.etaxonomy.taxeditor.prototype2.Activator;\r
 import eu.etaxonomy.taxeditor.prototype2.controller.DeleteTaxonAction;\r
 import eu.etaxonomy.taxeditor.prototype2.controller.OpenNameEditorAction;\r
@@ -79,7 +87,6 @@ import eu.etaxonomy.taxeditor.prototype2.view.propertysheetsupport.PropertySheet
 import eu.etaxonomy.taxeditor.prototype2.view.propertysheetsupport.PropertySheetValueLabelProvider;\r
 \r
 public class NameEditorView extends EditorPart {\r
-       \r
        /**\r
         * The taxon the editor is editing \r
         */\r
@@ -88,6 +95,21 @@ public class NameEditorView extends EditorPart {
         * The higher taxon of the taxon the editor is editing \r
         */\r
        private Taxon higherTaxon = null;\r
+       /**\r
+        * The workbench part that contains this editor, \r
+        *  i.e. MultiPageTaxonView \r
+        */\r
+       private WorkbenchPart parentPart = null;        \r
+       /**\r
+        * Shared listener that sets dirty state to true \r
+        *  when any registered property changes \r
+        */\r
+       private PropertyChangeListener taxonChangeListener = new PropertyChangeListener() {\r
+               public void propertyChange(PropertyChangeEvent arg0) {\r
+                       dirtyBoy = true;\r
+                       firePropertyChange(PROP_DIRTY);\r
+               }\r
+       };      \r
        /**\r
         * Arrays for the creation of synonyms - text and images \r
         */\r
@@ -109,10 +131,10 @@ public class NameEditorView extends EditorPart {
                        "orthovariant_no_bg.gif",\r
                        "misapplied_no_bg.gif",\r
                        "concept_no_bg.gif"};\r
-       /*\r
-        * Annotation model\r
+       String [] conceptTypes = {"congruent","included in","includes","overlaps","excludes","doubtful"};\r
+       /**\r
+        * If true, show "save" prompt before closing editor \r
         */\r
-    private AnnotationModel fAnnotationModel = new AnnotationModel();\r
        public boolean dirtyBoy = false;\r
        String clickText;\r
        \r
@@ -123,13 +145,19 @@ public class NameEditorView extends EditorPart {
        \r
        public static final String ID = "eu.etaxonomy.taxeditor.prototype2.view.nameeditorview"; //$NON-NLS-1$\r
 \r
+       public NameEditorView() {\r
+               \r
+       }\r
+       public NameEditorView(WorkbenchPart parentPart) {\r
+               this.parentPart = parentPart;\r
+       }\r
        /**\r
         * Create contents of the editor part\r
         * @param parent\r
         */\r
        @Override\r
        public void createPartControl(Composite parent) {\r
-       \r
+                               \r
                parent.setLayout(new GridLayout());\r
                parent.setRedraw(true);\r
                                \r
@@ -163,30 +191,28 @@ public class NameEditorView extends EditorPart {
 //             toolBar.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_GRAY));\r
 \r
                final ToolItem itemSave = new ToolItem(toolBar, SWT.PUSH);\r
-//             final CoolItem itemSave = new CoolItem(coolBar, SWT.PUSH);              \r
-//             itemSave.setToolTipText("Save taxon \"" + taxon.getName().getNameCache() + "\"");\r
                itemSave.setToolTipText("Save taxon");\r
                itemSave.setImage(ResourceManager.getPluginImage(Activator.getDefault(), "icons/save_edit.gif"));\r
                itemSave.addSelectionListener(new SelectionListener() {\r
                        public void widgetDefaultSelected(SelectionEvent e) {\r
+                               dirtyBoy = false;\r
                                new SaveTaxonAction(taxon).run();\r
                        }\r
                        public void widgetSelected(SelectionEvent e) {\r
+                               dirtyBoy = false;\r
                                new SaveTaxonAction(taxon).run();\r
                        }\r
                });\r
 \r
                final ToolItem itemMove = new ToolItem(toolBar, SWT.DROP_DOWN);\r
-//             itemMove.setToolTipText("Move taxon \"" + taxon.getName().getNameCache() + "\"");\r
                itemMove.setToolTipText("Move taxon");\r
                \r
                final Menu menuMove = new Menu(toolBar);\r
                addDropDown(itemMove, menuMove);\r
 \r
-               final MenuItem moveTaxonpilosellaMenuItem = new MenuItem(menuMove, SWT.NONE);\r
-//             moveTaxonpilosellaMenuItem.setText("Move taxon \"" + taxon.getName().getNameCache() + "\" to another higher taxon");\r
-               moveTaxonpilosellaMenuItem.setText("Move taxon to another higher taxon");\r
-               moveTaxonpilosellaMenuItem.addSelectionListener(new SelectionAdapter() {\r
+               final MenuItem moveTaxonMenuItem = new MenuItem(menuMove, SWT.NONE);\r
+               moveTaxonMenuItem.setText("Move taxon to another higher taxon");\r
+               moveTaxonMenuItem.addSelectionListener(new SelectionAdapter() {\r
                        public void widgetSelected(final SelectionEvent e) {\r
                                new MoveDialogView(getSite().getShell());                               \r
                                MoveDialogView dialog = new MoveDialogView(getSite().getShell());\r
@@ -194,11 +220,10 @@ public class NameEditorView extends EditorPart {
                        }\r
                });\r
 \r
-               final MenuItem turnTaxonpilosellaMenuItem = new MenuItem(menuMove, SWT.NONE);\r
-               turnTaxonpilosellaMenuItem.setSelection(true);\r
-//             turnTaxonpilosellaMenuItem.setText("Turn taxon \"" + taxon.getName().getNameCache() + "\" into a synonym");\r
-               turnTaxonpilosellaMenuItem.setText("Turn taxon's accepted name into a synonym");                \r
-               turnTaxonpilosellaMenuItem.addSelectionListener(new SelectionAdapter() {\r
+               final MenuItem taxonToSynonymMenuItem = new MenuItem(menuMove, SWT.NONE);\r
+               taxonToSynonymMenuItem.setSelection(true);\r
+               taxonToSynonymMenuItem.setText("Turn taxon's accepted name into a synonym");            \r
+               taxonToSynonymMenuItem.addSelectionListener(new SelectionAdapter() {\r
                        public void widgetSelected(final SelectionEvent e) {\r
                                new MoveDialogView(getSite().getShell());                               \r
                                MoveDialogView dialog = new MoveDialogView(getSite().getShell());\r
@@ -209,7 +234,6 @@ public class NameEditorView extends EditorPart {
                itemMove.setImage(ResourceManager.getPluginImage(Activator.getDefault(), "icons/correction_change.gif"));\r
 \r
                final ToolItem itemDelete = new ToolItem(toolBar, SWT.NONE);\r
-//             itemDelete.setToolTipText("Delete taxon \"" + taxon.getName().getNameCache() + "\"");\r
                itemDelete.setToolTipText("Delete taxon");\r
                itemDelete.setImage(ResourceManager.getPluginImage(Activator.getDefault(), "icons/delete_edit.gif"));\r
                itemDelete.addSelectionListener(new SelectionListener() {\r
@@ -226,8 +250,6 @@ public class NameEditorView extends EditorPart {
                final ToolItem separator1 = new ToolItem(toolBar, SWT.SEPARATOR);\r
 \r
                final ToolItem itemAddRelationship = new ToolItem(toolBar, SWT.DROP_DOWN);\r
-//             itemAddRelationship.setToolTipText("Add nom. or tax. relation to \"" + \r
-//                             taxon.getName().getNameCache() + "\"");\r
                itemAddRelationship.setToolTipText("Add nom. or tax. relation to taxon");               \r
                itemAddRelationship.setImage(ResourceManager.getPluginImage(Activator.getDefault(), "icons/rel_no_bg.gif"));\r
 \r
@@ -235,73 +257,35 @@ public class NameEditorView extends EditorPart {
                 * Create menu to add relations to the taxon\r
                 */\r
                final Menu menuAddRel = new Menu(toolBar);\r
-//             menuAddRel.setData("x", null);\r
                addDropDown(itemAddRelationship, menuAddRel);\r
 \r
-//             for (int i= 0; i < relTypes.length; i++) {\r
-//                     final MenuItem menuItem = new MenuItem(menuAddRel, SWT.NONE);\r
-//                     menuItem.setImage(ResourceManager.getPluginImage(Activator.getDefault(), "icons/" + relImgs[i]));\r
-//                     menuItem.setText("Add " + relTypes[i]);\r
-//             }\r
-               \r
-               final MenuItem testMenuItem = new MenuItem(menuAddRel, SWT.NONE);\r
-               testMenuItem.setImage(ResourceManager.getPluginImage(Activator.getDefault(), "icons/unknown_no_bg.gif"));\r
-               testMenuItem.setText("Add synonym (type unknown)");\r
-\r
-               final MenuItem addHomotypicSynonymMenuItem = new MenuItem(menuAddRel, SWT.NONE);\r
-               addHomotypicSynonymMenuItem.setImage(ResourceManager.getPluginImage(Activator.getDefault(), "icons/homosyn_no_bg.gif"));\r
-               addHomotypicSynonymMenuItem.setText("Add homotypic synonym");\r
-\r
-               final MenuItem addHeterotypicSynoynmMenuItem = new MenuItem(menuAddRel, SWT.NONE);\r
-               addHeterotypicSynoynmMenuItem.setImage(ResourceManager.getPluginImage(Activator.getDefault(), "icons/heterosyn_no_bg.gif"));\r
-               addHeterotypicSynoynmMenuItem.setText("Add heterotypic synoynm");\r
-\r
-               final MenuItem addBasionymMenuItem = new MenuItem(menuAddRel, SWT.NONE);\r
-               addBasionymMenuItem.setImage(ResourceManager.getPluginImage(Activator.getDefault(), "icons/basionym_no_bg.gif"));\r
-               addBasionymMenuItem.setText("Add basionym");\r
-\r
-               final MenuItem addReplacedSynonymMenuItem = new MenuItem(menuAddRel, SWT.NONE);\r
-               addReplacedSynonymMenuItem.setImage(ResourceManager.getPluginImage(Activator.getDefault(), "icons/repsyn_no_bg.gif"));\r
-               addReplacedSynonymMenuItem.setText("Add replaced synonym");\r
-\r
-               final MenuItem addHomonymMenuItem = new MenuItem(menuAddRel, SWT.NONE);\r
-               addHomonymMenuItem.setImage(ResourceManager.getPluginImage(Activator.getDefault(), "icons/homonym_no_bg.gif"));\r
-               addHomonymMenuItem.setText("Add homonym");\r
-\r
-               final MenuItem addOrthographicVariantMenuItem = new MenuItem(menuAddRel, SWT.NONE);\r
-               addOrthographicVariantMenuItem.setImage(ResourceManager.getPluginImage(Activator.getDefault(), "icons/orthovariant_no_bg.gif"));\r
-               addOrthographicVariantMenuItem.setText("Add orthographic variant");\r
-\r
-               final MenuItem addMisappliedNameMenuItem = new MenuItem(menuAddRel, SWT.NONE);\r
-               addMisappliedNameMenuItem.setImage(ResourceManager.getPluginImage(Activator.getDefault(), "icons/misapplied_no_bg.gif"));\r
-               addMisappliedNameMenuItem.setText("Add misapplied name");\r
-\r
-               final MenuItem addConceptRelationMenuItem_1 = new MenuItem(menuAddRel, SWT.CASCADE);\r
-               addConceptRelationMenuItem_1.setImage(ResourceManager.getPluginImage(Activator.getDefault(), "icons/concept_no_bg.gif"));\r
-               addConceptRelationMenuItem_1.setText("Add concept relation");\r
-\r
-               final Menu menu = new Menu(addConceptRelationMenuItem_1);\r
-               addConceptRelationMenuItem_1.setMenu(menu);\r
-\r
-               final MenuItem checkboxMenuItem = new MenuItem(menu, SWT.CHECK);\r
-               checkboxMenuItem.setText("congruent");\r
-\r
-               final MenuItem checkboxMenuItem_1 = new MenuItem(menu, SWT.CHECK);\r
-               checkboxMenuItem_1.setSelection(true);\r
-               checkboxMenuItem_1.setText("included in");\r
-\r
-               final MenuItem checkboxMenuItem_2 = new MenuItem(menu, SWT.CHECK);\r
-               checkboxMenuItem_2.setText("includes");\r
-\r
-               final MenuItem checkboxMenuItem_3 = new MenuItem(menu, SWT.CHECK);\r
-               checkboxMenuItem_3.setText("overlaps");\r
-\r
-               final MenuItem checkboxMenuItem_4 = new MenuItem(menu, SWT.CHECK);\r
-               checkboxMenuItem_4.setText("excludes");\r
+               for (int i = 0; i < relTypes.length; i++) {\r
+                       final MenuItem menuItem;\r
+                       if (relTypes[i].contains("concept")) {\r
+                               menuItem = new MenuItem(menuAddRel, SWT.CASCADE);\r
+                               \r
+                               final Menu conceptMenu = new Menu(menuItem);\r
+                               menuItem.setMenu(conceptMenu);\r
+                               \r
+                               for (int j = 0; j < conceptTypes.length; j++) {\r
+                                       final MenuItem conceptMenuItem = new MenuItem(conceptMenu, SWT.CHECK);\r
+                                       conceptMenuItem.setText(conceptTypes[j]);\r
+                               }       \r
+                       } else {\r
+                               menuItem = new MenuItem(menuAddRel, SWT.NONE);                          \r
+                       }\r
+                       \r
+                       menuItem.setImage(ResourceManager.getPluginImage(Activator.getDefault(), "icons/" + relImgs[i]));\r
+                       menuItem.setText("Add " + relTypes[i]);\r
+               }\r
 \r
-               final MenuItem checkboxMenuItem_5 = new MenuItem(menu, SWT.CHECK);\r
-               checkboxMenuItem_5.setSelection(true);\r
-               checkboxMenuItem_5.setText("doubtful");\r
+//             SynonymRelationshipType.HETEROTYPIC_SYNONYM_OF()\r
+//             SynonymRelationshipType.HOMOTYPIC_SYNONYM_OF()\r
+//             SynonymRelationshipType.PARTIAL_SYNONYM_OF()\r
+//             SynonymRelationshipType.PRO_PARTE_SYNONYM_OF()\r
+//             SynonymRelationshipType.SYNONYM_OF()\r
+//             NameRelationshipType.BASIONYM()\r
+//             NameRelationshipType.LATER_HOMONYM()            \r
                \r
                final ToolItem separator2 = new ToolItem(toolBar, SWT.SEPARATOR);\r
 \r
@@ -329,7 +313,6 @@ public class NameEditorView extends EditorPart {
                        });\r
                }\r
                final MenuItem addTaxonItem = new MenuItem(menuAdd, SWT.NONE);\r
-//             addTaxonItem.setText("Add new taxon to \"" + taxon.getName().getNameCache() + "\"");\r
                addTaxonItem.setText("Add new taxon to this taxon");\r
                addTaxonItem.addSelectionListener(new SelectionListener() {\r
                        public void widgetDefaultSelected(SelectionEvent e) {\r
@@ -351,7 +334,7 @@ public class NameEditorView extends EditorPart {
                contentComposite.setLayout(gridLayout_2);\r
                contentComposite.setRedraw(true);\r
 \r
-               nameComposite = new Composite(contentComposite, SWT.NONE);\r
+               nameComposite = new Composite(contentComposite, SWT.BORDER);\r
                nameComposite.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));\r
                nameComposite.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, true));\r
                nameComposite.setLayout(new GridLayout());\r
@@ -359,7 +342,7 @@ public class NameEditorView extends EditorPart {
                nameComposite.setRedraw(true);\r
                \r
 //             clickText = "Click here to start entering accepted name or enter its individual fields in the property sheet to the right";\r
-//             NameViewer acceptedNameViewer = new AcceptedNameViewer(taxon, bindingContext, nameComposite);\r
+//             NameViewer_ acceptedNameViewer = new AcceptedNameViewer(taxon, bindingContext, nameComposite);\r
 //             acceptedNameViewer.setBindingContext(bindingContext);\r
 //             acceptedNameViewer.configure(new NameViewerConfig());\r
 \r
@@ -394,6 +377,18 @@ public class NameEditorView extends EditorPart {
 \r
        private SourceViewer createAcceptedName() {\r
                \r
+//             Method[] methods = BotanicalName.class.getMethods();\r
+//             for (int i = 0; i < methods.length; i++) {\r
+//                     System.out.println("Annotations:");\r
+//                     for (int j = 0; i < methods[j].getAnnotations().length; j++)\r
+//                             System.out.println("\t" + methods[i].getAnnotations()[j]);\r
+//                     System.out.println("Type: " + methods[i].getReturnType().toString());\r
+//                     System.out.println("Name:" + methods[i].getName());\r
+//                     System.out.println();\r
+//             }\r
+               // use annotations to find persistent methods\r
+               \r
+               \r
 //             PropertyDescriptor descriptor;\r
 //             try {\r
 //                     descriptor = new PropertyDescriptor("genus", taxonname.getClass());\r
@@ -418,7 +413,7 @@ public class NameEditorView extends EditorPart {
                final SourceViewer sourceViewer = createSourceViewer(taxon.getName());\r
                \r
                sourceViewer.getTextWidget().setLayoutData(\r
-                               new GridData(SWT.FILL, SWT.CENTER, true, false, 2       , 1));\r
+                               new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1));\r
                sourceViewer.getTextWidget().setFont(\r
                                SWTResourceManager.getFont("Georgia", 12, SWT.NONE));           \r
                \r
@@ -437,8 +432,8 @@ public class NameEditorView extends EditorPart {
                                                sourceViewer.getTextWidget().setText("");\r
                                                sourceViewer.getTextWidget().setFont(SWTResourceManager.getFont("Georgia", 12, SWT.NONE));\r
                                                sourceViewer.getTextWidget().setForeground(SWTResourceManager.getColor(0, 0, 0));\r
-                                               dirtyBoy = true;\r
-                                               firePropertyChange(PROP_DIRTY);\r
+//                                             dirtyBoy = true;\r
+//                                             firePropertyChange(PROP_DIRTY);\r
                                        }\r
                                }\r
                                public void focusLost(FocusEvent e) {                           \r
@@ -489,21 +484,6 @@ public class NameEditorView extends EditorPart {
                ctlChooseRelType.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));\r
                ((Label) ctlChooseRelType).setImage(ResourceManager.getPluginImage(Activator.getDefault(), "icons/unknown_no_bg.gif"));\r
                ctlChooseRelType.moveBelow(precedingControl);\r
-                               \r
-               ctlChooseRelType.addMouseListener(new MouseListener() {\r
-                       public void mouseDoubleClick(MouseEvent e) {\r
-                               // TODO Auto-generated method stub\r
-                               \r
-                       }\r
-                       public void mouseDown(MouseEvent e) {\r
-                               // TODO Auto-generated method stub\r
-                               \r
-                       }\r
-                       public void mouseUp(MouseEvent e) {\r
-                               // TODO Auto-generated method stub\r
-                               \r
-                       }\r
-               });\r
                \r
                createRelationMenu((Label) ctlChooseRelType);\r
                \r
@@ -566,7 +546,9 @@ public class NameEditorView extends EditorPart {
                        }\r
                        public void focusLost(FocusEvent e) {\r
 //                             ((StyledText) e.widget).setBackgrond((Display.getCurrent().getSystemColor(SWT.COLOR_WHITE)));\r
-                               String text = ((StyledText) e.widget).getText(); \r
+                               String text = ((StyledText) e.widget).getText();\r
+                               \r
+                               // dummy code to get squigglies for walter's screenshots\r
                                if (text.contains("(?)")) {\r
                                        sourceViewer.getAnnotationModel().addAnnotation(\r
                                                        new ErrorAnnotation(1, "Could not parse name."), \r
@@ -673,10 +655,15 @@ public class NameEditorView extends EditorPart {
                        taxon = null;\r
                }\r
                \r
-               // get parent taxon\r
+               // Get parent taxon\r
                if (taxon.getTaxonomicParent() != null)\r
                                higherTaxon = taxon.getTaxonomicParent();\r
                \r
+               // Register listeners for any change in accepted name or set of relations\r
+               taxon.getName().addPropertyChangeListener("nameCache", taxonChangeListener);\r
+               taxon.addPropertyChangeListener("relationsFromThisTaxon", taxonChangeListener);\r
+               taxon.addPropertyChangeListener("relationsToThisTaxon", taxonChangeListener);\r
+               \r
                setSite(site);\r
                setInput(input);\r
                setBindingContext(new DataBindingContext());\r
@@ -696,7 +683,7 @@ public class NameEditorView extends EditorPart {
                                null, PropertySheetNode.EDITABLE);\r
                propertySheetNodes.add(node);\r
                \r
-               // note: only top-level nodes are "add"-ed - otherwise, they are\r
+               // Note: only top-level nodes are "add"-ed - otherwise, they are\r
                //  instantiated with their parent node\r
                new PropertySheetNode("Genus", BeansObservables.observeValue(botName, "uninomial"), \r
                                node, PropertySheetNode.EDITABLE);\r