- created specimen general element
[taxeditor.git] / eu.etaxonomy.taxeditor.navigation / src / main / java / eu / etaxonomy / taxeditor / navigation / navigator / TreeNodeDropAdapterAssistant.java
1 // $Id$
2 /**
3 * Copyright (C) 2007 EDIT
4 * European Distributed Institute of Taxonomy
5 * http://www.e-taxonomy.eu
6 *
7 * The contents of this file are subject to the Mozilla Public License Version 1.1
8 * See LICENSE.TXT at the top of this package for the full license terms.
9 */
10
11 package eu.etaxonomy.taxeditor.navigation.navigator;
12
13 import java.util.HashSet;
14 import java.util.Iterator;
15 import java.util.Set;
16
17 import org.apache.log4j.Logger;
18 import org.eclipse.core.commands.operations.IUndoContext;
19 import org.eclipse.core.runtime.IStatus;
20 import org.eclipse.core.runtime.Status;
21 import org.eclipse.jface.dialogs.MessageDialog;
22 import org.eclipse.jface.util.LocalSelectionTransfer;
23 import org.eclipse.jface.viewers.ISelection;
24 import org.eclipse.jface.viewers.TreeSelection;
25 import org.eclipse.swt.dnd.DropTargetEvent;
26 import org.eclipse.swt.dnd.TransferData;
27 import org.eclipse.ui.navigator.CommonDropAdapter;
28 import org.eclipse.ui.navigator.CommonDropAdapterAssistant;
29
30 import eu.etaxonomy.cdm.model.common.CdmBase;
31 import eu.etaxonomy.cdm.model.taxon.ITreeNode;
32 import eu.etaxonomy.cdm.model.taxon.TaxonNode;
33 import eu.etaxonomy.taxeditor.navigation.NavigationUtil;
34 import eu.etaxonomy.taxeditor.navigation.navigator.operation.MoveTaxonOperation;
35 import eu.etaxonomy.taxeditor.operation.AbstractPostOperation;
36 import eu.etaxonomy.taxeditor.operation.IPostOperationEnabled;
37
38 /**
39 * <p>TaxonNodeDropAdapterAssistant class.</p>
40 *
41 * @author p.ciardelli
42 * @created 03.06.2009
43 * @version 1.0
44 */
45 public class TreeNodeDropAdapterAssistant extends CommonDropAdapterAssistant implements IPostOperationEnabled{
46 private static final Logger logger = Logger
47 .getLogger(TreeNodeDropAdapterAssistant.class);
48
49 /** Constant <code>ID="eu.etaxonomy.taxeditor.navigation.navig"{trunked}</code> */
50 public static final String ID = "eu.etaxonomy.taxeditor.navigation.navigator.dropassistant"; //$NON-NLS-1$
51
52 /* (non-Javadoc)
53 * @see org.eclipse.ui.navigator.CommonDropAdapterAssistant#handleDrop(org.eclipse.ui.navigator.CommonDropAdapter, org.eclipse.swt.dnd.DropTargetEvent, java.lang.Object)
54 */
55 /** {@inheritDoc} */
56 @Override
57 public IStatus handleDrop(CommonDropAdapter dropAdapter,
58 DropTargetEvent dropTargetEvent, Object target) {
59
60 if (target instanceof ITreeNode) {
61 Set<TaxonNode> taxonNodes = getSelectedTaxa();
62 ITreeNode targetTreeNode = (ITreeNode) target;
63 if(taxonNodes != null)
64 return moveTaxon(taxonNodes, targetTreeNode);
65 }
66
67 return Status.CANCEL_STATUS;
68 }
69
70 private Set<TaxonNode> getSelectedTaxa(){
71 HashSet<TaxonNode> taxonNodes = new HashSet<TaxonNode>();
72
73 ISelection selection = LocalSelectionTransfer.getTransfer().getSelection();
74 if (selection instanceof TreeSelection) {
75
76 Iterator selectionIterator = ((TreeSelection) selection).iterator();
77
78 while (selectionIterator.hasNext()){
79 Object object = selectionIterator.next();
80 if(object instanceof TaxonNode){
81 TaxonNode taxonNode = (TaxonNode) object;
82 taxonNodes.add(taxonNode);
83 }
84 }
85 }
86 return taxonNodes.size() > 0 ? taxonNodes : null;
87 }
88
89 /* (non-Javadoc)
90 * @see org.eclipse.ui.navigator.CommonDropAdapterAssistant#validateDrop(java.lang.Object, int, org.eclipse.swt.dnd.TransferData)
91 */
92 /** {@inheritDoc} */
93 @Override
94 public IStatus validateDrop(Object target, int operation,
95 TransferData transferType) {
96 if (target instanceof ITreeNode) {
97 // do not allow to drop onto itself
98 for(TaxonNode taxonNode : getSelectedTaxa()){
99 if (taxonNode.equals(target)) {
100 return Status.CANCEL_STATUS;
101 }
102 }
103 return Status.OK_STATUS;
104 }
105 return Status.CANCEL_STATUS;
106 }
107
108
109 /**
110 * @param childTaxonNode
111 * @param parentTaxon
112 * @return
113 */
114 private IStatus moveTaxon(Set<TaxonNode> taxonNodes, ITreeNode targetITreeNode) {
115
116 TaxonNavigator taxonNavigator;
117 taxonNavigator = (TaxonNavigator) NavigationUtil.showView(TaxonNavigator.ID);
118
119 if(targetITreeNode instanceof TaxonNode){
120
121 TaxonNode targetTaxonNode = (TaxonNode) targetITreeNode;
122
123 // for(TaxonNode taxonNode : taxonNodes){
124 // if (taxonNode.equals(targetTaxonNode)) {
125 // return Status.CANCEL_STATUS;
126 // }
127 // }
128
129 // Make sure parent taxon does not have unsaved changes
130 if (NavigationUtil.isDirty(targetTaxonNode)){
131 MessageDialog.openWarning(NavigationUtil.getShell(), "Unsaved Parent Taxon", "There are unsaved " +
132 "changes in the parent taxon. Pleas save first.");
133 return Status.CANCEL_STATUS;
134 }
135
136
137 // Make sure parentTaxon is not the drop target
138 // if (!childTaxonNode.isTopmostNode() && childTaxonNode.getParent().equals(targetTaxonNode)){
139 // return Status.CANCEL_STATUS;
140 // }
141
142 // Make sure taxon is not being dropped onto itself
143 // if (childTaxonNode.equals(targetTaxonNode)) {
144 // return Status.CANCEL_STATUS;
145 // }
146
147
148
149 }
150
151 IUndoContext workspaceUndoContext = NavigationUtil.getWorkbenchUndoContext();
152 if (workspaceUndoContext == null) {
153 logger.error("Workspace undo context is null. DND operation cancelled");
154 return Status.CANCEL_STATUS;
155 }
156
157 AbstractPostOperation operation = new MoveTaxonOperation
158 ("Move Taxon", workspaceUndoContext, taxonNodes, targetITreeNode, this, taxonNavigator);
159 NavigationUtil.executeOperation(operation);
160
161 logger.info("Moved taxa to new parent " + targetITreeNode);
162 return Status.OK_STATUS;
163 }
164
165 /* (non-Javadoc)
166 * @see eu.etaxonomy.taxeditor.operations.IPostOperationEnabled#postOperation(eu.etaxonomy.cdm.model.common.CdmBase)
167 */
168 /** {@inheritDoc} */
169 public boolean postOperation(CdmBase objectAffectedByOperation) {
170 return true;
171 }
172
173 /**
174 * <p>onComplete</p>
175 *
176 * @return a boolean.
177 */
178 public boolean onComplete() {
179 // TODO Auto-generated method stub
180 return false;
181 }
182 }