Project

General

Profile

Download (7.58 KB) Statistics
| Branch: | Tag: | Revision:
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.EnumSet;
14
import java.util.HashSet;
15
import java.util.Iterator;
16
import java.util.Set;
17

    
18
import org.apache.log4j.Logger;
19
import org.eclipse.core.commands.operations.IUndoContext;
20
import org.eclipse.core.runtime.IStatus;
21
import org.eclipse.core.runtime.Status;
22
import org.eclipse.jface.dialogs.MessageDialog;
23
import org.eclipse.jface.util.LocalSelectionTransfer;
24
import org.eclipse.jface.viewers.ISelection;
25
import org.eclipse.jface.viewers.TreeSelection;
26
import org.eclipse.swt.dnd.DropTargetEvent;
27
import org.eclipse.swt.dnd.TransferData;
28
import org.eclipse.ui.navigator.CommonDropAdapter;
29
import org.eclipse.ui.navigator.CommonDropAdapterAssistant;
30

    
31
import eu.etaxonomy.cdm.model.common.CdmBase;
32
import eu.etaxonomy.cdm.model.taxon.ITaxonTreeNode;
33
import eu.etaxonomy.cdm.model.taxon.TaxonNode;
34
import eu.etaxonomy.cdm.persistence.hibernate.permission.CRUD;
35
import eu.etaxonomy.taxeditor.navigation.NavigationUtil;
36
import eu.etaxonomy.taxeditor.navigation.navigator.operation.MoveTaxonOperation;
37
import eu.etaxonomy.taxeditor.operation.AbstractPostOperation;
38
import eu.etaxonomy.taxeditor.operation.IPostOperationEnabled;
39
import eu.etaxonomy.taxeditor.store.CdmStore;
40

    
41
/**
42
 * <p>TaxonNodeDropAdapterAssistant class.</p>
43
 *
44
 * @author p.ciardelli
45
 * @created 03.06.2009
46
 * @version 1.0
47
 */
48
public class TreeNodeDropAdapterAssistant extends CommonDropAdapterAssistant implements IPostOperationEnabled {
49

    
50
	private static final Logger logger = Logger.getLogger(TreeNodeDropAdapterAssistant.class);
51

    
52
	/** Constant <code>ID="eu.etaxonomy.taxeditor.navigation.navig"{trunked}</code> */
53
	public static final String ID = "eu.etaxonomy.taxeditor.navigation.navigator.dropassistant"; //$NON-NLS-1$
54

    
55
	private static final EnumSet<CRUD> UPDATE = EnumSet.of(CRUD.UPDATE);
56

    
57
	/* (non-Javadoc)
58
	 * @see org.eclipse.ui.navigator.CommonDropAdapterAssistant#handleDrop(org.eclipse.ui.navigator.CommonDropAdapter, org.eclipse.swt.dnd.DropTargetEvent, java.lang.Object)
59
	 */
60
	/** {@inheritDoc} */
61
	@Override
62
	public IStatus handleDrop(CommonDropAdapter dropAdapter,
63
			DropTargetEvent dropTargetEvent, Object target) {
64

    
65
		if (target instanceof ITaxonTreeNode) {
66
			Set<TaxonNode> taxonNodes = getSelectedTaxa();
67
			ITaxonTreeNode targetTreeNode = (ITaxonTreeNode) target;
68
			if(taxonNodes != null) {
69
                return moveTaxon(taxonNodes, targetTreeNode);
70
            }
71
		}
72

    
73
		return Status.CANCEL_STATUS;
74
	}
75

    
76
	private Set<TaxonNode> getSelectedTaxa(){
77
		HashSet<TaxonNode> taxonNodes = new HashSet<TaxonNode>();
78

    
79
		ISelection selection = LocalSelectionTransfer.getTransfer().getSelection();
80
		if (selection instanceof TreeSelection) {
81

    
82
			Iterator selectionIterator = ((TreeSelection) selection).iterator();
83

    
84
			while (selectionIterator.hasNext()){
85
				Object object = selectionIterator.next();
86
				if(object instanceof TaxonNode){
87
					TaxonNode taxonNode = (TaxonNode) object;
88
					taxonNodes.add(taxonNode);
89
				}
90
			}
91
		}
92
		return taxonNodes.size() > 0 ? taxonNodes : null;
93
	}
94

    
95
	/* (non-Javadoc)
96
	 * @see org.eclipse.ui.navigator.CommonDropAdapterAssistant#validateDrop(java.lang.Object, int, org.eclipse.swt.dnd.TransferData)
97
	 */
98
	/** {@inheritDoc} */
99
	@Override
100
	public IStatus validateDrop(Object target, int operation,
101
			TransferData transferType) {
102
		if (target instanceof ITaxonTreeNode) {
103

    
104
		    // check users permissions with target taxonnode and taxon
105
		    if (target instanceof TaxonNode) {
106
		        TaxonNode targetNode = (TaxonNode)target;
107
		        Boolean hasTargetNodePermission = CdmStore.currentAuthentiationHasPermission(targetNode, UPDATE);
108
                Boolean hasTargetTaxonPermission = CdmStore.currentAuthentiationHasPermission(targetNode.getTaxon(), UPDATE);
109

    
110
                if(logger.isDebugEnabled()){
111
                    logger.debug("target: " + targetNode.getTaxon().getTitleCache());
112
                }
113

    
114
		        if(!hasTargetNodePermission || ! hasTargetNodePermission){
115
		            if(logger.isDebugEnabled()){
116
		                logger.debug("CANCEL_STATUS for target node: " + hasTargetNodePermission.toString() + " " + hasTargetTaxonPermission.toString() + " ");
117
		            }
118
		            return Status.CANCEL_STATUS;
119
		        }
120
		    }
121

    
122
		    // do not allow to drop onto itself and
123
		    // check users permissions with all selected taxon nodes and taxa
124
		    for(TaxonNode taxonNode : getSelectedTaxa()){
125
			    logger.debug("selectedTaxa: " + taxonNode.getTaxon().getTitleCache());
126
				Boolean isSameTaxonNode = taxonNode.equals(target);
127
				Boolean hasTaxonNodePermission = CdmStore.currentAuthentiationHasPermission(taxonNode, UPDATE);
128
				Boolean hasTaxonPermission = CdmStore.currentAuthentiationHasPermission(taxonNode.getTaxon(), UPDATE);
129
                if (
130
			        isSameTaxonNode
131
			        || !hasTaxonNodePermission
132
    	            || !hasTaxonPermission
133
	                ) {
134
                    if(logger.isDebugEnabled()){
135
                        logger.debug("CANCEL_STATUS for selected  " + isSameTaxonNode.toString() + " " + hasTaxonNodePermission.toString() + " " + hasTaxonPermission.toString() + " ");
136
                    }
137
					return Status.CANCEL_STATUS;
138
				}
139
			}
140
			logger.debug("OK_STATUS");
141
			return Status.OK_STATUS;
142
		}
143
		logger.debug("CANCEL_STATUS");
144
		return Status.CANCEL_STATUS;
145
	}
146

    
147

    
148
	/**
149
	 * @param childTaxonNode
150
	 * @param parentTaxon
151
	 * @return
152
	 */
153
	private IStatus moveTaxon(Set<TaxonNode> taxonNodes, ITaxonTreeNode targetITaxonTreeNode) {
154

    
155
		TaxonNavigator taxonNavigator;
156
		taxonNavigator = (TaxonNavigator) NavigationUtil.showView(TaxonNavigator.ID);
157

    
158
		if(targetITaxonTreeNode instanceof TaxonNode){
159

    
160
			TaxonNode targetTaxonNode = (TaxonNode) targetITaxonTreeNode;
161

    
162
//			for(TaxonNode taxonNode : taxonNodes){
163
//				if (taxonNode.equals(targetTaxonNode)) {
164
//					return Status.CANCEL_STATUS;
165
//				}
166
//			}
167

    
168
			// Make sure parent taxon does not have unsaved changes
169
			if (NavigationUtil.isDirty(targetTaxonNode)){
170
				MessageDialog.openWarning(NavigationUtil.getShell(), "Unsaved Parent Taxon", "There are unsaved " +
171
				"changes in the parent taxon. Pleas save first.");
172
				return Status.CANCEL_STATUS;
173
			}
174

    
175

    
176
			// Make sure parentTaxon is not the drop target
177
//			if (!childTaxonNode.isTopmostNode() && childTaxonNode.getParent().equals(targetTaxonNode)){
178
//				return Status.CANCEL_STATUS;
179
//			}
180

    
181
			// Make sure taxon is not being dropped onto itself
182
//			if (childTaxonNode.equals(targetTaxonNode)) {
183
//				return Status.CANCEL_STATUS;
184
//			}
185

    
186

    
187

    
188
		}
189

    
190
		IUndoContext workspaceUndoContext = NavigationUtil.getWorkbenchUndoContext();
191
		if (workspaceUndoContext == null) {
192
			logger.error("Workspace undo context is null. DND operation cancelled");
193
			return Status.CANCEL_STATUS;
194
		}
195

    
196
		AbstractPostOperation operation = new MoveTaxonOperation
197
				("Move Taxon", workspaceUndoContext, taxonNodes, targetITaxonTreeNode, this, taxonNavigator);
198
		NavigationUtil.executeOperation(operation);
199

    
200
		logger.info("Moved taxa to new parent " + targetITaxonTreeNode);
201
		return Status.OK_STATUS;
202
	}
203

    
204
	/* (non-Javadoc)
205
	 * @see eu.etaxonomy.taxeditor.operations.IPostOperationEnabled#postOperation(eu.etaxonomy.cdm.model.common.CdmBase)
206
	 */
207
	/** {@inheritDoc} */
208
	@Override
209
    public boolean postOperation(CdmBase objectAffectedByOperation) {
210
		return true;
211
	}
212

    
213
	/**
214
	 * <p>onComplete</p>
215
	 *
216
	 * @return a boolean.
217
	 */
218
	@Override
219
    public boolean onComplete() {
220
		// TODO Auto-generated method stub
221
		return false;
222
	}
223

    
224
}
(15-15/15)