Project

General

Profile

« Previous | Next » 

Revision 5790f731

Added by Katja Luther over 3 years ago

ref #8774: fix drag & drop in character editor

View differences:

eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/featuretree/CharacterNodeDtoTransfer.java
1
/**
2
* Copyright (C) 2020 EDIT
3
* European Distributed Institute of Taxonomy
4
* http://www.e-taxonomy.eu
5
*
6
* The contents of this file are subject to the Mozilla Public License Version 1.1
7
* See LICENSE.TXT at the top of this package for the full license terms.
8
*/
9
package eu.etaxonomy.taxeditor.featuretree;
10

  
11
import java.io.ByteArrayInputStream;
12
import java.io.ByteArrayOutputStream;
13
import java.io.DataInputStream;
14
import java.io.DataOutputStream;
15
import java.io.EOFException;
16
import java.io.IOException;
17
import java.util.ArrayList;
18
import java.util.List;
19
import java.util.UUID;
20

  
21
import org.eclipse.swt.SWTException;
22
import org.eclipse.swt.dnd.ByteArrayTransfer;
23
import org.eclipse.swt.dnd.TransferData;
24

  
25
import eu.etaxonomy.cdm.api.service.ITermNodeService;
26
import eu.etaxonomy.cdm.model.term.TermNode;
27
import eu.etaxonomy.cdm.persistence.dto.CharacterNodeDto;
28
import eu.etaxonomy.cdm.persistence.dto.TermNodeDto;
29
import eu.etaxonomy.taxeditor.model.MessagingUtils;
30
import eu.etaxonomy.taxeditor.store.CdmStore;
31

  
32
/**
33
 * @author k.luther
34
 * @since Oct 13, 2020
35
 */
36
public class CharacterNodeDtoTransfer extends ByteArrayTransfer {
37

  
38
    private static CharacterNodeDtoTransfer instance = new CharacterNodeDtoTransfer();
39
    private static final String TYPE_NAME = "featureNodeDto-transfer-format";
40
    private static final int TYPEID = registerType(TYPE_NAME);
41

  
42
    /**
43
     * <p>Getter for the field <code>instance</code>.</p>
44
     *
45
     * @return a {@link eu.etaxonomy.taxeditor.featuretree.FeatureNodeTransfer} object.
46
     */
47
    public static synchronized CharacterNodeDtoTransfer getInstance() {
48
        return instance;
49
    }
50

  
51
    private CharacterNodeDtoTransfer() {
52
    }
53

  
54
    /** {@inheritDoc} */
55
    @Override
56
    protected int[] getTypeIds() {
57
        return new int[] { TYPEID };
58
    }
59

  
60
    /** {@inheritDoc} */
61
    @Override
62
    protected String[] getTypeNames() {
63
        return new String[] { TYPE_NAME };
64
    }
65
    @Override
66
    protected void javaToNative(Object object, TransferData transferData) {
67
        if (object != null){
68
            byte[] bytes = toByteArray((TermNodeDto[]) object);
69
            if (bytes != null) {
70
                super.javaToNative(bytes, transferData);
71
            }
72
        }
73
    }
74

  
75
    @Override
76
    protected Object nativeToJava(TransferData transferData) {
77
        try{
78
            byte[] bytes = (byte[]) super.nativeToJava(transferData);
79
            if (bytes != null){
80
                return fromByteArray(bytes);
81
            }
82
        }catch (SWTException e){
83
            MessagingUtils.warningDialog("The new imported node needs to be saved first", this, "Newly created nodes can not be moved without saving");
84
        }
85

  
86
        return null;
87
    }
88

  
89

  
90
    protected byte[] toByteArray(TermNodeDto[] elements) {
91
        ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
92
        DataOutputStream out = new DataOutputStream(byteOut);
93

  
94
        byte[] bytes = null;
95

  
96
        try {
97
            for(TermNodeDto element : elements){
98
                if (element.getUuid() == null){
99
                //  MessagingUtils.warningDialog("The new imported node needs to be saved first", this, "Newly created nodes can not be moved without saving");
100

  
101
                }else{
102
                    writeElementUuid(element, out);
103
                }
104
            }
105
            out.close();
106
            bytes = byteOut.toByteArray();
107
        } catch (IOException e) {
108

  
109
            // when in doubt send nothing
110
        }
111
        return bytes;
112
    }
113

  
114
    protected Object[] fromByteArray(byte[] bytes) {
115
        DataInputStream in = new DataInputStream(
116
                new ByteArrayInputStream(bytes));
117

  
118
        try {
119
            List<CharacterNodeDto> elements = new ArrayList<CharacterNodeDto>();
120

  
121
            try{
122
                while(true){
123
                    UUID uuid = readElementUuid(in);
124
                    elements.add(loadElement(uuid));
125
                }
126
            }catch(EOFException e){
127
                return  elements.toArray();
128
            }
129
        } catch (IOException e) {
130
            return null;
131
        }
132
    }
133

  
134
    public CharacterNodeDto loadElement(UUID uuid){
135
        TermNode node = CdmStore.getService(ITermNodeService.class).load(uuid);
136
        return CharacterNodeDto.fromTermNode(node);
137
    }
138

  
139
    public UUID readElementUuid(DataInputStream in) throws IOException{
140
        return UUID.fromString(in.readUTF());
141
    }
142

  
143
    private void writeElementUuid(TermNodeDto element, DataOutputStream out) throws IOException {
144
        out.writeUTF(element.getUuid().toString());
145
    }
146

  
147

  
148
}
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/featuretree/e4/FeatureTreeDtoEditorComposite.java
38 38
import eu.etaxonomy.cdm.persistence.dto.TermNodeDto;
39 39
import eu.etaxonomy.cdm.persistence.dto.TermTreeDto;
40 40
import eu.etaxonomy.taxeditor.editor.definedterm.TermTransfer;
41
import eu.etaxonomy.taxeditor.featuretree.FeatureNodeDtoTransfer;
41
import eu.etaxonomy.taxeditor.featuretree.CharacterNodeDtoTransfer;
42 42
import eu.etaxonomy.taxeditor.featuretree.FeatureTreeContentProvider;
43 43
import eu.etaxonomy.taxeditor.featuretree.FeatureTreeLabelProvider;
44 44
import eu.etaxonomy.taxeditor.l10n.Messages;
......
162 162
        int ops = DND.DROP_COPY | DND.DROP_MOVE;
163 163
        if(transfers==null){
164 164
        transfers = new Transfer[] {
165
                FeatureNodeDtoTransfer.getInstance(),
165
                CharacterNodeDtoTransfer.getInstance(),
166 166
                TermTransfer.getInstance(),
167 167
                };
168 168
        }
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/section/feature/CharacterNodeDtoDetailElement.java
12 12

  
13 13
import eu.etaxonomy.cdm.model.description.Character;
14 14
import eu.etaxonomy.cdm.persistence.dto.CharacterDto;
15
import eu.etaxonomy.cdm.persistence.dto.CharacterNodeDto;
15
import eu.etaxonomy.cdm.persistence.dto.TermNodeDto;
16 16
import eu.etaxonomy.taxeditor.editor.definedterm.TermBasePropertyTester;
17 17
import eu.etaxonomy.taxeditor.event.EventUtility;
18 18
import eu.etaxonomy.taxeditor.event.WorkbenchEventConstants;
......
28 28
 * @since Aug 19, 2019
29 29
 *
30 30
 */
31
public class CharacterNodeDtoDetailElement extends AbstractCdmDetailElement<CharacterNodeDto> {
31
public class CharacterNodeDtoDetailElement extends AbstractCdmDetailElement<TermNodeDto> {
32 32
    private CharacterDtoDetailSection characterDetails;
33 33

  
34 34
    private ICdmFormElement parentFormElement;
......
58 58
	}
59 59

  
60 60
	@Override
61
	protected void createControls(ICdmFormElement formElement, CharacterNodeDto entity, int style) {
61
	protected void createControls(ICdmFormElement formElement, TermNodeDto entity, int style) {
62 62
	    this.parentFormElement = formElement;
63 63
//	    characterDetails = formFactory.createCharacterDetailElement(formElement, style);
64 64
	    characterDetails = formFactory.createCharacterDtoDetailSection(getConversationHolder(), formElement, null, StoreUtil.getSectionStyle(CharacterDetailSection.class, entity.getClass().getCanonicalName(), true));
......
122 122
    }
123 123

  
124 124
    @Override
125
    public void setEntity(CharacterNodeDto entity) {
125
    public void setEntity(TermNodeDto entity) {
126 126
        super.setEntity(entity);
127 127
        characterDetails.setEntity((CharacterDto)entity.getTerm());
128 128
        setEnabled(TermBasePropertyTester.isModifiable(entity));
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/section/feature/CharacterNodeDtoDetailSection.java
11 11
import org.eclipse.jface.viewers.ISelectionProvider;
12 12

  
13 13
import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
14
import eu.etaxonomy.cdm.persistence.dto.CharacterNodeDto;
14
import eu.etaxonomy.cdm.persistence.dto.TermNodeDto;
15 15
import eu.etaxonomy.taxeditor.ui.element.CdmFormFactory;
16 16
import eu.etaxonomy.taxeditor.ui.element.ICdmFormElement;
17 17
import eu.etaxonomy.taxeditor.ui.section.AbstractCdmDetailElement;
......
22 22
 * @since Aug 19, 2019
23 23
 *
24 24
 */
25
public class CharacterNodeDtoDetailSection extends AbstractCdmDetailSection<CharacterNodeDto> {
25
public class CharacterNodeDtoDetailSection extends AbstractCdmDetailSection<TermNodeDto> {
26 26

  
27 27
	public CharacterNodeDtoDetailSection(CdmFormFactory formFactory,
28 28
	        ConversationHolder conversation, ICdmFormElement parentElement,
......
39 39
     * {@inheritDoc}
40 40
     */
41 41
    @Override
42
    protected AbstractCdmDetailElement<CharacterNodeDto> createCdmDetailElement(AbstractCdmDetailSection<CharacterNodeDto> parentElement,
42
    protected AbstractCdmDetailElement<TermNodeDto> createCdmDetailElement(AbstractCdmDetailSection<TermNodeDto> parentElement,
43 43
            int style) {
44 44
        return formFactory.createCharacterNodeDtoDetailElement(parentElement, style);
45 45
    }

Also available in: Unified diff