Project

General

Profile

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

    
6
import java.util.UUID;
7

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

    
14
import eu.etaxonomy.cdm.model.common.ICdmBase;
15
import eu.etaxonomy.cdm.model.metadata.SecReferenceHandlingEnum;
16
import eu.etaxonomy.cdm.model.name.HomotypicalGroup;
17
import eu.etaxonomy.cdm.model.reference.Reference;
18
import eu.etaxonomy.cdm.model.taxon.Synonym;
19
import eu.etaxonomy.cdm.model.taxon.Taxon;
20
import eu.etaxonomy.cdm.model.taxon.TaxonBase;
21
import eu.etaxonomy.cdm.model.taxon.TaxonRelationshipType;
22
import eu.etaxonomy.taxeditor.editor.l10n.Messages;
23
import eu.etaxonomy.taxeditor.editor.name.e4.IDropTargetableE4;
24
import eu.etaxonomy.taxeditor.editor.name.e4.TaxonNameEditorE4;
25
import eu.etaxonomy.taxeditor.editor.name.e4.container.AbstractHomotypicalGroupContainerE4;
26
import eu.etaxonomy.taxeditor.editor.name.e4.container.MisappliedGroupE4;
27
import eu.etaxonomy.taxeditor.editor.name.e4.operation.MoveSynonymToAnotherAcceptedTaxonOperationE4;
28
import eu.etaxonomy.taxeditor.editor.name.operation.ChangeConceptRelationshipTypeOperation;
29
import eu.etaxonomy.taxeditor.editor.name.operation.ChangeConceptToSynonymOperation;
30
import eu.etaxonomy.taxeditor.editor.name.operation.ChangeHomotypicGroupOperation;
31
import eu.etaxonomy.taxeditor.editor.name.operation.ChangeSynonymToMisapplicationOperation;
32
import eu.etaxonomy.taxeditor.event.EventUtility;
33
import eu.etaxonomy.taxeditor.model.AbstractUtility;
34
import eu.etaxonomy.taxeditor.model.MessagingUtils;
35
import eu.etaxonomy.taxeditor.operation.AbstractPostOperation;
36
import eu.etaxonomy.taxeditor.preference.PreferencesUtil;
37
import eu.etaxonomy.taxeditor.ui.dialog.selection.ReferenceSelectionDialog;
38

    
39
/**
40
 * @author pplitzner
41
 * @date Aug 24, 2017
42
 */
43
public class NameEditorDropTargetListenerE4 extends DropTargetAdapter {
44

    
45
	private IDropTargetableE4 target;
46

    
47
	public NameEditorDropTargetListenerE4(IDropTargetableE4 target){
48
		this.target = target;
49
	}
50

    
51
	@Override
52
    public void dragEnter(DropTargetEvent dropTargetEvent) {
53
		target.dragEntered();
54
	}
55

    
56
	@Override
57
    public void dragLeave(DropTargetEvent dropTargetEvent) {
58
		target.dragLeft();
59
	}
60

    
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

    
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
				if (((AbstractHomotypicalGroupContainerE4) target).getEditor().getTaxon().equals(synonym.getAcceptedTaxon())){
100
				    //the actual accepted taxon is the same as the taxon of the target editor
101
				    try{
102
				        return new ChangeHomotypicGroupOperation(Messages.NameEditorDropTargetListener_CHANGE_HOMOTYPICAL_GROUP, getEditor().getUndoContext(),
103
				    				            ((AbstractHomotypicalGroupContainerE4) target).getEditor().getTaxon(), synonym, homotypicalGroup, target);
104
				    }catch (NullPointerException e){
105
				        return null;
106
				    }
107
				 } else{
108
                    getEditor().getConversationHolder().commit();
109
                    ((TaxonNameEditorE4) target).getConversationHolder().commit();
110
                    UUID newSecUuid = null;
111
                    try{
112
                        newSecUuid = getNewSecRef(synonym);
113
                    }catch (Exception e){
114
                        return null;
115
                    }
116
                    return new MoveSynonymToAnotherAcceptedTaxonOperationE4(Messages.NameEditorDropTargetListener_CHANGE_ACC_TAXON, getEditor().getUndoContext(), synonym.getUuid(), ((TaxonNameEditorE4) target).getTaxon(), newSecUuid, (TaxonNameEditorE4) target, (TaxonNameEditorE4) target);
117

    
118
                }
119

    
120
			}
121
			else if(target instanceof MisappliedGroupE4){
122
				return new ChangeSynonymToMisapplicationOperation(Messages.NameEditorDropTargetListener_CHANGE_SYNONYM_TO_MISAPP, getEditor().getUndoContext(),
123
						getEditor().getTaxon(), synonym, target);
124
			}
125
			else if(target instanceof TaxonNameEditorE4){
126
				if (((TaxonNameEditorE4) target).getTaxon().equals(synonym.getAcceptedTaxon())){
127
					return new ChangeHomotypicGroupOperation(Messages.NameEditorDropTargetListener_CHANGE_HOMOTYPICAL_GROUP, getEditor().getUndoContext(),
128
					        ((TaxonNameEditorE4) target).getTaxon(), synonym, null, target);
129
				} else{
130
					getEditor().getConversationHolder().commit();
131
					((TaxonNameEditorE4) target).getConversationHolder().commit();
132
					UUID newSecUuid = null;
133
					try{
134
					    newSecUuid = getNewSecRef(synonym);
135
					}catch (Exception e){
136
					    return null;
137
					}
138
					return new MoveSynonymToAnotherAcceptedTaxonOperationE4(Messages.NameEditorDropTargetListener_CHANGE_ACC_TAXON, getEditor().getUndoContext(), synonym.getUuid(), ((TaxonNameEditorE4) target).getTaxon(), newSecUuid, (TaxonNameEditorE4) target, (TaxonNameEditorE4) target);
139

    
140
				}
141
			}
142

    
143
		}else if(taxonBase instanceof Taxon){
144
			Taxon concept = (Taxon) taxonBase;
145

    
146
			if(target instanceof AbstractHomotypicalGroupContainerE4){
147
				HomotypicalGroup homotypicalGroup = ((AbstractHomotypicalGroupContainerE4) target).getGroup();
148

    
149
				return new ChangeConceptToSynonymOperation(Messages.NameEditorDropTargetListener_CHANGE_SYNONYM, getEditor().getUndoContext(),
150
						getEditor().getTaxon(), concept, homotypicalGroup, target);
151
			}
152
			else if(target instanceof MisappliedGroupE4){
153
				return new ChangeConceptRelationshipTypeOperation(Messages.NameEditorDropTargetListener_CHANGE, getEditor().getUndoContext(),
154
						getEditor().getTaxon(), concept, TaxonRelationshipType.MISAPPLIED_NAME_FOR(), target);
155
			}
156
		}
157

    
158

    
159
		return null;
160
	}
161

    
162
    public UUID getNewSecRef(Synonym synonym) throws Exception{
163
        Reference synSecRef = synonym.getSec();
164
        UUID newSecUuid = null;
165
        SecReferenceHandlingEnum secHandling = PreferencesUtil.getSecReferenceHandlingPreference();
166
        Reference parentSecRef = ((AbstractHomotypicalGroupContainerE4) target).getEditor().getTaxon() != null? ((AbstractHomotypicalGroupContainerE4) target).getEditor().getTaxon().getSec():null;
167
        if ((synSecRef != parentSecRef && secHandling.equals(SecReferenceHandlingEnum.KeepOrWarn) )|| secHandling.equals(SecReferenceHandlingEnum.KeepOrSelect)){
168

    
169
            if ((parentSecRef != synSecRef && secHandling.equals(SecReferenceHandlingEnum.KeepOrWarn) )|| secHandling.equals(SecReferenceHandlingEnum.KeepOrSelect)){
170
                int result = MessagingUtils.confirmDialog(Messages.ChangeSynonymToAcceptedHandler_Select_Sec_Reference_Handling_title, Messages.MoveSynonymToAcceptedHandler_Select_Sec_Reference_Handling_message,
171
                        new String[]{Messages.ChangeSynonymToAcceptedHandler_Select_Sec_Reference_Keep, Messages.ChangeSynonymToAcceptedHandler_Select_Sec_Reference_Parent, Messages.ChangeSynonymToAcceptedHandler_Select_Sec_Reference_Select});
172
                if (result == 2){
173
                    Reference sec = ReferenceSelectionDialog.select(null, null);
174
                    newSecUuid = sec != null? sec.getUuid(): null;
175
                }else if (result == 1){
176
                    newSecUuid = parentSecRef != null? parentSecRef.getUuid(): null;
177
                }else if (result == 0){
178
                    newSecUuid = synSecRef != null? synSecRef.getUuid(): null;
179
                }else{
180
                    return null;
181
                }
182

    
183
            }
184

    
185
        }
186
        return newSecUuid;
187
    }
188

    
189
	@Override
190
	public void dropAccept(DropTargetEvent event) {
191
		// pass
192
	}
193

    
194
	private HomotypicalGroup getHomotypicalGroup() {
195
		if(target instanceof AbstractHomotypicalGroupContainerE4){
196
			return ((AbstractHomotypicalGroupContainerE4) target).getGroup();
197
		}
198
		return null;
199
	}
200

    
201
	private TaxonBase getDroppedTaxonBase(DropTargetEvent dropTargetEvent){
202
		if(dropTargetEvent.data instanceof ICdmBase[]){
203

    
204
			ICdmBase[] cdmBaseObjects = (ICdmBase[]) dropTargetEvent.data;
205

    
206
			if(cdmBaseObjects[0] instanceof TaxonBase){
207
				return (TaxonBase) cdmBaseObjects[0];
208
			}
209
		}
210
		return null;
211
	}
212

    
213
	private TaxonNameEditorE4 getEditor() {
214
		return (TaxonNameEditorE4) EventUtility.getTaxonEditor();
215
	}
216
}
(4-4/4)