Taxonomic tree provider substantially re-programmed, cleaned up.
[taxeditor.git] / eclipseprojects / eu.etaxonomy.taxeditor / src / eu / etaxonomy / taxeditor / view / nameviewersupport / NameComposite.java
index 874a25025123e98f42a3f48b8aeb519c0bccd4cc..4a7dcc23fe571150f579c4c7f0a673f5b973a93f 100644 (file)
 package eu.etaxonomy.taxeditor.view.nameviewersupport;\r
 \r
-import org.eclipse.core.runtime.Assert;\r
-import org.eclipse.swt.SWT;\r
-import org.eclipse.swt.custom.StyledText;\r
-import org.eclipse.swt.dnd.DND;\r
-import org.eclipse.swt.dnd.DragSource;\r
-import org.eclipse.swt.dnd.DragSourceEvent;\r
-import org.eclipse.swt.dnd.DragSourceListener;\r
-import org.eclipse.swt.dnd.Transfer;\r
-import org.eclipse.swt.events.FocusAdapter;\r
-import org.eclipse.swt.events.FocusEvent;\r
-import org.eclipse.swt.events.ModifyEvent;\r
-import org.eclipse.swt.events.ModifyListener;\r
-import org.eclipse.swt.layout.GridData;\r
-import org.eclipse.swt.layout.GridLayout;\r
+import org.eclipse.swt.graphics.Font;\r
+import org.eclipse.swt.graphics.Image;\r
 import org.eclipse.swt.widgets.Composite;\r
-import org.eclipse.swt.widgets.Display;\r
-import org.eclipse.swt.widgets.Label;\r
-import org.eclipse.swt.widgets.Menu;\r
-import org.eclipse.swt.widgets.MenuItem;\r
-import org.eclipse.ui.forms.IManagedForm;\r
-import org.eclipse.ui.forms.widgets.FormToolkit;\r
 \r
-import com.swtdesigner.SWTResourceManager;\r
+import eu.etaxonomy.taxeditor.ITaxEditorConstants;\r
+import eu.etaxonomy.taxeditor.TaxEditorPlugin;\r
 \r
-import eu.etaxonomy.cdm.model.name.BotanicalName;\r
-import eu.etaxonomy.cdm.model.name.Rank;\r
-import eu.etaxonomy.cdm.model.name.TaxonNameBase;\r
-import eu.etaxonomy.cdm.model.taxon.Synonym;\r
-import eu.etaxonomy.cdm.model.taxon.Taxon;\r
-import eu.etaxonomy.taxeditor.controller.TaxonTransfer;\r
-import eu.etaxonomy.taxeditor.view.NameEditorView;\r
-import eu.etaxonomy.taxeditor.view.NameViewer;\r
-\r
-public class NameComposite extends Composite {\r
-       \r
-       public static final int ACCEPTED = 0;\r
-       public static final int HOMOTYPIC_SYNONYM = 1;\r
-       public static final int HETEROTYPIC_SYNONYM = 2;\r
-       \r
-       Label relationLabel;\r
-       Synonym synonym;\r
-       Taxon taxon;\r
-       int compositeType;\r
-       NameViewer nameViewer;\r
-       boolean initialized = false;\r
-\r
-       /**\r
-        * Temporary procedure until ability to get accepted taxon\r
-        *  from synonym is implemented\r
-        *  \r
-        * @param parent\r
-        * @param synonym\r
-        * @param taxon\r
-        */\r
-       public NameComposite(Composite parent, Synonym synonym, Taxon taxon) {\r
-               super(parent, SWT.NONE);\r
-               \r
-               this.taxon = taxon;\r
-               this.synonym = synonym;\r
-\r
-               // Either initialize group composite, \r
-               //  or assume its homotypic group\r
-               if (parent instanceof GroupComposite) {\r
-                       \r
-                       if (((GroupComposite) parent).isAcceptedGroup())\r
-                               this.compositeType = HOMOTYPIC_SYNONYM;\r
-                       else\r
-                               this.compositeType = HETEROTYPIC_SYNONYM;                       \r
-                       \r
-                       if (((GroupComposite) parent).getHomotypicalGroup() == null) \r
-                               ((GroupComposite) parent).setHomotypicalGroup(\r
-                                               synonym.getName().getHomotypicalGroup());\r
-                       else\r
-                               synonym.getName().setHomotypicalGroup(\r
-                                               ((GroupComposite) parent).getHomotypicalGroup());\r
-               }               \r
-               \r
-               createNameComposite();          \r
-       }\r
-       \r
-       public NameComposite(Composite parent, Synonym synonym) {\r
-               super(parent, SWT.NONE);\r
-                \r
-               this.synonym = synonym;\r
-//             this.taxon = (Taxon) synonym.getAcceptedTaxa().toArray()[0];\r
-\r
-               // Either initialize group composite, \r
-               //  or assume its homotypic group\r
-               if (parent instanceof GroupComposite) {\r
-                       \r
-                       if (((GroupComposite) parent).isAcceptedGroup())\r
-                               this.compositeType = HOMOTYPIC_SYNONYM;\r
-                       else\r
-                               this.compositeType = HETEROTYPIC_SYNONYM;\r
-                       \r
-                       if (((GroupComposite) parent).getHomotypicalGroup() == null) \r
-                               ((GroupComposite) parent).setHomotypicalGroup(\r
-                                               synonym.getName().getHomotypicalGroup());\r
-                       else\r
-                               synonym.getName().setHomotypicalGroup(\r
-                                               ((GroupComposite) parent).getHomotypicalGroup());\r
-               }                               \r
-               \r
-               createNameComposite();\r
-       }\r
-\r
-       public NameComposite(Composite parent, Taxon taxon) {\r
-               super(parent, SWT.NONE);\r
-                               \r
-               this.taxon = taxon;\r
-               this.compositeType = ACCEPTED;\r
-               \r
-               // Initialize homotypic group component\r
-               if (parent instanceof GroupComposite) {\r
-                                               \r
-                       ((GroupComposite) parent).setHomotypicalGroup(\r
-                                       taxon.getName().getHomotypicalGroup());\r
-                       ((GroupComposite) parent).setAcceptedGroup(true);\r
-               }\r
-                       \r
-               createNameComposite();\r
-       }\r
-       \r
-       /**\r
-        * \r
-        */\r
-       public void createNameComposite() {\r
-\r
-               Assert.isNotNull(taxon);\r
-                               \r
-               // Graphic layout of composite\r
-               GridLayout gridLayout = new GridLayout();\r
-               gridLayout.verticalSpacing = 0;\r
-               gridLayout.marginWidth = 5;\r
-               gridLayout.marginHeight = 5;\r
-               gridLayout.horizontalSpacing = 5;\r
-               gridLayout.numColumns = (compositeType == ACCEPTED? 1: 2);\r
-               this.setLayout(gridLayout);\r
-               this.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));\r
-               this.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));\r
-               if (compositeType != ACCEPTED) {\r
-//                     relationLabel.setImage(ResourceManager.getPluginImage(Activator.getDefault(), "icons/heterosyn_no_bg.gif"));    \r
-                       relationLabel = new Label(this, SWT.NONE);\r
-                       relationLabel.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, false, false));                                     \r
-                       relationLabel.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));\r
-                       \r
-                       if (this.compositeType == HOMOTYPIC_SYNONYM)\r
-                               relationLabel.setImage(SWTResourceManager.getImage(NameComposite.class, "homosyn_no_bg.gif"));\r
-//                             relationLabel.setImage(ResourceManager.getPluginImage(Activator.getDefault(), "icons/homosyn_no_bg.gif"));\r
-                       else\r
-                               relationLabel.setImage(SWTResourceManager.getImage(NameComposite.class, "heterosyn_no_bg.gif"));\r
-//                             relationLabel.setImage(ResourceManager.getPluginImage(Activator.getDefault(), "icons/heterosyn_no_bg.gif"));\r
-               }\r
-               nameViewer = new NameViewer(this);      \r
-               nameViewer.getTextWidget().setLayoutData(\r
-                               new GridData(SWT.FILL, SWT.CENTER, true, false));\r
-               nameViewer.getTextWidget().setFont(\r
-                               SWTResourceManager.getFont("Georgia", \r
-                                               (compositeType == ACCEPTED? 12 : 10), \r
-                                               SWT.NONE));     \r
-               \r
-               // Add verify listener to check for line breaks\r
-               nameViewer.getTextWidget().addVerifyListener(\r
-                               new NameViewerVerifyListener(taxon));\r
-               \r
-               // Listen for changes to name\r
-               nameViewer.getTextWidget().addModifyListener(new ModifyListener () {\r
-                       public void modifyText(ModifyEvent e) {\r
-                               if (initialized) {\r
-                                       String text = ((StyledText) e.widget).getText();\r
-                                       setName(BotanicalName.PARSED_NAME(text));\r
-                               }\r
-                       }\r
-               });\r
-\r
-               // Listen for focus to send this name to the property sheet\r
-               nameViewer.getTextWidget().addFocusListener(new FocusAdapter () {\r
-                       public void focusGained(FocusEvent e) {\r
-                               showBorder();\r
-                               \r
-                               BotanicalName botSpecies = new BotanicalName(Rank.SPECIES());\r
-                               botSpecies.setTitleCache("Hieracium geranium Smith");\r
-                               botSpecies.setUninomial("Hieracium");\r
-                               botSpecies.setSpecificEpithet("geranium");\r
-                               \r
-                               nameEditor.setSelection((BotanicalName) getName());\r
-//                             sendEvent(null);\r
-//                             notifyListeners(SWT.Selection, new Event());\r
-                               // Fire \r
-//                             if (nameEditor != null) \r
-//                                     nameEditor.setPropertySheetNodes(getName());\r
-                       }\r
-                       \r
-                       public void focusLost(FocusEvent e) {\r
-                               hideBorder();\r
-                       }\r
-                       \r
-               });\r
-                                                               \r
-               // Put name into name viewer, show error if parsed incorrectly\r
-               nameViewer.getTextWidget().setText(getName().getTitleCache() == null ? "" : getName().getTitleCache());\r
-               nameViewer.setShowError(getName().getHasProblem());\r
-               \r
-               // Put cursor at end of name viewer\r
-               nameViewer.getTextWidget().setCaretOffset(\r
-                               nameViewer.getTextWidget().getText().length());\r
-               \r
-               // Set composite to initialized - any new input will now be parsed\r
-               initialized = true;\r
-               \r
-               // Add drag functionality to synonyms only\r
-               if (compositeType == ACCEPTED) return;\r
+public class NameComposite extends EditableGroupedComposite {\r
                \r
-               // make menu temp\r
-               createTempMenu();\r
-               \r
-               // **************** DRAG FUNCTIONALITY **************** //\r
-               Transfer[] types = new Transfer[] {TaxonTransfer.getInstance()};\r
-               int operations = DND.DROP_MOVE | DND.DROP_COPY | DND.DROP_LINK;\r
-               \r
-               // Make composite draggable\r
-               DragSource dragComposite = new DragSource (this, operations);\r
-               dragComposite.setTransfer(types);\r
-               dragComposite.addDragListener(dragSourceListener);\r
-\r
-               // Make relation label draggable        \r
-               DragSource dragLabel = new DragSource (relationLabel, operations);\r
-               dragLabel.setTransfer(types);\r
-               dragLabel.addDragListener(dragSourceListener);\r
-       }\r
-               \r
-       /**\r
-        * Shared drag listener which destroys the NameComposite after the drag\r
-        *  gesture is completed.\r
-        */\r
-       DragSourceListener dragSourceListener = new DragSourceListener () {\r
-               \r
-               public void dragStart(DragSourceEvent event) {\r
-                       showBorder();\r
-                       event.doit = true;\r
-               }\r
-               public void dragSetData (DragSourceEvent event) {\r
-                       TaxonTransfer.getInstance().setTaxon(synonym);\r
-               }\r
-               public void dragFinished(DragSourceEvent event) {\r
-                                               \r
-                       hideBorder();\r
-                       \r
-                       if (event.detail == DND.DROP_MOVE) {\r
-                               Composite parent = NameComposite.this.getParent();\r
-                               Composite grandParent = parent.getParent();\r
-                               \r
-                               NameComposite.this.dispose();\r
-                               \r
-                               // If this was the last child in its homo. group,\r
-                               //  drop the group from the interface \r
-                               if (parent.getChildren().length == 0)\r
-                                       parent.dispose();\r
-                               else\r
-                                       // Only used if we're dropping it on its current homo. group\r
-                                       parent.layout();\r
-                               \r
-                               grandParent.layout();\r
-                       }\r
-               }\r
-       };\r
-       private NameEditorView nameEditor;\r
-       private IManagedForm managedForm;\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 void setName(TaxonNameBase name) {               \r
-               (compositeType == ACCEPTED? taxon : synonym).setName(name);\r
-               nameViewer.setShowError(name.getHasProblem());\r
-       }\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
-       protected void showBorder() {\r
-               if (managedForm != null) {\r
-                       nameViewer.getTextWidget().setData(FormToolkit.KEY_DRAW_BORDER, FormToolkit.TEXT_BORDER);\r
-                       managedForm.getToolkit().paintBordersFor(this);\r
-//                     this.setData(FormToolkit.KEY_DRAW_BORDER, FormToolkit.TEXT_BORDER);\r
-//                     managedForm.getToolkit().paintBordersFor(this.getParent());\r
-                       managedForm.getForm().reflow(true);\r
-               }\r
-       }\r
-\r
-       protected void hideBorder() {\r
-               if (managedForm != null) {\r
-                       nameViewer.getTextWidget().setData(FormToolkit.KEY_DRAW_BORDER, null);\r
-                       managedForm.getToolkit().paintBordersFor(this);\r
-//                     this.setData(FormToolkit.KEY_DRAW_BORDER, FormToolkit.TEXT_BORDER);\r
-//                     managedForm.getToolkit().paintBordersFor(this.getParent());\r
-                       managedForm.getForm().reflow(true);\r
-               }\r
-       }\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 TaxonNameBase getName() {\r
-               return (compositeType == ACCEPTED? taxon : synonym).getName();                          \r
-       }\r
-\r
-       public void setNameEditorView(NameEditorView nameEditorView) {\r
-               this.nameEditor = nameEditorView;\r
-               this.managedForm = nameEditorView.getManagedForm();\r
+       public NameComposite(Composite parent) {\r
+               super(parent);\r
        }\r
-       \r
-       private void createTempMenu() {\r
-               final Menu menu1 = new Menu(relationLabel);\r
-               relationLabel.setMenu(menu1);\r
-\r
-               final MenuItem deletehieraciumFuscoatrumMenuItem = new MenuItem(menu1, SWT.NONE);\r
-               deletehieraciumFuscoatrumMenuItem.setText("Delete \"Hieracium wolffii subsp. trichotranssilvanicum\" from this taxon");\r
-\r
-               new MenuItem(menu1, SWT.SEPARATOR);\r
-\r
-               final MenuItem moveMenuItem = new MenuItem(menu1, SWT.NONE);\r
-               moveMenuItem.setText("Make \"Hieracium wolffii subsp. trichotranssilvanicum\" the accepted name of a new taxon");\r
-\r
-               final MenuItem makehieraciumFuscoatrumMenuItem = new MenuItem(menu1, SWT.NONE);\r
-               makehieraciumFuscoatrumMenuItem.setText("Make \"Hieracium wolffii subsp. trichotranssilvanicum\" the accepted name of this taxon");\r
-\r
-               new MenuItem(menu1, SWT.SEPARATOR);\r
-\r
-               final MenuItem turnhieraciumFuscoatrumMenuItem_3 = new MenuItem(menu1, SWT.NONE);\r
-               turnhieraciumFuscoatrumMenuItem_3.setText("Turn \"Hieracium wolffii subsp. trichotranssilvanicum\" into a basionym");\r
-\r
-               final MenuItem turnhieraciumFuscoatrumMenuItem_4 = new MenuItem(menu1, SWT.NONE);\r
-               turnhieraciumFuscoatrumMenuItem_4.setText("...");\r
-       }\r
-\r
-       \r
 }
\ No newline at end of file