ref #6595 Use only e4 handler for opening name editor
[taxeditor.git] / eu.etaxonomy.taxeditor.navigation / src / main / java / eu / etaxonomy / taxeditor / navigation / navigator / handler / DeleteHandler.java
index a1a4425b55e1db569150557e442d51257c639d67..bafa4430c5b5ce39fd0e4e38ba4bcee950a9dfeb 100644 (file)
@@ -1,4 +1,3 @@
-// $Id$
 /**
 * Copyright (C) 2007 EDIT
 * European Distributed Institute of Taxonomy
@@ -17,10 +16,7 @@ import java.util.Set;
 import org.eclipse.core.commands.AbstractHandler;
 import org.eclipse.core.commands.ExecutionEvent;
 import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.commands.IHandler;
 import org.eclipse.core.commands.common.NotDefinedException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
 import org.eclipse.jface.dialogs.MessageDialog;
 import org.eclipse.jface.viewers.TreeSelection;
 import org.eclipse.ui.IEditorInput;
@@ -29,13 +25,21 @@ import org.eclipse.ui.IWorkbenchPage;
 import org.eclipse.ui.PartInitException;
 import org.eclipse.ui.handlers.HandlerUtil;
 
+import eu.etaxonomy.cdm.api.service.config.NodeDeletionConfigurator.ChildHandling;
+import eu.etaxonomy.cdm.api.service.config.TaxonDeletionConfigurator;
+import eu.etaxonomy.cdm.api.service.config.TaxonNodeDeletionConfigurator;
+import eu.etaxonomy.cdm.model.common.ITreeNode;
+import eu.etaxonomy.cdm.model.taxon.Classification;
 import eu.etaxonomy.cdm.model.taxon.ITaxonTreeNode;
 import eu.etaxonomy.cdm.model.taxon.TaxonNode;
 import eu.etaxonomy.taxeditor.editor.TaxonEditorInput;
+import eu.etaxonomy.taxeditor.model.MessagingUtils;
 import eu.etaxonomy.taxeditor.navigation.NavigationUtil;
+import eu.etaxonomy.taxeditor.navigation.l10n.Messages;
 import eu.etaxonomy.taxeditor.navigation.navigator.TaxonNavigator;
 import eu.etaxonomy.taxeditor.navigation.navigator.operation.DeleteOperation;
 import eu.etaxonomy.taxeditor.operation.AbstractPostOperation;
+import eu.etaxonomy.taxeditor.ui.dialog.configurator.deleteConfigurator.DeleteConfiguratorDialog;
 
 /**
  * <p>DeleteTreeNodeHandler class.</p>
@@ -44,10 +48,19 @@ import eu.etaxonomy.taxeditor.operation.AbstractPostOperation;
  * @created 06.04.2009
  * @version 1.0
  */
-public class DeleteHandler extends AbstractHandler implements IHandler{
+public class DeleteHandler extends AbstractHandler{
 
-       private IWorkbenchPage activePage;
-       private TaxonNavigator taxonNavigator;
+    protected static final String SKIP = Messages.DeleteHandler_SKIP;
+    protected static final String MOVE_CHILDREN_TO_PARENT_NODE = Messages.DeleteHandler_MOVE_TO_PARENT;
+    protected static final String DELETE_ALL_CHILDREN = Messages.DeleteHandler_DELETE_ALL;
+    protected static final String THERE_ARE_CHILDNODES_WHICH_WILL_BE_DELETED_TOO = Messages.DeleteHandler_THERE_ARE_CHILDNODES;
+    protected static final String THE_TREE_HAS_CHILDREN_THEY_WILL_BE_DELETED_TOO = Messages.DeleteHandler_THERE_ARE_CHILDREN;
+    protected static final String DO_YOU_REALLY_WANT_TO_DELETE_THE_SELECTED_NODE_S = Messages.DeleteHandler_DELETE_NODE;
+    protected static final String DO_YOU_REALLY_WANT_TO_DELETE_THE_CLASSIFICATION = Messages.DeleteHandler_DELETE_CLASSIFICATION;
+    protected static final String CONFIRM_DELETION = Messages.DeleteHandler_CONFIRM_DELETE;
+
+    protected IWorkbenchPage activePage;
+       protected TaxonNavigator taxonNavigator;
 
        /** {@inheritDoc} */
        @Override
@@ -59,11 +72,10 @@ public class DeleteHandler extends AbstractHandler implements IHandler{
 
                TreeSelection selection = (TreeSelection) HandlerUtil.getCurrentSelection(event);
 
-               String plural = selection.size() > 1 ? "s" : "";
+
                // Prompt user for confirmation
-               if(! MessageDialog.openConfirm(HandlerUtil.getActiveShell(event), "Confirm Deletion", "Are you sure you want to delete the selected node" + plural +"?")){
-                       return null;
-               }
+
+
 
                Iterator selectionIterator = selection.iterator();
                Set<ITaxonTreeNode> treeNodes = new HashSet<ITaxonTreeNode>();
@@ -74,44 +86,139 @@ public class DeleteHandler extends AbstractHandler implements IHandler{
                 treeNodes.add((ITaxonTreeNode) object);
             }
                }
-
+               boolean allEditorsClosed = true;
+               for (ITaxonTreeNode treeNode : treeNodes){
+                       if(treeNode instanceof TaxonNode) {
+                               allEditorsClosed &= closeObsoleteEditor((TaxonNode) treeNode);
+                       }
+               }
                AbstractPostOperation operation = null;
-               try {
-                       operation = new DeleteOperation(
-                                       event.getCommand().getName(), NavigationUtil.getUndoContext(),
-                                       treeNodes, taxonNavigator, taxonNavigator);
+               TaxonDeletionConfigurator config = new TaxonDeletionConfigurator();
+               config.setDeleteInAllClassifications(false);
 
-                       IStatus status = NavigationUtil.executeOperation(operation);
+               if (treeNodes.size() == 1 ){
+                       try {
 
+                               ITaxonTreeNode treeNode = treeNodes.iterator().next();
+                               ITaxonTreeNode taxonNode =treeNode;
+                               TaxonNodeDeletionConfigurator configNodes = new TaxonNodeDeletionConfigurator();
 
-                       // FIXME is there a better place for this code?
-                       if (status == Status.OK_STATUS){
-                               for (ITaxonTreeNode treeNode : treeNodes){
-                                       if(treeNode instanceof TaxonNode) {
-                                               closeObsoleteEditor((TaxonNode) treeNode);
+                               //configNodes.setDeleteTaxon(false);
+                               if (taxonNode instanceof Classification && taxonNode.hasChildNodes()){
+                                       if(!DeleteConfiguratorDialog.openConfirmWithConfigurator(config, HandlerUtil.getActiveShell(event), CONFIRM_DELETION, DO_YOU_REALLY_WANT_TO_DELETE_THE_CLASSIFICATION+THE_TREE_HAS_CHILDREN_THEY_WILL_BE_DELETED_TOO)){
+                                               return null;
+                                       }
+                               } else if (taxonNode instanceof Classification && !taxonNode.hasChildNodes()){
+                                       if(!DeleteConfiguratorDialog.openConfirmWithConfigurator(config, HandlerUtil.getActiveShell(event), CONFIRM_DELETION, DO_YOU_REALLY_WANT_TO_DELETE_THE_CLASSIFICATION)){
+                                               return null;
+                                       }
+                               } else {
+
+                                       if (taxonNode.hasChildNodes()){
+                        DeleteConfiguratorDialog dialog = new DeleteConfiguratorDialog(
+                                config,
+                                HandlerUtil.getActiveShell(event),
+                                CONFIRM_DELETION,
+                                null,
+                                DO_YOU_REALLY_WANT_TO_DELETE_THE_SELECTED_NODE_S+THERE_ARE_CHILDNODES_WHICH_WILL_BE_DELETED_TOO,
+                                MessageDialog.WARNING, new String[] { DELETE_ALL_CHILDREN,
+                                        MOVE_CHILDREN_TO_PARENT_NODE, SKIP }, 0);
+                                               int dialog_result = dialog.open();
+
+                                               if (dialog_result == 0){
+                                                       //delete all children
+                                                       configNodes.setChildHandling(ChildHandling.DELETE);
+                                                       config.setTaxonNodeConfig(configNodes);
+                                               } else if (dialog_result == 1){
+                                                       //move children
+                                                       configNodes.setChildHandling(ChildHandling.MOVE_TO_PARENT);
+                                                       config.setTaxonNodeConfig(configNodes);
+                                               } else if (dialog_result == 2){
+                                                       //skip
+                                                       return null;
+
+                                               }
+                                       }else{
+                                               if(!DeleteConfiguratorDialog.openConfirmWithConfigurator(configNodes, HandlerUtil.getActiveShell(event), CONFIRM_DELETION, DO_YOU_REALLY_WANT_TO_DELETE_THE_SELECTED_NODE_S)){
+                                                       return null;
+                                               }
+                                               config.setTaxonNodeConfig(configNodes);
                                        }
                                }
+
+                               if (allEditorsClosed){
+                                       /*if(! MessageDialog.openConfirm(HandlerUtil.getActiveShell(event), "Confirm Deletion", "Do you really want to delete the selected nodes?")){
+                                               return null;
+                                       }*/
+
+                                               operation = new DeleteOperation(event.getCommand().getName(),
+                                                       NavigationUtil.getUndoContext(),
+                                                               taxonNode,
+                                                               config,
+                                                               taxonNavigator,
+                                                               taxonNavigator,
+                                                               taxonNavigator);
+
+                                               NavigationUtil.executeOperation(operation);
+
+                                               //}
+                               }
+
+
+
+                       } catch (NotDefinedException e) {
+                               MessagingUtils.warn(getClass(), "Command name not set"); //$NON-NLS-1$
+                       } catch (Exception e){
+                           MessagingUtils.error(getClass(), e);
                        }
+               } else{
+                       try{
+                               if(!DeleteConfiguratorDialog.openConfirmWithConfigurator(config, HandlerUtil.getActiveShell(event), CONFIRM_DELETION, DO_YOU_REALLY_WANT_TO_DELETE_THE_SELECTED_NODE_S)){
+                                       return null;
+                               }
+                               if (allEditorsClosed){
+
+                                       operation = new DeleteOperation(event.getCommand().getName(),
+                                               NavigationUtil.getUndoContext(),
+                                                       treeNodes,
+                                                       new TaxonDeletionConfigurator(),
+                                                       taxonNavigator,
+                                                       taxonNavigator,
+                                                       taxonNavigator);
 
-               } catch (NotDefinedException e) {
-                       NavigationUtil.warn(getClass(), "Command name not set");
+                                       NavigationUtil.executeOperation(operation);
+
+                               }
+                       }catch (NotDefinedException e) {
+                               MessagingUtils.warn(getClass(), Messages.DeleteHandler_9);
+                       } catch (Exception e){
+                MessagingUtils.error(getClass(), e);
+            }
                }
                return null;
        }
 
-       private void closeObsoleteEditor(TaxonNode taxonNode){
+       protected boolean closeObsoleteEditor(TaxonNode taxonNode){
+               boolean result = true;
                for (IEditorReference ref : activePage.getEditorReferences()) {
                        try {
+                               String treeIndex = ((ITreeNode)taxonNode).treeIndex();
+
+
                                IEditorInput input = ref.getEditorInput();
                                if (input instanceof TaxonEditorInput) {
                                        TaxonNode node = ((TaxonEditorInput) input).getTaxonNode();
-                                       if (taxonNode.equals(node)) {
-                                               activePage.closeEditor(ref.getEditor(false), false);
+                                       //if node is a child of taxonNode then close the editor
+                                       if( ((ITreeNode) node).treeIndex().startsWith(treeIndex)){
+                                       //if (taxonNode.equals(node)) {
+                                               result &= activePage.closeEditor(ref.getEditor(false), true);
+
                                        }
                                }
                        } catch (PartInitException e) {
                                continue;
                        }
                }
+               return result;
        }
 }