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
.TreeNode
;
14 import org
.eclipse
.jface
.viewers
.ViewerDropAdapter
;
15 import org
.eclipse
.swt
.dnd
.TransferData
;
17 import eu
.etaxonomy
.cdm
.api
.service
.IOccurrenceService
;
18 import eu
.etaxonomy
.cdm
.api
.service
.molecular
.ISequenceService
;
19 import eu
.etaxonomy
.cdm
.model
.molecular
.DnaSample
;
20 import eu
.etaxonomy
.cdm
.model
.molecular
.Sequence
;
21 import eu
.etaxonomy
.cdm
.model
.molecular
.SingleRead
;
22 import eu
.etaxonomy
.cdm
.model
.occurrence
.DerivedUnit
;
23 import eu
.etaxonomy
.cdm
.model
.occurrence
.SpecimenOrObservationBase
;
24 import eu
.etaxonomy
.taxeditor
.editor
.EditorUtil
;
25 import eu
.etaxonomy
.taxeditor
.model
.AbstractUtility
;
26 import eu
.etaxonomy
.taxeditor
.store
.CdmStore
;
33 public class DerivateDropListener
extends ViewerDropAdapter
{
35 private final DerivateView derivateView
;
40 protected DerivateDropListener(DerivateView derivateView
) {
41 super(derivateView
.getViewer());
42 this.derivateView
= derivateView
;
46 * @see org.eclipse.jface.viewers.ViewerDropAdapter#performDrop(java.lang.Object)
49 public boolean performDrop(Object data
) {
50 if(derivateView
.isDirty()){
51 AbstractUtility
.warningDialog("View has unsaved changes", this, "You need to save before performing this action");
54 Object target
= getCurrentTarget();
55 if(target
instanceof TreeNode
&& data
instanceof DerivateViewSelection
){
56 DerivateViewSelection derivateViewSelection
= (DerivateViewSelection
)data
;
57 TreeNode targetNode
= (TreeNode
) target
;
58 TreeNode draggednode
= EditorUtil
.getTreeNodeOfSelection(derivateViewSelection
.getSelection());
59 if(draggednode
!=null){
60 if(moveTreeNode(draggednode
, targetNode
)){
62 derivateView
.getConversationHolder().commit();
63 derivateView
.refreshTree();
65 // update source DerivateView if dragging between different views occured
66 DerivateView sourceDerivateView
= derivateViewSelection
.getDerivateView();
67 if(sourceDerivateView
!=derivateView
){
68 sourceDerivateView
.setFocus();
69 // derivateView.getSite().getPage().activate(sourceDerivateView);
70 sourceDerivateView
.getConversationHolder().commit();
71 sourceDerivateView
.refreshTree();
74 LocalSelectionTransfer
.getTransfer().setSelection(null);
83 * @see org.eclipse.jface.viewers.ViewerDropAdapter#validateDrop(java.lang.Object, int, org.eclipse.swt.dnd.TransferData)
86 public boolean validateDrop(Object target
, int operation
, TransferData transferType
) {
87 return LocalSelectionTransfer
.getTransfer().isSupportedType(transferType
) && target
instanceof TreeNode
;
94 private boolean moveTreeNode(TreeNode draggedNode
, TreeNode targetNode
) {
95 Object draggedNodeValue
= draggedNode
.getValue();
96 Object targetNodeValue
= targetNode
.getValue();
97 TreeNode fromParentNode
= draggedNode
.getParent();
98 Object fromParentSpecimen
= fromParentNode
.getValue();
100 // drag'n'drop for SpecimenOrObservationBase
101 IOccurrenceService occurrenceService
= CdmStore
.getService(IOccurrenceService
.class);
102 if(draggedNodeValue
instanceof DerivedUnit
&& targetNodeValue
instanceof SpecimenOrObservationBase
<?
>){
103 DerivedUnit draggedSpecimen
= (DerivedUnit
) draggedNodeValue
;
104 SpecimenOrObservationBase
<?
> targetSpecimen
= (SpecimenOrObservationBase
<?
>) targetNodeValue
;
105 //check if type is a sub derivate type
106 if(!fromParentNode
.equals(targetNode
)//don't drag on direct parent node
107 && fromParentSpecimen
instanceof SpecimenOrObservationBase
<?
>){
108 occurrenceService
.moveDerivate((SpecimenOrObservationBase
<?
>)fromParentSpecimen
, targetSpecimen
, draggedSpecimen
);
113 // drag'n'drop for SingleRead
114 else if(draggedNodeValue
instanceof SingleRead
&& targetNodeValue
instanceof Sequence
){
115 SingleRead singleRead
= (SingleRead
) draggedNodeValue
;
116 if(fromParentSpecimen
instanceof Sequence
){
117 CdmStore
.getService(ISequenceService
.class).moveSingleRead((Sequence
)fromParentSpecimen
, (Sequence
)targetNodeValue
, singleRead
);
122 // drag'n'drop for Sequence
123 else if(draggedNodeValue
instanceof Sequence
&& targetNodeValue
instanceof DnaSample
){
124 Sequence sequence
= (Sequence
)draggedNodeValue
;
125 if(fromParentSpecimen
instanceof DnaSample
){
126 occurrenceService
.moveSequence((DnaSample
)fromParentSpecimen
, (DnaSample
)targetNodeValue
, sequence
);