ref #8774: fix drag & drop in character editor
authorKatja Luther <k.luther@bgbm.org>
Tue, 3 Nov 2020 09:24:10 +0000 (10:24 +0100)
committerKatja Luther <k.luther@bgbm.org>
Tue, 3 Nov 2020 09:24:10 +0000 (10:24 +0100)
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/featuretree/CharacterNodeDtoTransfer.java [new file with mode: 0755]
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/featuretree/e4/FeatureTreeDtoEditorComposite.java
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/section/feature/CharacterNodeDtoDetailElement.java
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/section/feature/CharacterNodeDtoDetailSection.java

diff --git a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/featuretree/CharacterNodeDtoTransfer.java b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/featuretree/CharacterNodeDtoTransfer.java
new file mode 100755 (executable)
index 0000000..1fefa49
--- /dev/null
@@ -0,0 +1,148 @@
+/**
+* Copyright (C) 2020 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.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.ITermNodeService;
+import eu.etaxonomy.cdm.model.term.TermNode;
+import eu.etaxonomy.cdm.persistence.dto.CharacterNodeDto;
+import eu.etaxonomy.cdm.persistence.dto.TermNodeDto;
+import eu.etaxonomy.taxeditor.model.MessagingUtils;
+import eu.etaxonomy.taxeditor.store.CdmStore;
+
+/**
+ * @author k.luther
+ * @since Oct 13, 2020
+ */
+public class CharacterNodeDtoTransfer extends ByteArrayTransfer {
+
+    private static CharacterNodeDtoTransfer instance = new CharacterNodeDtoTransfer();
+    private static final String TYPE_NAME = "featureNodeDto-transfer-format";
+    private static final int TYPEID = registerType(TYPE_NAME);
+
+    /**
+     * <p>Getter for the field <code>instance</code>.</p>
+     *
+     * @return a {@link eu.etaxonomy.taxeditor.featuretree.FeatureNodeTransfer} object.
+     */
+    public static synchronized CharacterNodeDtoTransfer getInstance() {
+        return instance;
+    }
+
+    private CharacterNodeDtoTransfer() {
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    protected int[] getTypeIds() {
+        return new int[] { TYPEID };
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    protected String[] getTypeNames() {
+        return new String[] { TYPE_NAME };
+    }
+    @Override
+    protected void javaToNative(Object object, TransferData transferData) {
+        if (object != null){
+            byte[] bytes = toByteArray((TermNodeDto[]) 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(TermNodeDto[] elements) {
+        ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
+        DataOutputStream out = new DataOutputStream(byteOut);
+
+        byte[] bytes = null;
+
+        try {
+            for(TermNodeDto 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<CharacterNodeDto> elements = new ArrayList<CharacterNodeDto>();
+
+            try{
+                while(true){
+                    UUID uuid = readElementUuid(in);
+                    elements.add(loadElement(uuid));
+                }
+            }catch(EOFException e){
+                return  elements.toArray();
+            }
+        } catch (IOException e) {
+            return null;
+        }
+    }
+
+    public CharacterNodeDto loadElement(UUID uuid){
+        TermNode node = CdmStore.getService(ITermNodeService.class).load(uuid);
+        return CharacterNodeDto.fromTermNode(node);
+    }
+
+    public UUID readElementUuid(DataInputStream in) throws IOException{
+        return UUID.fromString(in.readUTF());
+    }
+
+    private void writeElementUuid(TermNodeDto element, DataOutputStream out) throws IOException {
+        out.writeUTF(element.getUuid().toString());
+    }
+
+
+}
index 704a93e9a7d6dacdc1bae26f319cdb122312125c..f2bc518f9de15a4c985575a432eafd8fe0e320b4 100755 (executable)
@@ -38,7 +38,7 @@ import eu.etaxonomy.cdm.model.term.TermType;
 import eu.etaxonomy.cdm.persistence.dto.TermNodeDto;
 import eu.etaxonomy.cdm.persistence.dto.TermTreeDto;
 import eu.etaxonomy.taxeditor.editor.definedterm.TermTransfer;
-import eu.etaxonomy.taxeditor.featuretree.FeatureNodeDtoTransfer;
+import eu.etaxonomy.taxeditor.featuretree.CharacterNodeDtoTransfer;
 import eu.etaxonomy.taxeditor.featuretree.FeatureTreeContentProvider;
 import eu.etaxonomy.taxeditor.featuretree.FeatureTreeLabelProvider;
 import eu.etaxonomy.taxeditor.l10n.Messages;
@@ -162,7 +162,7 @@ public class FeatureTreeDtoEditorComposite <T extends DefinedTermBase> extends C
         int ops = DND.DROP_COPY | DND.DROP_MOVE;
         if(transfers==null){
         transfers = new Transfer[] {
-                FeatureNodeDtoTransfer.getInstance(),
+                CharacterNodeDtoTransfer.getInstance(),
                 TermTransfer.getInstance(),
                 };
         }
index 122328858a313504b8cb3cf15513673421bb6850..bbb6b7262b7ddb6dd88d06d86359b7648aa53b85 100755 (executable)
@@ -12,7 +12,7 @@ import org.eclipse.jface.util.PropertyChangeEvent;
 
 import eu.etaxonomy.cdm.model.description.Character;
 import eu.etaxonomy.cdm.persistence.dto.CharacterDto;
-import eu.etaxonomy.cdm.persistence.dto.CharacterNodeDto;
+import eu.etaxonomy.cdm.persistence.dto.TermNodeDto;
 import eu.etaxonomy.taxeditor.editor.definedterm.TermBasePropertyTester;
 import eu.etaxonomy.taxeditor.event.EventUtility;
 import eu.etaxonomy.taxeditor.event.WorkbenchEventConstants;
@@ -28,7 +28,7 @@ import eu.etaxonomy.taxeditor.ui.section.AbstractCdmDetailElement;
  * @since Aug 19, 2019
  *
  */
-public class CharacterNodeDtoDetailElement extends AbstractCdmDetailElement<CharacterNodeDto> {
+public class CharacterNodeDtoDetailElement extends AbstractCdmDetailElement<TermNodeDto> {
     private CharacterDtoDetailSection characterDetails;
 
     private ICdmFormElement parentFormElement;
@@ -58,7 +58,7 @@ public class CharacterNodeDtoDetailElement extends AbstractCdmDetailElement<Char
        }
 
        @Override
-       protected void createControls(ICdmFormElement formElement, CharacterNodeDto entity, int style) {
+       protected void createControls(ICdmFormElement formElement, TermNodeDto entity, int style) {
            this.parentFormElement = formElement;
 //         characterDetails = formFactory.createCharacterDetailElement(formElement, style);
            characterDetails = formFactory.createCharacterDtoDetailSection(getConversationHolder(), formElement, null, StoreUtil.getSectionStyle(CharacterDetailSection.class, entity.getClass().getCanonicalName(), true));
@@ -122,7 +122,7 @@ public class CharacterNodeDtoDetailElement extends AbstractCdmDetailElement<Char
     }
 
     @Override
-    public void setEntity(CharacterNodeDto entity) {
+    public void setEntity(TermNodeDto entity) {
         super.setEntity(entity);
         characterDetails.setEntity((CharacterDto)entity.getTerm());
         setEnabled(TermBasePropertyTester.isModifiable(entity));
index 7524580dffda900a7c31f2ca1c99af22fda2960b..2888d79bf21868c9c376005adcc365f92ef19aae 100755 (executable)
@@ -11,7 +11,7 @@ package eu.etaxonomy.taxeditor.ui.section.feature;
 import org.eclipse.jface.viewers.ISelectionProvider;
 
 import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
-import eu.etaxonomy.cdm.persistence.dto.CharacterNodeDto;
+import eu.etaxonomy.cdm.persistence.dto.TermNodeDto;
 import eu.etaxonomy.taxeditor.ui.element.CdmFormFactory;
 import eu.etaxonomy.taxeditor.ui.element.ICdmFormElement;
 import eu.etaxonomy.taxeditor.ui.section.AbstractCdmDetailElement;
@@ -22,7 +22,7 @@ import eu.etaxonomy.taxeditor.ui.section.AbstractCdmDetailSection;
  * @since Aug 19, 2019
  *
  */
-public class CharacterNodeDtoDetailSection extends AbstractCdmDetailSection<CharacterNodeDto> {
+public class CharacterNodeDtoDetailSection extends AbstractCdmDetailSection<TermNodeDto> {
 
        public CharacterNodeDtoDetailSection(CdmFormFactory formFactory,
                ConversationHolder conversation, ICdmFormElement parentElement,
@@ -39,7 +39,7 @@ public class CharacterNodeDtoDetailSection extends AbstractCdmDetailSection<Char
      * {@inheritDoc}
      */
     @Override
-    protected AbstractCdmDetailElement<CharacterNodeDto> createCdmDetailElement(AbstractCdmDetailSection<CharacterNodeDto> parentElement,
+    protected AbstractCdmDetailElement<TermNodeDto> createCdmDetailElement(AbstractCdmDetailSection<TermNodeDto> parentElement,
             int style) {
         return formFactory.createCharacterNodeDtoDetailElement(parentElement, style);
     }