Removed all CDM object manipulation from drag and drop part in NameComponent and...
authorp.ciardelli <p.ciardelli@localhost>
Thu, 24 Apr 2008 15:03:30 +0000 (15:03 +0000)
committerp.ciardelli <p.ciardelli@localhost>
Thu, 24 Apr 2008 15:03:30 +0000 (15:03 +0000)
.gitattributes
eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/controller/WidgetTransfer.java [new file with mode: 0644]
eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/view/NameEditorView.java
eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/view/nameviewersupport/GroupComposite.java
eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/view/nameviewersupport/NameComposite.java

index 1f613b341dc712c73e99d8b582a4ba625b3ed0a0..5d5abfce30bec36d3716c84398397efc1480508e 100644 (file)
@@ -387,6 +387,7 @@ eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/controller/Act
 eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/controller/NameTransfer.java -text
 eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/controller/SynonymRelationshipTransfer.java -text
 eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/controller/TaxonTransfer.java -text
+eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/controller/WidgetTransfer.java -text
 eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/model/NameEditorInput.java -text
 eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/model/NameTreeContentProvider.java -text
 eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/model/PropertySheetNode.java -text
diff --git a/eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/controller/WidgetTransfer.java b/eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/controller/WidgetTransfer.java
new file mode 100644 (file)
index 0000000..e2e9693
--- /dev/null
@@ -0,0 +1,84 @@
+package eu.etaxonomy.taxeditor.controller;\r
+\r
+import org.eclipse.swt.dnd.ByteArrayTransfer;\r
+import org.eclipse.swt.dnd.TransferData;\r
+import org.eclipse.swt.widgets.Widget;\r
+\r
+import eu.etaxonomy.cdm.model.taxon.TaxonBase;\r
+\r
+/**\r
+ * For drag and drop - a drag widget with this transfer type can only be dropped onto\r
+ *  a drop widget with the same type.\r
+ *    \r
+ * @author p.ciardelli\r
+ *\r
+ */\r
+public class WidgetTransfer extends ByteArrayTransfer {\r
+\r
+       private static final String WIDGETTYPENAME = "widget_type";\r
+       private static final int WIDGETTYPEID = registerType (WIDGETTYPENAME);          \r
+       private static final WidgetTransfer INSTANCE = new WidgetTransfer();\r
+       \r
+       /*\r
+        * The object associated with this transfer event\r
+        */\r
+       private Widget widget;\r
+               \r
+       /*\r
+        * Returns the singleton\r
+        */\r
+       public static WidgetTransfer getInstance() {\r
+               return INSTANCE;\r
+       }\r
+       /*\r
+        * Set transfer data for local use\r
+        */\r
+       public void setWidget(Widget widget) {\r
+               this.widget = widget;\r
+       }\r
+       /*\r
+        * Returns the local transfer data\r
+        */\r
+       public Widget getWidget() {\r
+               return widget;\r
+       }\r
+       \r
+       /* \r
+        * The type ID is used to identify this transfer\r
+        */\r
+       @Override\r
+       protected int[] getTypeIds() {\r
+               return new int[] { WIDGETTYPEID };\r
+       }\r
+\r
+       @Override\r
+       protected String[] getTypeNames() {\r
+               return new String[] { WIDGETTYPENAME } ;\r
+       }\r
+\r
+       @Override\r
+       protected void javaToNative(Object object, TransferData transferData) {\r
+               // No encoding needed since this is a hardcoded string read and written\r
+               // in the same process.\r
+               // See nativeToJava below\r
+               byte[] check = WIDGETTYPENAME.getBytes();\r
+               super.javaToNative(check, transferData);\r
+       }\r
+\r
+       @Override\r
+       protected Object nativeToJava(TransferData transferData) {\r
+               Object result = super.nativeToJava(transferData);\r
+               if (isInvalidNativeType(result)) {\r
+                       throw new RuntimeException(); //$NON-NLS-1$\r
+               }\r
+               return widget;\r
+       }\r
+       \r
+       private boolean isInvalidNativeType(Object result) {\r
+               // No encoding needed since this is a hardcoded string read and written\r
+               // in the same process.\r
+               // See javaToNative above\r
+               return !(result instanceof byte[])\r
+                               || !WIDGETTYPENAME.equals(new String((byte[]) result));\r
+       }\r
+}\r
index 05fe89b8cbe09a3dcb31ef6a51a3214b01cdfa3f..a7752d549c7051a475190df8d0060befc25d78e2 100644 (file)
@@ -11,7 +11,6 @@ import org.eclipse.core.databinding.observable.set.SetChangeEvent;
 import org.eclipse.core.runtime.IAdaptable;\r
 import org.eclipse.core.runtime.IProgressMonitor;\r
 import org.eclipse.core.runtime.ListenerList;\r
-import org.eclipse.jface.dialogs.IMessageProvider;\r
 import org.eclipse.jface.viewers.ISelection;\r
 import org.eclipse.jface.viewers.ISelectionChangedListener;\r
 import org.eclipse.jface.viewers.ISelectionProvider;\r
@@ -41,11 +40,10 @@ import org.eclipse.ui.views.properties.PropertySheetPage;
 \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
 import eu.etaxonomy.cdm.model.taxon.Synonym;\r
 import eu.etaxonomy.cdm.model.taxon.Taxon;\r
 import eu.etaxonomy.cdm.model.taxon.TaxonBase;\r
-import eu.etaxonomy.taxeditor.controller.TaxonTransfer;\r
+import eu.etaxonomy.taxeditor.controller.WidgetTransfer;\r
 import eu.etaxonomy.taxeditor.view.nameviewersupport.GroupComposite;\r
 import eu.etaxonomy.taxeditor.view.nameviewersupport.NameComposite;\r
 import eu.etaxonomy.taxeditor.view.nameviewersupport.TesterooWritableSet;\r
@@ -208,7 +206,7 @@ public class NameEditorView extends EditorPart implements IAdaptable {
                                createNameComposite(synonym, heterotypicComposite);                             \r
                        }\r
                }\r
-               \r
+                               \r
                // TODO replace this with real set of taxon's synonyms\r
                // 1) Observe all synonyms\r
                TesterooWritableSet.getInstance().addSetChangeListener\r
@@ -243,15 +241,24 @@ public class NameEditorView extends EditorPart implements IAdaptable {
                \r
                // Listen for names being dragged outside of existing homotypic groups -\r
                //  user wants to create a new group\r
-               Transfer[] types = new Transfer[] {TaxonTransfer.getInstance()};\r
+//             Transfer[] types = new Transfer[] {TaxonTransfer.getInstance()};\r
+               Transfer[] types = new Transfer[] {WidgetTransfer.getInstance()};\r
                int operations = DND.DROP_MOVE | DND.DROP_COPY | DND.DROP_DEFAULT;\r
                DropTarget target = new DropTarget(parent, operations);\r
                target.setTransfer(types);\r
                target.addDropListener(new DropTargetAdapter() {\r
                        \r
                        public void drop(DropTargetEvent event) {\r
-                               Synonym synonym = (Synonym) event.data;\r
-                               synonym.getName().setHomotypicalGroup(new HomotypicalGroup());\r
+                               HomotypicalGroup newHomotypicalGroup = new HomotypicalGroup();\r
+                               NameComposite nameComposite = (NameComposite) event.data;\r
+                               \r
+                               // UI elements\r
+                               GroupComposite newGroupComposite = createGroupComposite(newHomotypicalGroup);\r
+                               nameComposite.setParent(newGroupComposite);\r
+                               \r
+                               // Following should be triggered by set parent!\r
+                               // Data elements\r
+//                             nameComposite.getName().setHomotypicalGroup(newHomotypicalGroup);\r
                        }               \r
                });\r
        }\r
@@ -265,7 +272,23 @@ public class NameEditorView extends EditorPart implements IAdaptable {
                \r
                groupComposite.addListener(SWT.FocusIn, new DrawBorderListener(parent));\r
                groupComposite.addListener(SWT.FocusOut, new DrawBorderListener(parent));\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
+                               GroupComposite emptyComposite = (GroupComposite) event.widget;\r
+                               HomotypicalGroup emptyHomotypicalGroup = emptyComposite.getHomotypicalGroup();  \r
+                               taxon.getHeterotypicSynonymyGroups().remove(emptyHomotypicalGroup);\r
+                               \r
+                               redrawView(false);\r
+                       }\r
+                       \r
+               });\r
+               \r
                scrolledForm.reflow(true); // check whether this is necessary\r
                \r
                return groupComposite;\r
@@ -315,6 +338,21 @@ public class NameEditorView extends EditorPart implements IAdaptable {
                        }\r
                });\r
                \r
+               nameComposite.addPropertyChangeListener("parent", new PropertyChangeListener() {\r
+\r
+                       @Override\r
+                       public void propertyChange(PropertyChangeEvent evt) {\r
+                               System.out.println("changed parent");\r
+                               \r
+                               // DATA: set name's homotypical group\r
+                               \r
+                               // UI: set component's syn-type icon\r
+//                             evt.getNewValue();\r
+//                             evt.getOldValue();\r
+                       }\r
+                       \r
+               });\r
+               \r
                // Redraw form with every change in case text area has, for instance, word wrapped\r
                nameComposite.getTextWidget().addListener(SWT.Modify, new Listener() {\r
                        @Override\r
@@ -327,6 +365,17 @@ public class NameEditorView extends EditorPart implements IAdaptable {
                \r
                nameComposite.getTextWidget().setFocus();\r
                \r
+               nameComposite.addListener(SWT.Move, new Listener() {\r
+\r
+                       @Override\r
+                       public void handleEvent(Event event) {\r
+                               // still using old parent\r
+                               System.out.println("My move parent: " + \r
+                                               ((Composite) event.widget).getParent().handle);\r
+                       }\r
+                       \r
+               });\r
+               \r
 //             managedForm.getMessageManager().addMessage\r
 //                             ("TEST", "Testeroo error", null, IMessageProvider.ERROR, nameComposite.getTextWidget());\r
 //             managedForm.getMessageManager().addMessage\r
@@ -371,15 +420,14 @@ public class NameEditorView extends EditorPart implements IAdaptable {
                @Override\r
                public void handleEvent(Event event) {\r
                        \r
-                       // To cut down on flickering, only draw border as necessary\r
                        String border = (event.type == SWT.FocusIn ? FormToolkit.TEXT_BORDER : null);\r
-//                     if (event.widget.getData(FormToolkit.KEY_DRAW_BORDER).equals(border)) \r
-//                             return;\r
-                       \r
                        event.widget.setData(FormToolkit.KEY_DRAW_BORDER, border);\r
                        toolkit.paintBordersFor(parent);\r
-                       scrolledForm.reflow(false);\r
-//                     managedForm.reflow(false);\r
+                       redrawView(false);\r
                }                                       \r
        }\r
+       \r
+       private void redrawView(boolean flushLayoutDataCache) {\r
+               scrolledForm.reflow(flushLayoutDataCache);\r
+       }\r
 }
\ No newline at end of file
index 071a71eb9682d5621488b8191e1972b1d05b09b6..fd5d52f21c75c1c4f56902f4a37ac48034001afb 100644 (file)
@@ -12,9 +12,7 @@ import org.eclipse.ui.forms.widgets.TableWrapData;
 import org.eclipse.ui.forms.widgets.TableWrapLayout;\r
 \r
 import eu.etaxonomy.cdm.model.name.HomotypicalGroup;\r
-import eu.etaxonomy.cdm.model.name.TaxonNameBase;\r
-import eu.etaxonomy.cdm.model.taxon.Synonym;\r
-import eu.etaxonomy.taxeditor.controller.TaxonTransfer;\r
+import eu.etaxonomy.taxeditor.controller.WidgetTransfer;\r
 \r
 public class GroupComposite extends Composite {\r
        \r
@@ -25,14 +23,15 @@ public class GroupComposite extends Composite {
                super(parent, SWT.NONE);\r
                                \r
                this.homotypicalGroup = homotypicalGroup;\r
-               \r
+                               \r
                // Graphic layout of composite\r
                this.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));\r
                this.setLayout(new TableWrapLayout());\r
                this.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));\r
                                \r
                // Drop functionality\r
-               Transfer[] types = new Transfer[] {TaxonTransfer.getInstance()};\r
+//             Transfer[] types = new Transfer[] {TaxonTransfer.getInstance()};\r
+               Transfer[] types = new Transfer[] {WidgetTransfer.getInstance()};       \r
                int operations = DND.DROP_MOVE | DND.DROP_COPY | DND.DROP_DEFAULT;\r
                DropTarget target = new DropTarget(this, operations);\r
                target.setTransfer(types);\r
@@ -48,17 +47,12 @@ public class GroupComposite extends Composite {
                        \r
                        public void drop(DropTargetEvent event) {\r
                                \r
-                               TaxonNameBase synonymName = ((Synonym) event.data).getName();\r
-                               HomotypicalGroup homotypicalGroup = GroupComposite.this.getHomotypicalGroup();\r
-                               \r
-                               // Abort drop if name is being dropped onto group to which it already belongs\r
-                               if (synonymName.getHomotypicalGroup().equals(homotypicalGroup)) {\r
-                                       event.detail = DND.DROP_NONE;\r
-                                       return;\r
-                               }\r
-\r
-                               // Associate synonym with group - listeners will take care of the rest  \r
-                               synonymName.setHomotypicalGroup(homotypicalGroup);              \r
+                               if (event.data instanceof Composite) {\r
+                                       Composite composite = (Composite) event.data; \r
+                                       if ( ! composite.getParent().equals(GroupComposite.this)) {\r
+                                               composite.setParent(GroupComposite.this);\r
+                                       }\r
+                               }               \r
                        }\r
                });\r
        }\r
index 8d100785a2dd755d52b61389c1e2a2b47a947881..8ce1b865f247ea16ac2f11b472ab6a315fc34a7a 100644 (file)
@@ -1,7 +1,7 @@
 package eu.etaxonomy.taxeditor.view.nameviewersupport;\r
 \r
-import java.util.Observable;\r
-import java.util.Observer;\r
+import java.beans.PropertyChangeListener;\r
+import java.beans.PropertyChangeSupport;\r
 \r
 import org.eclipse.core.runtime.Assert;\r
 import org.eclipse.swt.SWT;\r
@@ -33,7 +33,7 @@ import eu.etaxonomy.cdm.model.taxon.Synonym;
 import eu.etaxonomy.cdm.model.taxon.Taxon;\r
 import eu.etaxonomy.cdm.strategy.parser.TaxonNameParserBotanicalNameImpl;\r
 import eu.etaxonomy.taxeditor.Activator;\r
-import eu.etaxonomy.taxeditor.controller.TaxonTransfer;\r
+import eu.etaxonomy.taxeditor.controller.WidgetTransfer;\r
 import eu.etaxonomy.taxeditor.view.IFavoritesDraggable;\r
 import eu.etaxonomy.taxeditor.view.NameViewer;\r
 \r
@@ -50,6 +50,9 @@ public class NameComposite extends Composite implements IFavoritesDraggable {
        NameViewer nameViewer;\r
        boolean initialized = false;\r
        Image icon;\r
+       \r
+       PropertyChangeSupport propertyChangeSupport;\r
+       private boolean draggable;\r
 \r
        /**\r
         * Temporary procedure until ability to get accepted taxon\r
@@ -91,16 +94,29 @@ public class NameComposite extends Composite implements IFavoritesDraggable {
                createNameComposite();\r
        }\r
        \r
+       public NameComposite(Composite parent, Object data, boolean draggable) {\r
+               super(parent, SWT.NONE);\r
+               \r
+               setData(data);\r
+               \r
+               this.draggable = draggable;\r
+               \r
+               propertyChangeSupport = new PropertyChangeSupport(this);\r
+               \r
+               createNameComposite();\r
+       }\r
+       \r
        /**\r
         * \r
         */\r
        public void createNameComposite() {\r
 \r
+               propertyChangeSupport = new PropertyChangeSupport(this);\r
+               \r
                Assert.isNotNull(taxon);\r
                                                \r
                this.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));\r
                TableWrapLayout layout = new TableWrapLayout();\r
-//             layout.numColumns = (compositeType == ACCEPTED? 1: 2);\r
                layout.numColumns = 2;\r
                layout.leftMargin = (compositeType == ACCEPTED? 0: 15);\r
                this.setLayout(layout);\r
@@ -122,15 +138,6 @@ public class NameComposite extends Composite implements IFavoritesDraggable {
                }\r
                relationLabel.setImage(this.icon);\r
                \r
-               //              if (compositeType != ACCEPTED) {        \r
-//                     relationLabel = new Label(this, SWT.NONE);                                      \r
-//                     relationLabel.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));\r
-//                     \r
-//                     if (this.compositeType == HOMOTYPIC_SYNONYM)\r
-//                             relationLabel.setImage(Activator.getDefault().getImageRegistry().get(Activator.HOMOTYPIC_SYN));\r
-//                     else\r
-//                             relationLabel.setImage(Activator.getDefault().getImageRegistry().get(Activator.HETEROTYPIC_SYN));\r
-//             }\r
                nameViewer = new NameViewer(this);      \r
                StyledText nameWidget = nameViewer.getTextWidget();\r
                \r
@@ -145,7 +152,7 @@ public class NameComposite extends Composite implements IFavoritesDraggable {
                        @Override\r
                        public void focusLost(FocusEvent e) {}                  \r
                });\r
-               \r
+                               \r
                nameWidget.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));           \r
                nameWidget.setFont(\r
                                SWTResourceManager.getFont("Georgia", \r
@@ -171,7 +178,6 @@ public class NameComposite extends Composite implements IFavoritesDraggable {
                });\r
                                                                \r
                // Put name into name viewer, show error if parsed incorrectly\r
-//             nameWidget.setText(getName().getTitleCache() == null ? "" : getName().getTitleCache());\r
                String initText = getName().getTitleCache() == null ? "" : getName().getTitleCache();\r
 //             initText += " NameID: " + getName().getId();\r
 //             initText += ", TaxonID: " + (compositeType == ACCEPTED? taxon : synonym).getId();\r
@@ -192,14 +198,9 @@ public class NameComposite extends Composite implements IFavoritesDraggable {
                createTempMenu();\r
                \r
                // **************** DRAG FUNCTIONALITY **************** //\r
-               Transfer[] types = new Transfer[] {TaxonTransfer.getInstance()};\r
+               Transfer[] types = new Transfer[] {WidgetTransfer.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
@@ -207,8 +208,8 @@ public class NameComposite extends Composite implements IFavoritesDraggable {
        }\r
 \r
        /**\r
-        * Shared drag listener which destroys the NameComposite after the drag\r
-        *  gesture is completed.\r
+        * Shared drag listener which passes the Composite as the data in\r
+        *  a drag event.\r
         */\r
        DragSourceListener dragSourceListener = new DragSourceListener () {\r
                \r
@@ -217,26 +218,10 @@ public class NameComposite extends Composite implements IFavoritesDraggable {
                        event.doit = true;\r
                }\r
                public void dragSetData (DragSourceEvent event) {\r
-                       TaxonTransfer.getInstance().setTaxon(synonym);\r
+//                     TaxonTransfer.getInstance().setTaxon(synonym);\r
+                       WidgetTransfer.getInstance().setWidget(NameComposite.this);\r
                }\r
                public void dragFinished(DragSourceEvent event) {\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
        \r
@@ -277,6 +262,32 @@ public class NameComposite extends Composite implements IFavoritesDraggable {
                return nameViewer.getTextWidget();\r
        }\r
 \r
+\r
+       /** \r
+        * Override of setParent: dispose of parent if this is its last child composite\r
+        * @see org.eclipse.swt.widgets.Control#setParent(org.eclipse.swt.widgets.Composite)\r
+        */\r
+       public boolean setParent (Composite parent) {\r
+               Composite oldParent = this.getParent();\r
+               if (super.setParent (parent)) {\r
+                       if (oldParent.getChildren().length == 0) {\r
+                               oldParent.dispose();\r
+                       }\r
+                       propertyChangeSupport.firePropertyChange("parent", oldParent, parent);\r
+                       return true;\r
+               }\r
+               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
        @Override\r
        public Image getIcon() {\r
                return icon;\r