Project

General

Profile

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

    
6
import org.eclipse.core.runtime.Assert;
7
import org.eclipse.swt.SWTException;
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.hibernate.HibernateProxyHelper;
13
import eu.etaxonomy.cdm.model.common.ICdmBase;
14
import eu.etaxonomy.cdm.model.name.HomotypicalGroup;
15
import eu.etaxonomy.cdm.model.reference.Reference;
16
import eu.etaxonomy.cdm.model.taxon.Synonym;
17
import eu.etaxonomy.cdm.model.taxon.SynonymRelationship;
18
import eu.etaxonomy.cdm.model.taxon.SynonymRelationshipType;
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.EditorUtil;
23
import eu.etaxonomy.taxeditor.editor.IDropTargetable;
24
import eu.etaxonomy.taxeditor.editor.name.TaxonNameEditor;
25
import eu.etaxonomy.taxeditor.editor.name.container.AbstractHomotypicalGroupContainer;
26
import eu.etaxonomy.taxeditor.editor.name.container.HomotypicalSynonymGroup;
27
import eu.etaxonomy.taxeditor.editor.name.container.MisappliedGroup;
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.editor.name.operation.MoveSynonymToAnotherAcceptedTaxonOperation;
33
import eu.etaxonomy.taxeditor.model.MessagingUtils;
34
import eu.etaxonomy.taxeditor.operation.AbstractPostOperation;
35

    
36
/**
37
 * <p>NameEditorDropTargetListener class.</p>
38
 *
39
 * @author n.hoffmann
40
 * @version $Id: $
41
 */
42
public class NameEditorDropTargetListener extends DropTargetAdapter {
43
		
44
	private IDropTargetable target;
45
	
46

    
47
	/**
48
	 * <p>Constructor for NameEditorDropTargetListener.</p>
49
	 *
50
	 * @param target a {@link eu.etaxonomy.taxeditor.editor.IDropTargetable} object.
51
	 */
52
	public NameEditorDropTargetListener(IDropTargetable target){
53
		this.target = target;
54
	}
55
	
56
	/** {@inheritDoc} */
57
	public void dragEnter(DropTargetEvent dropTargetEvent) {
58
		target.dragEntered();
59
		
60
//		if(! EditorUtil.getActiveMultiPageTaxonEditor().equals(editor.getMultiPageTaxonEditor())){
61
//			editor.getMultiPageTaxonEditor().setFocus();
62
//		}
63
	}
64
	
65
	/** {@inheritDoc} */
66
	public void dragLeave(DropTargetEvent dropTargetEvent) {
67
		target.dragLeft();
68
	}
69
	
70
	/** {@inheritDoc} */
71
	public void drop(DropTargetEvent dropTargetEvent) {
72
		if (!EditorUtil.forceUserSave(target.getEditor(), dropTargetEvent.display.getActiveShell())){
73
			return ;
74
		}
75
		TaxonBase taxonBase = getDroppedTaxonBase(dropTargetEvent);
76
		
77
		Assert.isNotNull(taxonBase);
78
		
79
		if(taxonBase.getHomotypicGroup().equals(getHomotypicalGroup())){
80
			// do nothing when dragged to the same group
81
			dropTargetEvent.detail = DND.DROP_NONE;
82
			return;
83
		}
84
		
85
		// Execute operations at end of drag event
86
		AbstractPostOperation operation = createOperation(taxonBase);
87
		
88
		// Execute operation if it has been initiated
89
		if (operation == null) {
90
			MessagingUtils.warn(getClass(), "User unsuccessfully tried to drop: " + taxonBase.getClass() +
91
					". Target: " + target);
92
			dropTargetEvent.detail = DND.DROP_NONE;
93
		} else {
94
			EditorUtil.executeOperation(operation);
95
		}
96
		target.getEditor().getConversationHolder().commit();
97
		if (!target.equals(EditorUtil.getActiveMultiPageTaxonEditor().getActiveEditor())){
98
			((TaxonNameEditor)EditorUtil.getActiveMultiPageTaxonEditor().getActiveEditor()).redraw();
99
			((TaxonNameEditor)EditorUtil.getActiveMultiPageTaxonEditor().getActiveEditor()).getConversationHolder().commit();
100
			
101
		}
102
		target.getEditor().redraw();
103
		
104
	}
105
	
106
	private AbstractPostOperation createOperation(TaxonBase taxonBase) {
107
		
108
		
109
		if(taxonBase instanceof Synonym){
110
			Synonym synonym = (Synonym) taxonBase;
111
			
112
			if(target instanceof AbstractHomotypicalGroupContainer){
113
				HomotypicalGroup homotypicalGroup = ((AbstractHomotypicalGroupContainer) target).getGroup();
114
				
115
				return new ChangeHomotypicGroupOperation("Change Homotypical Group", getEditor().getUndoContext(), 
116
						getEditor().getTaxon(), synonym, homotypicalGroup, target);
117
			}
118
			else if(target instanceof MisappliedGroup){
119
				return new ChangeSynonymToMisapplicationOperation("Change Synonym to Misapplication", getEditor().getUndoContext(), 
120
						getEditor().getTaxon(), synonym, target);
121
			}
122
			else if(target instanceof TaxonNameEditor){
123
				if (target.equals(getEditor())){
124
					return new ChangeHomotypicGroupOperation("Change Homotypical Group", getEditor().getUndoContext(), 
125
						getEditor().getTaxon(), synonym, null, target);
126
				} else{
127
					getEditor().getConversationHolder().commit();
128
					((TaxonNameEditor) target).getConversationHolder().commit();
129
					
130
					return new MoveSynonymToAnotherAcceptedTaxonOperation("Change accepted Taxon", getEditor().getUndoContext(), getEditor().getTaxon().getUuid(), synonym.getUuid(), ((TaxonNameEditor) target).getTaxon(), null );
131
					
132
				}
133
			}
134
			
135
		}else if(taxonBase instanceof Taxon){
136
			Taxon concept = (Taxon) taxonBase;
137
			
138
			if(target instanceof AbstractHomotypicalGroupContainer){
139
				HomotypicalGroup homotypicalGroup = ((AbstractHomotypicalGroupContainer) target).getGroup();
140
				
141
				return new ChangeConceptToSynonymOperation("Change to Synonym", getEditor().getUndoContext(), 
142
						getEditor().getTaxon(), concept, homotypicalGroup, target);
143
			}
144
			else if(target instanceof MisappliedGroup ){
145
				return new ChangeConceptRelationshipTypeOperation("Change", getEditor().getUndoContext(), 
146
						getEditor().getTaxon(), concept, TaxonRelationshipType.MISAPPLIED_NAME_FOR(), target);
147
			}
148
		}
149

    
150
		
151
		return null;
152
	}
153

    
154
	/** {@inheritDoc} */
155
	@Override
156
	public void dropAccept(DropTargetEvent event) {
157
		// pass
158
	}
159

    
160
	
161
	private HomotypicalGroup getHomotypicalGroup() {
162
		if(target instanceof AbstractHomotypicalGroupContainer){
163
			return ((AbstractHomotypicalGroupContainer) target).getGroup();
164
		}
165
		return null;
166
	}	
167
	
168
	private TaxonBase getDroppedTaxonBase(DropTargetEvent dropTargetEvent){
169
		if(dropTargetEvent.data instanceof ICdmBase[]){
170
		
171
			ICdmBase[] cdmBaseObjects = (ICdmBase[]) dropTargetEvent.data;
172
			
173
			if(cdmBaseObjects[0] instanceof TaxonBase){
174
				return (TaxonBase) cdmBaseObjects[0];
175
			}
176
		}
177
		return null;
178
	}
179
	
180
	/**
181
	 * @return 
182
	 * 
183
	 */
184
	private TaxonNameEditor getEditor() {
185
		return (TaxonNameEditor) EditorUtil.getActiveMultiPageTaxonEditor().getActiveEditor();
186
	}
187
}
(4-4/4)