From 840d4d5dea0b490cfd7887cfbacbe3b922893138 Mon Sep 17 00:00:00 2001 From: "n.hoffmann" Date: Tue, 8 Feb 2011 17:48:08 +0000 Subject: [PATCH] Implemented drag and drop for description elements as well as the functionality to move description elements between taxa. Not working yet due to #2233. --- .gitattributes | 6 + taxeditor-editor/plugin.xml | 16 +++ .../DescriptionElementDragListener.java | 68 +++++++++++ .../DescriptionElementDropAdapter.java | 91 ++++++++++++++ .../DescriptionElementTransfer.java | 60 +++++++++ .../view/descriptive/DescriptiveViewPart.java | 13 +- .../MoveDescriptionElementsHandler.java | 89 ++++++++++++++ .../MoveDescriptionElementsOperation.java | 94 +++++++++++++++ .../featuretree/FeatureNodeTransfer.java | 114 ++---------------- .../taxeditor/model/AbstractUtility.java | 4 +- .../taxeditor/model/CdmObjectTransfer.java | 107 ++++++++++++++++ 11 files changed, 554 insertions(+), 108 deletions(-) create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/descriptive/DescriptionElementDragListener.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/descriptive/DescriptionElementDropAdapter.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/descriptive/DescriptionElementTransfer.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/descriptive/handler/MoveDescriptionElementsHandler.java create mode 100644 taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/descriptive/operation/MoveDescriptionElementsOperation.java create mode 100644 taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/model/CdmObjectTransfer.java diff --git a/.gitattributes b/.gitattributes index 75499b917..97598e100 100644 --- a/.gitattributes +++ b/.gitattributes @@ -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 diff --git a/taxeditor-editor/plugin.xml b/taxeditor-editor/plugin.xml index 0d4e2910a..4761ae8c1 100644 --- a/taxeditor-editor/plugin.xml +++ b/taxeditor-editor/plugin.xml @@ -663,6 +663,17 @@ name="taxeditor-editor.separator1" visible="true"> + + + + + + @@ -715,6 +726,11 @@ id="eu.etaxonomy.taxeditor.description.commands.adddescription" name="New Description"> + + 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 index 000000000..14c693959 --- /dev/null +++ b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/descriptive/DescriptionElementDragListener.java @@ -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 index 000000000..028cd0b5b --- /dev/null +++ b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/descriptive/DescriptionElementDropAdapter.java @@ -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 descriptionElements = new ArrayList(); + + 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 index 000000000..34e37de34 --- /dev/null +++ b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/descriptive/DescriptionElementTransfer.java @@ -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 { + + 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); + } +} diff --git a/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/descriptive/DescriptiveViewPart.java b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/descriptive/DescriptiveViewPart.java index 3516945c1..1eb100f10 100644 --- a/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/descriptive/DescriptiveViewPart.java +++ b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/descriptive/DescriptiveViewPart.java @@ -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 index 000000000..a24d7ee2e --- /dev/null +++ b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/descriptive/handler/MoveDescriptionElementsHandler.java @@ -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 elements = new ArrayList(); + + 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 index 000000000..51ba2b291 --- /dev/null +++ b/taxeditor-editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/descriptive/operation/MoveDescriptionElementsOperation.java @@ -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 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 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; + } + +} diff --git a/taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/featuretree/FeatureNodeTransfer.java b/taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/featuretree/FeatureNodeTransfer.java index 44a5c8e22..8e31c8904 100644 --- a/taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/featuretree/FeatureNodeTransfer.java +++ b/taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/featuretree/FeatureNodeTransfer.java @@ -10,21 +10,11 @@ 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 { 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); - } - - /** - *

toByteArray

- * - * @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; - } - - /** - *

fromByteArray

- * - * @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 featureNodes = new ArrayList(); - - 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); } } diff --git a/taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/model/AbstractUtility.java b/taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/model/AbstractUtility.java index b2cfe084a..78c690bb2 100644 --- a/taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/model/AbstractUtility.java +++ b/taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/model/AbstractUtility.java @@ -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 index 000000000..40d8e197b --- /dev/null +++ b/taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/model/CdmObjectTransfer.java @@ -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 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 elements = new ArrayList(); + + 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()); + } +} -- 2.34.1