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
--- /dev/null
+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
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
\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
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
\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
\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
}\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
\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
@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
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
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
\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
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
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
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
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
}\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
@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
});\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
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
}\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
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
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