From 739cbae5d4fdf061701b3755b7febc443a42a09f Mon Sep 17 00:00:00 2001 From: Patrick Plitzner Date: Wed, 20 Dec 2017 08:53:44 +0100 Subject: [PATCH] ref #7086 Allow drag and drop for taxon filter from taxon navigator --- .../workingSet/TaxonNodeDropAdapter.java | 73 +++++++++++++++++++ .../workingSet/WorkingSetComposite.java | 22 +----- .../editor/workingSet/WorkingSetEditor.java | 47 ++++++++---- 3 files changed, 109 insertions(+), 33 deletions(-) create mode 100644 eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/workingSet/TaxonNodeDropAdapter.java diff --git a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/workingSet/TaxonNodeDropAdapter.java b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/workingSet/TaxonNodeDropAdapter.java new file mode 100644 index 000000000..2b6c16682 --- /dev/null +++ b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/workingSet/TaxonNodeDropAdapter.java @@ -0,0 +1,73 @@ +/** +* 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 java.util.ArrayList; +import java.util.Collection; + +import org.eclipse.jface.util.LocalSelectionTransfer; +import org.eclipse.jface.viewers.ISelection; +import org.eclipse.jface.viewers.IStructuredSelection; +import org.eclipse.jface.viewers.ITreeSelection; +import org.eclipse.jface.viewers.Viewer; +import org.eclipse.jface.viewers.ViewerDropAdapter; +import org.eclipse.swt.dnd.TransferData; + +import eu.etaxonomy.cdm.model.taxon.ITaxonTreeNode; + +/** + * @author pplitzner + * @since Dec 19, 2017 + * + */ +public class TaxonNodeDropAdapter extends ViewerDropAdapter { + + private WorkingSetEditor workingSetEditor; + + public TaxonNodeDropAdapter(WorkingSetEditor workingSetEditor) { + super(workingSetEditor.getTaxonTreeViewer()); + this.workingSetEditor = workingSetEditor; + } + + /** + * {@inheritDoc} + */ + @Override + public boolean performDrop(Object data) { + ITaxonTreeNode treeNode= (ITaxonTreeNode) ((ITreeSelection) data).getFirstElement(); + Viewer taxonTreeViewer = workingSetEditor.getTaxonTreeViewer(); + Object input = taxonTreeViewer.getInput(); + Collection treeNodes; + if(input==null){ + treeNodes = new ArrayList<>(); + } + else{ + treeNodes = (Collection) input; + } + treeNodes.add(treeNode); + taxonTreeViewer.setInput(treeNodes); + return true; + } + + /** + * {@inheritDoc} + */ + @Override + public boolean validateDrop(Object target, int operation, TransferData transferType) { + ISelection selection = LocalSelectionTransfer.getTransfer().getSelection(); + if(selection instanceof ITreeSelection + && ((IStructuredSelection) selection).size()==1 + && ((IStructuredSelection) selection).getFirstElement() instanceof ITaxonTreeNode){ + return true; + } + return false; + } + + +} diff --git a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/workingSet/WorkingSetComposite.java b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/workingSet/WorkingSetComposite.java index 05c4af0ec..7a8123d1b 100644 --- a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/workingSet/WorkingSetComposite.java +++ b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/workingSet/WorkingSetComposite.java @@ -8,10 +8,6 @@ */ package eu.etaxonomy.taxeditor.editor.workingSet; -import java.util.List; - -import org.eclipse.jface.viewers.ITreeSelection; -import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.GridData; @@ -21,15 +17,11 @@ import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; import org.eclipse.swt.widgets.Tree; -import eu.etaxonomy.cdm.api.service.IClassificationService; import eu.etaxonomy.cdm.model.common.TermType; import eu.etaxonomy.cdm.model.description.FeatureTree; import eu.etaxonomy.cdm.model.location.NamedArea; import eu.etaxonomy.cdm.model.name.Rank; -import eu.etaxonomy.cdm.model.taxon.Classification; -import eu.etaxonomy.cdm.model.taxon.TaxonNode; import eu.etaxonomy.taxeditor.featuretree.e4.FeatureTreeEditorComposite; -import eu.etaxonomy.taxeditor.store.CdmStore; import eu.etaxonomy.taxeditor.ui.combo.TermUuidComboViewer; import eu.etaxonomy.taxeditor.util.TaxonTreeNodeContentProvider; import eu.etaxonomy.taxeditor.util.TaxonTreeNodeLabelProvider; @@ -51,8 +43,6 @@ public class WorkingSetComposite extends Composite { public WorkingSetComposite(Composite parent, int style) { super(parent, style); - List list = CdmStore.getService(IClassificationService.class).list(Classification.class, null, null, null, null); - setLayout(new GridLayout(3, false)); Label lblNewLabel = new Label(this, SWT.NONE); @@ -78,7 +68,6 @@ public class WorkingSetComposite extends Composite { taxonNodeTree.setContentProvider(new TaxonTreeNodeContentProvider()); taxonNodeTree.setLabelProvider(new TaxonTreeNodeLabelProvider()); - taxonNodeTree.setInput(list); Label lblNewLabel_3 = new Label(this, SWT.NONE); lblNewLabel_3.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1)); @@ -134,15 +123,8 @@ public class WorkingSetComposite extends Composite { featureTreeEditorComposite.setSelectedTree(characters, null); } - public TaxonNode getTaxonNode(){ - ITreeSelection selection = (ITreeSelection) taxonNodeTree.getSelection(); - if(selection!=null && selection.getFirstElement() instanceof TaxonNode){ - return (TaxonNode) selection.getFirstElement(); - } - return null; - } - public void setTaxonNode(TaxonNode taxonNode){ - taxonNodeTree.setSelection(new StructuredSelection(taxonNode), true); + public TreeViewer getTaxonNodeTree() { + return taxonNodeTree; } public NamedArea getArea(){ diff --git a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/workingSet/WorkingSetEditor.java b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/workingSet/WorkingSetEditor.java index d8eac201c..56aa97258 100644 --- a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/workingSet/WorkingSetEditor.java +++ b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/workingSet/WorkingSetEditor.java @@ -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 descriptions; - if(taxonNode!=null && taxonNode.getTaxon()!=null){ - Taxon taxon = HibernateProxyHelper.deproxy(taxonNode.getTaxon(), Taxon.class); - Collection specimens = CdmStore.getService(IOccurrenceService.class).listByAssociatedTaxon(SpecimenOrObservationBase.class, null, taxon, null, null, null, null, null); - for (SpecimenOrObservationBase specimen : specimens) { - Set specimenDescriptions = specimen.getSpecimenDescriptions(); - for (SpecimenDescription specimenDescription : specimenDescriptions) { - workingSet.addDescription(specimenDescription); + Object input = composite.getTaxonNodeTree().getInput(); + if(input!=null){ + Collection taxonNodes = (Collection) input; + for (ITaxonTreeNode taxonTreeNode : taxonNodes) { + if(taxonTreeNode instanceof TaxonNode){ + TaxonNode taxonNode = (TaxonNode)taxonTreeNode; + workingSet.addTaxonSubtree(taxonNode); + Set descriptions; + if(taxonNode!=null && taxonNode.getTaxon()!=null){ + Taxon taxon = HibernateProxyHelper.deproxy(taxonNode.getTaxon(), Taxon.class); + Collection specimens = CdmStore.getService(IOccurrenceService.class).listByAssociatedTaxon(SpecimenOrObservationBase.class, null, taxon, null, null, null, null, null); + for (SpecimenOrObservationBase specimen : specimens) { + Set 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(); + } + } -- 2.34.1