Merge branch 'release/3.8.0'
[taxeditor.git] / eu.etaxonomy.taxeditor.navigation / src / main / java / eu / etaxonomy / taxeditor / navigation / navigator / handler / DeleteHandler.java
1 // $Id$
2 /**
3 * Copyright (C) 2007 EDIT
4 * European Distributed Institute of Taxonomy
5 * http://www.e-taxonomy.eu
6 *
7 * The contents of this file are subject to the Mozilla Public License Version 1.1
8 * See LICENSE.TXT at the top of this package for the full license terms.
9 */
10
11 package eu.etaxonomy.taxeditor.navigation.navigator.handler;
12
13 import java.util.HashSet;
14 import java.util.Iterator;
15 import java.util.Set;
16
17 import org.eclipse.core.commands.AbstractHandler;
18 import org.eclipse.core.commands.ExecutionEvent;
19 import org.eclipse.core.commands.ExecutionException;
20 import org.eclipse.core.commands.common.NotDefinedException;
21 import org.eclipse.jface.dialogs.MessageDialog;
22 import org.eclipse.jface.viewers.TreeSelection;
23 import org.eclipse.ui.IEditorInput;
24 import org.eclipse.ui.IEditorReference;
25 import org.eclipse.ui.IWorkbenchPage;
26 import org.eclipse.ui.PartInitException;
27 import org.eclipse.ui.handlers.HandlerUtil;
28
29 import eu.etaxonomy.cdm.api.service.config.TaxonDeletionConfigurator;
30 import eu.etaxonomy.cdm.api.service.config.TaxonNodeDeletionConfigurator;
31 import eu.etaxonomy.cdm.api.service.config.TaxonNodeDeletionConfigurator.ChildHandling;
32 import eu.etaxonomy.cdm.model.common.ITreeNode;
33 import eu.etaxonomy.cdm.model.taxon.Classification;
34 import eu.etaxonomy.cdm.model.taxon.ITaxonTreeNode;
35 import eu.etaxonomy.cdm.model.taxon.TaxonNode;
36 import eu.etaxonomy.taxeditor.editor.TaxonEditorInput;
37 import eu.etaxonomy.taxeditor.model.AbstractUtility;
38 import eu.etaxonomy.taxeditor.model.MessagingUtils;
39 import eu.etaxonomy.taxeditor.navigation.NavigationUtil;
40 import eu.etaxonomy.taxeditor.navigation.navigator.TaxonNavigator;
41 import eu.etaxonomy.taxeditor.navigation.navigator.operation.DeleteOperation;
42 import eu.etaxonomy.taxeditor.operation.AbstractPostOperation;
43 import eu.etaxonomy.taxeditor.ui.dialog.deleteConfigurator.DeleteConfiguratorDialog;
44
45 /**
46 * <p>DeleteTreeNodeHandler class.</p>
47 *
48 * @author n.hoffmann
49 * @created 06.04.2009
50 * @version 1.0
51 */
52 public class DeleteHandler extends AbstractHandler{
53
54 protected IWorkbenchPage activePage;
55 protected TaxonNavigator taxonNavigator;
56
57 /** {@inheritDoc} */
58 @Override
59 public Object execute(ExecutionEvent event) throws ExecutionException {
60
61 activePage = HandlerUtil.getActiveWorkbenchWindow(event).getActivePage();
62
63 taxonNavigator = NavigationUtil.showNavigator();
64
65 TreeSelection selection = (TreeSelection) HandlerUtil.getCurrentSelection(event);
66
67 Iterator selectionIterator = selection.iterator();
68 Set<ITaxonTreeNode> treeNodes = new HashSet<ITaxonTreeNode>();
69
70 while (selectionIterator.hasNext()){
71 Object object = selectionIterator.next();
72 if(object instanceof ITaxonTreeNode) {
73 treeNodes.add((ITaxonTreeNode) object);
74 }
75 }
76 boolean allEditorsClosed = true;
77 for (ITaxonTreeNode treeNode : treeNodes){
78 if(treeNode instanceof TaxonNode) {
79 allEditorsClosed &= closeObsoleteEditor((TaxonNode) treeNode);
80 }
81 }
82 AbstractPostOperation operation = null;
83 TaxonDeletionConfigurator config = new TaxonDeletionConfigurator();
84 if (treeNodes.size() == 1 ){
85 try {
86
87 ITaxonTreeNode treeNode = treeNodes.iterator().next();
88 ITaxonTreeNode taxonNode =treeNode;
89 TaxonNodeDeletionConfigurator configNodes = new TaxonNodeDeletionConfigurator();
90 //configNodes.setDeleteTaxon(false);
91 if (taxonNode instanceof Classification && taxonNode.hasChildNodes()){
92 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.")){
93 return null;
94 }
95 } else if (taxonNode instanceof Classification && !taxonNode.hasChildNodes()){
96 if(!DeleteConfiguratorDialog.openConfirmWithConfigurator(config, HandlerUtil.getActiveShell(event), "Confirm Deletion", "Do you really want to delete the classification?")){
97 return null;
98 }
99 } else {
100
101 if (taxonNode.hasChildNodes()){
102 DeleteConfiguratorDialog dialog = new DeleteConfiguratorDialog(
103 config,
104 HandlerUtil.getActiveShell(event),
105 "Confirm Deletion",
106 null,
107 "Do you really want to delete the selected node? It has childnodes, they will be deleted, too.",
108 MessageDialog.WARNING, new String[] { "Delete all children",
109 "Move children to parent node", "Skip" }, 0);
110 int result = dialog.open();
111
112 if (result == 0){
113 //delete all children
114 configNodes.setChildHandling(ChildHandling.DELETE);
115 config.setTaxonNodeConfig(configNodes);
116 } else if (result == 1){
117 //move children
118 configNodes.setChildHandling(ChildHandling.MOVE_TO_PARENT);
119 config.setTaxonNodeConfig(configNodes);
120 } else if (result == 2){
121 //skip
122 return null;
123
124 }
125 }else{
126 if(!DeleteConfiguratorDialog.openConfirmWithConfigurator(configNodes, HandlerUtil.getActiveShell(event), "Confirm Deletion", "Do you really want to delete the selected node?")){
127 return null;
128 }
129 config.setTaxonNodeConfig(configNodes);
130 }
131 }
132
133 if (allEditorsClosed){
134 /*if(! MessageDialog.openConfirm(HandlerUtil.getActiveShell(event), "Confirm Deletion", "Do you really want to delete the selected nodes?")){
135 return null;
136 }*/
137 operation = new DeleteOperation(
138 event.getCommand().getName(), NavigationUtil.getUndoContext(),
139 taxonNode, config, taxonNavigator, taxonNavigator);
140
141 AbstractUtility.executeOperation(operation);
142 //}
143 }
144
145
146
147 } catch (NotDefinedException e) {
148 MessagingUtils.warn(getClass(), "Command name not set");
149 } catch (Exception e){
150 MessagingUtils.error(getClass(), e);
151 }
152 } else{
153 try{
154 if(!DeleteConfiguratorDialog.openConfirmWithConfigurator(config, HandlerUtil.getActiveShell(event), "Confirm Deletion", "Do you really want to delete the selected nodes?")){
155 return null;
156 }
157 if (allEditorsClosed){
158 operation = new DeleteOperation(
159 event.getCommand().getName(), NavigationUtil.getUndoContext(),
160 treeNodes, new TaxonDeletionConfigurator(), taxonNavigator, taxonNavigator);
161
162 AbstractUtility.executeOperation(operation);
163 }
164 }catch (NotDefinedException e) {
165 MessagingUtils.warn(getClass(), "Command name not set");
166 } catch (Exception e){
167 MessagingUtils.error(getClass(), e);
168 }
169 }
170 return null;
171 }
172
173 protected boolean closeObsoleteEditor(TaxonNode taxonNode){
174 boolean result = true;
175 for (IEditorReference ref : activePage.getEditorReferences()) {
176 try {
177 String treeIndex = ((ITreeNode)taxonNode).treeIndex();
178
179
180 IEditorInput input = ref.getEditorInput();
181 if (input instanceof TaxonEditorInput) {
182 TaxonNode node = ((TaxonEditorInput) input).getTaxonNode();
183 //if node is a child of taxonNode then close the editor
184 if( ((ITreeNode) node).treeIndex().startsWith(treeIndex)){
185 //if (taxonNode.equals(node)) {
186 result &= activePage.closeEditor(ref.getEditor(false), true);
187
188 }
189 }
190 } catch (PartInitException e) {
191 continue;
192 }
193 }
194 return result;
195 }
196 }