Project

General

Profile

Download (6.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
 * @author pplitzner
35
 * @date Aug 24, 2017
36
 */
37
public class NameEditorDropTargetListenerE4 extends DropTargetAdapter {
38

    
39
	private IDropTargetableE4 target;
40

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

    
45
	@Override
46
    public void dragEnter(DropTargetEvent dropTargetEvent) {
47
		target.dragEntered();
48
	}
49

    
50
	@Override
51
    public void dragLeave(DropTargetEvent dropTargetEvent) {
52
		target.dragLeft();
53
	}
54

    
55
	@Override
56
    public void drop(DropTargetEvent dropTargetEvent) {
57

    
58
		TaxonBase<?> taxonBase = getDroppedTaxonBase(dropTargetEvent);
59

    
60
		Assert.isNotNull(taxonBase);
61

    
62
		if(taxonBase.getHomotypicGroup().equals(getHomotypicalGroup())){
63
			// do nothing when dragged to the same group
64
			dropTargetEvent.detail = DND.DROP_NONE;
65
			return;
66
		}
67

    
68
		if (target instanceof MisappliedGroupE4){
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

    
84
	}
85

    
86
	private AbstractPostOperation createOperation(TaxonBase taxonBase) {
87

    
88
		if(taxonBase instanceof Synonym){
89
			Synonym synonym = (Synonym) taxonBase;
90

    
91
			if(target instanceof AbstractHomotypicalGroupContainerE4){
92
				HomotypicalGroup homotypicalGroup = ((AbstractHomotypicalGroupContainerE4) target).getGroup();
93
				if (((AbstractHomotypicalGroupContainerE4) target).getEditor().getTaxon().equals(synonym.getAcceptedTaxon())){
94
				    //the actual accepted taxon is the same as the taxon of the target editor
95
				    try{
96
				        return new ChangeHomotypicGroupOperation(Messages.NameEditorDropTargetListener_CHANGE_HOMOTYPICAL_GROUP, getEditor().getUndoContext(),
97
				    				            ((AbstractHomotypicalGroupContainerE4) target).getEditor().getTaxon(), synonym, homotypicalGroup, target);
98
				    }catch (NullPointerException e){
99
				        return null;
100
				    }
101
				 } else{
102
                    getEditor().getConversationHolder().commit();
103
                    ((TaxonNameEditorE4) target).getConversationHolder().commit();
104

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

    
107
                }
108

    
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 (((TaxonNameEditorE4) target).getTaxon().equals(synonym.getAcceptedTaxon())){
116
					return new ChangeHomotypicGroupOperation(Messages.NameEditorDropTargetListener_CHANGE_HOMOTYPICAL_GROUP, getEditor().getUndoContext(),
117
					        ((TaxonNameEditorE4) target).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
	@Override
147
	public void dropAccept(DropTargetEvent event) {
148
		// pass
149
	}
150

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

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

    
161
			ICdmBase[] cdmBaseObjects = (ICdmBase[]) dropTargetEvent.data;
162

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

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