Merge branch 'develop' into remoting-4.0
[taxeditor.git] / eu.etaxonomy.taxeditor.editor / src / main / java / eu / etaxonomy / taxeditor / editor / view / descriptive / handler / MoveDescriptionToOtherTaxonHandler.java
1 /**
2 *
3 */
4 package eu.etaxonomy.taxeditor.editor.view.descriptive.handler;
5
6 import java.util.ArrayList;
7 import java.util.List;
8 import java.util.UUID;
9
10 import org.apache.log4j.Logger;
11 import org.eclipse.core.commands.AbstractHandler;
12 import org.eclipse.core.commands.ExecutionEvent;
13 import org.eclipse.core.commands.ExecutionException;
14 import org.eclipse.core.commands.common.NotDefinedException;
15 import org.eclipse.jface.viewers.ISelection;
16 import org.eclipse.jface.viewers.IStructuredSelection;
17 import org.eclipse.swt.widgets.Display;
18 import org.eclipse.ui.PartInitException;
19 import org.eclipse.ui.handlers.HandlerUtil;
20
21 import eu.etaxonomy.cdm.api.service.IDescriptionService;
22 import eu.etaxonomy.cdm.model.common.CdmBase;
23 import eu.etaxonomy.cdm.model.description.DescriptionBase;
24 import eu.etaxonomy.cdm.model.description.TaxonDescription;
25 import eu.etaxonomy.cdm.model.taxon.TaxonNode;
26 import eu.etaxonomy.taxeditor.editor.EditorUtil;
27 import eu.etaxonomy.taxeditor.editor.MultiPageTaxonEditor;
28 import eu.etaxonomy.taxeditor.editor.Page;
29 import eu.etaxonomy.taxeditor.editor.name.TaxonNameEditor;
30 import eu.etaxonomy.taxeditor.editor.view.descriptive.operation.MoveDescriptionToOtherTaxonOperation;
31 import eu.etaxonomy.taxeditor.model.AbstractUtility;
32 import eu.etaxonomy.taxeditor.model.FeatureNodeContainer;
33 import eu.etaxonomy.taxeditor.model.MessagingUtils;
34 import eu.etaxonomy.taxeditor.operation.IPostOperationEnabled;
35 import eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled;
36 import eu.etaxonomy.taxeditor.store.CdmStore;
37 import eu.etaxonomy.taxeditor.ui.dialog.selection.TaxonNodeSelectionDialog;
38
39 /**
40 * <p>ChangeAcceptedTaxonToSynonymHandler class.</p>
41 *
42 * @author a.kohlbecker
43 * @created Okt. 11, 2013
44 * @version 1.0
45 *
46 */
47 public class MoveDescriptionToOtherTaxonHandler extends AbstractHandler
48 implements IPostOperationEnabled {
49 private static final Logger logger = Logger
50 .getLogger(MoveDescriptionToOtherTaxonHandler.class);
51 private MoveDescriptionToOtherTaxonOperation operation;
52
53 private UUID newAcceptedTaxonNodeUuid;
54 private TaxonNameEditor editor;
55
56 /* (non-Javadoc)
57 * @see org.eclipse.core.commands.IHandler#execute(org.eclipse.core.commands.ExecutionEvent)
58 */
59 /** {@inheritDoc} */
60 @Override
61 public Object execute(ExecutionEvent event) throws ExecutionException {
62
63 ISelection selection = HandlerUtil.getCurrentSelection(event);
64
65 if(selection instanceof IStructuredSelection){
66
67 List<TaxonDescription> descriptions = new ArrayList<TaxonDescription>();
68
69 IStructuredSelection structuredSelection = (IStructuredSelection) selection;
70
71 for(Object element : structuredSelection.toArray()){
72 UUID uuid = null;
73 if (element instanceof FeatureNodeContainer){
74 uuid = ((FeatureNodeContainer)element).getDescription().getUuid();
75 } else if (element instanceof DescriptionBase){
76 uuid = ((DescriptionBase)element).getUuid();
77 }
78
79 if (uuid != null){
80 descriptions.add((TaxonDescription) CdmStore.getService(IDescriptionService.class).load(uuid, null));
81 }
82 }
83 if(descriptions.size() == 0){
84 return null;
85 }
86
87 // Choose the target taxon
88 List<UUID> excludeTaxa = new ArrayList<UUID>();
89 editor = (TaxonNameEditor) EditorUtil.getActiveEditorPage(Page.NAME);
90 excludeTaxa.add(descriptions.get(0).getTaxon().getUuid());
91 TaxonNode newAcceptedTaxonNode = TaxonNodeSelectionDialog.select(HandlerUtil.getActiveShell(event),
92 editor.getConversationHolder(),
93 "Choose the accepted taxon",
94 excludeTaxa,
95 null,
96 null);
97
98 if (newAcceptedTaxonNode == null) {
99 return null;
100 }
101
102 newAcceptedTaxonNodeUuid = newAcceptedTaxonNode.getUuid();
103
104 try {
105 for(TaxonDescription description : descriptions){
106 operation = new MoveDescriptionToOtherTaxonOperation(event.getCommand().getName(),
107 editor.getUndoContext(),
108 description,
109 newAcceptedTaxonNode,
110 this,
111 editor,
112 (ICdmEntitySessionEnabled)editor.getEditorInput());
113 AbstractUtility.executeOperation(operation);
114 }
115
116 } catch (NotDefinedException e) {
117 logger.warn("Command name not set");
118 }
119 }
120
121 return null;
122
123 }
124
125 /* (non-Javadoc)
126 * @see eu.etaxonomy.taxeditor.operations.IPostOperationEnabled#postOperation(eu.etaxonomy.cdm.model.common.CdmBase)
127 */
128 /** {@inheritDoc} */
129 @Override
130 public boolean postOperation(CdmBase objectAffectedByOperation) {
131 Display.getDefault().asyncExec(new Runnable(){
132
133 @Override
134 public void run() {
135 AbstractUtility.close(editor.getMultiPageTaxonEditor());
136
137 try {
138 MultiPageTaxonEditor possibleOpenEditor = (MultiPageTaxonEditor) EditorUtil.findEditorByTaxonNodeUuid(newAcceptedTaxonNodeUuid);
139 if(possibleOpenEditor != null){
140 AbstractUtility.close(possibleOpenEditor);
141 }
142 EditorUtil.openTaxonNode(newAcceptedTaxonNodeUuid);
143 } catch (PartInitException e) {
144 MessagingUtils.error(this.getClass(), e);
145 throw new RuntimeException(e);
146 } catch (Exception e) {
147 MessagingUtils.warningDialog("Could not create Taxon", this, e.getMessage());
148 }
149 }
150
151 });
152
153
154 return true;
155 }
156
157 /**
158 * <p>onComplete</p>
159 *
160 * @return a boolean.
161 */
162 @Override
163 public boolean onComplete() {
164 // TODO Auto-generated method stub
165 return false;
166 }
167 }