X-Git-Url: https://dev.e-taxonomy.eu/gitweb/taxeditor.git/blobdiff_plain/1e2ff9ee581e9129435098e4453f9aa2fd70b3e9..025f3eb9f8936553e442641114182184722eeb8a:/eu.etaxonomy.taxeditor.navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/navigator/TreeNodeDropAdapterAssistant.java diff --git a/eu.etaxonomy.taxeditor.navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/navigator/TreeNodeDropAdapterAssistant.java b/eu.etaxonomy.taxeditor.navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/navigator/TreeNodeDropAdapterAssistant.java index dd7c51520..842f9a8c6 100644 --- a/eu.etaxonomy.taxeditor.navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/navigator/TreeNodeDropAdapterAssistant.java +++ b/eu.etaxonomy.taxeditor.navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/navigator/TreeNodeDropAdapterAssistant.java @@ -10,11 +10,14 @@ package eu.etaxonomy.taxeditor.navigation.navigator; +import java.util.EnumSet; import java.util.HashSet; import java.util.Iterator; import java.util.Set; +import java.util.UUID; import org.apache.log4j.Logger; +import org.eclipse.core.commands.operations.AbstractOperation; import org.eclipse.core.commands.operations.IUndoContext; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; @@ -27,13 +30,19 @@ import org.eclipse.swt.dnd.TransferData; import org.eclipse.ui.navigator.CommonDropAdapter; import org.eclipse.ui.navigator.CommonDropAdapterAssistant; +import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper; import eu.etaxonomy.cdm.model.common.CdmBase; +import eu.etaxonomy.cdm.model.taxon.Classification; import eu.etaxonomy.cdm.model.taxon.ITaxonTreeNode; import eu.etaxonomy.cdm.model.taxon.TaxonNode; +import eu.etaxonomy.cdm.persistence.hibernate.permission.CRUD; import eu.etaxonomy.taxeditor.navigation.NavigationUtil; import eu.etaxonomy.taxeditor.navigation.navigator.operation.MoveTaxonOperation; +import eu.etaxonomy.taxeditor.navigation.navigator.operation.RemotingMoveTaxonOperation; import eu.etaxonomy.taxeditor.operation.AbstractPostOperation; import eu.etaxonomy.taxeditor.operation.IPostOperationEnabled; +import eu.etaxonomy.taxeditor.preference.PreferencesUtil; +import eu.etaxonomy.taxeditor.store.CdmStore; /** *

TaxonNodeDropAdapterAssistant class.

@@ -42,13 +51,15 @@ import eu.etaxonomy.taxeditor.operation.IPostOperationEnabled; * @created 03.06.2009 * @version 1.0 */ -public class TreeNodeDropAdapterAssistant extends CommonDropAdapterAssistant implements IPostOperationEnabled{ - private static final Logger logger = Logger - .getLogger(TreeNodeDropAdapterAssistant.class); +public class TreeNodeDropAdapterAssistant extends CommonDropAdapterAssistant implements IPostOperationEnabled { + + private static final Logger logger = Logger.getLogger(TreeNodeDropAdapterAssistant.class); /** Constant ID="eu.etaxonomy.taxeditor.navigation.navig"{trunked} */ public static final String ID = "eu.etaxonomy.taxeditor.navigation.navigator.dropassistant"; //$NON-NLS-1$ + private static final EnumSet UPDATE = EnumSet.of(CRUD.UPDATE); + /* (non-Javadoc) * @see org.eclipse.ui.navigator.CommonDropAdapterAssistant#handleDrop(org.eclipse.ui.navigator.CommonDropAdapter, org.eclipse.swt.dnd.DropTargetEvent, java.lang.Object) */ @@ -57,11 +68,22 @@ public class TreeNodeDropAdapterAssistant extends CommonDropAdapterAssistant imp public IStatus handleDrop(CommonDropAdapter dropAdapter, DropTargetEvent dropTargetEvent, Object target) { + if (target instanceof ITaxonTreeNode) { Set taxonNodes = getSelectedTaxa(); ITaxonTreeNode targetTreeNode = (ITaxonTreeNode) target; - if(taxonNodes != null) { - return moveTaxon(taxonNodes, targetTreeNode); + if (targetTreeNode instanceof Classification){ + targetTreeNode = ((Classification)targetTreeNode).getRootNode(); + targetTreeNode = HibernateProxyHelper.deproxy(targetTreeNode, TaxonNode.class); + } + //if(taxonNodes != null) { + if (taxonNodes.size() >= 1){ + return moveTaxon(taxonNodes, targetTreeNode); + /*} else{ + if( MessageDialog.openConfirm(null, "Moving taxon", "The operation move accepted taxon to other parent is available only for a single taxon.")){ + return null; + } + }*/ } } @@ -95,14 +117,47 @@ public class TreeNodeDropAdapterAssistant extends CommonDropAdapterAssistant imp public IStatus validateDrop(Object target, int operation, TransferData transferType) { if (target instanceof ITaxonTreeNode) { - // do not allow to drop onto itself - for(TaxonNode taxonNode : getSelectedTaxa()){ - if (taxonNode.equals(target)) { + + // check users permissions with target taxonnode and taxon + if (target instanceof TaxonNode) { + TaxonNode targetNode = (TaxonNode)target; + Boolean hasTargetNodePermission = CdmStore.currentAuthentiationHasPermission(targetNode, UPDATE); + Boolean hasTargetTaxonPermission = CdmStore.currentAuthentiationHasPermission(targetNode.getTaxon(), UPDATE); + + if(logger.isDebugEnabled()){ + logger.debug("target: " + targetNode.getTaxon().getTitleCache()); + } + + if(!hasTargetNodePermission || ! hasTargetNodePermission){ + if(logger.isDebugEnabled()){ + logger.debug("CANCEL_STATUS for target node: " + hasTargetNodePermission.toString() + " " + hasTargetTaxonPermission.toString() + " "); + } + return Status.CANCEL_STATUS; + } + } + + // do not allow to drop onto itself and + // check users permissions with all selected taxon nodes and taxa + for(TaxonNode taxonNode : getSelectedTaxa()){ + logger.debug("selectedTaxa: " + taxonNode.getTaxon().getTitleCache()); + Boolean isSameTaxonNode = taxonNode.equals(target); + Boolean hasTaxonNodePermission = CdmStore.currentAuthentiationHasPermission(taxonNode, UPDATE); + Boolean hasTaxonPermission = CdmStore.currentAuthentiationHasPermission(taxonNode.getTaxon(), UPDATE); + if ( + isSameTaxonNode + || !hasTaxonNodePermission + || !hasTaxonPermission + ) { + if(logger.isDebugEnabled()){ + logger.debug("CANCEL_STATUS for selected " + isSameTaxonNode.toString() + " " + hasTaxonNodePermission.toString() + " " + hasTaxonPermission.toString() + " "); + } return Status.CANCEL_STATUS; } } + logger.debug("OK_STATUS"); return Status.OK_STATUS; } + logger.debug("CANCEL_STATUS"); return Status.CANCEL_STATUS; } @@ -120,47 +175,86 @@ public class TreeNodeDropAdapterAssistant extends CommonDropAdapterAssistant imp if(targetITaxonTreeNode instanceof TaxonNode){ TaxonNode targetTaxonNode = (TaxonNode) targetITaxonTreeNode; - -// for(TaxonNode taxonNode : taxonNodes){ -// if (taxonNode.equals(targetTaxonNode)) { -// return Status.CANCEL_STATUS; -// } -// } - - // Make sure parent taxon does not have unsaved changes + // Make sure parent taxon does not have unsaved changes if (NavigationUtil.isDirty(targetTaxonNode)){ MessageDialog.openWarning(NavigationUtil.getShell(), "Unsaved Parent Taxon", "There are unsaved " + "changes in the parent taxon. Pleas save first."); return Status.CANCEL_STATUS; } + } + Iterator taxIterator = taxonNodes.iterator(); + Set uuids = new HashSet(); + TaxonNode node = null; + while(taxIterator.hasNext()){ + node = taxIterator.next(); + uuids.add(node.getUuid()); + } + if (!PreferencesUtil.getSortNodesNaturally()){ + IUndoContext workspaceUndoContext = NavigationUtil.getWorkbenchUndoContext(); + if (workspaceUndoContext == null) { + logger.error("Workspace undo context is null. DND operation cancelled"); + return Status.CANCEL_STATUS; + } - // Make sure parentTaxon is not the drop target -// if (!childTaxonNode.isTopmostNode() && childTaxonNode.getParent().equals(targetTaxonNode)){ -// return Status.CANCEL_STATUS; -// } + if(CdmStore.getCurrentSessionManager().isRemoting()) { + AbstractOperation operation = new RemotingMoveTaxonOperation(taxonNavigator, false, uuids, (TaxonNode)targetITaxonTreeNode, true); + NavigationUtil.executeOperation(operation, null); + } else { + AbstractPostOperation operation = new MoveTaxonOperation + ("Move Taxon", workspaceUndoContext, uuids, targetITaxonTreeNode, this, taxonNavigator, true); + NavigationUtil.executeOperation(operation); + } - // Make sure taxon is not being dropped onto itself -// if (childTaxonNode.equals(targetTaxonNode)) { -// return Status.CANCEL_STATUS; -// } + logger.info("Moved taxa to new parent " + targetITaxonTreeNode); + return Status.OK_STATUS; + }else{ + String[] buttonLables = {"Parent", "Predecessor", "Cancel"}; + MessageDialog dialog = new MessageDialog(null, "Target node", null, "Do you want to use the target node as parent or do you want to move the taxon below the target.", MessageDialog.QUESTION_WITH_CANCEL, buttonLables, 0); + dialog.open(); + int returnCode = dialog.getReturnCode(); + if (returnCode == 0){ + IUndoContext workspaceUndoContext = NavigationUtil.getWorkbenchUndoContext(); + if (workspaceUndoContext == null) { + logger.error("Workspace undo context is null. DND operation cancelled"); + return Status.CANCEL_STATUS; + } + if(CdmStore.getCurrentSessionManager().isRemoting()) { + AbstractOperation operation = new RemotingMoveTaxonOperation(taxonNavigator, false, uuids, (TaxonNode)targetITaxonTreeNode, true); + NavigationUtil.executeOperation(operation, null); + } else { + AbstractPostOperation operation = new MoveTaxonOperation + ("Move Taxon", workspaceUndoContext, uuids, targetITaxonTreeNode, this, taxonNavigator, true); + NavigationUtil.executeOperation(operation); + } + logger.info("Moved taxa to new parent " + targetITaxonTreeNode); + return Status.OK_STATUS; + }else if (returnCode == 1){ + IUndoContext workspaceUndoContext = NavigationUtil.getWorkbenchUndoContext(); + if (workspaceUndoContext == null) { + logger.error("Workspace undo context is null. DND operation cancelled"); + return Status.CANCEL_STATUS; + } + TaxonNode targetNode = (TaxonNode) targetITaxonTreeNode; + + if(CdmStore.getCurrentSessionManager().isRemoting()) { + AbstractOperation operation = new RemotingMoveTaxonOperation(taxonNavigator, false, uuids, targetNode.getParent(), true); + NavigationUtil.executeOperation(operation, null); + } else { + AbstractPostOperation operation = new MoveTaxonOperation + ("Move Taxon", workspaceUndoContext, uuids, targetNode.getParent(), this, taxonNavigator, false); + NavigationUtil.executeOperation(operation); + } + logger.info("Moved taxa to new parent " + targetITaxonTreeNode); + return Status.OK_STATUS; + } else{ + return Status.CANCEL_STATUS; + } - } - IUndoContext workspaceUndoContext = NavigationUtil.getWorkbenchUndoContext(); - if (workspaceUndoContext == null) { - logger.error("Workspace undo context is null. DND operation cancelled"); - return Status.CANCEL_STATUS; } - - AbstractPostOperation operation = new MoveTaxonOperation - ("Move Taxon", workspaceUndoContext, taxonNodes, targetITaxonTreeNode, this, taxonNavigator); - NavigationUtil.executeOperation(operation); - - logger.info("Moved taxa to new parent " + targetITaxonTreeNode); - return Status.OK_STATUS; } /* (non-Javadoc) @@ -182,4 +276,5 @@ public class TreeNodeDropAdapterAssistant extends CommonDropAdapterAssistant imp // TODO Auto-generated method stub return false; } + }