2 * Copyright (C) 2015 EDIT
3 * European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
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.
10 package eu
.etaxonomy
.taxeditor
.navigation
.navigator
;
12 import java
.util
.EnumSet
;
13 import java
.util
.HashSet
;
14 import java
.util
.Iterator
;
17 import org
.apache
.log4j
.Logger
;
18 import org
.eclipse
.jface
.dialogs
.MessageDialog
;
19 import org
.eclipse
.jface
.util
.LocalSelectionTransfer
;
20 import org
.eclipse
.jface
.viewers
.ISelection
;
21 import org
.eclipse
.jface
.viewers
.TreeSelection
;
22 import org
.eclipse
.jface
.viewers
.ViewerDropAdapter
;
23 import org
.eclipse
.swt
.dnd
.DND
;
24 import org
.eclipse
.swt
.dnd
.DropTargetEvent
;
25 import org
.eclipse
.swt
.dnd
.TransferData
;
27 import eu
.etaxonomy
.cdm
.hibernate
.HibernateProxyHelper
;
28 import eu
.etaxonomy
.cdm
.model
.common
.CdmBase
;
29 import eu
.etaxonomy
.cdm
.model
.taxon
.Classification
;
30 import eu
.etaxonomy
.cdm
.model
.taxon
.ITaxonTreeNode
;
31 import eu
.etaxonomy
.cdm
.model
.taxon
.TaxonNode
;
32 import eu
.etaxonomy
.cdm
.persistence
.hibernate
.permission
.CRUD
;
33 import eu
.etaxonomy
.taxeditor
.navigation
.l10n
.Messages
;
34 import eu
.etaxonomy
.taxeditor
.operation
.IPostOperationEnabled
;
35 import eu
.etaxonomy
.taxeditor
.store
.CdmStore
;
38 * <p>TreeNodeDropAdapter class.</p>
43 public class TreeNodeDropAdapter
extends ViewerDropAdapter
implements IPostOperationEnabled
{
45 protected static final String TREE_NODE_DROP_ADAPTER_UNSAVED_PARENT_MESSAGE
= Messages
.TreeNodeDropAdapter_UNSAVED_PARENT_MESSAGE
;
46 protected static final String TREE_NODE_DROP_ADAPTER_UNSAVED_PARENT
= Messages
.TreeNodeDropAdapter_UNSAVED_PARENT
;
47 protected static final String TREE_NODE_DROP_ADAPTER_MOVE_TAXON
= Messages
.TreeNodeDropAdapter_MOVE_TAXON
;
48 protected static final String TREE_NODE_DROP_ADAPTER_CANCEL
= Messages
.TreeNodeDropAdapter_CANCEL
;
49 protected static final String TREE_NODE_DROP_ADAPTER_BEHIND
= Messages
.TreeNodeDropAdapter_BEHIND
;
50 protected static final String TREE_NODE_DROP_ADAPTER_CHILD
= Messages
.TreeNodeDropAdapter_CHILD
;
51 protected static final String DO_YOU_WANT_TO_MOVE_THE_TAXONNODE_AS_CHILD_OR_BEHIND_THE_TARGET_NODE
= Messages
.TreeNodeDropAdapter_MOVE_BEHIND
;
52 protected static final String TARGET_NODE
= Messages
.TreeNodeDropAdapter_TARGET_NODE
;
54 private static final Logger logger
= Logger
.getLogger(TreeNodeDropAdapter
.class);
56 private final TaxonNavigatorViewer navigatorViewer
;
61 protected TreeNodeDropAdapter(TaxonNavigatorViewer navigatorViewer
) {
62 super(navigatorViewer
);
63 this.navigatorViewer
= navigatorViewer
;
67 /** Constant <code>ID="eu.etaxonomy.taxeditor.navigation.navig"{trunked}</code> */
68 public static final String ID
= "eu.etaxonomy.taxeditor.navigation.navigator.dropassistant"; //$NON-NLS-1$
70 private static final EnumSet
<CRUD
> UPDATE
= EnumSet
.of(CRUD
.UPDATE
);
72 public enum MovingType
{
73 CHILD
, PREVIOUS
, BEHIND
79 public boolean performDrop(Object target
) {
82 if (target
instanceof ITaxonTreeNode
) {
83 Set
<TaxonNode
> taxonNodes
= getSelectedTaxa();
84 ITaxonTreeNode targetTreeNode
= (ITaxonTreeNode
) target
;
85 if (targetTreeNode
instanceof Classification
){
86 targetTreeNode
= ((Classification
)targetTreeNode
).getRootNode();
87 targetTreeNode
= HibernateProxyHelper
.deproxy(targetTreeNode
, TaxonNode
.class);
89 if(taxonNodes
!= null) {
90 if (taxonNodes
.size() == 1){
91 return moveTaxon(taxonNodes
, targetTreeNode
);
93 if( MessageDialog
.openConfirm(null, Messages
.TreeNodeDropAdapter_MOVING
, Messages
.TreeNodeDropAdapter_MOVING_MESSAGE
)){
103 private Set
<TaxonNode
> getSelectedTaxa(){
104 HashSet
<TaxonNode
> taxonNodes
= new HashSet
<TaxonNode
>();
106 ISelection selection
= LocalSelectionTransfer
.getTransfer().getSelection();
107 if (selection
instanceof TreeSelection
) {
109 Iterator
<?
> selectionIterator
= ((TreeSelection
) selection
).iterator();
111 while (selectionIterator
.hasNext()){
112 Object object
= selectionIterator
.next();
113 if(object
instanceof TaxonNode
){
114 TaxonNode taxonNode
= (TaxonNode
) object
;
115 taxonNodes
.add(taxonNode
);
119 return taxonNodes
.size() > 0 ? taxonNodes
: null;
124 public boolean validateDrop(Object target
, int operation
,
125 TransferData transferType
) {
127 if (target
instanceof ITaxonTreeNode
) {
129 // check users permissions with target taxonnode and taxon
130 if (target
instanceof TaxonNode
) {
131 TaxonNode targetNode
= (TaxonNode
)target
;
132 boolean hasTargetNodePermission
= CdmStore
.currentAuthentiationHasPermission(targetNode
, UPDATE
);
133 boolean hasTargetTaxonPermission
= targetNode
.getTaxon() == null ?
135 CdmStore
.currentAuthentiationHasPermission(targetNode
.getTaxon(), UPDATE
);
137 if(logger
.isDebugEnabled()){
138 logger
.debug("target: " + targetNode
.getTaxon() == null?
"-" : targetNode
.getTaxon().getTitleCache()); //$NON-NLS-1$
141 if(!hasTargetNodePermission
|| ! hasTargetNodePermission
){
142 if(logger
.isDebugEnabled()){
143 logger
.debug("CANCEL_STATUS for target node: " + hasTargetNodePermission
+ " " + hasTargetTaxonPermission
+ " "); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
149 // do not allow to drop onto itself and
150 // check users permissions with all selected taxon nodes and taxa
151 for(TaxonNode taxonNode
: getSelectedTaxa()){
152 if (logger
.isDebugEnabled()){
153 logger
.debug("selectedTaxa: " + taxonNode
.getTaxon() == null?
"-" : taxonNode
.getTaxon().getTitleCache()); //$NON-NLS-1$
155 boolean isSameTaxonNode
= taxonNode
.equals(target
);
156 boolean hasTaxonNodePermission
= CdmStore
.currentAuthentiationHasPermission(taxonNode
, UPDATE
);
157 boolean hasTaxonPermission
= taxonNode
.getTaxon() == null ?
159 CdmStore
.currentAuthentiationHasPermission(taxonNode
.getTaxon(), UPDATE
);CdmStore
.currentAuthentiationHasPermission(taxonNode
.getTaxon(), UPDATE
);
162 || !hasTaxonNodePermission
163 || !hasTaxonPermission
165 if(logger
.isDebugEnabled()){
166 logger
.debug("CANCEL_STATUS for selected " + isSameTaxonNode
+ Messages
.TreeNodeDropAdapter_10
+ hasTaxonNodePermission
+ " " + hasTaxonPermission
+ " "); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
171 logger
.debug("OK_STATUS"); //$NON-NLS-1$
174 logger
.debug("CANCEL_STATUS"); //$NON-NLS-1$
180 * @param childTaxonNode
184 private boolean moveTaxon(Set
<TaxonNode
> taxonNodes
, ITaxonTreeNode targetITaxonTreeNode
) {
186 // TaxonNavigator taxonNavigator;
187 // taxonNavigator = (TaxonNavigator) NavigationUtil.showView(TaxonNavigator.ID);
189 // if(targetITaxonTreeNode instanceof TaxonNode){
191 // TaxonNode targetTaxonNode = (TaxonNode) targetITaxonTreeNode;
192 // // Make sure parent taxon does not have unsaved changes
193 //// if (NavigationUtil.isDirty(targetTaxonNode)){
194 //// MessageDialog.openWarning(NavigationUtil.getShell(), TREE_NODE_DROP_ADAPTER_UNSAVED_PARENT, TREE_NODE_DROP_ADAPTER_UNSAVED_PARENT_MESSAGE);
199 // Iterator<TaxonNode> taxIterator = taxonNodes.iterator();
200 // Set<UUID> uuids = new HashSet<UUID>();
201 // TaxonNode node = null;
202 // while(taxIterator.hasNext()){
203 // node = taxIterator.next();
204 // uuids.add(node.getUuid());
206 // if (!PreferencesUtil.getSortNodesNaturally()){
207 // IUndoContext workspaceUndoContext = NavigationUtil.getWorkbenchUndoContext();
208 // if (workspaceUndoContext == null) {
209 // logger.error("Workspace undo context is null. DND operation cancelled"); //$NON-NLS-1$
213 // AbstractPostOperation<?> operation = new MoveTaxonOperation
214 // (TREE_NODE_DROP_ADAPTER_MOVE_TAXON, workspaceUndoContext, uuids, targetITaxonTreeNode, this, taxonNavigator, MovingType.CHILD);
215 // NavigationUtil.executeOperation(operation);
217 // logger.info("Moved taxa to new parent " + targetITaxonTreeNode); //$NON-NLS-1$
220 // String[] buttonLables = {TREE_NODE_DROP_ADAPTER_CHILD, TREE_NODE_DROP_ADAPTER_BEHIND,TREE_NODE_DROP_ADAPTER_CANCEL};
221 // 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);
223 // int returnCode = dialog.getReturnCode();
224 // if (returnCode == 0){
225 // IUndoContext workspaceUndoContext = NavigationUtil.getWorkbenchUndoContext();
226 // if (workspaceUndoContext == null) {
227 // logger.error("Workspace undo context is null. DND operation cancelled"); //$NON-NLS-1$
231 // AbstractPostOperation<?> operation = new MoveTaxonOperation
232 // (TREE_NODE_DROP_ADAPTER_MOVE_TAXON, workspaceUndoContext, uuids, targetITaxonTreeNode, this, taxonNavigator, MovingType.CHILD);
233 // NavigationUtil.executeOperation(operation);
235 // logger.info("Moved taxa to new parent " + targetITaxonTreeNode); //$NON-NLS-1$
237 // }else if (returnCode == 1){
238 // IUndoContext workspaceUndoContext = NavigationUtil.getWorkbenchUndoContext();
239 // if (workspaceUndoContext == null) {
240 // logger.error("Workspace undo context is null. DND operation cancelled"); //$NON-NLS-1$
243 // TaxonNode targetNode = (TaxonNode) targetITaxonTreeNode;
245 // AbstractPostOperation<?> operation = new MoveTaxonOperation
246 // (TREE_NODE_DROP_ADAPTER_MOVE_TAXON, workspaceUndoContext, uuids, targetNode, this, taxonNavigator, MovingType.PREVIOUS);
247 // NavigationUtil.executeOperation(operation);
249 // logger.info("Moved taxa to new parent " + targetITaxonTreeNode); //$NON-NLS-1$
252 //// } else if (returnCode == 2){
253 //// IUndoContext workspaceUndoContext = NavigationUtil.getWorkbenchUndoContext();
254 //// if (workspaceUndoContext == null) {
255 //// logger.error("Workspace undo context is null. DND operation cancelled");
258 //// TaxonNode targetNode = (TaxonNode) targetITaxonTreeNode;
260 //// AbstractPostOperation operation = new MoveTaxonOperation
261 //// ("Move Taxon", workspaceUndoContext, uuids, targetNode, this, taxonNavigator, MovingType.BEHIND);
262 //// NavigationUtil.executeOperation(operation);
264 //// logger.info("Moved taxa to new parent " + targetITaxonTreeNode);
277 public boolean postOperation(CdmBase objectAffectedByOperation
) {
287 public boolean onComplete() {
288 // TODO Auto-generated method stub
292 public void dragOver(DropTargetEvent event
) {
293 super.dragOver(event
);
294 event
.feedback
= DND
.FEEDBACK_SELECT
| DND
.FEEDBACK_INSERT_AFTER
;