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