Project

General

Profile

Download (6.1 KB) Statistics
| Branch: | Tag: | Revision:
1
/**
2
 *
3
 */
4
package eu.etaxonomy.taxeditor.editor.name.e4.dnd;
5

    
6
import org.eclipse.core.runtime.Assert;
7
import org.eclipse.e4.ui.di.UISynchronize;
8
import org.eclipse.swt.dnd.DND;
9
import org.eclipse.swt.dnd.DropTargetAdapter;
10
import org.eclipse.swt.dnd.DropTargetEvent;
11

    
12
import eu.etaxonomy.cdm.model.common.ICdmBase;
13
import eu.etaxonomy.cdm.model.name.HomotypicalGroup;
14
import eu.etaxonomy.cdm.model.taxon.Synonym;
15
import eu.etaxonomy.cdm.model.taxon.Taxon;
16
import eu.etaxonomy.cdm.model.taxon.TaxonBase;
17
import eu.etaxonomy.cdm.model.taxon.TaxonRelationshipType;
18
import eu.etaxonomy.taxeditor.editor.l10n.Messages;
19
import eu.etaxonomy.taxeditor.editor.name.e4.IDropTargetableE4;
20
import eu.etaxonomy.taxeditor.editor.name.e4.TaxonNameEditorE4;
21
import eu.etaxonomy.taxeditor.editor.name.e4.container.AbstractHomotypicalGroupContainerE4;
22
import eu.etaxonomy.taxeditor.editor.name.e4.container.MisappliedGroupE4;
23
import eu.etaxonomy.taxeditor.editor.name.e4.operation.MoveSynonymToAnotherAcceptedTaxonOperationE4;
24
import eu.etaxonomy.taxeditor.editor.name.operation.ChangeConceptRelationshipTypeOperation;
25
import eu.etaxonomy.taxeditor.editor.name.operation.ChangeConceptToSynonymOperation;
26
import eu.etaxonomy.taxeditor.editor.name.operation.ChangeHomotypicGroupOperation;
27
import eu.etaxonomy.taxeditor.editor.name.operation.ChangeSynonymToMisapplicationOperation;
28
import eu.etaxonomy.taxeditor.event.EventUtility;
29
import eu.etaxonomy.taxeditor.model.AbstractUtility;
30
import eu.etaxonomy.taxeditor.model.MessagingUtils;
31
import eu.etaxonomy.taxeditor.operation.AbstractPostOperation;
32

    
33
/**
34
 *
35
 * @author pplitzner
36
 * @date Aug 24, 2017
37
 *
38
 */
39
public class NameEditorDropTargetListenerE4 extends DropTargetAdapter {
40

    
41
	private IDropTargetableE4 target;
42

    
43
	public NameEditorDropTargetListenerE4(IDropTargetableE4 target){
44
		this.target = target;
45
	}
46

    
47
	/** {@inheritDoc} */
48
	@Override
49
    public void dragEnter(DropTargetEvent dropTargetEvent) {
50
		target.dragEntered();
51
	}
52

    
53
	/** {@inheritDoc} */
54
	@Override
55
    public void dragLeave(DropTargetEvent dropTargetEvent) {
56
		target.dragLeft();
57
	}
58

    
59

    
60
	/** {@inheritDoc} */
61
	@Override
62
    public void drop(DropTargetEvent dropTargetEvent) {
63

    
64
		TaxonBase taxonBase = getDroppedTaxonBase(dropTargetEvent);
65

    
66
		Assert.isNotNull(taxonBase);
67

    
68
		if(taxonBase.getHomotypicGroup().equals(getHomotypicalGroup())){
69
			// do nothing when dragged to the same group
70
			dropTargetEvent.detail = DND.DROP_NONE;
71
			return;
72
		}
73

    
74
		if (target instanceof MisappliedGroupE4){
75
		   dropTargetEvent.detail = DND.DROP_NONE;
76
	       return;
77
		}
78

    
79
		// Execute operations at end of drag event
80
		AbstractPostOperation operation = createOperation(taxonBase);
81

    
82
		// Execute operation if it has been initiated
83
		if (operation == null) {
84
			MessagingUtils.warn(getClass(), String.format(Messages.NameEditorDropTargetListener_UNSUCCESSFULL_DROP, taxonBase.getClass(), target));
85
			dropTargetEvent.detail = DND.DROP_NONE;
86
		} else {
87
			AbstractUtility.executeOperation(operation, target.getContext().get(UISynchronize.class));
88
		}
89
		target.getEditor().getConversationHolder().commit();
90
		if (!target.equals(EventUtility.getTaxonEditor())){
91
			((TaxonNameEditorE4)EventUtility.getTaxonEditor()).redraw();
92
			((TaxonNameEditorE4)EventUtility.getTaxonEditor()).getConversationHolder().commit();
93

    
94
		}
95
		target.getEditor().redraw();
96

    
97
	}
98

    
99
	private AbstractPostOperation createOperation(TaxonBase taxonBase) {
100

    
101
		if(taxonBase instanceof Synonym){
102
			Synonym synonym = (Synonym) taxonBase;
103

    
104
			if(target instanceof AbstractHomotypicalGroupContainerE4){
105
				HomotypicalGroup homotypicalGroup = ((AbstractHomotypicalGroupContainerE4) target).getGroup();
106

    
107
				return new ChangeHomotypicGroupOperation(Messages.NameEditorDropTargetListener_CHANGE_HOMOTYPICAL_GROUP, getEditor().getUndoContext(),
108
						getEditor().getTaxon(), synonym, homotypicalGroup, target);
109
			}
110
			else if(target instanceof MisappliedGroupE4){
111
				return new ChangeSynonymToMisapplicationOperation(Messages.NameEditorDropTargetListener_CHANGE_SYNONYM_TO_MISAPP, getEditor().getUndoContext(),
112
						getEditor().getTaxon(), synonym, target);
113
			}
114
			else if(target instanceof TaxonNameEditorE4){
115
				if (target.equals(getEditor())){
116
					return new ChangeHomotypicGroupOperation(Messages.NameEditorDropTargetListener_CHANGE_HOMOTYPICAL_GROUP, getEditor().getUndoContext(),
117
						getEditor().getTaxon(), synonym, null, target);
118
				} else{
119
					getEditor().getConversationHolder().commit();
120
					((TaxonNameEditorE4) target).getConversationHolder().commit();
121

    
122
					return new MoveSynonymToAnotherAcceptedTaxonOperationE4(Messages.NameEditorDropTargetListener_CHANGE_ACC_TAXON, getEditor().getUndoContext(), synonym.getUuid(), ((TaxonNameEditorE4) target).getTaxon(), (TaxonNameEditorE4) target, (TaxonNameEditorE4) target);
123

    
124
				}
125
			}
126

    
127
		}else if(taxonBase instanceof Taxon){
128
			Taxon concept = (Taxon) taxonBase;
129

    
130
			if(target instanceof AbstractHomotypicalGroupContainerE4){
131
				HomotypicalGroup homotypicalGroup = ((AbstractHomotypicalGroupContainerE4) target).getGroup();
132

    
133
				return new ChangeConceptToSynonymOperation(Messages.NameEditorDropTargetListener_CHANGE_SYNONYM, getEditor().getUndoContext(),
134
						getEditor().getTaxon(), concept, homotypicalGroup, target);
135
			}
136
			else if(target instanceof MisappliedGroupE4){
137
				return new ChangeConceptRelationshipTypeOperation(Messages.NameEditorDropTargetListener_CHANGE, getEditor().getUndoContext(),
138
						getEditor().getTaxon(), concept, TaxonRelationshipType.MISAPPLIED_NAME_FOR(), target);
139
			}
140
		}
141

    
142

    
143
		return null;
144
	}
145

    
146
	/** {@inheritDoc} */
147
	@Override
148
	public void dropAccept(DropTargetEvent event) {
149
		// pass
150
	}
151

    
152

    
153
	private HomotypicalGroup getHomotypicalGroup() {
154
		if(target instanceof AbstractHomotypicalGroupContainerE4){
155
			return ((AbstractHomotypicalGroupContainerE4) target).getGroup();
156
		}
157
		return null;
158
	}
159

    
160
	private TaxonBase getDroppedTaxonBase(DropTargetEvent dropTargetEvent){
161
		if(dropTargetEvent.data instanceof ICdmBase[]){
162

    
163
			ICdmBase[] cdmBaseObjects = (ICdmBase[]) dropTargetEvent.data;
164

    
165
			if(cdmBaseObjects[0] instanceof TaxonBase){
166
				return (TaxonBase) cdmBaseObjects[0];
167
			}
168
		}
169
		return null;
170
	}
171

    
172
	private TaxonNameEditorE4 getEditor() {
173
		return (TaxonNameEditorE4) EventUtility.getTaxonEditor();
174
	}
175
}
(4-4/4)