ref #9340, #9734, #9668: further improvements for configurable sec handling during...
[taxeditor.git] / eu.etaxonomy.taxeditor.editor / src / main / java / eu / etaxonomy / taxeditor / editor / name / e4 / handler / MoveSynonymToAnotherAcceptedTaxonHandlerE4.java
1 package eu.etaxonomy.taxeditor.editor.name.e4.handler;
2
3 import java.util.HashSet;
4 import java.util.Set;
5 import java.util.UUID;
6
7 import javax.inject.Inject;
8 import javax.inject.Named;
9
10 import org.apache.log4j.Logger;
11 import org.eclipse.e4.core.di.annotations.CanExecute;
12 import org.eclipse.e4.core.di.annotations.Execute;
13 import org.eclipse.e4.ui.di.UISynchronize;
14 import org.eclipse.e4.ui.model.application.MApplication;
15 import org.eclipse.e4.ui.model.application.ui.basic.MPart;
16 import org.eclipse.e4.ui.model.application.ui.menu.MHandledMenuItem;
17 import org.eclipse.e4.ui.services.IServiceConstants;
18 import org.eclipse.e4.ui.workbench.modeling.EModelService;
19 import org.eclipse.e4.ui.workbench.modeling.EPartService;
20 import org.eclipse.jface.viewers.IStructuredSelection;
21 import org.eclipse.swt.widgets.Shell;
22
23 import eu.etaxonomy.cdm.model.metadata.SecReferenceHandlingEnum;
24 import eu.etaxonomy.cdm.model.reference.Reference;
25 import eu.etaxonomy.cdm.model.taxon.Synonym;
26 import eu.etaxonomy.cdm.model.taxon.TaxonNode;
27 import eu.etaxonomy.taxeditor.editor.EditorUtil;
28 import eu.etaxonomy.taxeditor.editor.e4.TaxonEditorInputE4;
29 import eu.etaxonomy.taxeditor.editor.l10n.Messages;
30 import eu.etaxonomy.taxeditor.editor.name.e4.TaxonNameEditorE4;
31 import eu.etaxonomy.taxeditor.editor.name.e4.operation.MoveSynonymToAnotherAcceptedTaxonOperationE4;
32 import eu.etaxonomy.taxeditor.editor.name.handler.NameEditorMenuPropertyTester;
33 import eu.etaxonomy.taxeditor.model.AbstractUtility;
34 import eu.etaxonomy.taxeditor.model.MessagingUtils;
35 import eu.etaxonomy.taxeditor.operation.IPostOperationEnabled;
36 import eu.etaxonomy.taxeditor.preference.PreferencesUtil;
37 import eu.etaxonomy.taxeditor.ui.dialog.selection.ReferenceSelectionDialog;
38 import eu.etaxonomy.taxeditor.ui.dialog.selection.TaxonNodeSelectionDialog;
39
40 public class MoveSynonymToAnotherAcceptedTaxonHandlerE4 implements IPostOperationEnabled{
41 private static final Logger logger = Logger
42 .getLogger(MoveSynonymToAnotherAcceptedTaxonHandlerE4.class);
43
44 private TaxonNameEditorE4 editor;
45
46 private TaxonNode newParentNode;
47
48 private EPartService partService;
49
50 @Inject
51 private EModelService modelService;
52
53 @Inject
54 private MApplication application;
55
56 @Inject
57 private MPart activePart;
58
59 @Execute
60 public void execute(@Named(IServiceConstants.ACTIVE_PART)MPart activePart,
61 @Named(IServiceConstants.ACTIVE_SELECTION)IStructuredSelection selection,
62 @Named(IServiceConstants.ACTIVE_SHELL)Shell shell, EPartService partService,
63 UISynchronize sync) {
64
65 this.activePart = activePart;
66 this.partService = partService;
67
68 editor = (TaxonNameEditorE4) activePart.getObject();
69
70 TaxonEditorInputE4 input = editor.getEditorInput();
71
72 if (!EditorUtil.forceUserSaveE4Editor(editor, shell)) {
73 return ;
74 }
75
76 if (selection==null || !(selection.getFirstElement() instanceof Synonym)) {
77 MessagingUtils.warningDialog(Messages.MoveSynonymToAnotherAcceptedTaxonHandler_NO_SELECTION, this, Messages.MoveSynonymToAnotherAcceptedTaxonHandler_NO_SELECTION_MESSAGE);
78 logger.error("Selection does not contain a Synonym"); //$NON-NLS-1$
79 return ;
80 }
81
82 Synonym synonym = (Synonym) selection.getFirstElement();
83 TaxonNode oldParent = input.getTaxonNode();
84 Set<UUID> excludeTaxa = new HashSet<>();
85 excludeTaxa.add(oldParent.getUuid());
86
87
88 newParentNode = TaxonNodeSelectionDialog.select(shell, Messages.MoveSynonymToAnotherAcceptedTaxonHandler_SELECT_ACC_TAXON, excludeTaxa, input.getTaxonNode(), input.getTaxonNode().getClassification().getUuid());
89 SecReferenceHandlingEnum secHandling = PreferencesUtil.getSecReferenceHandlingPreference();
90 UUID newSecUuid = null;
91
92 Reference synSecRef = synonym.getSec();
93 Reference parentSecRef = newParentNode.getTaxon() != null? newParentNode.getTaxon().getSec():null;
94 if ((synSecRef != parentSecRef && secHandling.equals(SecReferenceHandlingEnum.KeepOrWarn) )|| secHandling.equals(SecReferenceHandlingEnum.KeepOrSelect)){
95
96 if ((parentSecRef != synSecRef && secHandling.equals(SecReferenceHandlingEnum.KeepOrWarn) )|| secHandling.equals(SecReferenceHandlingEnum.KeepOrSelect)){
97 int result = MessagingUtils.confirmDialog(Messages.ChangeSynonymToAcceptedHandler_Select_Sec_Reference_Handling_title, Messages.MoveSynonymToAcceptedHandler_Select_Sec_Reference_Handling_message,
98 new String[]{Messages.ChangeSynonymToAcceptedHandler_Select_Sec_Reference_Keep, Messages.ChangeSynonymToAcceptedHandler_Select_Sec_Reference_Parent, Messages.ChangeSynonymToAcceptedHandler_Select_Sec_Reference_Select});
99 if (result == 2){
100 Reference sec = ReferenceSelectionDialog.select(shell, null);
101 newSecUuid = sec != null? sec.getUuid(): null;
102 }else if (result == 1){
103 newSecUuid = parentSecRef != null? parentSecRef.getUuid(): null;
104 }else if (result == 0){
105 newSecUuid = synSecRef != null? synSecRef.getUuid(): null;
106 }else{
107 return ;
108 }
109
110 }
111
112 }
113 boolean homotypicGroupPublish = true;
114 // for (synonym.getName().getHomotypicalGroup().getTypifiedNames())
115 if (synonym.isPublish() != newParentNode.getTaxon().isPublish()){
116 MessagingUtils.warningDialog("Publish flag", this,Messages.ChangeSynonymToAcceptedHandler_Different_Publish_Flag);
117 }
118 if(newParentNode!=null){
119 MoveSynonymToAnotherAcceptedTaxonOperationE4 operation = new MoveSynonymToAnotherAcceptedTaxonOperationE4(Messages.MoveSynonymToAnotherAcceptedTaxonHandler_CHANGE_ACC_TAXON, EditorUtil.getUndoContext(),
120 synonym.getUuid(), newParentNode.getTaxon(),newSecUuid, this, editor);
121
122 AbstractUtility.executeOperation(operation, sync);
123 }
124 }
125
126 @CanExecute
127 public boolean canExecute(@Named(IServiceConstants.ACTIVE_SELECTION)IStructuredSelection selection,
128 MHandledMenuItem menuItem){
129 boolean canExecute = false;
130 if(selection.size()==1){
131 Object selectedElement = selection.getFirstElement();
132 canExecute =
133 NameEditorMenuPropertyTester.isSynonym(selectedElement)
134 && NameEditorMenuPropertyTester.isNotHomotypicSynonymOfAcceptedTaxon(selectedElement);
135 }
136 menuItem.setVisible(canExecute);
137 return canExecute;
138 }
139
140 @Override
141 public boolean postOperation(Object objectAffectedByOperation) {
142 editor.redraw();
143 return false;
144 }
145
146 @Override
147 public boolean onComplete() {
148 partService.hidePart(activePart);
149 EditorUtil.openTaxonNodeE4(newParentNode.getUuid(), modelService, partService, application);
150 return true;
151 }
152
153 }