merge-update from trunk
[taxeditor.git] / eu.etaxonomy.taxeditor.editor / src / main / java / eu / etaxonomy / taxeditor / editor / name / dnd / NameEditorDropTargetListener.java
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.model.common.ICdmBase;
13 import eu.etaxonomy.cdm.model.name.HomotypicalGroup;
14 import eu.etaxonomy.cdm.model.reference.Reference;
15 import eu.etaxonomy.cdm.model.taxon.Synonym;
16 import eu.etaxonomy.cdm.model.taxon.SynonymRelationship;
17 import eu.etaxonomy.cdm.model.taxon.SynonymRelationshipType;
18 import eu.etaxonomy.cdm.model.taxon.Taxon;
19 import eu.etaxonomy.cdm.model.taxon.TaxonBase;
20 import eu.etaxonomy.cdm.model.taxon.TaxonRelationshipType;
21 import eu.etaxonomy.taxeditor.editor.EditorUtil;
22 import eu.etaxonomy.taxeditor.editor.IDropTargetable;
23 import eu.etaxonomy.taxeditor.editor.name.TaxonNameEditor;
24 import eu.etaxonomy.taxeditor.editor.name.container.AbstractHomotypicalGroupContainer;
25 import eu.etaxonomy.taxeditor.editor.name.container.HomotypicalSynonymGroup;
26 import eu.etaxonomy.taxeditor.editor.name.container.MisappliedGroup;
27 import eu.etaxonomy.taxeditor.editor.name.operation.ChangeConceptRelationshipTypeOperation;
28 import eu.etaxonomy.taxeditor.editor.name.operation.ChangeConceptToSynonymOperation;
29 import eu.etaxonomy.taxeditor.editor.name.operation.ChangeHomotypicGroupOperation;
30 import eu.etaxonomy.taxeditor.editor.name.operation.ChangeSynonymToMisapplicationOperation;
31 import eu.etaxonomy.taxeditor.editor.name.operation.MoveSynonymToAnotherAcceptedTaxonOperation;
32 import eu.etaxonomy.taxeditor.model.MessagingUtils;
33 import eu.etaxonomy.taxeditor.operation.AbstractPostOperation;
34
35 /**
36 * <p>NameEditorDropTargetListener class.</p>
37 *
38 * @author n.hoffmann
39 * @version $Id: $
40 */
41 public class NameEditorDropTargetListener extends DropTargetAdapter {
42
43 private IDropTargetable target;
44
45
46 /**
47 * <p>Constructor for NameEditorDropTargetListener.</p>
48 *
49 * @param target a {@link eu.etaxonomy.taxeditor.editor.IDropTargetable} object.
50 */
51 public NameEditorDropTargetListener(IDropTargetable target){
52 this.target = target;
53 }
54
55 /** {@inheritDoc} */
56 public void dragEnter(DropTargetEvent dropTargetEvent) {
57 target.dragEntered();
58
59 // if(! EditorUtil.getActiveMultiPageTaxonEditor().equals(editor.getMultiPageTaxonEditor())){
60 // editor.getMultiPageTaxonEditor().setFocus();
61 // }
62 }
63
64 /** {@inheritDoc} */
65 public void dragLeave(DropTargetEvent dropTargetEvent) {
66 target.dragLeft();
67 }
68
69 /** {@inheritDoc} */
70 public void drop(DropTargetEvent dropTargetEvent) {
71
72 TaxonBase taxonBase = getDroppedTaxonBase(dropTargetEvent);
73
74 Assert.isNotNull(taxonBase);
75
76 if(taxonBase.getHomotypicGroup().equals(getHomotypicalGroup())){
77 // do nothing when dragged to the same group
78 dropTargetEvent.detail = DND.DROP_NONE;
79 return;
80 }
81
82 // Execute operations at end of drag event
83 AbstractPostOperation operation = createOperation(taxonBase);
84
85 // Execute operation if it has been initiated
86 if (operation == null) {
87 MessagingUtils.warn(getClass(), "User unsuccessfully tried to drop: " + taxonBase.getClass() +
88 ". Target: " + target);
89 dropTargetEvent.detail = DND.DROP_NONE;
90 } else {
91 EditorUtil.executeOperation(operation);
92 }
93 target.getEditor().getConversationHolder().commit();
94 if (!target.equals(EditorUtil.getActiveMultiPageTaxonEditor().getActiveEditor())){
95 ((TaxonNameEditor)EditorUtil.getActiveMultiPageTaxonEditor().getActiveEditor()).redraw();
96 ((TaxonNameEditor)EditorUtil.getActiveMultiPageTaxonEditor().getActiveEditor()).getConversationHolder().commit();
97
98 }
99 target.getEditor().redraw();
100
101 }
102
103 private AbstractPostOperation createOperation(TaxonBase taxonBase) {
104
105 if(taxonBase instanceof Synonym){
106 Synonym synonym = (Synonym) taxonBase;
107
108 if(target instanceof AbstractHomotypicalGroupContainer){
109 HomotypicalGroup homotypicalGroup = ((AbstractHomotypicalGroupContainer) target).getGroup();
110
111 return new ChangeHomotypicGroupOperation("Change Homotypical Group", getEditor().getUndoContext(),
112 getEditor().getTaxon(), synonym, homotypicalGroup, target);
113 }
114 else if(target instanceof MisappliedGroup){
115 return new ChangeSynonymToMisapplicationOperation("Change Synonym to Misapplication", getEditor().getUndoContext(),
116 getEditor().getTaxon(), synonym, target);
117 }
118 else if(target instanceof TaxonNameEditor){
119 if (target.equals(getEditor())){
120 return new ChangeHomotypicGroupOperation("Change Homotypical Group", getEditor().getUndoContext(),
121 getEditor().getTaxon(), synonym, null, target);
122 } else{
123 getEditor().getConversationHolder().commit();
124 ((TaxonNameEditor) target).getConversationHolder().commit();
125
126 return new MoveSynonymToAnotherAcceptedTaxonOperation("Change accepted Taxon", getEditor().getUndoContext(), getEditor().getTaxon().getUuid(), synonym.getUuid(), ((TaxonNameEditor) target).getTaxon(), null );
127
128 }
129 }
130
131 }else if(taxonBase instanceof Taxon){
132 Taxon concept = (Taxon) taxonBase;
133
134 if(target instanceof AbstractHomotypicalGroupContainer){
135 HomotypicalGroup homotypicalGroup = ((AbstractHomotypicalGroupContainer) target).getGroup();
136
137 return new ChangeConceptToSynonymOperation("Change to Synonym", getEditor().getUndoContext(),
138 getEditor().getTaxon(), concept, homotypicalGroup, target);
139 }
140 else if(target instanceof MisappliedGroup ){
141 return new ChangeConceptRelationshipTypeOperation("Change", getEditor().getUndoContext(),
142 getEditor().getTaxon(), concept, TaxonRelationshipType.MISAPPLIED_NAME_FOR(), target);
143 }
144 }
145
146
147 return null;
148 }
149
150 /** {@inheritDoc} */
151 @Override
152 public void dropAccept(DropTargetEvent event) {
153 // pass
154 }
155
156
157 private HomotypicalGroup getHomotypicalGroup() {
158 if(target instanceof AbstractHomotypicalGroupContainer){
159 return ((AbstractHomotypicalGroupContainer) target).getGroup();
160 }
161 return null;
162 }
163
164 private TaxonBase getDroppedTaxonBase(DropTargetEvent dropTargetEvent){
165 if(dropTargetEvent.data instanceof ICdmBase[]){
166
167 ICdmBase[] cdmBaseObjects = (ICdmBase[]) dropTargetEvent.data;
168
169 if(cdmBaseObjects[0] instanceof TaxonBase){
170 return (TaxonBase) cdmBaseObjects[0];
171 }
172 }
173 return null;
174 }
175
176 /**
177 * @return
178 *
179 */
180 private TaxonNameEditor getEditor() {
181 return (TaxonNameEditor) EditorUtil.getActiveMultiPageTaxonEditor().getActiveEditor();
182 }
183 }