Implemented drag and drop for description elements as well as the functionality to...
authorn.hoffmann <n.hoffmann@localhost>
Tue, 8 Feb 2011 17:48:08 +0000 (17:48 +0000)
committern.hoffmann <n.hoffmann@localhost>
Tue, 8 Feb 2011 17:48:08 +0000 (17:48 +0000)
.gitattributes
taxeditor-editor/plugin.xml
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/descriptive/DescriptionElementDragListener.java [new file with mode: 0644]
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/descriptive/DescriptionElementDropAdapter.java [new file with mode: 0644]
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/descriptive/DescriptionElementTransfer.java [new file with mode: 0644]
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/descriptive/DescriptiveViewPart.java
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/descriptive/handler/MoveDescriptionElementsHandler.java [new file with mode: 0644]
taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/descriptive/operation/MoveDescriptionElementsOperation.java [new file with mode: 0644]
taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/featuretree/FeatureNodeTransfer.java
taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/model/AbstractUtility.java
taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/model/CdmObjectTransfer.java [new file with mode: 0644]

index 75499b9173614c12747cbf74c6d7e8e4c6ff4f4e..97598e100b26348296cfd0535150c161ee961eae 100644 (file)
@@ -468,6 +468,9 @@ taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/concept/handle
 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/concept/handler/OpenRelatedConceptHandler.java -text
 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/concept/operation/CreateConceptRelationOperation.java -text
 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/concept/operation/DeleteConceptRelationOperation.java -text
+taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/descriptive/DescriptionElementDragListener.java -text
+taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/descriptive/DescriptionElementDropAdapter.java -text
+taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/descriptive/DescriptionElementTransfer.java -text
 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/descriptive/DescriptiveContentProvider.java -text
 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/descriptive/DescriptiveLabelProvider.java -text
 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/descriptive/DescriptiveViewPart.java -text
@@ -477,11 +480,13 @@ taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/descriptive/ha
 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/descriptive/handler/DeleteHandler.java -text
 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/descriptive/handler/DescriptionsMenuPropertyTester.java -text
 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/descriptive/handler/DynamicFeatureMenu.java -text
+taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/descriptive/handler/MoveDescriptionElementsHandler.java -text
 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/descriptive/operation/ChangeDescriptionElementType.java -text
 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/descriptive/operation/CreateDescriptionElementOperation.java -text
 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/descriptive/operation/CreateTaxonDescriptionOperation.java -text
 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/descriptive/operation/DeleteDescriptionElementOperation.java -text
 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/descriptive/operation/DeleteTaxonDescriptionOperation.java -text
+taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/descriptive/operation/MoveDescriptionElementsOperation.java -text
 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/detail/CdmSectionPart.java -text
 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/detail/DetailsViewPart.java -text
 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/detail/DetailsViewer.java -text
@@ -1066,6 +1071,7 @@ taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/model/AbstractCdmViewPart.j
 taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/model/AbstractDataChangeBehaviour.java -text
 taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/model/AbstractUtility.java -text
 taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/model/AuthorHelper.java -text
+taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/model/CdmObjectTransfer.java -text
 taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/model/CdmProgressMonitorAdapter.java -text
 taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/model/CommonHelper.java -text
 taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/model/ContextListenerAdapter.java -text
index 0d4e2910a755a32adc0bd370afe3f1463e0a1a39..4761ae8c174a2485e490782909c4c3b831a0bc1f 100644 (file)
                   name="taxeditor-editor.separator1"
                   visible="true">
             </separator>
+            <command
+                  commandId="eu.etaxonomy.taxeditor.description.commands.moveDescriptionElements"
+                  label="Move Elements"
+                  style="push">
+               <visibleWhen
+                     checkEnabled="true">
+                  <reference
+                        definitionId="isDescriptionElement">
+                  </reference>
+               </visibleWhen>
+            </command>
             <separator
                   name="eu.etaxonomy.taxeditor.taxonDescriptionEditor.separator.afterNew"
                   visible="true">
                id="eu.etaxonomy.taxeditor.description.commands.adddescription"
                name="New Description">
          </command>
+         <command
+               defaultHandler="eu.etaxonomy.taxeditor.editor.view.descriptive.handler.MoveDescriptionElementsHandler"
+               id="eu.etaxonomy.taxeditor.description.commands.moveDescriptionElements"
+               name="Move Description Elements">
+         </command>
       </extension>
       <extension
             point="org.eclipse.core.expressions.definitions">
diff --git a/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/descriptive/DescriptionElementDragListener.java b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/descriptive/DescriptionElementDragListener.java
new file mode 100644 (file)
index 0000000..14c6939
--- /dev/null
@@ -0,0 +1,68 @@
+// $Id$
+/**
+* Copyright (C) 2007 EDIT
+* European Distributed Institute of Taxonomy 
+* http://www.e-taxonomy.eu
+* 
+* The contents of this file are subject to the Mozilla Public License Version 1.1
+* See LICENSE.TXT at the top of this package for the full license terms.
+*/
+
+package eu.etaxonomy.taxeditor.editor.view.descriptive;
+
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.swt.dnd.DND;
+import org.eclipse.swt.dnd.DragSourceAdapter;
+import org.eclipse.swt.dnd.DragSourceEvent;
+
+import eu.etaxonomy.cdm.model.description.DescriptionElementBase;
+
+/**
+ * @author n.hoffmann
+ * @created Feb 8, 2011
+ * @version 1.0
+ */
+public class DescriptionElementDragListener extends DragSourceAdapter {
+
+       private DescriptiveViewPart part;
+       
+       public DescriptionElementDragListener(DescriptiveViewPart part){
+               this.part = part;
+       }
+       
+       /**
+        * Method declared on DragSourceListener
+        */
+       public void dragFinished(DragSourceEvent event) {
+               if (!event.doit)
+                       return;
+               // FIXME what to do here?
+               if (event.detail != DND.DROP_NONE) {
+                       IStructuredSelection selection = (IStructuredSelection) part.getViewer()
+                                       .getSelection();
+                       part.changed(null);
+               }
+       }
+       
+       /**
+        * Method declared on DragSourceListener
+        */
+       public void dragSetData(DragSourceEvent event) {
+               IStructuredSelection selection = (IStructuredSelection) part.getViewer()
+                               .getSelection();
+               DescriptionElementBase[] descriptionElements = (DescriptionElementBase[]) selection.toList().toArray(new DescriptionElementBase[selection.size()]);
+               if (DescriptionElementTransfer.getInstance().isSupportedType(
+                               event.dataType)) {
+                       event.data = descriptionElements;
+               }
+       }
+       
+       /**
+        * Method declared on DragSourceListener
+        */
+       public void dragStart(DragSourceEvent event) {
+               event.doit = !part.getViewer().getSelection().isEmpty();
+       }
+       
+}
diff --git a/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/descriptive/DescriptionElementDropAdapter.java b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/descriptive/DescriptionElementDropAdapter.java
new file mode 100644 (file)
index 0000000..028cd0b
--- /dev/null
@@ -0,0 +1,91 @@
+// $Id$
+/**
+* Copyright (C) 2007 EDIT
+* European Distributed Institute of Taxonomy 
+* http://www.e-taxonomy.eu
+* 
+* The contents of this file are subject to the Mozilla Public License Version 1.1
+* See LICENSE.TXT at the top of this package for the full license terms.
+*/
+
+package eu.etaxonomy.taxeditor.editor.view.descriptive;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerDropAdapter;
+import org.eclipse.swt.dnd.DND;
+import org.eclipse.swt.dnd.TransferData;
+
+import eu.etaxonomy.cdm.model.description.DescriptionElementBase;
+import eu.etaxonomy.cdm.model.description.TaxonDescription;
+import eu.etaxonomy.taxeditor.editor.EditorUtil;
+import eu.etaxonomy.taxeditor.editor.view.descriptive.operation.MoveDescriptionElementsOperation;
+import eu.etaxonomy.taxeditor.operation.AbstractPostOperation;
+import eu.etaxonomy.taxeditor.store.StoreUtil;
+
+/**
+ * @author n.hoffmann
+ * @created Feb 8, 2011
+ * @version 1.0
+ */
+public class DescriptionElementDropAdapter extends ViewerDropAdapter {
+
+       /**
+        * @param viewer
+        */
+       protected DescriptionElementDropAdapter(Viewer viewer) {
+               super(viewer);
+       }
+
+       /* (non-Javadoc)
+        * @see org.eclipse.jface.viewers.ViewerDropAdapter#performDrop(java.lang.Object)
+        */
+       @Override
+       public boolean performDrop(Object data) {
+               TaxonDescription target = (TaxonDescription) getCurrentTarget();
+               Object[] droppedElements = (Object[]) data;
+               
+               Collection<DescriptionElementBase> descriptionElements = new ArrayList<DescriptionElementBase>();
+               
+               boolean isCopy = getCurrentOperation() == DND.DROP_COPY ? true : false;
+               
+               // cannot drop a feature node onto itself
+               for (Object droppedElement : droppedElements) {                 
+                       if (droppedElement == null){
+                               StoreUtil.warningDialog("Operation not supported yet", this, "We are currently unable to drag and drop a newly created element. Please save the editor to make this work.");
+                               return false;
+                       }
+                       if(! (droppedElement instanceof DescriptionElementBase)){
+                               return false;
+                       }else{
+                               DescriptionElementBase descriptionElement = (DescriptionElementBase) droppedElement;
+                               
+                               if (descriptionElement.getInDescription().equals(target)) {
+                                       return false;
+                               }
+                               
+                               descriptionElements.add(descriptionElement);
+                       }                       
+               }
+               
+               AbstractPostOperation operation = new MoveDescriptionElementsOperation("Move Descriptions", EditorUtil.getUndoContext(), target, descriptionElements, isCopy, null);
+               
+               EditorUtil.executeOperation(operation);
+               
+               return true;
+       }
+
+       /* (non-Javadoc)
+        * @see org.eclipse.jface.viewers.ViewerDropAdapter#validateDrop(java.lang.Object, int, org.eclipse.swt.dnd.TransferData)
+        */
+       @Override
+       public boolean validateDrop(Object target, int operation,
+                       TransferData transferData) {
+               boolean transferDataIsSupported = DescriptionElementTransfer.getInstance().isSupportedType(
+                               transferData);
+               return target instanceof TaxonDescription && transferDataIsSupported;
+       }
+
+}
diff --git a/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/descriptive/DescriptionElementTransfer.java b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/descriptive/DescriptionElementTransfer.java
new file mode 100644 (file)
index 0000000..34e37de
--- /dev/null
@@ -0,0 +1,60 @@
+// $Id$
+/**
+* Copyright (C) 2007 EDIT
+* European Distributed Institute of Taxonomy 
+* http://www.e-taxonomy.eu
+* 
+* The contents of this file are subject to the Mozilla Public License Version 1.1
+* See LICENSE.TXT at the top of this package for the full license terms.
+*/
+
+package eu.etaxonomy.taxeditor.editor.view.descriptive;
+
+import java.util.UUID;
+
+import eu.etaxonomy.cdm.api.service.IDescriptionService;
+import eu.etaxonomy.cdm.model.description.DescriptionElementBase;
+import eu.etaxonomy.taxeditor.model.CdmObjectTransfer;
+import eu.etaxonomy.taxeditor.store.CdmStore;
+
+/**
+ * @author n.hoffmann
+ * @created Feb 8, 2011
+ * @version 1.0
+ */
+public class DescriptionElementTransfer extends CdmObjectTransfer<DescriptionElementBase> {
+
+       private static DescriptionElementTransfer instance = new DescriptionElementTransfer();
+       private static final String TYPE_NAME = "descriptionElement-transfer-format";
+       private static final int TYPEID = registerType(TYPE_NAME);
+       
+       public static synchronized DescriptionElementTransfer getInstance(){
+               return instance;
+       }
+       
+       private DescriptionElementTransfer(){}
+       
+       /* (non-Javadoc)
+        * @see org.eclipse.swt.dnd.Transfer#getTypeIds()
+        */
+       @Override
+       protected int[] getTypeIds() {
+               return new int[] { TYPEID };
+       }
+
+       /* (non-Javadoc)
+        * @see org.eclipse.swt.dnd.Transfer#getTypeNames()
+        */
+       @Override
+       protected String[] getTypeNames() {
+               return new String[] { TYPE_NAME };
+       }
+
+       /* (non-Javadoc)
+        * @see eu.etaxonomy.taxeditor.model.CdmObjectTransfer#loadElement(java.util.UUID)
+        */
+       @Override
+       public DescriptionElementBase loadElement(UUID uuid) {
+               return CdmStore.getService(IDescriptionService.class).loadDescriptionElement(uuid, null);
+       }
+}
index 3516945c108ec2953c92ce744ae76df4f50211f0..1eb100f10cb55043da103e6d224badfc2419b059 100644 (file)
@@ -23,6 +23,8 @@ import org.eclipse.jface.viewers.StructuredSelection;
 import org.eclipse.jface.viewers.TreeViewer;
 import org.eclipse.jface.viewers.Viewer;
 import org.eclipse.swt.SWT;
+import org.eclipse.swt.dnd.DND;
+import org.eclipse.swt.dnd.Transfer;
 import org.eclipse.swt.graphics.ImageData;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Control;
@@ -67,7 +69,9 @@ public class DescriptiveViewPart extends AbstractCdmEditorViewPart implements IP
        private ToggleDescriptionAction showAllElementsAction;
 
        private ToggleDescriptionAction hideAllElementsAction;
-               
+
+       private int dndOperations = DND.DROP_COPY | DND.DROP_MOVE;
+       
        /** {@inheritDoc} */
        @Override
        public void createViewer(Composite parent) {
@@ -80,6 +84,13 @@ public class DescriptiveViewPart extends AbstractCdmEditorViewPart implements IP
                viewer.setSorter(new DescriptiveViewerSorter());
                
                viewer.setAutoExpandLevel(2);
+               
+               
+               Transfer[] transfers = new Transfer[] { DescriptionElementTransfer.getInstance() };
+               viewer.addDragSupport(dndOperations, transfers, new DescriptionElementDragListener(
+                               this));
+               viewer.addDropSupport(dndOperations, transfers,
+                               new DescriptionElementDropAdapter(viewer));
                                                
                // Propagate selection from viewer
                getSite().setSelectionProvider(viewer);
diff --git a/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/descriptive/handler/MoveDescriptionElementsHandler.java b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/descriptive/handler/MoveDescriptionElementsHandler.java
new file mode 100644 (file)
index 0000000..a24d7ee
--- /dev/null
@@ -0,0 +1,89 @@
+// $Id$
+/**
+* Copyright (C) 2007 EDIT
+* European Distributed Institute of Taxonomy 
+* http://www.e-taxonomy.eu
+* 
+* The contents of this file are subject to the Mozilla Public License Version 1.1
+* See LICENSE.TXT at the top of this package for the full license terms.
+*/
+
+package eu.etaxonomy.taxeditor.editor.view.descriptive.handler;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.commands.common.NotDefinedException;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.ui.handlers.HandlerUtil;
+
+import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
+import eu.etaxonomy.cdm.api.service.IDescriptionService;
+import eu.etaxonomy.cdm.model.description.DescriptionElementBase;
+import eu.etaxonomy.cdm.model.description.TaxonDescription;
+import eu.etaxonomy.cdm.model.taxon.Taxon;
+import eu.etaxonomy.taxeditor.dialogs.filteredSelection.TaxonBaseSelectionDialog;
+import eu.etaxonomy.taxeditor.editor.EditorUtil;
+import eu.etaxonomy.taxeditor.editor.view.descriptive.DescriptiveViewPart;
+import eu.etaxonomy.taxeditor.editor.view.descriptive.operation.MoveDescriptionElementsOperation;
+import eu.etaxonomy.taxeditor.operation.AbstractPostOperation;
+import eu.etaxonomy.taxeditor.operation.IPostOperationEnabled;
+import eu.etaxonomy.taxeditor.store.CdmStore;
+
+/**
+ * @author n.hoffmann
+ * @created Feb 8, 2011
+ * @version 1.0
+ */
+public class MoveDescriptionElementsHandler extends AbstractHandler {
+
+       /* (non-Javadoc)
+        * @see org.eclipse.core.commands.IHandler#execute(org.eclipse.core.commands.ExecutionEvent)
+        */
+       @Override
+       public Object execute(ExecutionEvent event) throws ExecutionException {
+               
+               ConversationHolder conversation = CdmStore.createConversation();
+               
+               ISelection selection = HandlerUtil.getActiveMenuSelection(event);
+               
+               if(selection instanceof IStructuredSelection){
+
+                       IStructuredSelection structuredSelection = (IStructuredSelection) selection;
+                       
+                       List<DescriptionElementBase> elements = new ArrayList<DescriptionElementBase>();
+                       
+                       for(Object element : structuredSelection.toArray()){
+                               if(element instanceof DescriptionElementBase){
+                                       UUID uuid = ((DescriptionElementBase) element).getUuid();
+                                       
+                                       elements.add(CdmStore.getService(IDescriptionService.class).loadDescriptionElement(uuid, null));
+                               }
+                       }
+                       
+                       Taxon targetTaxon = TaxonBaseSelectionDialog.selectTaxon(HandlerUtil.getActiveShell(event), conversation);
+                                               
+                       TaxonDescription targetDescription = TaxonDescription.NewInstance(targetTaxon);
+                       targetDescription.setTitleCache(String.format("Copied from %s", EditorUtil.getActiveMultiPageTaxonEditor().getTaxon()), true);
+                       
+                       try {
+                               AbstractPostOperation operation = new MoveDescriptionElementsOperation(
+                                               event.getCommand().getName(), EditorUtil.getUndoContext(), 
+                                               targetDescription, elements, false, (IPostOperationEnabled) EditorUtil.getView(DescriptiveViewPart.ID, true));
+                               EditorUtil.executeOperation(operation);
+                               conversation.commit(false);
+                               
+                       } catch (NotDefinedException e) {
+                               EditorUtil.error(getClass(), e);
+                       }
+               }
+               
+               return null;
+       }
+
+}
diff --git a/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/descriptive/operation/MoveDescriptionElementsOperation.java b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/descriptive/operation/MoveDescriptionElementsOperation.java
new file mode 100644 (file)
index 0000000..51ba2b2
--- /dev/null
@@ -0,0 +1,94 @@
+// $Id$
+/**
+* Copyright (C) 2007 EDIT
+* European Distributed Institute of Taxonomy 
+* http://www.e-taxonomy.eu
+* 
+* The contents of this file are subject to the Mozilla Public License Version 1.1
+* See LICENSE.TXT at the top of this package for the full license terms.
+*/
+
+package eu.etaxonomy.taxeditor.editor.view.descriptive.operation;
+
+import java.util.Collection;
+
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.commands.operations.IUndoContext;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+
+import eu.etaxonomy.cdm.api.service.IDescriptionService;
+import eu.etaxonomy.cdm.model.description.DescriptionBase;
+import eu.etaxonomy.cdm.model.description.DescriptionElementBase;
+import eu.etaxonomy.taxeditor.operation.AbstractPostOperation;
+import eu.etaxonomy.taxeditor.operation.IPostOperationEnabled;
+import eu.etaxonomy.taxeditor.store.CdmStore;
+
+/**
+ * @author n.hoffmann
+ * @created Feb 8, 2011
+ * @version 1.0
+ */
+public class MoveDescriptionElementsOperation extends AbstractPostOperation {
+
+       private Collection<DescriptionElementBase> descriptionElements;
+       private DescriptionBase targetDescription;
+       private IDescriptionService service;
+       private boolean isCopy;
+
+       /**
+        * 
+        * @param label
+        * @param undoContext
+        * @param targetDescription
+        * @param descriptionElements
+        * @param isCopy
+        * @param postOperationEnabled
+        */
+       public MoveDescriptionElementsOperation(String label,
+                       IUndoContext undoContext, DescriptionBase targetDescription, 
+                       Collection<DescriptionElementBase> descriptionElements, boolean isCopy,
+                       IPostOperationEnabled postOperationEnabled) {
+               super(label, undoContext, postOperationEnabled);
+               this.targetDescription = targetDescription;
+               this.descriptionElements = descriptionElements;
+               this.isCopy = isCopy;
+               
+               service = CdmStore.getService(IDescriptionService.class);
+       }
+
+       /* (non-Javadoc)
+        * @see org.eclipse.core.commands.operations.AbstractOperation#execute(org.eclipse.core.runtime.IProgressMonitor, org.eclipse.core.runtime.IAdaptable)
+        */
+       @Override
+       public IStatus execute(IProgressMonitor monitor, IAdaptable info)
+                       throws ExecutionException {
+               
+               
+               service.moveDescriptionElementsToDescription(descriptionElements, targetDescription, isCopy);
+               
+               return postExecute(targetDescription);
+       }
+
+       /* (non-Javadoc)
+        * @see org.eclipse.core.commands.operations.AbstractOperation#redo(org.eclipse.core.runtime.IProgressMonitor, org.eclipse.core.runtime.IAdaptable)
+        */
+       @Override
+       public IStatus redo(IProgressMonitor monitor, IAdaptable info)
+                       throws ExecutionException {
+               // TODO Auto-generated method stub
+               return null;
+       }
+
+       /* (non-Javadoc)
+        * @see org.eclipse.core.commands.operations.AbstractOperation#undo(org.eclipse.core.runtime.IProgressMonitor, org.eclipse.core.runtime.IAdaptable)
+        */
+       @Override
+       public IStatus undo(IProgressMonitor monitor, IAdaptable info)
+                       throws ExecutionException {
+               // TODO Auto-generated method stub
+               return null;
+       }
+
+}
index 44a5c8e22c9a6907c92c7652dcc731a92ee44a8a..8e31c8904b9ce51c3a1117c0c401ddac6a4d2c5a 100644 (file)
 
 package eu.etaxonomy.taxeditor.featuretree;
 
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.DataInputStream;
-import java.io.DataOutputStream;
-import java.io.EOFException;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
 import java.util.UUID;
 
-import org.eclipse.swt.dnd.ByteArrayTransfer;
-import org.eclipse.swt.dnd.TransferData;
-
 import eu.etaxonomy.cdm.api.service.IFeatureNodeService;
 import eu.etaxonomy.cdm.model.description.FeatureNode;
+import eu.etaxonomy.taxeditor.model.CdmObjectTransfer;
 import eu.etaxonomy.taxeditor.store.CdmStore;
 
 /**
@@ -34,7 +24,7 @@ import eu.etaxonomy.taxeditor.store.CdmStore;
  * @created Aug 5, 2010
  * @version 1.0
  */
-public class FeatureNodeTransfer extends ByteArrayTransfer {
+public class FeatureNodeTransfer extends CdmObjectTransfer<FeatureNode> {
 
        private static FeatureNodeTransfer instance = new FeatureNodeTransfer();
        private static final String TYPE_NAME = "featureNode-transfer-format";
@@ -49,9 +39,7 @@ public class FeatureNodeTransfer extends ByteArrayTransfer {
                return instance;
        }
 
-       private FeatureNodeTransfer() {
-               
-       }
+       private FeatureNodeTransfer() {}
 
        /** {@inheritDoc} */
        @Override
@@ -65,97 +53,11 @@ public class FeatureNodeTransfer extends ByteArrayTransfer {
                return new String[] { TYPE_NAME };
        }
 
-       /*
-        * Method declared on Transfer.
-        */
-       /** {@inheritDoc} */
-       protected void javaToNative(Object object, TransferData transferData) {
-               byte[] bytes = toByteArray((FeatureNode[]) object);
-               if (bytes != null)
-                       super.javaToNative(bytes, transferData);
-       }
-
-       /*
-        * Method declared on Transfer.
+       /* (non-Javadoc)
+        * @see eu.etaxonomy.taxeditor.model.CdmObjectTransfer#loadElement(java.util.UUID)
         */
-       /** {@inheritDoc} */
-       protected Object nativeToJava(TransferData transferData) {
-               byte[] bytes = (byte[]) super.nativeToJava(transferData);
-               return fromByteArray(bytes);
-       }
-
-       /**
-        * <p>toByteArray</p>
-        *
-        * @param featureNodes an array of {@link eu.etaxonomy.cdm.model.description.FeatureNode} objects.
-        * @return an array of byte.
-        */
-       protected byte[] toByteArray(FeatureNode[] featureNodes) {
-               /**
-                * Transfer data is an array of gadgets. Serialized version is: (int)
-                * number of gadgets (Gadget) gadget 1 (Gadget) gadget 2 ... repeat for
-                * each subsequent gadget see writeGadget for the (Gadget) format.
-                */
-               ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
-               DataOutputStream out = new DataOutputStream(byteOut);
-
-               byte[] bytes = null;
-
-               try {
-                       
-                       for(FeatureNode featureNode : featureNodes){
-                               writeFeatureNode(featureNode, out);
-                       }
-                       out.close();
-                       bytes = byteOut.toByteArray();
-               } catch (IOException e) {
-                       // when in doubt send nothing
-               }
-               return bytes;
-       }
-
-       /**
-        * <p>fromByteArray</p>
-        *
-        * @param bytes an array of byte.
-        * @return an array of {@link eu.etaxonomy.cdm.model.description.FeatureNode} objects.
-        */
-       protected FeatureNode[] fromByteArray(byte[] bytes) {
-               DataInputStream in = new DataInputStream(
-                               new ByteArrayInputStream(bytes));
-
-               try {
-                       List<FeatureNode> featureNodes = new ArrayList<FeatureNode>();
-                       
-                       try{
-                               while(true){
-                                       featureNodes.add(readFeatureNode(in));
-                               }
-                       }catch(EOFException e){
-                               return featureNodes.toArray(new FeatureNode[]{});
-                       }
-               } catch (IOException e) {
-                       return null;
-               }
-       }
-
-       /**
-        * Reads and returns a single featureNode from the given stream.
-        */
-       private FeatureNode readFeatureNode(DataInputStream dataIn) throws IOException {
-               
-               UUID uuid = UUID.fromString(dataIn.readUTF());
-               
-               FeatureNode featureNode = CdmStore.getService(IFeatureNodeService.class).load(uuid);
-               
-               return featureNode;
-       }
-
-       /**
-        * Writes the given featureNode to the stream.
-        */
-       private void writeFeatureNode(FeatureNode featureNode,
-                       DataOutputStream dataOut) throws IOException {
-               dataOut.writeUTF(featureNode.getUuid().toString());
+       @Override
+       public FeatureNode loadElement(UUID uuid) {
+               return  CdmStore.getService(IFeatureNodeService.class).load(uuid);
        }
 }
index b2cfe084a22091ff50f717ef128a00ae31f8a03b..78c690bb237c1c804728db556540146170ae9239 100644 (file)
@@ -390,7 +390,9 @@ public abstract class AbstractUtility {
 //        }
                
                IPostOperationEnabled postOperationEnabled = operation.getPostOperationEnabled();
-               postOperationEnabled.onComplete();
+               if(postOperationEnabled != null){
+                       postOperationEnabled.onComplete();
+               }
                return Status.OK_STATUS;
        }
        
diff --git a/taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/model/CdmObjectTransfer.java b/taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/model/CdmObjectTransfer.java
new file mode 100644 (file)
index 0000000..40d8e19
--- /dev/null
@@ -0,0 +1,107 @@
+// $Id$
+/**
+* Copyright (C) 2007 EDIT
+* European Distributed Institute of Taxonomy 
+* http://www.e-taxonomy.eu
+* 
+* The contents of this file are subject to the Mozilla Public License Version 1.1
+* See LICENSE.TXT at the top of this package for the full license terms.
+*/
+
+package eu.etaxonomy.taxeditor.model;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.EOFException;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+
+import org.eclipse.swt.dnd.ByteArrayTransfer;
+import org.eclipse.swt.dnd.TransferData;
+
+import eu.etaxonomy.cdm.model.common.ICdmBase;
+
+/**
+ * @author n.hoffmann
+ * @created Feb 8, 2011
+ * @version 1.0
+ */
+public abstract class CdmObjectTransfer<T extends ICdmBase> extends ByteArrayTransfer {
+       
+       /* (non-Javadoc)
+        * @see org.eclipse.swt.dnd.ByteArrayTransfer#javaToNative(java.lang.Object, org.eclipse.swt.dnd.TransferData)
+        */
+       @Override
+       protected void javaToNative(Object object, TransferData transferData) {
+               byte[] bytes = toByteArray((T[]) object);
+               if (bytes != null)
+                       super.javaToNative(bytes, transferData);
+       }
+       
+       /* (non-Javadoc)
+        * @see org.eclipse.swt.dnd.ByteArrayTransfer#nativeToJava(org.eclipse.swt.dnd.TransferData)
+        */
+       @Override
+       protected Object nativeToJava(TransferData transferData) {
+               byte[] bytes = (byte[]) super.nativeToJava(transferData);
+               return fromByteArray(bytes);
+       }
+       
+       protected byte[] toByteArray(T[] elements) {
+               ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
+               DataOutputStream out = new DataOutputStream(byteOut);
+
+               byte[] bytes = null;
+
+               try {
+                       
+                       for(T element : elements){
+                               writeElementUuid(element, out);
+                       }
+                       out.close();
+                       bytes = byteOut.toByteArray();
+               } catch (IOException e) {
+                       // when in doubt send nothing
+               }
+               return bytes;
+       }
+       
+       private void writeElementUuid(T element, DataOutputStream out) throws IOException {
+               out.writeUTF(element.getUuid().toString());             
+       }
+
+       protected Object fromByteArray(byte[] bytes) {
+               DataInputStream in = new DataInputStream(
+                               new ByteArrayInputStream(bytes));
+
+               try {
+                       List<T> elements = new ArrayList<T>();
+                       
+                       try{
+                               while(true){
+                                       UUID uuid = readElementUuid(in);
+                                       elements.add(loadElement(uuid));
+                               }
+                       }catch(EOFException e){
+                               return elements.toArray();
+                       }
+               } catch (IOException e) {
+                       return null;
+               }
+       }
+
+       public abstract T loadElement(UUID uuid);
+       
+       /**
+        * @param in
+        * @return
+        * @throws IOException 
+        */
+       public UUID readElementUuid(DataInputStream in) throws IOException{
+               return UUID.fromString(in.readUTF());
+       }
+}