Project

General

Profile

Download (5.91 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.swt.dnd.DND;
8
import org.eclipse.swt.dnd.DropTargetAdapter;
9
import org.eclipse.swt.dnd.DropTargetEvent;
10

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

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

    
40
	private IDropTargetableE4 target;
41

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

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

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

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

    
62
		TaxonBase taxonBase = getDroppedTaxonBase(dropTargetEvent);
63

    
64
		Assert.isNotNull(taxonBase);
65

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

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

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

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

    
90
	}
91

    
92
	private AbstractPostOperation createOperation(TaxonBase taxonBase) {
93

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

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

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

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

    
117
				}
118
			}
119

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

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

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

    
135

    
136
		return null;
137
	}
138

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

    
145

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

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

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

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

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