Project

General

Profile

Download (6 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
	/** {@inheritDoc} */
60
	@Override
61
    public void drop(DropTargetEvent dropTargetEvent) {
62

    
63
		TaxonBase taxonBase = getDroppedTaxonBase(dropTargetEvent);
64

    
65
		Assert.isNotNull(taxonBase);
66

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

    
73
		// Execute operations at end of drag event
74
		AbstractPostOperation operation = createOperation(taxonBase);
75

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

    
88
		}
89
		target.getEditor().redraw();
90

    
91
	}
92

    
93
	private AbstractPostOperation createOperation(TaxonBase taxonBase) {
94

    
95
		if(taxonBase instanceof Synonym){
96
			Synonym synonym = (Synonym) taxonBase;
97

    
98
			if(target instanceof AbstractHomotypicalGroupContainerE4){
99
				HomotypicalGroup homotypicalGroup = ((AbstractHomotypicalGroupContainerE4) target).getGroup();
100

    
101
				return new ChangeHomotypicGroupOperation(Messages.NameEditorDropTargetListener_CHANGE_HOMOTYPICAL_GROUP, getEditor().getUndoContext(),
102
						getEditor().getTaxon(), synonym, homotypicalGroup, target);
103
			}
104
			else if(target instanceof MisappliedGroupE4){
105
				return new ChangeSynonymToMisapplicationOperation(Messages.NameEditorDropTargetListener_CHANGE_SYNONYM_TO_MISAPP, getEditor().getUndoContext(),
106
						getEditor().getTaxon(), synonym, target);
107
			}
108
			else if(target instanceof TaxonNameEditorE4){
109
				if (target.equals(getEditor())){
110
					return new ChangeHomotypicGroupOperation(Messages.NameEditorDropTargetListener_CHANGE_HOMOTYPICAL_GROUP, getEditor().getUndoContext(),
111
						getEditor().getTaxon(), synonym, null, target);
112
				} else{
113
					getEditor().getConversationHolder().commit();
114
					((TaxonNameEditorE4) target).getConversationHolder().commit();
115

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

    
118
				}
119
			}
120

    
121
		}else if(taxonBase instanceof Taxon){
122
			Taxon concept = (Taxon) taxonBase;
123

    
124
			if(target instanceof AbstractHomotypicalGroupContainerE4){
125
				HomotypicalGroup homotypicalGroup = ((AbstractHomotypicalGroupContainerE4) target).getGroup();
126

    
127
				return new ChangeConceptToSynonymOperation(Messages.NameEditorDropTargetListener_CHANGE_SYNONYM, getEditor().getUndoContext(),
128
						getEditor().getTaxon(), concept, homotypicalGroup, target);
129
			}
130
			else if(target instanceof MisappliedGroupE4){
131
				return new ChangeConceptRelationshipTypeOperation(Messages.NameEditorDropTargetListener_CHANGE, getEditor().getUndoContext(),
132
						getEditor().getTaxon(), concept, TaxonRelationshipType.MISAPPLIED_NAME_FOR(), target);
133
			}
134
		}
135

    
136

    
137
		return null;
138
	}
139

    
140
	/** {@inheritDoc} */
141
	@Override
142
	public void dropAccept(DropTargetEvent event) {
143
		// pass
144
	}
145

    
146

    
147
	private HomotypicalGroup getHomotypicalGroup() {
148
		if(target instanceof AbstractHomotypicalGroupContainerE4){
149
			return ((AbstractHomotypicalGroupContainerE4) target).getGroup();
150
		}
151
		return null;
152
	}
153

    
154
	private TaxonBase getDroppedTaxonBase(DropTargetEvent dropTargetEvent){
155
		if(dropTargetEvent.data instanceof ICdmBase[]){
156

    
157
			ICdmBase[] cdmBaseObjects = (ICdmBase[]) dropTargetEvent.data;
158

    
159
			if(cdmBaseObjects[0] instanceof TaxonBase){
160
				return (TaxonBase) cdmBaseObjects[0];
161
			}
162
		}
163
		return null;
164
	}
165

    
166
	private TaxonNameEditorE4 getEditor() {
167
		return (TaxonNameEditorE4) EventUtility.getTaxonEditor();
168
	}
169
}
(4-4/4)