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
.cdm
.model
.occurrence
.SpecimenOrObservationType
;
25 import eu
.etaxonomy
.taxeditor
.editor
.EditorUtil
;
26 import eu
.etaxonomy
.taxeditor
.model
.MessagingUtils
;
27 import eu
.etaxonomy
.taxeditor
.store
.CdmStore
;
28 import eu
.etaxonomy
.taxeditor
.view
.derivateSearch
.DerivateLabelProvider
;
35 public class DerivateDropListener
extends ViewerDropAdapter
{
37 private final DerivateView derivateView
;
42 protected DerivateDropListener(DerivateView derivateView
) {
43 super(derivateView
.getViewer());
44 this.derivateView
= derivateView
;
48 * @see org.eclipse.jface.viewers.ViewerDropAdapter#performDrop(java.lang.Object)
51 public boolean performDrop(Object data
) {
52 if(derivateView
.isDirty()){
53 MessagingUtils
.warningDialog("View has unsaved changes", this, "You need to save before performing this action");
56 Object target
= getCurrentTarget();
57 if(target
instanceof TreeNode
&& data
instanceof DerivateViewSelection
){
58 DerivateViewSelection derivateViewSelection
= (DerivateViewSelection
)data
;
59 TreeNode targetNode
= (TreeNode
) target
;
60 TreeNode draggednode
= EditorUtil
.getTreeNodeOfSelection(derivateViewSelection
.getSelection());
61 if(draggednode
!=null){
62 if(moveTreeNode(draggednode
, targetNode
)){
64 derivateView
.getConversationHolder().commit();
65 derivateView
.refreshTree();
67 // update source DerivateView if dragging between different views occurred
68 DerivateView sourceDerivateView
= derivateViewSelection
.getDerivateView();
69 if(sourceDerivateView
!=derivateView
){
70 sourceDerivateView
.getConversationHolder().commit();
71 sourceDerivateView
.refreshTree();
74 //FIXME: way too much overhead for just refreshing the other DerivateView
75 // CdmStore.getContextManager().notifyContextRefresh();
76 LocalSelectionTransfer
.getTransfer().setSelection(null);
80 DerivateLabelProvider derivateLabelProvider
= new DerivateLabelProvider();
81 derivateLabelProvider
.setConversation(derivateView
.getConversationHolder());
82 MessagingUtils
.warningDialog("Moving derivate not possible!", derivateView
, "Moving \""+derivateLabelProvider
.getDerivateText(draggednode
)+"\" to \""+derivateLabelProvider
.getDerivateText(targetNode
)+"\" is not possible!");
90 * @see org.eclipse.jface.viewers.ViewerDropAdapter#validateDrop(java.lang.Object, int, org.eclipse.swt.dnd.TransferData)
93 public boolean validateDrop(Object target
, int operation
, TransferData transferType
) {
94 return LocalSelectionTransfer
.getTransfer().isSupportedType(transferType
) && target
instanceof TreeNode
;
101 private boolean moveTreeNode(TreeNode draggedNode
, TreeNode targetNode
) {
102 Object draggedNodeValue
= draggedNode
.getValue();
103 Object targetNodeValue
= targetNode
.getValue();
104 TreeNode fromParentNode
= draggedNode
.getParent();
105 Object fromParentSpecimen
= null;
106 if(fromParentNode
!=null){
107 fromParentSpecimen
= fromParentNode
.getValue();
110 // drag'n'drop for SpecimenOrObservationBase
111 IOccurrenceService occurrenceService
= CdmStore
.getService(IOccurrenceService
.class);
112 if(draggedNodeValue
instanceof DerivedUnit
&& targetNodeValue
instanceof SpecimenOrObservationBase
<?
>){
113 DerivedUnit draggedSpecimen
= (DerivedUnit
) draggedNodeValue
;
114 SpecimenOrObservationBase
<?
> targetSpecimen
= (SpecimenOrObservationBase
<?
>) targetNodeValue
;
115 //check if type is a sub derivate type
116 if(fromParentSpecimen
instanceof SpecimenOrObservationBase
<?
>
117 && fromParentNode
!=null
118 && !fromParentNode
.equals(targetNode
)){//don't drag on direct parent node)
119 return occurrenceService
.moveDerivate((SpecimenOrObservationBase
<?
>)fromParentSpecimen
, targetSpecimen
, draggedSpecimen
);
123 // drag'n'drop for SingleRead
124 else if(draggedNodeValue
instanceof SingleRead
&& targetNodeValue
instanceof Sequence
){
125 SingleRead singleRead
= (SingleRead
) draggedNodeValue
;
126 if(fromParentSpecimen
instanceof Sequence
){
127 return CdmStore
.getService(ISequenceService
.class).moveSingleRead((Sequence
)fromParentSpecimen
, (Sequence
)targetNodeValue
, singleRead
);
131 // drag'n'drop for Sequence
132 else if(draggedNodeValue
instanceof Sequence
&& targetNodeValue
instanceof DnaSample
&& ((SpecimenOrObservationBase
<?
>) targetNodeValue
).getRecordBasis()==SpecimenOrObservationType
.DnaSample
){
133 Sequence sequence
= (Sequence
)draggedNodeValue
;
134 if(fromParentSpecimen
instanceof DnaSample
&& ((SpecimenOrObservationBase
<?
>) targetNodeValue
).getRecordBasis()==SpecimenOrObservationType
.DnaSample
){
135 return occurrenceService
.moveSequence((DnaSample
)fromParentSpecimen
, (DnaSample
)targetNodeValue
, sequence
);