Implement creation of characters via drag'n'drop
authorPatrick Plitzner <p.plitzner@bgbm.org>
Fri, 2 Jun 2017 12:26:53 +0000 (14:26 +0200)
committerPatrick Plitzner <p.plitzner@bgbm.org>
Fri, 2 Jun 2017 12:26:53 +0000 (14:26 +0200)
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/workingSet/CharacterDragListener.java [new file with mode: 0644]
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/workingSet/CharacterDropAdapter.java [new file with mode: 0644]
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/workingSet/CharacterLabelProvider.java [new file with mode: 0644]
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/workingSet/FeatureTreeBuilderViewPart.java
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/workingSet/StructureContentProvider.java
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/workingSet/StructureLabelProvider.java
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/featuretree/EditFeatureTreeWizardPage.java
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/featuretree/FeatureNodeDragListener.java [new file with mode: 0644]
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/featuretree/FeatureNodeDropAdapter.java [new file with mode: 0644]
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/featuretree/FeatureTreeLabelProvider.java

diff --git a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/workingSet/CharacterDragListener.java b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/workingSet/CharacterDragListener.java
new file mode 100644 (file)
index 0000000..7b127f6
--- /dev/null
@@ -0,0 +1,53 @@
+/**
+* Copyright (C) 2017 EDIT
+* European Distributed Institute of Taxonomy
+* http://www.e-taxonomy.eu
+*
+* The contents of this file are subject to the Mozilla Public License Version 1.1
+* See LICENSE.TXT at the top of this package for the full license terms.
+*/
+package eu.etaxonomy.taxeditor.editor.workingSet;
+
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.swt.dnd.DragSourceEvent;
+
+import eu.etaxonomy.cdm.model.description.FeatureNode;
+import eu.etaxonomy.taxeditor.featuretree.FeatureNodeDragListener;
+import eu.etaxonomy.taxeditor.featuretree.FeatureNodeTransfer;
+
+/**
+ * @author pplitzner
+ * @since Jun 2, 2017
+ *
+ */
+public class CharacterDragListener extends FeatureNodeDragListener {
+
+    private TreeViewer structureViewer;
+    private TreeViewer propertyViewer;
+
+    /**
+     * @param propertyViewer
+     */
+    public CharacterDragListener(TreeViewer structureViewer, TreeViewer propertyViewer) {
+        super(propertyViewer);
+        this.structureViewer = structureViewer;
+        this.propertyViewer = propertyViewer;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void dragSetData(DragSourceEvent event) {
+        FeatureNode structure = (FeatureNode) ((IStructuredSelection) structureViewer.getSelection()).getFirstElement();
+        FeatureNode property = (FeatureNode) ((IStructuredSelection) propertyViewer.getSelection()).getFirstElement();
+        FeatureNode[] character = new FeatureNode[2];
+        character[0] = structure;
+        character[1] = property;
+        if (FeatureNodeTransfer.getInstance().isSupportedType(event.dataType)) {
+            event.data = character;
+        }
+    }
+
+}
diff --git a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/workingSet/CharacterDropAdapter.java b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/workingSet/CharacterDropAdapter.java
new file mode 100644 (file)
index 0000000..062d75b
--- /dev/null
@@ -0,0 +1,72 @@
+/**
+* Copyright (C) 2009 EDIT
+* European Distributed Institute of Taxonomy
+* http://www.e-taxonomy.eu
+*
+* The contents of this file are subject to the Mozilla Public License Version 1.1
+* See LICENSE.TXT at the top of this package for the full license terms.
+*/
+package eu.etaxonomy.taxeditor.editor.workingSet;
+
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerDropAdapter;
+import org.eclipse.swt.dnd.TransferData;
+
+import eu.etaxonomy.cdm.model.description.Character;
+import eu.etaxonomy.cdm.model.description.FeatureNode;
+import eu.etaxonomy.cdm.model.description.FeatureTree;
+import eu.etaxonomy.taxeditor.featuretree.FeatureNodeTransfer;
+
+/**
+ *
+ * @author pplitzner
+ * @date Jun 1, 2017
+ *
+ */
+public class CharacterDropAdapter extends ViewerDropAdapter {
+
+       protected CharacterDropAdapter(Viewer viewer) {
+           super(viewer);
+       }
+
+       @Override
+       public boolean performDrop(Object data) {
+
+           FeatureNode target = (FeatureNode) getCurrentTarget();
+               int currentLocation = getCurrentLocation();
+               Object[] characterData = (Object[]) data;
+
+               //create new Character
+               if(characterData.length==2){
+                   FeatureNode structureNode = (FeatureNode) characterData[0];
+                   FeatureNode propertyNode = (FeatureNode) characterData[1];
+                   String label = structureNode.getFeature().toString()+" "+propertyNode.getFeature().toString();
+                   Character character = Character.NewInstance(structureNode, propertyNode, null, label, label);
+                   FeatureNode characterNode = FeatureNode.NewInstance(character);
+
+                   Object input = getViewer().getInput();
+            if(input==null){
+                       //create new feature tree
+                       FeatureTree featureTree = FeatureTree.NewInstance();
+                       getViewer().setInput(featureTree);
+                   }
+            if(target==null){
+                FeatureNode root = ((FeatureTree)input).getRoot();
+                root.addChild(characterNode);
+            }
+            else{
+                target.addChild(characterNode);
+            }
+               }
+               getViewer().refresh();
+               return true;
+       }
+
+       @Override
+       public boolean validateDrop(Object target, int operation,
+                       TransferData transferType) {
+               boolean transferDataIsSupported = FeatureNodeTransfer.getInstance().isSupportedType(transferType);
+               return transferDataIsSupported;
+       }
+
+}
diff --git a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/workingSet/CharacterLabelProvider.java b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/workingSet/CharacterLabelProvider.java
new file mode 100644 (file)
index 0000000..985ed13
--- /dev/null
@@ -0,0 +1,34 @@
+// $Id$
+/**
+* Copyright (C) 2017 EDIT
+* European Distributed Institute of Taxonomy
+* http://www.e-taxonomy.eu
+*
+* The contents of this file are subject to the Mozilla Public License Version 1.1
+* See LICENSE.TXT at the top of this package for the full license terms.
+*/
+package eu.etaxonomy.taxeditor.editor.workingSet;
+
+import eu.etaxonomy.taxeditor.featuretree.FeatureTreeLabelProvider;
+
+/**
+ *
+ * @author pplitzner
+ * @date Jun 1, 2017
+ *
+ */
+public class CharacterLabelProvider extends FeatureTreeLabelProvider {
+
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public String getText(Object element) {
+        if(element instanceof eu.etaxonomy.cdm.model.description.Character){
+            eu.etaxonomy.cdm.model.description.Character character = (eu.etaxonomy.cdm.model.description.Character)element;
+        }
+        return super.getText(element);
+    }
+
+}
index fcddc6d35e8ba172075cb232b4ab754f519f466d..2c494bd6602a718cf2f519154f979d27e0c88ceb 100644 (file)
@@ -17,11 +17,16 @@ import javax.annotation.PreDestroy;
 import org.eclipse.e4.ui.di.Focus;
 import org.eclipse.jface.viewers.TreeViewer;
 import org.eclipse.swt.SWT;
+import org.eclipse.swt.dnd.DND;
+import org.eclipse.swt.dnd.Transfer;
 import org.eclipse.swt.layout.FillLayout;
 import org.eclipse.swt.widgets.Composite;
 
-import eu.etaxonomy.cdm.api.service.IVocabularyService;
-import eu.etaxonomy.cdm.model.common.TermVocabulary;
+import eu.etaxonomy.cdm.api.service.IFeatureTreeService;
+import eu.etaxonomy.cdm.model.description.FeatureTree;
+import eu.etaxonomy.taxeditor.featuretree.FeatureNodeTransfer;
+import eu.etaxonomy.taxeditor.featuretree.FeatureTreeContentProvider;
+import eu.etaxonomy.taxeditor.featuretree.FeatureTreeLabelProvider;
 import eu.etaxonomy.taxeditor.store.CdmStore;
 
 /**
@@ -31,6 +36,7 @@ import eu.etaxonomy.taxeditor.store.CdmStore;
  */
 public class FeatureTreeBuilderViewPart {
 
+
     private TreeViewer treeViewerCharacters;
     private TreeViewer treeViewerProperties;
     private TreeViewer treeViewerStructures;
@@ -46,7 +52,6 @@ public class FeatureTreeBuilderViewPart {
         parent.setLayout(new FillLayout(SWT.HORIZONTAL));
 
         treeViewerStructures = new TreeViewer(parent, SWT.BORDER);
-        treeViewerStructures.setColumnProperties(new String[] {});
 
         treeViewerProperties = new TreeViewer(parent, SWT.BORDER);
 
@@ -56,15 +61,23 @@ public class FeatureTreeBuilderViewPart {
     }
 
     private void init(){
-        TermVocabulary structureVoc = CdmStore.getService(IVocabularyService.class).load(UUID.fromString("51f3a28e-6c1a-40bf-b504-012a12d69112"));
-        treeViewerStructures.setContentProvider(new StructureContentProvider());
-        treeViewerStructures.setLabelProvider(new StructureLabelProvider());
-        treeViewerStructures.setInput(structureVoc);
-
-        TermVocabulary propertiesVoc = CdmStore.getService(IVocabularyService.class).load(UUID.fromString("c5ff574b-40a5-4046-b2a0-59bfbe6b6616"));
-        treeViewerProperties.setContentProvider(new StructureContentProvider());
-        treeViewerProperties.setLabelProvider(new StructureLabelProvider());
-        treeViewerProperties.setInput(propertiesVoc);
+        int dndOperations = DND.DROP_COPY | DND.DROP_MOVE;
+        Transfer[] transfers = new Transfer[] { FeatureNodeTransfer.getInstance() };
+
+        FeatureTree structureFeatureTree = CdmStore.getService(IFeatureTreeService.class).load(UUID.fromString("63d15e75-5f47-47c0-9540-cebe2697f37e"));
+        treeViewerStructures.setContentProvider(new FeatureTreeContentProvider());
+        treeViewerStructures.setLabelProvider(new FeatureTreeLabelProvider());
+        treeViewerStructures.setInput(structureFeatureTree);
+
+        FeatureTree propertiesFeatureTree = CdmStore.getService(IFeatureTreeService.class).load(UUID.fromString("87680e5d-1026-451f-9a18-02d8e80fdaa0"));
+        treeViewerProperties.setContentProvider(new FeatureTreeContentProvider());
+        treeViewerProperties.setLabelProvider(new FeatureTreeLabelProvider());
+        treeViewerProperties.addDragSupport(dndOperations, transfers, new CharacterDragListener(treeViewerStructures, treeViewerProperties));
+        treeViewerProperties.setInput(propertiesFeatureTree);
+
+        treeViewerCharacters.setContentProvider(new FeatureTreeContentProvider());
+        treeViewerCharacters.setLabelProvider(new FeatureTreeLabelProvider());
+        treeViewerCharacters.addDropSupport(dndOperations, transfers, new CharacterDropAdapter(treeViewerCharacters));
     }
 
     @PreDestroy
index b6ebf30d3c7dd4d23bf1df23689ee9cc7bfb260b..ce6b01ecf903f96b5eae54717bc3d5c5b69d638f 100644 (file)
@@ -9,16 +9,12 @@
 */
 package eu.etaxonomy.taxeditor.editor.workingSet;
 
-import java.util.HashSet;
-import java.util.Set;
-import java.util.SortedSet;
+import java.util.Collections;
 
 import org.eclipse.jface.viewers.ITreeContentProvider;
 
-import eu.etaxonomy.cdm.model.common.DefinedTermBase;
-import eu.etaxonomy.cdm.model.common.TermVocabulary;
-import eu.etaxonomy.cdm.model.description.Feature;
-import eu.etaxonomy.taxeditor.store.CdmStore;
+import eu.etaxonomy.cdm.model.description.FeatureNode;
+import eu.etaxonomy.cdm.model.description.FeatureTree;
 
 /**
  * @author pplitzner
@@ -35,7 +31,8 @@ public class StructureContentProvider implements ITreeContentProvider {
      */
     @Override
     public Object[] getElements(Object inputElement) {
-        return getTopLevelElements((TermVocabulary<Feature>) inputElement);
+        FeatureTree featureTree = (FeatureTree)inputElement;
+        return Collections.singleton(featureTree.getRoot()).toArray();
     }
 
     /**
@@ -43,7 +40,7 @@ public class StructureContentProvider implements ITreeContentProvider {
      */
     @Override
     public Object[] getChildren(Object parentElement) {
-        return ((Feature)parentElement).getIncludes().toArray();
+        return ((FeatureNode)parentElement).getChildNodes().toArray();
     }
 
     /**
@@ -59,27 +56,7 @@ public class StructureContentProvider implements ITreeContentProvider {
      */
     @Override
     public boolean hasChildren(Object element) {
-        return !((Feature)element).getIncludes().isEmpty();
-    }
-
-    /**
-     *
-     * @param vocabulary
-     * @return An array of DefinedTermBase objects that do not have parents
-     *
-     * TODO: Needs to be implemented in cdmlib
-     */
-    private Object[] getTopLevelElements(TermVocabulary vocabulary) {
-
-        SortedSet<DefinedTermBase> terms = vocabulary.getTermsOrderedByLabels(CdmStore.getDefaultLanguage());
-        Set<DefinedTermBase> topLevelTerms = new HashSet<DefinedTermBase>();
-
-        for (DefinedTermBase term : terms){
-             if (term.getPartOf() == null){
-                 topLevelTerms.add(term);
-             }
-        }
-        return topLevelTerms.toArray();
+        return ((FeatureNode)element).getChildCount()>0;
     }
 
 }
index f1d66ff534fa3d95fd56c4d7befd4496044d4c28..9314bbb1df780c23a0b47fd7b4c4e8fda30f9899 100644 (file)
@@ -11,7 +11,7 @@ package eu.etaxonomy.taxeditor.editor.workingSet;
 
 import org.eclipse.jface.viewers.ColumnLabelProvider;
 
-import eu.etaxonomy.cdm.model.description.Feature;
+import eu.etaxonomy.cdm.model.description.FeatureNode;
 
 /**
  * @author pplitzner
@@ -29,6 +29,6 @@ public class StructureLabelProvider extends ColumnLabelProvider {
     @Override
     public String getText(Object element) {
 
-        return ((Feature)element).getLabel();
+        return ((FeatureNode)element).getFeature().getLabel();
     }
 }
index 0fcfaecf9079705c4c23430b4601a5aab5c1de14..bc0de46056b29b6f7a487dfaf80abf0b9c630656 100644 (file)
@@ -16,16 +16,11 @@ import org.eclipse.jface.viewers.ISelectionChangedListener;
 import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.jface.viewers.SelectionChangedEvent;
 import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerDropAdapter;
 import org.eclipse.jface.wizard.WizardDialog;
 import org.eclipse.jface.wizard.WizardPage;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.dnd.DND;
-import org.eclipse.swt.dnd.DragSourceAdapter;
-import org.eclipse.swt.dnd.DragSourceEvent;
 import org.eclipse.swt.dnd.Transfer;
-import org.eclipse.swt.dnd.TransferData;
 import org.eclipse.swt.events.ModifyEvent;
 import org.eclipse.swt.events.ModifyListener;
 import org.eclipse.swt.events.SelectionAdapter;
@@ -36,7 +31,6 @@ import org.eclipse.swt.widgets.Button;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Label;
 import org.eclipse.swt.widgets.Text;
-import org.hibernate.proxy.HibernateProxy;
 
 import eu.etaxonomy.cdm.api.service.IFeatureNodeService;
 import eu.etaxonomy.cdm.api.service.config.FeatureNodeDeletionConfigurator;
@@ -44,7 +38,6 @@ import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
 import eu.etaxonomy.cdm.model.description.Feature;
 import eu.etaxonomy.cdm.model.description.FeatureNode;
 import eu.etaxonomy.cdm.model.description.FeatureTree;
-import eu.etaxonomy.taxeditor.model.MessagingUtils;
 import eu.etaxonomy.taxeditor.store.CdmStore;
 
 /**
@@ -206,7 +199,7 @@ public class EditFeatureTreeWizardPage extends WizardPage implements
                                for (Feature feature : additionalFeatures) {
                                        FeatureNode child = FeatureNode.NewInstance(feature);
                                        CdmStore.getService(IFeatureNodeService.class).merge(child, true);
-                                       
+
                                        parent.addChild(child);
                                }
                                viewer.refresh();
@@ -224,126 +217,12 @@ public class EditFeatureTreeWizardPage extends WizardPage implements
                                FeatureNode featureNode = (FeatureNode) selectedObject;
                                FeatureNode parent = featureNode.getParent();
                                parent.removeChild(featureNode);
-                               
-                               CdmStore.getService(IFeatureNodeService.class).deleteFeatureNode(featureNode.getUuid(), new FeatureNodeDeletionConfigurator());
-                               
-                       }
-                       viewer.refresh();
-               }
-       }
 
-       private class FeatureNodeDragListener extends DragSourceAdapter {
-
-               private final TreeViewer viewer;
-
-               public FeatureNodeDragListener(TreeViewer viewer) {
-                       this.viewer = viewer;
-               }
-
-               /**
-                * Method declared on DragSourceListener
-                */
-               @Override
-               public void dragFinished(DragSourceEvent event) {
-                       if (!event.doit) {
-                return;
-            }
-                       // if the featureNode was moved, remove it from the source viewer
-                       if (event.detail == DND.DROP_MOVE) {
-                               IStructuredSelection selection = (IStructuredSelection) viewer
-                                               .getSelection();
-                               viewer.refresh();
-                       }
-               }
+                               CdmStore.getService(IFeatureNodeService.class).deleteFeatureNode(featureNode.getUuid(), new FeatureNodeDeletionConfigurator());
 
-               /**
-                * Method declared on DragSourceListener
-                */
-               @Override
-               public void dragSetData(DragSourceEvent event) {
-                       IStructuredSelection selection = (IStructuredSelection) viewer
-                                       .getSelection();
-                       FeatureNode[] featureNodes = (FeatureNode[]) selection.toList()
-                                       .toArray(new FeatureNode[selection.size()]);
-                       if (FeatureNodeTransfer.getInstance().isSupportedType(
-                                       event.dataType)) {
-                               event.data = featureNodes;
                        }
+                       viewer.refresh();
                }
-
-               /**
-                * Method declared on DragSourceListener
-                */
-               @Override
-               public void dragStart(DragSourceEvent event) {
-                       event.doit = !viewer.getSelection().isEmpty();
-               }
-
        }
 
-       private class FeatureNodeDropAdapter extends ViewerDropAdapter {
-
-               protected FeatureNodeDropAdapter(Viewer viewer) {
-                       super(viewer);
-               }
-
-               @Override
-               public boolean performDrop(Object data) {
-                       FeatureNode target = (FeatureNode) getCurrentTarget();
-                       int position = 0;
-
-                       if (target != null) {
-                               int location = getCurrentLocation();
-                               FeatureNode parent = target.getParent();
-                               if (location == LOCATION_BEFORE) {
-                                       position = Math.max(0, parent.getIndex(target) - 1);
-                                       target = parent;
-                               }
-
-                               if (location == LOCATION_AFTER) {
-                                       position = parent.getIndex(target);
-                                       target = parent;
-                               }
-                       }
-
-                       // set target to root node if there is no target specified
-                       if (target == null) {
-                               FeatureTree featureTree = (FeatureTree) getViewer().getInput();
-                               target = featureTree.getRoot();
-                       }
-
-                       Object[] droppedObjects = (Object[]) data;
-                       TreeViewer viewer = (TreeViewer) getViewer();
-
-                       // cannot drop a feature node onto itself
-                       for (Object droppedObject : droppedObjects) {
-                               if (droppedObject == null) {
-                                       MessagingUtils.warningDialog(
-                                                                       "Operation not supported yet",
-                                                                       this,
-                                                                       "We are currently unable to change the order of freshly created "
-                                                                                       + "feature trees nodes. Please close and reopen the dialog to change the order of features.");
-                                       return false;
-                               }
-                               if (droppedObject.equals(target)) {
-                                       return false;
-                               }
-                       }
-                       for (Object droppedObject : droppedObjects) {
-                               FeatureNode droppedNode = (FeatureNode) droppedObject;
-                               target.addChild(droppedNode, position);
-                               viewer.add(target, droppedNode);
-                               viewer.reveal(droppedNode);
-                       }
-                       return true;
-               }
-
-               @Override
-               public boolean validateDrop(Object target, int operation,
-                               TransferData transferData) {
-                       return FeatureNodeTransfer.getInstance().isSupportedType(
-                                       transferData);
-               }
-
-       }
 }
diff --git a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/featuretree/FeatureNodeDragListener.java b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/featuretree/FeatureNodeDragListener.java
new file mode 100644 (file)
index 0000000..048d298
--- /dev/null
@@ -0,0 +1,68 @@
+/**
+* Copyright (C) 2017 EDIT
+* European Distributed Institute of Taxonomy
+* http://www.e-taxonomy.eu
+*
+* The contents of this file are subject to the Mozilla Public License Version 1.1
+* See LICENSE.TXT at the top of this package for the full license terms.
+*/
+package eu.etaxonomy.taxeditor.featuretree;
+
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.swt.dnd.DND;
+import org.eclipse.swt.dnd.DragSourceAdapter;
+import org.eclipse.swt.dnd.DragSourceEvent;
+
+import eu.etaxonomy.cdm.model.description.FeatureNode;
+
+/**
+ * @author pplitzner
+ * @since Jun 2, 2017
+ *
+ */
+public class FeatureNodeDragListener extends DragSourceAdapter {
+
+    private final TreeViewer viewer;
+
+    public FeatureNodeDragListener(TreeViewer viewer) {
+        this.viewer = viewer;
+    }
+
+    /**
+     * Method declared on DragSourceListener
+     */
+    @Override
+    public void dragFinished(DragSourceEvent event) {
+        if (!event.doit) {
+            return;
+        }
+        if (event.detail == DND.DROP_MOVE) {
+            viewer.refresh();
+        }
+    }
+
+    /**
+     * Method declared on DragSourceListener
+     */
+    @Override
+    public void dragSetData(DragSourceEvent event) {
+        IStructuredSelection selection = (IStructuredSelection) viewer
+                .getSelection();
+        FeatureNode[] featureNodes = (FeatureNode[]) selection.toList()
+                .toArray(new FeatureNode[selection.size()]);
+        if (FeatureNodeTransfer.getInstance().isSupportedType(
+                event.dataType)) {
+            event.data = featureNodes;
+        }
+    }
+
+    /**
+     * Method declared on DragSourceListener
+     */
+    @Override
+    public void dragStart(DragSourceEvent event) {
+        event.doit = !viewer.getSelection().isEmpty();
+    }
+
+}
diff --git a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/featuretree/FeatureNodeDropAdapter.java b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/featuretree/FeatureNodeDropAdapter.java
new file mode 100644 (file)
index 0000000..a3f7c71
--- /dev/null
@@ -0,0 +1,89 @@
+/**
+* Copyright (C) 2017 EDIT
+* European Distributed Institute of Taxonomy
+* http://www.e-taxonomy.eu
+*
+* The contents of this file are subject to the Mozilla Public License Version 1.1
+* See LICENSE.TXT at the top of this package for the full license terms.
+*/
+package eu.etaxonomy.taxeditor.featuretree;
+
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerDropAdapter;
+import org.eclipse.swt.dnd.TransferData;
+
+import eu.etaxonomy.cdm.model.description.FeatureNode;
+import eu.etaxonomy.cdm.model.description.FeatureTree;
+import eu.etaxonomy.taxeditor.model.MessagingUtils;
+
+/**
+ * @author pplitzner
+ * @since Jun 2, 2017
+ *
+ */
+public class FeatureNodeDropAdapter extends ViewerDropAdapter {
+
+    public FeatureNodeDropAdapter(Viewer viewer) {
+        super(viewer);
+    }
+
+    @Override
+    public boolean performDrop(Object data) {
+        FeatureNode target = (FeatureNode) getCurrentTarget();
+        int position = 0;
+
+        if (target != null) {
+            int location = getCurrentLocation();
+            FeatureNode parent = target.getParent();
+            if (location == LOCATION_BEFORE) {
+                position = Math.max(0, parent.getIndex(target) - 1);
+                target = parent;
+            }
+
+            if (location == LOCATION_AFTER) {
+                position = parent.getIndex(target);
+                target = parent;
+            }
+        }
+
+        // set target to root node if there is no target specified
+        if (target == null) {
+            FeatureTree featureTree = (FeatureTree) getViewer().getInput();
+            target = featureTree.getRoot();
+        }
+
+        Object[] droppedObjects = (Object[]) data;
+        TreeViewer viewer = (TreeViewer) getViewer();
+
+        // cannot drop a feature node onto itself
+        for (Object droppedObject : droppedObjects) {
+            if (droppedObject == null) {
+                MessagingUtils.warningDialog(
+                                "Operation not supported yet",
+                                this,
+                                "We are currently unable to change the order of freshly created "
+                                        + "feature trees nodes. Please close and reopen the dialog to change the order of features.");
+                return false;
+            }
+            if (droppedObject.equals(target)) {
+                return false;
+            }
+        }
+        for (Object droppedObject : droppedObjects) {
+            FeatureNode droppedNode = (FeatureNode) droppedObject;
+            target.addChild(droppedNode, position);
+            viewer.add(target, droppedNode);
+            viewer.reveal(droppedNode);
+        }
+        return true;
+    }
+
+    @Override
+    public boolean validateDrop(Object target, int operation,
+            TransferData transferData) {
+        return FeatureNodeTransfer.getInstance().isSupportedType(
+                transferData);
+    }
+
+}
\ No newline at end of file
index 1f2f7131c8bf05ee00f1796adb82575e9fff1f80..5ff277ceff752d9366347454f712b16b13ac149b 100644 (file)
@@ -1,8 +1,8 @@
 /**
 * Copyright (C) 2007 EDIT
-* European Distributed Institute of Taxonomy 
+* European Distributed Institute of Taxonomy
 * http://www.e-taxonomy.eu
-* 
+*
 * The contents of this file are subject to the Mozilla Public License Version 1.1
 * See LICENSE.TXT at the top of this package for the full license terms.
 */
@@ -16,37 +16,26 @@ import eu.etaxonomy.cdm.model.description.FeatureNode;
 import eu.etaxonomy.cdm.model.description.FeatureTree;
 
 /**
- * <p>FeatureTreeLabelProvider class.</p>
  *
  * @author n.hoffmann
  * @created Aug 5, 2010
  * @version 1.0
  */
 public class FeatureTreeLabelProvider extends LabelProvider {
-       
-       private Feature feature;
-               
+
        /** {@inheritDoc} */
        @Override
        public String getText(Object element) {
                if(element instanceof FeatureTree){
                        return ((FeatureTree) element).getTitleCache();
                }else if(element instanceof FeatureNode){
-                       feature = ((FeatureNode) element).getFeature();
-                       
-                       if(feature != null)
-                               return feature.getTitleCache();
-                       
+                   Feature feature = ((FeatureNode) element).getFeature();
+                       if(feature != null) {
+                return feature.getTitleCache();
+            }
+
                }
                return "No label provided";
        }
-       
-       /**
-        * <p>Getter for the field <code>feature</code>.</p>
-        *
-        * @return a {@link eu.etaxonomy.cdm.model.description.Feature} object.
-        */
-       public Feature getFeature(){
-               return feature;
-       }
+
 }