- implemented drag'n'drop support for SpecimenOrObservationBase in Derivate View
[taxeditor.git] / eu.etaxonomy.taxeditor.editor / src / main / java / eu / etaxonomy / taxeditor / editor / view / derivate / DerivateDropListener.java
1 // $Id$
2 /**
3 * Copyright (C) 2014 EDIT
4 * European Distributed Institute of Taxonomy
5 * http://www.e-taxonomy.eu
6 *
7 * The contents of this file are subject to the Mozilla Public License Version 1.1
8 * See LICENSE.TXT at the top of this package for the full license terms.
9 */
10 package eu.etaxonomy.taxeditor.editor.view.derivate;
11
12 import org.eclipse.jface.util.LocalSelectionTransfer;
13 import org.eclipse.jface.viewers.IStructuredSelection;
14 import org.eclipse.jface.viewers.TreeNode;
15 import org.eclipse.jface.viewers.ViewerDropAdapter;
16 import org.eclipse.swt.dnd.TransferData;
17
18 import eu.etaxonomy.cdm.model.occurrence.DerivationEvent;
19 import eu.etaxonomy.cdm.model.occurrence.DerivedUnit;
20 import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;
21 import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationType;
22
23 /**
24 * @author pplitzner
25 * @date 18.03.2014
26 *
27 */
28 public class DerivateDropListener extends ViewerDropAdapter {
29
30 private final DerivateView derivateView;
31
32 /**
33 * @param derivateView
34 */
35 protected DerivateDropListener(DerivateView derivateView) {
36 super(derivateView.viewer);
37 this.derivateView = derivateView;
38 }
39
40 /* (non-Javadoc)
41 * @see org.eclipse.jface.viewers.ViewerDropAdapter#performDrop(java.lang.Object)
42 */
43 @Override
44 public boolean performDrop(Object data) {
45 Object target = getCurrentTarget();
46 if(target instanceof TreeNode && data instanceof IStructuredSelection && ((IStructuredSelection) data).size()==1 && ((IStructuredSelection) data).getFirstElement() instanceof TreeNode){
47 TreeNode targetNode = (TreeNode) target;
48 TreeNode draggednode = (TreeNode) ((IStructuredSelection) data).getFirstElement();
49 if(moveDropTarget(draggednode, targetNode)){
50 derivateView.changed(null);
51 return true;
52 }
53 }
54 return false;
55 }
56
57 /* (non-Javadoc)
58 * @see org.eclipse.jface.viewers.ViewerDropAdapter#validateDrop(java.lang.Object, int, org.eclipse.swt.dnd.TransferData)
59 */
60 @Override
61 public boolean validateDrop(Object target, int operation, TransferData transferType) {
62 return LocalSelectionTransfer.getTransfer().isSupportedType(transferType) && target instanceof TreeNode;
63 }
64
65 /**
66 * @param value
67 * @return
68 */
69 private boolean moveDropTarget(TreeNode draggedObject, TreeNode target) {
70 if(draggedObject.getValue() instanceof DerivedUnit && target.getValue() instanceof SpecimenOrObservationBase<?>){
71 DerivedUnit draggedSpecimen = (DerivedUnit) draggedObject.getValue();
72 SpecimenOrObservationBase<?> targetSpecimen = (SpecimenOrObservationBase<?>) target.getValue();
73 SpecimenOrObservationType dragType = draggedSpecimen.getRecordBasis();
74 SpecimenOrObservationType targetType = targetSpecimen.getRecordBasis();
75 //check if type is a sub derivate type
76 TreeNode parentNode = draggedObject.getParent();
77 if(parentNode!=null && !parentNode.equals(target) //don't drag on direct parent node
78 && (targetType==SpecimenOrObservationType.FieldUnit //dragging on FieldUnit always works (except when direct parent)
79 || (dragType.isKindOf(targetType) && targetType!=dragType))){ //dragging only on parent derivate type
80 //remove derivation event from parent specimen of dragged object
81 DerivationEvent eventToRemove = null;
82 if(parentNode.getValue() instanceof SpecimenOrObservationBase<?>){
83 SpecimenOrObservationBase<?> parentDragSpecimen = (SpecimenOrObservationBase<?>) parentNode.getValue();
84 for(DerivationEvent event:parentDragSpecimen.getDerivationEvents()){
85 if(event.getDerivatives().contains(draggedSpecimen)){
86 eventToRemove = event;
87 break;
88 }
89 }
90 parentDragSpecimen.removeDerivationEvent(eventToRemove);
91 }
92 //add new derivation event to target
93 targetSpecimen.addDerivationEvent(DerivationEvent.NewSimpleInstance(targetSpecimen, draggedSpecimen, eventToRemove==null?null:eventToRemove.getType()));
94 return true;
95 }
96 }
97 return false;
98 }
99
100 }