ref #7086 Allow drag and drop for taxon filter from taxon navigator
[taxeditor.git] / eu.etaxonomy.taxeditor.editor / src / main / java / eu / etaxonomy / taxeditor / editor / workingSet / WorkingSetEditor.java
index d8eac201cc03a59c34a1e3704d9a6a1962f8c702..56aa97258115a42c2a4860c79e1a11dc21270a5b 100644 (file)
@@ -25,12 +25,15 @@ import org.eclipse.e4.ui.di.Focus;
 import org.eclipse.e4.ui.di.Persist;
 import org.eclipse.e4.ui.model.application.ui.MDirtyable;
 import org.eclipse.e4.ui.services.IServiceConstants;
+import org.eclipse.jface.util.LocalSelectionTransfer;
+import org.eclipse.jface.viewers.Viewer;
 import org.eclipse.swt.SWT;
+import org.eclipse.swt.dnd.DND;
+import org.eclipse.swt.dnd.Transfer;
 import org.eclipse.swt.events.ModifyEvent;
 import org.eclipse.swt.events.ModifyListener;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Listener;
 import org.eclipse.swt.widgets.Shell;
 
 import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
@@ -44,6 +47,7 @@ import eu.etaxonomy.cdm.model.description.WorkingSet;
 import eu.etaxonomy.cdm.model.location.NamedArea;
 import eu.etaxonomy.cdm.model.name.Rank;
 import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;
+import eu.etaxonomy.cdm.model.taxon.ITaxonTreeNode;
 import eu.etaxonomy.cdm.model.taxon.Taxon;
 import eu.etaxonomy.cdm.model.taxon.TaxonNode;
 import eu.etaxonomy.taxeditor.store.CdmStore;
@@ -64,11 +68,11 @@ public class WorkingSetEditor implements IE4SavablePart{
 
     private WorkingSet workingSet;
 
+    private final int dndOperations = DND.DROP_MOVE;
+
     @Inject
     private MDirtyable dirty;
 
-    private Listener nameAreaSelectionListener;
-
     private ModifyListener labelModifyListener;
 
     @PostConstruct
@@ -100,6 +104,11 @@ public class WorkingSetEditor implements IE4SavablePart{
             }
             dirty.setDirty(true);
         });
+
+        //add drag'n'drop support
+        Transfer[] transfers = new Transfer[] {LocalSelectionTransfer.getTransfer()};
+        composite.getTaxonNodeTree().addDropSupport(dndOperations, transfers, new TaxonNodeDropAdapter(this));
+
     }
 
     public void init(UUID workingSetUuid) {
@@ -137,15 +146,24 @@ public class WorkingSetEditor implements IE4SavablePart{
         if(area!=null){
             areas.add(area);
         }
-        TaxonNode taxonNode = composite.getTaxonNode();
-        Set<NamedArea> descriptions;
-        if(taxonNode!=null && taxonNode.getTaxon()!=null){
-            Taxon taxon = HibernateProxyHelper.deproxy(taxonNode.getTaxon(), Taxon.class);
-            Collection<SpecimenOrObservationBase> specimens = CdmStore.getService(IOccurrenceService.class).listByAssociatedTaxon(SpecimenOrObservationBase.class, null, taxon, null, null, null, null, null);
-            for (SpecimenOrObservationBase specimen : specimens) {
-                Set<SpecimenDescription> specimenDescriptions = specimen.getSpecimenDescriptions();
-                for (SpecimenDescription specimenDescription : specimenDescriptions) {
-                    workingSet.addDescription(specimenDescription);
+        Object input = composite.getTaxonNodeTree().getInput();
+        if(input!=null){
+            Collection<ITaxonTreeNode> taxonNodes = (Collection<ITaxonTreeNode>) input;
+            for (ITaxonTreeNode taxonTreeNode : taxonNodes) {
+                if(taxonTreeNode instanceof TaxonNode){
+                    TaxonNode taxonNode = (TaxonNode)taxonTreeNode;
+                    workingSet.addTaxonSubtree(taxonNode);
+                    Set<NamedArea> descriptions;
+                    if(taxonNode!=null && taxonNode.getTaxon()!=null){
+                        Taxon taxon = HibernateProxyHelper.deproxy(taxonNode.getTaxon(), Taxon.class);
+                        Collection<SpecimenOrObservationBase> specimens = CdmStore.getService(IOccurrenceService.class).listByAssociatedTaxon(SpecimenOrObservationBase.class, null, taxon, null, null, null, null, null);
+                        for (SpecimenOrObservationBase specimen : specimens) {
+                            Set<SpecimenDescription> specimenDescriptions = specimen.getSpecimenDescriptions();
+                            for (SpecimenDescription specimenDescription : specimenDescriptions) {
+                                workingSet.addDescription(specimenDescription);
+                            }
+                        }
+                    }
                 }
             }
         }
@@ -164,7 +182,6 @@ public class WorkingSetEditor implements IE4SavablePart{
         workingSet.setMaxRank(rankMax);
         workingSet.setMinRank(rankMin);
         workingSet.setDescriptiveSystem(characters);
-        workingSet.addTaxonSubtree(taxonNode);
         workingSet.setGeoFilter(areas);
 
         conversation.commit();
@@ -188,4 +205,8 @@ public class WorkingSetEditor implements IE4SavablePart{
         }
     }
 
+    public Viewer getTaxonTreeViewer() {
+        return composite.getTaxonNodeTree();
+    }
+
 }