Project

General

Profile

Download (11.4 KB) Statistics
| Branch: | Tag: | Revision:
1
/**
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
import org.eclipse.swt.widgets.Display;
29

    
30
import eu.etaxonomy.cdm.api.application.CdmApplicationState;
31
import eu.etaxonomy.cdm.api.service.ITaxonNodeService;
32
import eu.etaxonomy.cdm.api.service.UpdateResult;
33
import eu.etaxonomy.cdm.common.monitor.IRemotingProgressMonitor;
34
import eu.etaxonomy.cdm.model.taxon.TaxonNode;
35
import eu.etaxonomy.cdm.persistence.dto.TaxonNodeDto;
36
import eu.etaxonomy.cdm.persistence.hibernate.permission.CRUD;
37
import eu.etaxonomy.taxeditor.model.AbstractUtility;
38
import eu.etaxonomy.taxeditor.navigation.l10n.Messages;
39
import eu.etaxonomy.taxeditor.operation.IPostMoniteredOperationEnabled;
40
import eu.etaxonomy.taxeditor.preference.PreferencesUtil;
41
import eu.etaxonomy.taxeditor.store.CdmStore;
42

    
43
/**
44
 * @author k.luther
45
 * @date 02.06.2015
46
 */
47
public class TreeNodeDropAdapterE4 extends ViewerDropAdapter implements IPostMoniteredOperationEnabled{
48

    
49
    protected static final String TREE_NODE_DROP_ADAPTER_UNSAVED_PARENT_MESSAGE = Messages.TreeNodeDropAdapter_UNSAVED_PARENT_MESSAGE;
50
    protected static final String TREE_NODE_DROP_ADAPTER_UNSAVED_PARENT = Messages.TreeNodeDropAdapter_UNSAVED_PARENT;
51
    protected static final String TREE_NODE_DROP_ADAPTER_MOVE_TAXON = Messages.TreeNodeDropAdapter_MOVE_TAXON;
52
    protected static final String TREE_NODE_DROP_ADAPTER_CANCEL = Messages.TreeNodeDropAdapter_CANCEL;
53
    protected static final String TREE_NODE_DROP_ADAPTER_BEHIND = Messages.TreeNodeDropAdapter_BEHIND;
54
    protected static final String TREE_NODE_DROP_ADAPTER_CHILD = Messages.TreeNodeDropAdapter_CHILD;
55
    protected static final String DO_YOU_WANT_TO_MOVE_THE_TAXONNODE_AS_CHILD_OR_BEHIND_THE_TARGET_NODE = Messages.TreeNodeDropAdapter_MOVE_BEHIND;
56
    protected static final String TARGET_NODE = Messages.TreeNodeDropAdapter_TARGET_NODE;
57

    
58
    private static final Logger logger = Logger.getLogger(TreeNodeDropAdapterE4.class);
59

    
60
    private TaxonNavigatorE4 taxonNavigator;
61
    UpdateResult result;
62

    
63
	public static final String ID = "eu.etaxonomy.taxeditor.navigation.navigator.dropassistant"; //$NON-NLS-1$
64

    
65
	private static final EnumSet<CRUD> UPDATE = EnumSet.of(CRUD.UPDATE);
66

    
67
	public enum MovingType{
68
	    CHILD, PREVIOUS, BEHIND
69
	}
70

    
71
	protected TreeNodeDropAdapterE4(TaxonNavigatorE4 navigator) {
72
	    super(navigator.getViewer());
73
	    this.taxonNavigator = navigator;
74
	}
75

    
76
	/** {@inheritDoc} */
77
	@Override
78
	public boolean performDrop(Object data) {
79
        Object target = getCurrentTarget();
80
		if (getCurrentTarget() instanceof TaxonNodeDto) {
81
			Set<TaxonNodeDto> taxonNodes = getSelectedTaxa();
82
			TaxonNodeDto targetTreeNode = (TaxonNodeDto) target;
83
//			if (targetTreeNode.getType() != null && targetTreeNode.getType().equals(Classification.class)){
84
//				targetTreeNode = ((Classification)targetTreeNode).getRootNode();
85
//				targetTreeNode = HibernateProxyHelper.deproxy(targetTreeNode, TaxonNode.class);
86
//			}
87
			if(taxonNodes != null) {
88
//				if (taxonNodes.size() == 1){
89
				    boolean success = moveTaxon(taxonNodes, targetTreeNode);
90
				    if (success){
91
				        taxonNavigator.refresh();
92
				     }
93
					return success;
94
//				} else{
95
//					if( MessageDialog.openConfirm(null, Messages.TreeNodeDropAdapter_MOVING, Messages.TreeNodeDropAdapter_MOVING_MESSAGE)){
96
//						return true;
97
//					}
98
//				}
99
            }
100
		}
101
		return false;
102
	}
103

    
104
	private Set<TaxonNodeDto> getSelectedTaxa(){
105
		HashSet<TaxonNodeDto> taxonNodes = new HashSet();
106

    
107
		ISelection selection = LocalSelectionTransfer.getTransfer().getSelection();
108
		if (selection instanceof TreeSelection) {
109

    
110
			Iterator<?> selectionIterator = ((TreeSelection) selection).iterator();
111

    
112
			while (selectionIterator.hasNext()){
113
				Object object = selectionIterator.next();
114
				if(object instanceof TaxonNodeDto){
115
					TaxonNodeDto taxonNode = (TaxonNodeDto) object;
116
					taxonNodes.add(taxonNode);
117
				}
118
			}
119
		}
120
		return taxonNodes;
121
	}
122

    
123
	/** {@inheritDoc} */
124
	@Override
125
	public boolean validateDrop(Object target, int operation,
126
			TransferData transferType) {
127

    
128
		if (target instanceof TaxonNodeDto) {
129

    
130
		    // check users permissions with target taxonnode and taxon
131
		    if (target instanceof TaxonNodeDto) {
132
		        TaxonNodeDto targetNode = (TaxonNodeDto)target;
133
		        TaxonNode node = CdmStore.getService(ITaxonNodeService.class).load(targetNode.getUuid());
134
		        boolean hasTargetNodePermission = CdmStore.currentAuthentiationHasPermission(node, UPDATE);
135
		        boolean hasTargetTaxonPermission = node.getTaxon() == null ?
136
		        			true :
137
		        			CdmStore.currentAuthentiationHasPermission(node.getTaxon(), UPDATE);
138

    
139
		        if(!hasTargetNodePermission || ! hasTargetNodePermission){
140
		            if(logger.isDebugEnabled()){
141
		                logger.debug("CANCEL_STATUS for target node: " + hasTargetNodePermission + " " + hasTargetTaxonPermission + " "); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
142
		            }
143
		            return false;
144
		        }
145
		    }
146

    
147
		    // do not allow to drop onto itself and
148
		    // check users permissions with all selected taxon nodes and taxa
149
		    for(TaxonNodeDto taxonNode : getSelectedTaxa()){
150
			    if (logger.isDebugEnabled()){
151
			    	logger.debug("selectedTaxa: " + taxonNode.getTaxonUuid() == null? "-" : taxonNode.getTitleCache()); //$NON-NLS-1$
152
			    }
153
			    boolean isClassification = taxonNode.getTaxonUuid()== null;
154
			    if (isClassification) {
155
	                    if(logger.isDebugEnabled()){
156
	                        logger.debug("CANCEL_STATUS for selected classification " + taxonNode.getClassificationUUID()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
157
	                    }
158
	                    return false;
159
	                }
160
			    boolean isSameTaxonNode = taxonNode.equals(target);
161
			    TaxonNode node = CdmStore.getService(ITaxonNodeService.class).load(taxonNode.getUuid());
162
				boolean hasTaxonNodePermission = CdmStore.currentAuthentiationHasPermission(node, UPDATE);
163

    
164
				boolean hasTaxonPermission =
165
	        			CdmStore.currentAuthentiationHasPermission(node.getTaxon(), UPDATE);CdmStore.currentAuthentiationHasPermission(node.getTaxon(), UPDATE);
166
                if (
167
			        isSameTaxonNode
168
			        || !hasTaxonNodePermission
169
    	            || !hasTaxonPermission
170
    	            ) {
171
                    if(logger.isDebugEnabled()){
172
                        logger.debug("CANCEL_STATUS for selected  " + isSameTaxonNode + Messages.TreeNodeDropAdapter_10 + hasTaxonNodePermission + " " + hasTaxonPermission + " "); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
173
                    }
174
					return false;
175
				}
176
			}
177
			logger.debug("OK_STATUS"); //$NON-NLS-1$
178
			return true;
179
		}
180
		logger.debug("CANCEL_STATUS"); //$NON-NLS-1$
181
		return false;
182
	}
183

    
184

    
185
	private boolean moveTaxon(Set<TaxonNodeDto> taxonNodes, TaxonNodeDto targetITaxonTreeNode) {
186
		Iterator<TaxonNodeDto> taxIterator = taxonNodes.iterator();
187
        Set<UUID> uuids = new HashSet<UUID>();
188
        TaxonNodeDto node = null;
189
        while(taxIterator.hasNext()){
190
            node = taxIterator.next();
191
            uuids.add(node.getUuid());
192
        }
193
        IUndoContext workspaceUndoContext = taxonNavigator.getUndoContext();
194
         int movingTypeInt = 0;
195
		if (!PreferencesUtil.getSortNodesNaturally()){
196
//			if (workspaceUndoContext == null) {
197
//				logger.error("Workspace undo context is null. DND operation cancelled"); //$NON-NLS-1$
198
//				return false;
199
//			}
200
//			result =CdmStore.getService(ITaxonNodeService.class).moveTaxonNodes(uuids,targetITaxonTreeNode.getUuid(), 0);
201
//
202
//			logger.info("Moved taxa to new parent " + targetITaxonTreeNode); //$NON-NLS-1$
203
//			return true;
204
		}else{
205
			String[] buttonLables = {TREE_NODE_DROP_ADAPTER_CHILD, TREE_NODE_DROP_ADAPTER_BEHIND,TREE_NODE_DROP_ADAPTER_CANCEL};
206
			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);
207
			dialog.open();
208
			int returnCode = dialog.getReturnCode();
209

    
210
			if (returnCode == 0){
211
				if (workspaceUndoContext == null) {
212
					logger.error("Workspace undo context is null. DND operation cancelled"); //$NON-NLS-1$
213
					return false;
214
				}
215

    
216
//				result = CdmStore.getService(ITaxonNodeService.class).moveTaxonNodes(uuids,targetITaxonTreeNode.getUuid(), 0);
217
//
218
//				logger.info("Moved taxa to new parent " + targetITaxonTreeNode); //$NON-NLS-1$
219
//				return true;
220
			}else if (returnCode == 1){
221
				if (workspaceUndoContext == null) {
222
					logger.error("Workspace undo context is null. DND operation cancelled"); //$NON-NLS-1$
223
					return false;
224
				}
225

    
226
				movingTypeInt = 2;
227
//				CdmStore.getService(ITaxonNodeService.class).moveTaxonNodes(uuids,targetITaxonTreeNode.getUuid(), 2);
228
//				logger.info("Moved taxa to new parent " + targetITaxonTreeNode); //$NON-NLS-1$
229
//				return true;
230
			}
231
//			} else if (returnCode == 2){
232
//                IUndoContext workspaceUndoContext = NavigationUtil.getWorkbenchUndoContext();
233
//                if (workspaceUndoContext == null) {
234
//                    logger.error("Workspace undo context is null. DND operation cancelled");
235
//                    return false;
236
//                }
237
//                TaxonNode targetNode = (TaxonNode) targetITaxonTreeNode;
238
//
239
//                AbstractPostOperation operation = new MoveTaxonOperation
240
//                        ("Move Taxon", workspaceUndoContext, uuids, targetNode, this, taxonNavigator, MovingType.BEHIND);
241
//                NavigationUtil.executeOperation(operation);
242
//
243
//                logger.info("Moved taxa to new parent " + targetITaxonTreeNode);
244
//                return true;
245
//            }
246
				else{
247
				return false;
248
			}
249

    
250

    
251
		}
252
		moveNodes(uuids, targetITaxonTreeNode.getUuid(), movingTypeInt);
253
        return true;
254
	}
255

    
256
	private void moveNodes(Set<UUID> taxonNodesToMoveUuid, UUID newParentTreeNodeUuid, int movingTypeInt){
257
	    UUID uuid = CdmApplicationState.getLongRunningTasksService().monitLongRunningTask(taxonNodesToMoveUuid,
258
                newParentTreeNodeUuid, movingTypeInt);
259

    
260
                Display.getDefault().asyncExec(new Runnable() {
261
                    @Override
262
                    public void run() {
263
                        AbstractUtility.executeMoniteredOperation("Move Taxon to new parent: ",
264
                                uuid,
265
                                1000,
266
                                false,
267
                                TreeNodeDropAdapterE4.this,
268
                                null);
269
                    }
270
                });
271
	}
272

    
273

    
274
	@Override
275
	public void dragOver(DropTargetEvent event) {
276
		super.dragOver(event);
277
		event.feedback = DND.FEEDBACK_SELECT | DND.FEEDBACK_INSERT_AFTER;
278
	}
279

    
280
    /**
281
     * {@inheritDoc}
282
     */
283
    @Override
284
    public void postOperation(IRemotingProgressMonitor monitor) {
285
        taxonNavigator.refresh();
286
    }
287

    
288
}
(6-6/6)