Made TaxonCompositeFactory, which dynamically attaches all model functionality to...
authorp.ciardelli <p.ciardelli@localhost>
Tue, 29 Apr 2008 17:32:38 +0000 (17:32 +0000)
committerp.ciardelli <p.ciardelli@localhost>
Tue, 29 Apr 2008 17:32:38 +0000 (17:32 +0000)
13 files changed:
.gitattributes
eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/controller/ActionSaveTaxon.java
eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/view/MultiPageTaxonEditor.java
eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/view/NameEditorView.java
eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/view/nameviewersupport/EditableGroupedComposite.java [new file with mode: 0644]
eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/view/nameviewersupport/GroupComposite.java
eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/view/nameviewersupport/GroupedComposite.java
eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/view/nameviewersupport/IDataDisposer.java [new file with mode: 0644]
eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/view/nameviewersupport/IParentDataAdapter.java [new file with mode: 0644]
eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/view/nameviewersupport/ISelectionWrapper.java [new file with mode: 0644]
eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/view/nameviewersupport/LineBreakListener.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 [new file with mode: 0644]

index dc7a6fb2b8ab9e5bbd3f6df26c6795c4b1583d0e..3efdd6256744fd5011f60aef990b996522444019 100644 (file)
@@ -413,11 +413,16 @@ eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/view/UndoView.
 eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/view/nameviewersupport/AnnotationMarkerAccess.java -text
 eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/view/nameviewersupport/CompositeBorderDecorator.java -text
 eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/view/nameviewersupport/CompositeRectangle.java -text
+eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/view/nameviewersupport/EditableGroupedComposite.java -text
 eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/view/nameviewersupport/ErrorAnnotation.java -text
 eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/view/nameviewersupport/GroupComposite.java -text
 eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/view/nameviewersupport/GroupedComposite.java -text
+eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/view/nameviewersupport/IDataDisposer.java -text
+eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/view/nameviewersupport/IParentDataAdapter.java -text
+eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/view/nameviewersupport/ISelectionWrapper.java -text
 eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/view/nameviewersupport/LineBreakListener.java -text
 eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/view/nameviewersupport/NameComposite.java -text
+eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/view/nameviewersupport/TaxonCompositeFactory.java -text
 eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/view/nameviewersupport/TesterooWritableSet.java -text
 eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/view/nameviewersupport/WarningAnnotation.java -text
 eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/view/propertysheetsupport/BotanicalNamePropertySource.java -text
index d9845e016f1b0c831fcc755186c5099e951ea156..ce3f1d4e5c36bc283e48debded0e9b86dd609e59 100644 (file)
@@ -2,6 +2,7 @@ package eu.etaxonomy.taxeditor.controller;
 \r
 import org.eclipse.jface.action.Action;\r
 \r
+import eu.etaxonomy.cdm.api.service.TaxonServiceImpl;\r
 import eu.etaxonomy.cdm.model.taxon.Taxon;\r
 import eu.etaxonomy.taxeditor.Activator;\r
 \r
index c5d027b3ca70bca8aca51b09a51fa27ce4574232..d75fdb91c0616461302a747b14bacc8534c0ab02 100644 (file)
@@ -50,7 +50,7 @@ public class MultiPageTaxonEditor extends MultiPageEditorPart {
        @Override\r
        public void doSave(IProgressMonitor monitor) {\r
                System.out.println("Start save");\r
-               new ActionSaveTaxon(taxon);\r
+               new ActionSaveTaxon(taxon).run();\r
                System.out.println("Save finished");\r
        }\r
 \r
index 0c100432fc0a339a285858fa6f77f731af12c3f4..c9f5a857c3932ec4dad92f047e7e7f91b2843ab5 100644 (file)
@@ -19,14 +19,10 @@ import org.eclipse.swt.dnd.DropTarget;
 import org.eclipse.swt.dnd.DropTargetAdapter;\r
 import org.eclipse.swt.dnd.DropTargetEvent;\r
 import org.eclipse.swt.dnd.Transfer;\r
-import org.eclipse.swt.events.FocusEvent;\r
-import org.eclipse.swt.events.FocusListener;\r
 import org.eclipse.swt.events.ModifyEvent;\r
 import org.eclipse.swt.events.ModifyListener;\r
 import org.eclipse.swt.widgets.Composite;\r
 import org.eclipse.swt.widgets.Display;\r
-import org.eclipse.swt.widgets.Event;\r
-import org.eclipse.swt.widgets.Listener;\r
 import org.eclipse.ui.IEditorInput;\r
 import org.eclipse.ui.IEditorSite;\r
 import org.eclipse.ui.PartInitException;\r
@@ -38,8 +34,6 @@ import org.eclipse.ui.part.EditorPart;
 import org.eclipse.ui.views.properties.IPropertySheetPage;\r
 import org.eclipse.ui.views.properties.PropertySheetPage;\r
 \r
-import com.swtdesigner.SWTResourceManager;\r
-\r
 import eu.etaxonomy.cdm.model.name.BotanicalName;\r
 import eu.etaxonomy.cdm.model.name.HomotypicalGroup;\r
 import eu.etaxonomy.cdm.model.name.TaxonNameBase;\r
@@ -48,10 +42,10 @@ import eu.etaxonomy.cdm.model.taxon.Taxon;
 import eu.etaxonomy.cdm.model.taxon.TaxonBase;\r
 import eu.etaxonomy.cdm.strategy.parser.TaxonNameParserBotanicalNameImpl;\r
 import eu.etaxonomy.taxeditor.controller.WidgetTransfer;\r
-import eu.etaxonomy.taxeditor.view.nameviewersupport.CompositeBorderDecorator;\r
 import eu.etaxonomy.taxeditor.view.nameviewersupport.GroupComposite;\r
 import eu.etaxonomy.taxeditor.view.nameviewersupport.LineBreakListener;\r
 import eu.etaxonomy.taxeditor.view.nameviewersupport.NameComposite;\r
+import eu.etaxonomy.taxeditor.view.nameviewersupport.TaxonCompositeFactory;\r
 import eu.etaxonomy.taxeditor.view.propertysheetsupport.BotanicalNamePropertySource;\r
 import eu.etaxonomy.taxeditor.view.propertysheetsupport.CustomSortPropertySheetEntry;\r
 \r
@@ -70,6 +64,7 @@ public class NameEditorView extends EditorPart implements IAdaptable {
         */\r
        private PropertyChangeListener taxonChangeListener = new PropertyChangeListener() {\r
                public void propertyChange(PropertyChangeEvent arg0) {\r
+                       System.out.println("prop change");\r
                        dirty = true;\r
                        firePropertyChange(PROP_DIRTY);\r
                }\r
@@ -97,14 +92,16 @@ public class NameEditorView extends EditorPart implements IAdaptable {
                if (input.getAdapter(Taxon.class) != null) {\r
                        taxon = (Taxon) input.getAdapter(Taxon.class);\r
                } else {\r
-                       \r
-                       taxon = null;\r
+                       throw new PartInitException(\r
+                               "Invalid Input: Taxon cannot be null");\r
                }\r
                \r
                // Register listeners for any change in accepted name or set of relations\r
                taxon.getName().addPropertyChangeListener(taxonChangeListener);\r
                taxon.addPropertyChangeListener("synonyms", taxonChangeListener);\r
                \r
+               taxonCompositeFactory = TaxonCompositeFactory.NewInstance(taxon);\r
+               \r
                setSite(site);\r
                setInput(input);\r
 \r
@@ -153,11 +150,21 @@ public class NameEditorView extends EditorPart implements IAdaptable {
                provider.setSelection(\r
                                new StructuredSelection(\r
                                                new BotanicalNamePropertySource((BotanicalName) taxon.getName())));\r
+               \r
+               taxonCompositeFactory.setSelectionWrapper(provider);\r
        }\r
 \r
-       public void setSelection(BotanicalName name) {\r
-               getSite().getSelectionProvider().setSelection\r
-                               (new StructuredSelection(new BotanicalNamePropertySource(name)));;\r
+       @SuppressWarnings("unchecked")\r
+       public Object getAdapter(Class type) {\r
+           if (type == IPropertySheetPage.class) {\r
+               PropertySheetPage page = new PropertySheetPage();\r
+               \r
+               CustomSortPropertySheetEntry entry = new CustomSortPropertySheetEntry();\r
+               page.setRootEntry(entry);\r
+               \r
+               return page;\r
+           }\r
+           return super.getAdapter(type);\r
        }\r
        \r
        @Override\r
@@ -171,6 +178,8 @@ public class NameEditorView extends EditorPart implements IAdaptable {
                return false;\r
        }\r
 \r
+       TaxonCompositeFactory taxonCompositeFactory; \r
+       \r
        @Override\r
        public void createPartControl(final Composite composite) {\r
                                                \r
@@ -178,35 +187,40 @@ public class NameEditorView extends EditorPart implements IAdaptable {
                managedForm = new ManagedForm(composite);\r
                scrolledForm = managedForm.getForm();\r
                parent = scrolledForm.getBody();\r
-               parent.setLayout(new TableWrapLayout());\r
-                               \r
+               \r
+               parent.setLayout(new TableWrapLayout());                \r
                parent.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));\r
                \r
+               // Add managed form to composite factory to enable border support\r
+               taxonCompositeFactory.setManagedForm(managedForm);\r
+               \r
                // Create a homotypic group for the accepted taxon\r
-               GroupComposite homotypicComposite = createGroupComposite(taxon.getHomotypicGroup());\r
+               GroupComposite homotypicComposite = \r
+                               taxonCompositeFactory.createGroupComposite(parent, taxon.getHomotypicGroup()); \r
                \r
                // Add accepted taxon to the group\r
-               createNameComposite(taxon, homotypicComposite);\r
+               decorateNameComposite(taxon, taxonCompositeFactory.createAcceptedNameComposite(homotypicComposite, taxon));\r
                \r
                // Add any homotypic synonyms to the group\r
                if (taxon.getHomotypicGroup() != null) {\r
                        List<Synonym> homotypicSynonyms = taxon.getHomotypicGroup().\r
                                        getSynonymsInGroup(taxon.getSec());\r
                        for (Synonym synonym : homotypicSynonyms) {\r
-                               createNameComposite(synonym, homotypicComposite);\r
+                               decorateNameComposite(synonym, taxonCompositeFactory.createHomotypicSynonymComposite(homotypicComposite, synonym));\r
                        }\r
                }\r
 \r
                // Create composites for any heterotypic groups\r
                List<HomotypicalGroup> heterotypicGroups = taxon.getHeterotypicSynonymyGroups();\r
                for (HomotypicalGroup heterotypicGroup : heterotypicGroups) {\r
-                       GroupComposite heterotypicComposite = createGroupComposite(heterotypicGroup);\r
-                       \r
+                       GroupComposite heterotypicComposite = \r
+                                       taxonCompositeFactory.createGroupComposite(parent, heterotypicGroup);\r
+                                               \r
                        // Add any homotypic synonyms to the group\r
                        List<Synonym> heterotypicSynonyms = heterotypicGroup.\r
                                        getSynonymsInGroup(taxon.getSec());\r
                        for (Synonym synonym : heterotypicSynonyms) {\r
-                               createNameComposite(synonym, heterotypicComposite);                             \r
+                               decorateNameComposite(synonym, taxonCompositeFactory.createHeterotypicSynonymComposite(heterotypicComposite, synonym));                         \r
                        }\r
                }\r
                        \r
@@ -219,10 +233,11 @@ public class NameEditorView extends EditorPart implements IAdaptable {
                target.addDropListener(new DropTargetAdapter() {\r
                        \r
                        public void drop(DropTargetEvent event) {\r
-                               HomotypicalGroup newHomotypicalGroup = new HomotypicalGroup();\r
-                               NameComposite nameComposite = (NameComposite) event.data;\r
                                \r
-                               GroupComposite newGroupComposite = createGroupComposite(newHomotypicalGroup);\r
+                               GroupComposite newGroupComposite = \r
+                                               taxonCompositeFactory.createGroupComposite(parent, new HomotypicalGroup());\r
+                               \r
+                               NameComposite nameComposite = (NameComposite) event.data;\r
                                nameComposite.setParent(newGroupComposite);\r
                                \r
                        }               \r
@@ -231,55 +246,26 @@ public class NameEditorView extends EditorPart implements IAdaptable {
                // We've added elements to the managed form, so redraw it\r
                scrolledForm.reflow(true);\r
        }\r
-\r
-       private GroupComposite createGroupComposite(HomotypicalGroup homotypicalGroup) {\r
-               GroupComposite groupComposite = new GroupComposite(parent, homotypicalGroup);\r
+       \r
+       private NameComposite decorateNameComposite(final TaxonBase taxonBase, NameComposite nameComposite) {\r
+               \r
+               TaxonNameBase name = taxonBase.getName();\r
                \r
-               new CompositeBorderDecorator(groupComposite, managedForm);\r
+               // Put a border on the composite's StyledText widget when it has focus\r
+               StyledText textWidget = nameComposite.getTextWidget();\r
+                                       \r
+               String initText = (name.getTitleCache() == null) ? \r
+                               "" : name.getTitleCache();\r
+               textWidget.setText(initText);\r
+                               \r
+               // Put cursor at end of name viewer\r
+               textWidget.setCaretOffset(textWidget.getText().length());\r
 \r
-               groupComposite.addListener(SWT.Dispose, new Listener() {\r
 \r
-                       @Override\r
-                       public void handleEvent(Event event) {\r
-                               \r
-                               // Remove homotypic group from taxon\r
-                               // TODO put in own action\r
-                               // TODO this will of course remove homotypical groups with every shutdown event!!!\r
-                               GroupComposite emptyComposite = (GroupComposite) event.widget;\r
-                               HomotypicalGroup emptyHomotypicalGroup = (HomotypicalGroup) emptyComposite.getData();  \r
-                               taxon.getHeterotypicSynonymyGroups().remove(emptyHomotypicalGroup);\r
-                               \r
-                       }\r
-                       \r
-               });\r
-                               \r
-               return groupComposite;\r
-       }\r
-       \r
-       private NameComposite createNameComposite(final TaxonBase taxonBase, GroupComposite groupComposite) {\r
-               NameComposite nameComposite;\r
-               TaxonNameBase name = taxonBase.getName();\r
-               if (taxonBase instanceof Taxon) {\r
-                       nameComposite = new NameComposite(groupComposite, taxonBase, false);\r
-                       nameComposite.setIcon(NameComposite.ACCEPTED);\r
-                       \r
-               } else {\r
-                       nameComposite = new NameComposite(groupComposite, taxonBase, true);\r
+               textWidget.addVerifyListener(new LineBreakListener() {\r
                        \r
-                       nameComposite.indent();\r
+                       // This needs a connection with the factory to create the new group and grouped\r
                        \r
-                       if (taxon.getName().getHomotypicalGroup().equals(groupComposite.getData())) {\r
-                               nameComposite.setIcon(NameComposite.HOMOTYPIC_SYNONYM);\r
-                       } else {\r
-                               nameComposite.setIcon(NameComposite.HETEROTYPIC_SYNONYM);\r
-                       }\r
-               }\r
-                               \r
-               StyledText textWidget = nameComposite.getTextWidget();\r
-               \r
-               new CompositeBorderDecorator(textWidget, managedForm);\r
-               \r
-               textWidget.addVerifyListener(new LineBreakListener() {\r
                        @Override\r
                        public void handleSplitText(String text) {\r
                                // Model actions\r
@@ -292,38 +278,17 @@ public class NameEditorView extends EditorPart implements IAdaptable {
                                synonym.setName(name);\r
                                \r
                                // Interface actions\r
-                               GroupComposite newGroupComposite = createGroupComposite(newHomotypicalGroup);\r
-                               createNameComposite(synonym, newGroupComposite);                \r
+                               GroupComposite newGroupComposite = taxonCompositeFactory.createGroupComposite(parent, newHomotypicalGroup);\r
+                               decorateNameComposite(synonym, taxonCompositeFactory.createHeterotypicSynonymComposite(newGroupComposite, synonym));            \r
                                \r
                                parent.layout();\r
                        }               \r
-               });\r
-                       \r
-               // Add listener for sending selection to property sheet\r
-               textWidget.addFocusListener(new FocusListener() {\r
-                       @Override\r
-                       public void focusGained(FocusEvent e) {\r
-                               setSelection((BotanicalName) taxonBase.getName());\r
-                       }\r
-\r
-                       @Override\r
-                       public void focusLost(FocusEvent e) {}                  \r
-               });\r
-               \r
-               textWidget.setFont(\r
-                               SWTResourceManager.getFont("Georgia", \r
-                                               (taxonBase instanceof Taxon ? 12 : 10), \r
-                                               SWT.NONE));\r
+               });             \r
                \r
-               String initText = (name.getTitleCache() == null) ? \r
-                               "" : name.getTitleCache();\r
-               textWidget.setText(initText);\r
-                               \r
-               // Put cursor at end of name viewer\r
-               textWidget.setCaretOffset(\r
-                               textWidget.getText().length());\r
-\r
                textWidget.addModifyListener(new ModifyListener () {\r
+                       \r
+                       // This needs no connection, just a call to parse\r
+                       \r
                        public void modifyText(ModifyEvent e) {\r
                                StyledText widget = (StyledText) e.widget;\r
                                String text = widget.getText();\r
@@ -335,31 +300,10 @@ public class NameEditorView extends EditorPart implements IAdaptable {
                NameViewer nameViewer = (NameViewer) nameComposite.getTextViewer();\r
                nameViewer.setShowError(name.getHasProblem());\r
                \r
-               nameComposite.addPropertyChangeListener("parent", new PropertyChangeListener() {\r
-\r
-                       @Override\r
-                       public void propertyChange(PropertyChangeEvent evt) {\r
-                               \r
-                               GroupComposite groupComposite = (GroupComposite) evt.getNewValue();\r
-                               HomotypicalGroup newHomotypicalGroup = (HomotypicalGroup) groupComposite.getData();\r
-                               NameComposite nameComposite = (NameComposite) evt.getSource();\r
-                               \r
-                               // Set name's homotypical group         \r
-                               TaxonNameBase name = ((TaxonBase) nameComposite.getData()).getName();\r
-                               name.setHomotypicalGroup(newHomotypicalGroup);\r
-                               \r
-                               // Set component's synonym type icon\r
-                               if (newHomotypicalGroup.equals(taxon.getHomotypicGroup())) {\r
-                                       nameComposite.setIcon(NameComposite.HOMOTYPIC_SYNONYM);\r
-                               } else {\r
-                                       nameComposite.setIcon(NameComposite.HETEROTYPIC_SYNONYM);\r
-                               }\r
-                       }\r
-               });\r
                \r
                // TODO Redraw form with every change in case text area has, for instance, word wrapped\r
                \r
-               nameComposite.getTextWidget().setFocus();\r
+               nameComposite.setFocus();\r
                \r
 //             managedForm.getMessageManager().addMessage\r
 //                             ("TEST", "Testeroo error", null, IMessageProvider.ERROR, nameComposite.getTextWidget());\r
@@ -375,17 +319,4 @@ public class NameEditorView extends EditorPart implements IAdaptable {
        public void setFocus() {\r
                // TODO Auto-generated method stub\r
        }\r
-\r
-       @SuppressWarnings("unchecked")\r
-       public Object getAdapter(Class type) {\r
-           if (type == IPropertySheetPage.class) {\r
-               PropertySheetPage page = new PropertySheetPage();\r
-               \r
-               CustomSortPropertySheetEntry entry = new CustomSortPropertySheetEntry();\r
-               page.setRootEntry(entry);\r
-               \r
-               return page;\r
-           }\r
-           return super.getAdapter(type);\r
-       }\r
 }
\ No newline at end of file
diff --git a/eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/view/nameviewersupport/EditableGroupedComposite.java b/eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/view/nameviewersupport/EditableGroupedComposite.java
new file mode 100644 (file)
index 0000000..ceaddc1
--- /dev/null
@@ -0,0 +1,80 @@
+package eu.etaxonomy.taxeditor.view.nameviewersupport;\r
+\r
+import org.eclipse.jface.text.TextViewer;\r
+import org.eclipse.swt.SWT;\r
+import org.eclipse.swt.custom.StyledText;\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.ui.forms.widgets.TableWrapData;\r
+import org.eclipse.ui.forms.widgets.TableWrapLayout;\r
+\r
+abstract public class EditableGroupedComposite extends GroupedComposite {\r
+       \r
+       private TextViewer textViewer;\r
+       protected TableWrapLayout layout;\r
+       \r
+       ISelectionWrapper selectionWrapper;\r
+       \r
+       protected static final int INDENT_INCREMENT = 15;\r
+       private Label draggableLabel;\r
+       \r
+       public EditableGroupedComposite(Composite parent) {\r
+               super(parent);\r
+       }\r
+\r
+       @Override\r
+       protected void createContent() {\r
+               setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));\r
+               layout = new TableWrapLayout();\r
+               layout.numColumns = 2;\r
+               layout.leftMargin = 0;\r
+               setLayout(layout);\r
+               \r
+               setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));\r
+               \r
+               draggableLabel = new Label(this, SWT.NONE);\r
+               draggableLabel.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));\r
+               draggableLabel.setLayoutData(new TableWrapData(TableWrapData.CENTER, TableWrapData.MIDDLE));\r
+               \r
+               setDraggableControl(draggableLabel);\r
+       }               \r
+       \r
+       public TextViewer getTextViewer() {\r
+               return textViewer;\r
+       }\r
+\r
+       public void setTextViewer(TextViewer textViewer) {\r
+               this.textViewer = textViewer;\r
+       }\r
+\r
+       public StyledText getTextWidget() {\r
+               return textViewer.getTextWidget();\r
+       }\r
+\r
+       protected void setIcon(Image icon) {\r
+               draggableLabel.setImage(icon);\r
+       }\r
+\r
+       public void indent() {\r
+               layout.leftMargin += INDENT_INCREMENT;\r
+               this.setLayout(layout);\r
+       }       \r
+       \r
+       public boolean setFocus() {\r
+               if (selectionWrapper != null) {\r
+                       selectionWrapper.setSelection();\r
+               }\r
+               return getTextViewer().getTextWidget().setFocus();\r
+       }\r
+       \r
+       public void setFont(Font font) {\r
+               getTextViewer().getTextWidget().setFont(font);\r
+       }\r
+       \r
+       public void setSelectionWrapper (ISelectionWrapper selectionWrapper) {\r
+               this.selectionWrapper = selectionWrapper;\r
+       }\r
+}
\ No newline at end of file
index 34e3fec4035971086d0209f817a18f39579dc338..3372ac305e9b2cc8605f2e8dcd65d94749b4ca01 100644 (file)
@@ -15,6 +15,8 @@ import eu.etaxonomy.taxeditor.controller.WidgetTransfer;
 \r
 public class GroupComposite extends Composite {\r
        \r
+       IDataDisposer dataDisposer;\r
+       \r
        public GroupComposite(Composite parent, Object data) {\r
                this(parent);\r
                setData(data);\r
@@ -22,8 +24,7 @@ public class GroupComposite extends Composite {
        \r
        public GroupComposite(Composite parent) {\r
                super(parent, SWT.NONE);\r
-                               \r
-                               \r
+\r
                // Graphic layout of composite\r
                this.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));\r
                this.setLayout(new TableWrapLayout());\r
@@ -55,4 +56,18 @@ public class GroupComposite extends Composite {
                        }\r
                });\r
        }\r
+\r
+       /**\r
+        * If disposal of the composite by the user should also cause associated data\r
+        *  to be disposed, add an IDataDisposer\r
+        */\r
+       protected void disposeData() {\r
+               if (dataDisposer != null) {\r
+                       dataDisposer.disposeData();\r
+               }\r
+       }\r
+       \r
+       public void setDataDisposer(IDataDisposer dataDisposer) {\r
+               this.dataDisposer = dataDisposer;\r
+       }\r
 }
\ No newline at end of file
index d2576589f125a81e2dc6f941df5434469b40d626..a2abe6cbefba91a25e0a1545d7cc24d6d9c3aeb9 100644 (file)
 package eu.etaxonomy.taxeditor.view.nameviewersupport;\r
 \r
-import java.beans.PropertyChangeListener;\r
-import java.beans.PropertyChangeSupport;\r
-\r
-import org.eclipse.jface.text.TextViewer;\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.DragSourceAdapter;\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.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.ui.forms.widgets.TableWrapData;\r
-import org.eclipse.ui.forms.widgets.TableWrapLayout;\r
+import org.eclipse.swt.widgets.Control;\r
 \r
 import eu.etaxonomy.taxeditor.controller.WidgetTransfer;\r
 \r
 /**\r
- * A draggable composite with two elements: a draggable label and a text viewer for editing text.\r
+ * A composite which can be dragged between different GroupComposite. The user\r
+ *  uses the draggable control for dragging the whole composite.\r
+ * \r
+ * @see eu.etaxonomy.taxeditor.view.nameviewersupport.GroupComposite\r
  * \r
  * @author p.ciardelli\r
  *\r
  */\r
 abstract public class GroupedComposite extends Composite {\r
-       \r
-       private Label draggableLabel;\r
-       private TextViewer textViewer;\r
-       protected TableWrapLayout layout;\r
-       \r
-       protected static final int LEFT_MARGIN = 15;\r
-               \r
-       PropertyChangeSupport propertyChangeSupport;\r
-       \r
-       public GroupedComposite(Composite parent, boolean draggable) {\r
-               this(parent, null, draggable);\r
-       }\r
-       \r
-       public GroupedComposite(Composite parent, Object data, boolean draggable) {\r
-               super(parent, SWT.NONE);\r
 \r
-               if (data != null) {\r
-                       setData(data);\r
-               }\r
+       IParentDataAdapter parentDataAdapter;\r
+       private Control draggableControl;       \r
                \r
-               propertyChangeSupport = new PropertyChangeSupport(this);\r
+       public GroupedComposite(Composite parent) {\r
+               super(parent, SWT.NONE);\r
                \r
                createContent();\r
-                               \r
-               if (draggable) {\r
-                       addDraggability();\r
-               }               \r
        }\r
        \r
-       protected void createContent() {\r
-               this.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));\r
-               layout = new TableWrapLayout();\r
-               layout.numColumns = 2;\r
-               layout.leftMargin = 0;\r
-               this.setLayout(layout);\r
-               \r
-               this.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));\r
-               \r
-               draggableLabel = new Label(this, SWT.NONE);                                     \r
-               draggableLabel.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));\r
-               draggableLabel.setLayoutData(new TableWrapData(TableWrapData.CENTER, TableWrapData.MIDDLE));\r
+       abstract protected void createContent();\r
+       \r
+       protected void setDraggableControl(Control control) {\r
+               draggableControl = control;     \r
        }\r
        \r
-       private void addDraggability() {\r
+       public void addDraggability() {\r
+               \r
+               if (draggableControl == null) {\r
+                       throw new NullPointerException(\r
+                               "Draggable control must be set to add draggability");\r
+               }\r
+               \r
                Transfer[] types = new Transfer[] {WidgetTransfer.getInstance()};               \r
                int operations = DND.DROP_MOVE | DND.DROP_COPY | DND.DROP_LINK;\r
                \r
-               // Make relation label draggable        \r
-               DragSource dragLabel = new DragSource (draggableLabel, operations);\r
-               dragLabel.setTransfer(types);\r
-               dragLabel.addDragListener(dragSourceListener);\r
+               dragger = new DragSource (draggableControl, operations);\r
+               dragger.setTransfer(types);\r
+               dragger.addDragListener(dragSourceListener);\r
        }\r
 \r
+       public void removeDraggability() {\r
+               dragger = null;\r
+       }\r
+       \r
        /**\r
         * Drag listener which passes the Composite as the data in\r
         *  a drag event.\r
         */\r
-       DragSourceListener dragSourceListener = new DragSourceListener () {\r
+       DragSourceListener dragSourceListener = new DragSourceAdapter() {\r
                \r
                public void dragStart(DragSourceEvent event) {\r
-                       getTextWidget().setFocus();\r
+                       GroupedComposite.this.setFocus();\r
                        event.doit = true;\r
                }\r
                public void dragSetData (DragSourceEvent event) {\r
                        WidgetTransfer.getInstance().setWidget(GroupedComposite.this);\r
                }\r
-               public void dragFinished(DragSourceEvent event) {\r
-               }\r
        };\r
+       private DragSource dragger;\r
        \r
        /** \r
         * Override of setParent: dispose of parent if this is its last child composite\r
@@ -104,10 +80,11 @@ abstract public class GroupedComposite extends Composite {
        public boolean setParent (Composite parent) {\r
                Composite oldParent = this.getParent();\r
                if (super.setParent (parent)) {\r
-                       if (oldParent.getChildren().length == 0) {\r
+                       if (oldParent instanceof GroupComposite && oldParent.getChildren().length == 0) {\r
+                               ((GroupComposite) oldParent).disposeData();\r
                                oldParent.dispose();\r
                        }\r
-                       propertyChangeSupport.firePropertyChange("parent", oldParent, parent);\r
+                       adaptParentData();\r
                        \r
                        // Redraw the component holding all group and grouped composites \r
                        parent.getParent().layout();\r
@@ -117,33 +94,19 @@ abstract public class GroupedComposite extends Composite {
                return false;\r
        }\r
 \r
-       public void addPropertyChangeListener(String propertyName,\r
-            PropertyChangeListener listener) {\r
-               propertyChangeSupport.addPropertyChangeListener(propertyName, listener);\r
-       }\r
-\r
-       public void removePropertyChangeListener(PropertyChangeListener listener) {\r
-               propertyChangeSupport.removePropertyChangeListener(listener);\r
-       }\r
-\r
-       public TextViewer getTextViewer() {\r
-               return textViewer;\r
-       }\r
-\r
-       public void setTextViewer(TextViewer textViewer) {\r
-               this.textViewer = textViewer;\r
-       }\r
-\r
-       public StyledText getTextWidget() {\r
-               return textViewer.getTextWidget();\r
-       }\r
-\r
-       protected void setIcon(Image icon) {\r
-               draggableLabel.setImage(icon);\r
+       \r
+       /**\r
+        * A grouped composites is usually grouped according to data held by its parent.\r
+        *  When the composite changes parents, this method gets called to update data \r
+        *  as needed.\r
+        */\r
+       private void adaptParentData() {\r
+               if (parentDataAdapter != null) {\r
+                       parentDataAdapter.adaptParentData();\r
+               }\r
        }\r
-\r
-       public void indent() {\r
-               layout.leftMargin = LEFT_MARGIN;\r
-               this.setLayout(layout);\r
+       \r
+       public void setParentDataAdapter(IParentDataAdapter parentDataAdapter) {\r
+               this.parentDataAdapter = parentDataAdapter;\r
        }\r
 }
\ No newline at end of file
diff --git a/eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/view/nameviewersupport/IDataDisposer.java b/eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/view/nameviewersupport/IDataDisposer.java
new file mode 100644 (file)
index 0000000..63bba06
--- /dev/null
@@ -0,0 +1,5 @@
+package eu.etaxonomy.taxeditor.view.nameviewersupport;\r
+\r
+public interface IDataDisposer {\r
+       public void disposeData();\r
+}\r
diff --git a/eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/view/nameviewersupport/IParentDataAdapter.java b/eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/view/nameviewersupport/IParentDataAdapter.java
new file mode 100644 (file)
index 0000000..1917efd
--- /dev/null
@@ -0,0 +1,5 @@
+package eu.etaxonomy.taxeditor.view.nameviewersupport;\r
+\r
+public interface IParentDataAdapter {\r
+       public void adaptParentData();\r
+}\r
diff --git a/eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/view/nameviewersupport/ISelectionWrapper.java b/eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/view/nameviewersupport/ISelectionWrapper.java
new file mode 100644 (file)
index 0000000..9c82a01
--- /dev/null
@@ -0,0 +1,5 @@
+package eu.etaxonomy.taxeditor.view.nameviewersupport;\r
+\r
+public interface ISelectionWrapper {\r
+       public void setSelection();\r
+}\r
index 7545a1e1e3122557a86d4afebf4841b3dab4ccb0..be2016dbbf8c463fcb401441ac0c7875ea1ef32b 100644 (file)
@@ -7,7 +7,7 @@ import org.eclipse.swt.events.VerifyEvent;
 import org.eclipse.swt.events.VerifyListener;\r
 \r
 /**\r
- * Checks text entered into a name viewer for line breaks, sends\r
+ * Checks text entered into a StyledText widget for line breaks, sends\r
  *  split text to handleSplitText()\r
  * \r
  * @author p.ciardelli\r
index d8b3a31e341ced25a7c733a21d9226f4f44541da..51a593636ba79ebf38773356f41c770d0a26613c 100644 (file)
@@ -6,14 +6,14 @@ import org.eclipse.swt.widgets.Composite;
 import eu.etaxonomy.taxeditor.Activator;\r
 import eu.etaxonomy.taxeditor.view.NameViewer;\r
 \r
-public class NameComposite extends GroupedComposite {\r
-       \r
+public class NameComposite extends EditableGroupedComposite {\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
-       public NameComposite(Composite parent, Object data, boolean draggable) {\r
-               super(parent, data, draggable);\r
+       public NameComposite(Composite parent) {\r
+               super(parent);\r
        }\r
        \r
        protected void createContent() {\r
diff --git a/eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/view/nameviewersupport/TaxonCompositeFactory.java b/eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/view/nameviewersupport/TaxonCompositeFactory.java
new file mode 100644 (file)
index 0000000..f00e4c3
--- /dev/null
@@ -0,0 +1,135 @@
+package eu.etaxonomy.taxeditor.view.nameviewersupport;\r
+\r
+import org.eclipse.jface.viewers.ISelectionProvider;\r
+import org.eclipse.jface.viewers.StructuredSelection;\r
+import org.eclipse.swt.SWT;\r
+import org.eclipse.swt.widgets.Composite;\r
+import org.eclipse.ui.forms.IManagedForm;\r
+\r
+import com.swtdesigner.SWTResourceManager;\r
+\r
+import eu.etaxonomy.cdm.model.name.BotanicalName;\r
+import eu.etaxonomy.cdm.model.name.HomotypicalGroup;\r
+import eu.etaxonomy.cdm.model.taxon.Taxon;\r
+import eu.etaxonomy.cdm.model.taxon.TaxonBase;\r
+import eu.etaxonomy.taxeditor.view.propertysheetsupport.BotanicalNamePropertySource;\r
+\r
+public class TaxonCompositeFactory {\r
+               \r
+       private Taxon taxon;\r
+\r
+       public TaxonCompositeFactory(Taxon taxon) {\r
+               this.taxon = taxon;\r
+       }\r
+\r
+       public static TaxonCompositeFactory NewInstance(Taxon taxon) {\r
+               return new TaxonCompositeFactory(taxon);\r
+       }\r
+\r
+       private IManagedForm managedForm;\r
+       private ISelectionProvider selectionProvider;\r
+\r
+       public GroupComposite createGroupComposite(Composite parent, HomotypicalGroup data) {\r
+               final GroupComposite groupComposite = new GroupComposite(parent);\r
+               groupComposite.setData(data);\r
+               groupComposite.setDataDisposer(new IDataDisposer() {\r
+                       @Override\r
+                       public void disposeData() {\r
+                               HomotypicalGroup data = (HomotypicalGroup) groupComposite.getData();\r
+                               taxon.getHeterotypicSynonymyGroups().remove(data);\r
+                       }\r
+               });\r
+               createBorderSupport(groupComposite);\r
+               return groupComposite;\r
+       }\r
+       \r
+       private NameComposite createNameComposite(Composite parent, final TaxonBase data) {\r
+               final NameComposite nameComposite = new NameComposite(parent);\r
+               nameComposite.setData(data);\r
+               nameComposite.setParentDataAdapter(new IParentDataAdapter() {\r
+                       @Override\r
+                       public void adaptParentData() {\r
+                               Object parentData = nameComposite.getParent().getData();\r
+                               if (parentData instanceof HomotypicalGroup) {\r
+                                       data.getName().setHomotypicalGroup((HomotypicalGroup) parentData);\r
+                                       \r
+                                       if (parentData.equals(taxon.getHomotypicGroup())) {\r
+                                               createHomotypicSynonymComposite(nameComposite);\r
+                                       } else {\r
+                                               createHeterotypicSynonymComposite(nameComposite);\r
+                                       }\r
+                               }\r
+                       }\r
+               });\r
+               if (selectionProvider != null) {\r
+                       nameComposite.setSelectionWrapper(new ISelectionWrapper() {\r
+                               @Override\r
+                               public void setSelection() {\r
+                                       selectionProvider.setSelection(\r
+                                                       new StructuredSelection(\r
+                                                                       new BotanicalNamePropertySource((BotanicalName) data.getName())));\r
+                                       \r
+                               }\r
+                       });\r
+               }\r
+               createBorderSupport(nameComposite);\r
+               return nameComposite;\r
+       }\r
+       \r
+       public NameComposite createAcceptedNameComposite(Composite parent, TaxonBase data) {\r
+               NameComposite nameComposite = createNameComposite(parent, data);\r
+               return createAcceptedNameComposite(nameComposite);\r
+       }\r
+       \r
+       public NameComposite createAcceptedNameComposite(NameComposite nameComposite) {\r
+               nameComposite.removeDraggability();\r
+               nameComposite.setIcon(NameComposite.ACCEPTED);\r
+               nameComposite.setFont(SWTResourceManager.getFont("Georgia", 12, SWT.NONE));\r
+               return nameComposite;\r
+       }\r
+       \r
+       public NameComposite createHomotypicSynonymComposite(Composite parent, TaxonBase data) {\r
+               NameComposite nameComposite = createSynonymComposite(parent, data);\r
+               return createHomotypicSynonymComposite(nameComposite);\r
+       }\r
+\r
+       public NameComposite createHomotypicSynonymComposite(NameComposite nameComposite) {\r
+               nameComposite.setIcon(NameComposite.HOMOTYPIC_SYNONYM);\r
+               return nameComposite;\r
+       }\r
+       \r
+       public NameComposite createHeterotypicSynonymComposite(Composite parent, TaxonBase data) {\r
+               NameComposite nameComposite = createSynonymComposite(parent, data);\r
+               return createHeterotypicSynonymComposite(nameComposite);\r
+       }\r
+       \r
+       public NameComposite createHeterotypicSynonymComposite(NameComposite nameComposite) {\r
+               nameComposite.setIcon(NameComposite.HETEROTYPIC_SYNONYM);\r
+               return nameComposite;\r
+       }\r
+\r
+       private NameComposite createSynonymComposite(Composite composite, TaxonBase data) {\r
+               NameComposite nameComposite = createNameComposite(composite, data);\r
+               nameComposite.addDraggability();\r
+               nameComposite.setFont(SWTResourceManager.getFont("Georgia", 10, SWT.NONE));\r
+               nameComposite.indent();\r
+               return nameComposite;\r
+       }\r
+\r
+       public void setManagedForm(IManagedForm managedForm) {\r
+               this.managedForm = managedForm;\r
+       }\r
+\r
+       public void setSelectionWrapper(ISelectionProvider selectionProvider) {\r
+               this.selectionProvider = selectionProvider;             \r
+       }\r
+       \r
+       public void createBorderSupport(Composite composite) {\r
+               if (managedForm != null) {\r
+                       new CompositeBorderDecorator(composite, managedForm);\r
+               } else {\r
+                       // TODO add warning that border support can't be added without a managed form \r
+               }\r
+       }\r
+\r
+}
\ No newline at end of file