- fixed possible LazyInitializaitionException in DerivateLabelProvdider
[taxeditor.git] / eu.etaxonomy.taxeditor.editor / src / main / java / eu / etaxonomy / taxeditor / editor / view / derivate / DerivateDropListener.java
index 05a769171aa07cc180230a9a62bc264a00ce47d8..69f175743e030568b3e904015de829284f4a00b2 100644 (file)
@@ -10,7 +10,6 @@
 package eu.etaxonomy.taxeditor.editor.view.derivate;
 
 import org.eclipse.jface.util.LocalSelectionTransfer;
-import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.jface.viewers.TreeNode;
 import org.eclipse.jface.viewers.ViewerDropAdapter;
 import org.eclipse.swt.dnd.TransferData;
@@ -23,8 +22,9 @@ import eu.etaxonomy.cdm.model.molecular.SingleRead;
 import eu.etaxonomy.cdm.model.occurrence.DerivedUnit;
 import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;
 import eu.etaxonomy.taxeditor.editor.EditorUtil;
-import eu.etaxonomy.taxeditor.model.AbstractUtility;
+import eu.etaxonomy.taxeditor.model.MessagingUtils;
 import eu.etaxonomy.taxeditor.store.CdmStore;
+import eu.etaxonomy.taxeditor.view.derivateSearch.DerivateLabelProvider;
 
 /**
  * @author pplitzner
@@ -49,19 +49,37 @@ public class DerivateDropListener extends ViewerDropAdapter {
     @Override
     public boolean performDrop(Object data) {
         if(derivateView.isDirty()){
-            AbstractUtility.warningDialog("View has unsaved changes", this, "You need to save before performing this action");
+            MessagingUtils.warningDialog("View has unsaved changes", this, "You need to save before performing this action");
             return false;
         }
         Object target = getCurrentTarget();
-        if(target instanceof TreeNode && data instanceof IStructuredSelection){
+        if(target instanceof TreeNode && data instanceof DerivateViewSelection){
+            DerivateViewSelection derivateViewSelection = (DerivateViewSelection)data;
             TreeNode targetNode = (TreeNode) target;
-            TreeNode draggednode = EditorUtil.getTreeNodeOfSelection((IStructuredSelection) data);
+            TreeNode draggednode = EditorUtil.getTreeNodeOfSelection(derivateViewSelection.getSelection());
             if(draggednode!=null){
                 if(moveTreeNode(draggednode, targetNode)){
+                    //update DerivateView
+                    derivateView.getConversationHolder().commit();
                     derivateView.refreshTree();
+
+                    // update source DerivateView if dragging between different views occurred
+                    DerivateView sourceDerivateView = derivateViewSelection.getDerivateView();
+                    if(sourceDerivateView!=derivateView){
+                        sourceDerivateView.getConversationHolder().commit();
+                        sourceDerivateView.refreshTree();
+                    }
+
+                    //FIXME: way too much overhead for just refreshing the other DerivateView
+//                    CdmStore.getContextManager().notifyContextRefresh();
                     LocalSelectionTransfer.getTransfer().setSelection(null);
                     return true;
                 }
+                else{
+                    DerivateLabelProvider derivateLabelProvider = new DerivateLabelProvider();
+                    derivateLabelProvider.setConversation(derivateView.getConversationHolder());
+                    MessagingUtils.warningDialog("Moving derivate not possible!", derivateView, "Moving \""+derivateLabelProvider.getDerivateText(draggednode)+"\" to \""+derivateLabelProvider.getDerivateText(targetNode)+"\" is not possible!");
+                }
             }
         }
         return false;
@@ -79,39 +97,40 @@ public class DerivateDropListener extends ViewerDropAdapter {
      * @param value
      * @return
      */
-    private boolean moveTreeNode(TreeNode from, TreeNode to) {
-        Object fromValue = from.getValue();
-        Object toValue = to.getValue();
-        TreeNode fromParentNode = from.getParent();
-        Object fromParentSpecimen = fromParentNode.getValue();
+    private boolean moveTreeNode(TreeNode draggedNode, TreeNode targetNode) {
+        Object draggedNodeValue = draggedNode.getValue();
+        Object targetNodeValue = targetNode.getValue();
+        TreeNode fromParentNode = draggedNode.getParent();
+        Object fromParentSpecimen = null;
+        if(fromParentNode!=null){
+            fromParentNode.getValue();
+        }
 
         // drag'n'drop for SpecimenOrObservationBase
-        if(fromValue instanceof DerivedUnit && toValue instanceof SpecimenOrObservationBase<?>){
-            DerivedUnit draggedSpecimen = (DerivedUnit) fromValue;
-            SpecimenOrObservationBase<?> targetSpecimen = (SpecimenOrObservationBase<?>) toValue;
+        IOccurrenceService occurrenceService = CdmStore.getService(IOccurrenceService.class);
+        if(draggedNodeValue instanceof DerivedUnit && targetNodeValue instanceof SpecimenOrObservationBase<?>){
+            DerivedUnit draggedSpecimen = (DerivedUnit) draggedNodeValue;
+            SpecimenOrObservationBase<?> targetSpecimen = (SpecimenOrObservationBase<?>) targetNodeValue;
             //check if type is a sub derivate type
-            if(!fromParentNode.equals(to)//don't drag on direct parent node
+            if(!fromParentNode.equals(targetNode)//don't drag on direct parent node
                     && fromParentSpecimen instanceof SpecimenOrObservationBase<?>){
-                CdmStore.getService(IOccurrenceService.class).moveDerivate((SpecimenOrObservationBase<?>)fromParentSpecimen, targetSpecimen, draggedSpecimen);
-                return true;
+                return occurrenceService.moveDerivate((SpecimenOrObservationBase<?>)fromParentSpecimen, targetSpecimen, draggedSpecimen);
             }
         }
 
         // drag'n'drop for SingleRead
-        else if(fromValue instanceof SingleRead && toValue instanceof Sequence){
-            SingleRead singleRead = (SingleRead) fromValue;
+        else if(draggedNodeValue instanceof SingleRead && targetNodeValue instanceof Sequence){
+            SingleRead singleRead = (SingleRead) draggedNodeValue;
             if(fromParentSpecimen instanceof Sequence){
-                CdmStore.getService(ISequenceService.class).moveSingleRead((Sequence)fromParentSpecimen, (Sequence)toValue, singleRead);
+                return CdmStore.getService(ISequenceService.class).moveSingleRead((Sequence)fromParentSpecimen, (Sequence)targetNodeValue, singleRead);
             }
-            return true;
         }
 
         // drag'n'drop for Sequence
-        else if(fromValue instanceof Sequence && toValue instanceof DnaSample ){
-            Sequence sequence = (Sequence)fromValue;
+        else if(draggedNodeValue instanceof Sequence && targetNodeValue instanceof DnaSample ){
+            Sequence sequence = (Sequence)draggedNodeValue;
             if(fromParentSpecimen instanceof DnaSample){
-                CdmStore.getService(IOccurrenceService.class).moveSequence((DnaSample)fromParentSpecimen, (DnaSample)toValue, sequence);
-                return true;
+                return occurrenceService.moveSequence((DnaSample)fromParentSpecimen, (DnaSample)targetNodeValue, sequence);
             }
         }
         return false;