Project

General

Profile

Download (10 KB) Statistics
| Branch: | Tag: | Revision:
1 fb76c216 Patrick Plitzner
/**
2
* Copyright (C) 2015 EDIT
3
* European Distributed Institute of Taxonomy
4
* http://www.e-taxonomy.eu
5
*
6
* The contents of this file are subject to the Mozilla Public License Version 1.1
7
* See LICENSE.TXT at the top of this package for the full license terms.
8
*/
9
10
package eu.etaxonomy.taxeditor.navigation.navigator.e4;
11
12
import java.util.EnumSet;
13
import java.util.HashSet;
14
import java.util.Iterator;
15
import java.util.Set;
16
import java.util.UUID;
17
18
import org.apache.log4j.Logger;
19
import org.eclipse.core.commands.operations.IUndoContext;
20
import org.eclipse.jface.dialogs.MessageDialog;
21
import org.eclipse.jface.util.LocalSelectionTransfer;
22
import org.eclipse.jface.viewers.ISelection;
23
import org.eclipse.jface.viewers.TreeSelection;
24
import org.eclipse.jface.viewers.ViewerDropAdapter;
25
import org.eclipse.swt.dnd.DND;
26
import org.eclipse.swt.dnd.DropTargetEvent;
27
import org.eclipse.swt.dnd.TransferData;
28
29 cedc4ff1 Katja Luther
import eu.etaxonomy.cdm.api.service.ITaxonNodeService;
30
import eu.etaxonomy.cdm.api.service.UpdateResult;
31 fb76c216 Patrick Plitzner
import eu.etaxonomy.cdm.model.taxon.TaxonNode;
32 cedc4ff1 Katja Luther
import eu.etaxonomy.cdm.persistence.dto.TaxonNodeDto;
33 fb76c216 Patrick Plitzner
import eu.etaxonomy.cdm.persistence.hibernate.permission.CRUD;
34
import eu.etaxonomy.taxeditor.navigation.l10n.Messages;
35
import eu.etaxonomy.taxeditor.preference.PreferencesUtil;
36
import eu.etaxonomy.taxeditor.store.CdmStore;
37
38
/**
39
 * @author k.luther
40
 * @date 02.06.2015
41
 */
42
public class TreeNodeDropAdapterE4 extends ViewerDropAdapter {
43
44
    protected static final String TREE_NODE_DROP_ADAPTER_UNSAVED_PARENT_MESSAGE = Messages.TreeNodeDropAdapter_UNSAVED_PARENT_MESSAGE;
45
    protected static final String TREE_NODE_DROP_ADAPTER_UNSAVED_PARENT = Messages.TreeNodeDropAdapter_UNSAVED_PARENT;
46
    protected static final String TREE_NODE_DROP_ADAPTER_MOVE_TAXON = Messages.TreeNodeDropAdapter_MOVE_TAXON;
47
    protected static final String TREE_NODE_DROP_ADAPTER_CANCEL = Messages.TreeNodeDropAdapter_CANCEL;
48
    protected static final String TREE_NODE_DROP_ADAPTER_BEHIND = Messages.TreeNodeDropAdapter_BEHIND;
49
    protected static final String TREE_NODE_DROP_ADAPTER_CHILD = Messages.TreeNodeDropAdapter_CHILD;
50
    protected static final String DO_YOU_WANT_TO_MOVE_THE_TAXONNODE_AS_CHILD_OR_BEHIND_THE_TARGET_NODE = Messages.TreeNodeDropAdapter_MOVE_BEHIND;
51
    protected static final String TARGET_NODE = Messages.TreeNodeDropAdapter_TARGET_NODE;
52
53
    private static final Logger logger = Logger.getLogger(TreeNodeDropAdapterE4.class);
54
55
    private TaxonNavigatorE4 taxonNavigator;
56 cedc4ff1 Katja Luther
    UpdateResult result;
57 fb76c216 Patrick Plitzner
58
	public static final String ID = "eu.etaxonomy.taxeditor.navigation.navigator.dropassistant"; //$NON-NLS-1$
59
60
	private static final EnumSet<CRUD> UPDATE = EnumSet.of(CRUD.UPDATE);
61
62
	public enum MovingType{
63
	    CHILD, PREVIOUS, BEHIND
64
	}
65
66
	protected TreeNodeDropAdapterE4(TaxonNavigatorE4 navigator) {
67
	    super(navigator.getViewer());
68
	    this.taxonNavigator = navigator;
69
	}
70
71
	/** {@inheritDoc} */
72
	@Override
73
	public boolean performDrop(Object data) {
74
        Object target = getCurrentTarget();
75 cedc4ff1 Katja Luther
		if (getCurrentTarget() instanceof TaxonNodeDto) {
76
			Set<TaxonNodeDto> taxonNodes = getSelectedTaxa();
77
			TaxonNodeDto targetTreeNode = (TaxonNodeDto) target;
78
//			if (targetTreeNode.getType() != null && targetTreeNode.getType().equals(Classification.class)){
79
//				targetTreeNode = ((Classification)targetTreeNode).getRootNode();
80
//				targetTreeNode = HibernateProxyHelper.deproxy(targetTreeNode, TaxonNode.class);
81
//			}
82 fb76c216 Patrick Plitzner
			if(taxonNodes != null) {
83
				if (taxonNodes.size() == 1){
84 cedc4ff1 Katja Luther
				    boolean success = moveTaxon(taxonNodes, targetTreeNode);
85
				    if (success){
86
				        taxonNavigator.refresh();
87
				     }
88
					return success;
89 fb76c216 Patrick Plitzner
				} else{
90
					if( MessageDialog.openConfirm(null, Messages.TreeNodeDropAdapter_MOVING, Messages.TreeNodeDropAdapter_MOVING_MESSAGE)){
91
						return true;
92
					}
93
				}
94
            }
95
		}
96
		return false;
97
	}
98
99 cedc4ff1 Katja Luther
	private Set<TaxonNodeDto> getSelectedTaxa(){
100
		HashSet<TaxonNodeDto> taxonNodes = new HashSet();
101 fb76c216 Patrick Plitzner
102
		ISelection selection = LocalSelectionTransfer.getTransfer().getSelection();
103
		if (selection instanceof TreeSelection) {
104
105
			Iterator<?> selectionIterator = ((TreeSelection) selection).iterator();
106
107
			while (selectionIterator.hasNext()){
108
				Object object = selectionIterator.next();
109 cedc4ff1 Katja Luther
				if(object instanceof TaxonNodeDto){
110
					TaxonNodeDto taxonNode = (TaxonNodeDto) object;
111 fb76c216 Patrick Plitzner
					taxonNodes.add(taxonNode);
112
				}
113
			}
114
		}
115
		return taxonNodes;
116
	}
117
118
	/** {@inheritDoc} */
119
	@Override
120
	public boolean validateDrop(Object target, int operation,
121
			TransferData transferType) {
122
123 cedc4ff1 Katja Luther
		if (target instanceof TaxonNodeDto) {
124 fb76c216 Patrick Plitzner
125
		    // check users permissions with target taxonnode and taxon
126 cedc4ff1 Katja Luther
		    if (target instanceof TaxonNodeDto) {
127
		        TaxonNodeDto targetNode = (TaxonNodeDto)target;
128
		        TaxonNode node = CdmStore.getService(ITaxonNodeService.class).load(targetNode.getUuid());
129
		        boolean hasTargetNodePermission = CdmStore.currentAuthentiationHasPermission(node, UPDATE);
130
		        boolean hasTargetTaxonPermission = node.getTaxon() == null ?
131 fb76c216 Patrick Plitzner
		        			true :
132 cedc4ff1 Katja Luther
		        			CdmStore.currentAuthentiationHasPermission(node.getTaxon(), UPDATE);
133 fb76c216 Patrick Plitzner
134
		        if(!hasTargetNodePermission || ! hasTargetNodePermission){
135
		            if(logger.isDebugEnabled()){
136
		                logger.debug("CANCEL_STATUS for target node: " + hasTargetNodePermission + " " + hasTargetTaxonPermission + " "); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
137
		            }
138
		            return false;
139
		        }
140
		    }
141
142
		    // do not allow to drop onto itself and
143
		    // check users permissions with all selected taxon nodes and taxa
144 cedc4ff1 Katja Luther
		    for(TaxonNodeDto taxonNode : getSelectedTaxa()){
145 fb76c216 Patrick Plitzner
			    if (logger.isDebugEnabled()){
146 cedc4ff1 Katja Luther
			    	logger.debug("selectedTaxa: " + taxonNode.getTaxonUuid() == null? "-" : taxonNode.getTitleCache()); //$NON-NLS-1$
147 fb76c216 Patrick Plitzner
			    }
148 cedc4ff1 Katja Luther
			    boolean isClassification = taxonNode.getTaxonUuid()== null;
149 0d795e97 Katja Luther
			    if (isClassification) {
150
	                    if(logger.isDebugEnabled()){
151 cedc4ff1 Katja Luther
	                        logger.debug("CANCEL_STATUS for selected classification " + taxonNode.getClassificationUUID()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
152 0d795e97 Katja Luther
	                    }
153
	                    return false;
154
	                }
155 fb76c216 Patrick Plitzner
			    boolean isSameTaxonNode = taxonNode.equals(target);
156 cedc4ff1 Katja Luther
			    TaxonNode node = CdmStore.getService(ITaxonNodeService.class).load(taxonNode.getUuid());
157
				boolean hasTaxonNodePermission = CdmStore.currentAuthentiationHasPermission(node, UPDATE);
158 0d795e97 Katja Luther
159
				boolean hasTaxonPermission =
160 cedc4ff1 Katja Luther
	        			CdmStore.currentAuthentiationHasPermission(node.getTaxon(), UPDATE);CdmStore.currentAuthentiationHasPermission(node.getTaxon(), UPDATE);
161 fb76c216 Patrick Plitzner
                if (
162
			        isSameTaxonNode
163
			        || !hasTaxonNodePermission
164
    	            || !hasTaxonPermission
165 0d795e97 Katja Luther
    	            ) {
166 fb76c216 Patrick Plitzner
                    if(logger.isDebugEnabled()){
167
                        logger.debug("CANCEL_STATUS for selected  " + isSameTaxonNode + Messages.TreeNodeDropAdapter_10 + hasTaxonNodePermission + " " + hasTaxonPermission + " "); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
168
                    }
169
					return false;
170
				}
171
			}
172
			logger.debug("OK_STATUS"); //$NON-NLS-1$
173
			return true;
174
		}
175
		logger.debug("CANCEL_STATUS"); //$NON-NLS-1$
176
		return false;
177
	}
178
179
180 cedc4ff1 Katja Luther
	private boolean moveTaxon(Set<TaxonNodeDto> taxonNodes, TaxonNodeDto targetITaxonTreeNode) {
181
		Iterator<TaxonNodeDto> taxIterator = taxonNodes.iterator();
182 fb76c216 Patrick Plitzner
        Set<UUID> uuids = new HashSet<UUID>();
183 cedc4ff1 Katja Luther
        TaxonNodeDto node = null;
184 fb76c216 Patrick Plitzner
        while(taxIterator.hasNext()){
185
            node = taxIterator.next();
186
            uuids.add(node.getUuid());
187
        }
188
        IUndoContext workspaceUndoContext = taxonNavigator.getUndoContext();
189
		if (!PreferencesUtil.getSortNodesNaturally()){
190
			if (workspaceUndoContext == null) {
191
				logger.error("Workspace undo context is null. DND operation cancelled"); //$NON-NLS-1$
192
				return false;
193
			}
194 cedc4ff1 Katja Luther
			result =CdmStore.getService(ITaxonNodeService.class).moveTaxonNodes(uuids,targetITaxonTreeNode.getUuid(), 0);
195 fb76c216 Patrick Plitzner
196
			logger.info("Moved taxa to new parent " + targetITaxonTreeNode); //$NON-NLS-1$
197
			return true;
198
		}else{
199
			String[] buttonLables = {TREE_NODE_DROP_ADAPTER_CHILD, TREE_NODE_DROP_ADAPTER_BEHIND,TREE_NODE_DROP_ADAPTER_CANCEL};
200
			MessageDialog dialog = new MessageDialog(null, TARGET_NODE, null, DO_YOU_WANT_TO_MOVE_THE_TAXONNODE_AS_CHILD_OR_BEHIND_THE_TARGET_NODE, MessageDialog.QUESTION_WITH_CANCEL, buttonLables, 0);
201
			dialog.open();
202
			int returnCode = dialog.getReturnCode();
203 cedc4ff1 Katja Luther
204 fb76c216 Patrick Plitzner
			if (returnCode == 0){
205
				if (workspaceUndoContext == null) {
206
					logger.error("Workspace undo context is null. DND operation cancelled"); //$NON-NLS-1$
207
					return false;
208
				}
209
210 cedc4ff1 Katja Luther
				result = CdmStore.getService(ITaxonNodeService.class).moveTaxonNodes(uuids,targetITaxonTreeNode.getUuid(), 0);
211 fb76c216 Patrick Plitzner
212
				logger.info("Moved taxa to new parent " + targetITaxonTreeNode); //$NON-NLS-1$
213
				return true;
214
			}else if (returnCode == 1){
215
				if (workspaceUndoContext == null) {
216
					logger.error("Workspace undo context is null. DND operation cancelled"); //$NON-NLS-1$
217
					return false;
218
				}
219
220
221 cedc4ff1 Katja Luther
				CdmStore.getService(ITaxonNodeService.class).moveTaxonNodes(uuids,targetITaxonTreeNode.getUuid(), 2);
222 fb76c216 Patrick Plitzner
				logger.info("Moved taxa to new parent " + targetITaxonTreeNode); //$NON-NLS-1$
223
				return true;
224
			}
225
//			} else if (returnCode == 2){
226
//                IUndoContext workspaceUndoContext = NavigationUtil.getWorkbenchUndoContext();
227
//                if (workspaceUndoContext == null) {
228
//                    logger.error("Workspace undo context is null. DND operation cancelled");
229
//                    return false;
230
//                }
231
//                TaxonNode targetNode = (TaxonNode) targetITaxonTreeNode;
232
//
233
//                AbstractPostOperation operation = new MoveTaxonOperation
234
//                        ("Move Taxon", workspaceUndoContext, uuids, targetNode, this, taxonNavigator, MovingType.BEHIND);
235
//                NavigationUtil.executeOperation(operation);
236
//
237
//                logger.info("Moved taxa to new parent " + targetITaxonTreeNode);
238
//                return true;
239
//            }
240
				else{
241
				return false;
242
			}
243
244
245
		}
246
	}
247
248
	@Override
249
	public void dragOver(DropTargetEvent event) {
250
		super.dragOver(event);
251
		event.feedback = DND.FEEDBACK_SELECT | DND.FEEDBACK_INSERT_AFTER;
252
	}
253
254
}