ref #8774: fix drag & drop in character editor
[taxeditor.git] / eu.etaxonomy.taxeditor.store / src / main / java / eu / etaxonomy / taxeditor / featuretree / FeatureNodeTransfer.java
index cacd6e2de9c12f300a5ff6cb0f707c99e056c148..08853abf3efc0e804cd0b15e4a52f7126da6a68f 100644 (file)
@@ -1,20 +1,32 @@
 /**
  * Copyright (C) 2007 EDIT
- * European Distributed Institute of Taxonomy 
+ * 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.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.SWTException;
+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.Feature;
 import eu.etaxonomy.cdm.model.term.TermNode;
-import eu.etaxonomy.taxeditor.model.CdmObjectTransfer;
+import eu.etaxonomy.taxeditor.model.MessagingUtils;
 import eu.etaxonomy.taxeditor.store.CdmStore;
 
 /**
@@ -23,7 +35,7 @@ import eu.etaxonomy.taxeditor.store.CdmStore;
  * @author n.hoffmann
  * @created Aug 5, 2010
  */
-public class FeatureNodeTransfer extends CdmObjectTransfer<TermNode<Feature>> {
+public class FeatureNodeTransfer extends ByteArrayTransfer {
 
        private static FeatureNodeTransfer instance = new FeatureNodeTransfer();
        private static final String TYPE_NAME = "featureNode-transfer-format";
@@ -52,9 +64,86 @@ public class FeatureNodeTransfer extends CdmObjectTransfer<TermNode<Feature>> {
        protected String[] getTypeNames() {
                return new String[] { TYPE_NAME };
        }
-
        @Override
-       public TermNode<Feature> loadElement(UUID uuid) {
-               return  CdmStore.getService(IFeatureNodeService.class).load(uuid);
-       }
+    protected void javaToNative(Object object, TransferData transferData) {
+        if (object != null){
+            byte[] bytes = toByteArray((TermNode[]) object);
+            if (bytes != null) {
+                super.javaToNative(bytes, transferData);
+            }
+        }
+    }
+
+    @Override
+    protected Object nativeToJava(TransferData transferData) {
+        try{
+            byte[] bytes = (byte[]) super.nativeToJava(transferData);
+            if (bytes != null){
+                return fromByteArray(bytes);
+            }
+        }catch (SWTException e){
+            MessagingUtils.warningDialog("The new imported node needs to be saved first", this, "Newly created nodes can not be moved without saving");
+        }
+
+        return null;
+    }
+
+
+    protected byte[] toByteArray(TermNode[] elements) {
+        ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
+        DataOutputStream out = new DataOutputStream(byteOut);
+
+        byte[] bytes = null;
+
+        try {
+            for(TermNode element : elements){
+                if (element.getUuid() == null){
+                //                    MessagingUtils.warningDialog("The new imported node needs to be saved first", this, "Newly created nodes can not be moved without saving");
+
+                }else{
+                    writeElementUuid(element, out);
+                }
+            }
+            out.close();
+            bytes = byteOut.toByteArray();
+        } catch (IOException e) {
+
+            // when in doubt send nothing
+        }
+        return bytes;
+    }
+
+    protected Object[] fromByteArray(byte[] bytes) {
+        DataInputStream in = new DataInputStream(
+                new ByteArrayInputStream(bytes));
+
+        try {
+            List<TermNode> elements = new ArrayList<TermNode>();
+
+            try{
+                while(true){
+                    UUID uuid = readElementUuid(in);
+                    elements.add(loadElement(uuid));
+                }
+            }catch(EOFException e){
+                return  elements.toArray();
+            }
+        } catch (IOException e) {
+            return null;
+        }
+    }
+
+    public TermNode loadElement(UUID uuid){
+        TermNode<Feature> node = CdmStore.getService(IFeatureNodeService.class).load(uuid);
+        return node;
+    }
+
+    public UUID readElementUuid(DataInputStream in) throws IOException{
+        return UUID.fromString(in.readUTF());
+    }
+
+    private void writeElementUuid(Object element, DataOutputStream out) throws IOException {
+        out.writeUTF(((TermNode)element).getUuid().toString());
+    }
+
 }