3 * Copyright (C) 2014 EDIT
4 * European Distributed Institute of Taxonomy
5 * http://www.e-taxonomy.eu
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.
10 package eu
.etaxonomy
.taxeditor
.editor
.view
.derivate
;
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
;
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
;
28 public class DerivateDropListener
extends ViewerDropAdapter
{
30 private final DerivateView derivateView
;
35 protected DerivateDropListener(DerivateView derivateView
) {
36 super(derivateView
.viewer
);
37 this.derivateView
= derivateView
;
41 * @see org.eclipse.jface.viewers.ViewerDropAdapter#performDrop(java.lang.Object)
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);
58 * @see org.eclipse.jface.viewers.ViewerDropAdapter#validateDrop(java.lang.Object, int, org.eclipse.swt.dnd.TransferData)
61 public boolean validateDrop(Object target
, int operation
, TransferData transferType
) {
62 return LocalSelectionTransfer
.getTransfer().isSupportedType(transferType
) && target
instanceof TreeNode
;
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
;
90 parentDragSpecimen
.removeDerivationEvent(eventToRemove
);
92 //add new derivation event to target
93 targetSpecimen
.addDerivationEvent(DerivationEvent
.NewSimpleInstance(targetSpecimen
, draggedSpecimen
, eventToRemove
==null?
null:eventToRemove
.getType()));