Merge branch 'hotfix/5.43.1'
[taxeditor.git] / eu.etaxonomy.taxeditor.store / src / main / java / eu / etaxonomy / taxeditor / ui / section / name / TypeDesignationSection.java
1 /**
2 * Copyright (C) 2007 EDIT
3 * European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
5 *
6 * The contents of this file are subject to the Mozilla Public License Version 1.1
7 * See LICENSE.TXT at the top of this package for the full license terms.
8 */
9 package eu.etaxonomy.taxeditor.ui.section.name;
10
11 import java.util.Collection;
12 import java.util.Comparator;
13
14 import org.apache.logging.log4j.LogManager;
15 import org.apache.logging.log4j.Logger;
16 import org.eclipse.core.commands.operations.IOperationHistory;
17 import org.eclipse.core.runtime.IStatus;
18 import org.eclipse.e4.ui.workbench.modeling.EPartService;
19 import org.eclipse.jface.action.Action;
20 import org.eclipse.jface.action.IAction;
21 import org.eclipse.jface.action.ToolBarManager;
22 import org.eclipse.jface.resource.ImageDescriptor;
23 import org.eclipse.jface.wizard.WizardDialog;
24 import org.eclipse.swt.graphics.ImageData;
25
26 import eu.etaxonomy.cdm.api.service.INameService;
27 import eu.etaxonomy.cdm.api.service.UpdateResult;
28 import eu.etaxonomy.cdm.compare.name.TypeDesignationComparator;
29 import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
30 import eu.etaxonomy.cdm.model.name.NameTypeDesignation;
31 import eu.etaxonomy.cdm.model.name.Rank;
32 import eu.etaxonomy.cdm.model.name.SpecimenTypeDesignation;
33 import eu.etaxonomy.cdm.model.name.TaxonName;
34 import eu.etaxonomy.cdm.model.name.TextualTypeDesignation;
35 import eu.etaxonomy.cdm.model.name.TypeDesignationBase;
36 import eu.etaxonomy.cdm.model.taxon.TaxonBase;
37 import eu.etaxonomy.taxeditor.editor.ITaxonEditor;
38 import eu.etaxonomy.taxeditor.l10n.Messages;
39 import eu.etaxonomy.taxeditor.model.AbstractUtility;
40 import eu.etaxonomy.taxeditor.model.ImageResources;
41 import eu.etaxonomy.taxeditor.model.MessagingUtils;
42 import eu.etaxonomy.taxeditor.operation.IPostOperationEnabled;
43 import eu.etaxonomy.taxeditor.preference.IPreferenceKeys;
44 import eu.etaxonomy.taxeditor.preference.PreferencesUtil;
45 import eu.etaxonomy.taxeditor.store.CdmStore;
46 import eu.etaxonomy.taxeditor.store.StoreUtil;
47 import eu.etaxonomy.taxeditor.ui.element.CdmFormFactory;
48 import eu.etaxonomy.taxeditor.ui.element.ICdmFormElement;
49 import eu.etaxonomy.taxeditor.ui.section.AbstractEntityCollectionSection;
50 import eu.etaxonomy.taxeditor.ui.section.ITaxonBaseDetailSection;
51 import eu.etaxonomy.taxeditor.ui.section.name.operation.DeleteTypeDesignationOperation;
52 import eu.etaxonomy.taxeditor.ui.section.name.type.CloneTypeWizard;
53 import eu.etaxonomy.taxeditor.view.e4.details.DetailsPartE4;
54 import eu.etaxonomy.taxeditor.workbench.part.IE4SavablePart;
55
56 /**
57 * @author n.hoffmann
58 * @created May 17, 2010
59 */
60 public class TypeDesignationSection extends AbstractEntityCollectionSection<TaxonName, TypeDesignationBase> implements ITaxonBaseDetailSection {
61
62 private static final Logger logger = LogManager.getLogger();
63
64 private TaxonBase<?> taxonBase;
65
66 public TypeDesignationSection(CdmFormFactory formFactory,
67 ICdmFormElement parentElement, int style) {
68 super(formFactory, parentElement, Messages.TypeDesignationSection_TYPE_DESIGNATIONS, style);
69 }
70
71 @Override
72 protected void addAction(ToolBarManager toolBarManager) {
73
74 // add textual type designation button
75 Action addTextualTypeDesignationAction = new Action("Add", IAction.AS_PUSH_BUTTON){
76 @Override
77 public void run() {
78 TextualTypeDesignation textualTypeDesignation = TextualTypeDesignation.NewInstance();
79 addElement(textualTypeDesignation);
80 if(! getSection().isExpanded()) {
81 getSection().setExpanded(true);
82 }
83 internalUpdateSection(true);
84 }
85 };
86 addTextualTypeDesignationAction.setImageDescriptor(new ImageDescriptor() {
87
88 @Override
89 public ImageData getImageData() {
90 return ImageResources.getImage(ImageResources.ADD_TEXT).getImageData();
91 }
92 });
93 addTextualTypeDesignationAction.setToolTipText("Add textual type designation");
94 toolBarManager.add(addTextualTypeDesignationAction);
95
96 // clone button
97 if(!isSpecimenType() ||
98 getEntity().getTypeDesignations().isEmpty()
99 || getEntity().getTypeDesignations().stream().noneMatch(designation->designation instanceof SpecimenTypeDesignation)){
100 return;
101 }
102 Action cloneAction = new Action(Messages.TypeDesignationSection_CREATE_DUPLICATE, IAction.AS_PUSH_BUTTON){
103 @Override
104 public void run() {
105 DetailsPartE4 detailsView = AbstractUtility.getDetailsView(getFormFactory().getContext().get((EPartService.class)));
106 if(detailsView!=null
107 && detailsView.getSelectionProvidingPart().getObject() instanceof IE4SavablePart
108 && StoreUtil.promptCheckIsDirty(((IE4SavablePart)detailsView.getSelectionProvidingPart().getObject()))){
109 return;
110 }
111 CloneTypeWizard wizard = new CloneTypeWizard(getEntity());
112 WizardDialog dialog = new WizardDialog(getShell(), wizard);
113
114 if (dialog.open() == IStatus.OK) {
115 SpecimenTypeDesignation baseTypeDesignation = HibernateProxyHelper.deproxy(wizard.getBaseTypeDesignation());
116 UpdateResult result = CdmStore.getService(INameService.class).cloneTypeDesignation(
117 wizard.getTaxonName().getUuid(),
118 baseTypeDesignation,
119 wizard.getAccessionNumber(),
120 wizard.getBarcode(),
121 wizard.getCatalogNumber(),
122 wizard.getCollection().getUuid(),
123 wizard.getTypeStatus(),
124 wizard.getStableIdentifier());
125 if(!result.isOk()){
126 MessagingUtils.warningDialog(Messages.TypeDesignationSection_DUPLICATE_FAILED, this, result.getExceptions().toString());
127 }
128 StoreUtil.reflowParentScrolledForm(getLayoutComposite(), true);
129 internalUpdateSection(false);
130 }
131 }
132 };
133 cloneAction.setImageDescriptor(new ImageDescriptor() {
134
135 @Override
136 public ImageData getImageData() {
137 return ImageResources.getImage(ImageResources.ADD_DOUBLE).getImageData();
138 }
139 });
140 cloneAction.setToolTipText(Messages.TypeDesignationSection_CREATE_DUPLICATE);
141
142 toolBarManager.add(cloneAction);
143 }
144
145 @Override
146 public void addElement(TypeDesignationBase element) {
147 getEntity().addTypeDesignation(element, PreferencesUtil.getBooleanValue(IPreferenceKeys.ADD_TYPES_TO_ALL_NAMES));
148 updateToolbar();
149 }
150
151 @Override
152 public TypeDesignationBase createNewElement() {
153 if(isSpecimenType()){
154 return SpecimenTypeDesignation.NewInstance();
155 }else{
156 return NameTypeDesignation.NewInstance();
157 }
158 }
159
160 @Override
161 public Collection<TypeDesignationBase> getCollection(TaxonName entity) {
162 if (entity == null){
163 return null;
164 }
165 return entity.getTypeDesignations();
166 }
167
168 @Override
169 public Comparator<TypeDesignationBase> getComparator() {
170 return new TypeDesignationComparator();
171 }
172
173 @Override
174 public String getEmptyString() {
175 return Messages.TypeDesignationSection_NO_TYPES_YET;
176 }
177
178 @Override
179 protected String getTooltipString() {
180 return Messages.TypeDesignationSection_ADD_TYPE;
181 }
182
183 @Override
184 public void removeElement(TypeDesignationBase element) {
185 DetailsPartE4 detailsView = AbstractUtility.getDetailsView(getFormFactory().getContext().get((EPartService.class)));
186 if(detailsView!=null
187 && detailsView.getSelectionProvidingPart().getObject() instanceof IE4SavablePart
188 && StoreUtil.promptCheckIsDirty(((IE4SavablePart)detailsView.getSelectionProvidingPart().getObject()))){
189 return;
190 }
191 boolean removeTypeDesignationFromAllTypifiedNames = PreferencesUtil.getBooleanValue(IPreferenceKeys.ADD_TYPES_TO_ALL_NAMES);
192 TaxonName entity = removeTypeDesignationFromAllTypifiedNames ? null : getEntity();
193 if(!element.isPersisted() && entity!=null){
194 entity.removeTypeDesignation(element);
195 }
196 else if(detailsView!=null
197 && detailsView.getSelectionProvidingPart().getObject() instanceof ITaxonEditor
198 && detailsView.getSelectionProvidingPart().getObject() instanceof IPostOperationEnabled) {
199 DeleteTypeDesignationOperation operation = new DeleteTypeDesignationOperation(
200 "Remove type designation",
201 IOperationHistory.GLOBAL_UNDO_CONTEXT,
202 entity,
203 element,
204 (IPostOperationEnabled) detailsView.getSelectionProvidingPart().getObject(),
205 null);
206 ((ITaxonEditor) detailsView.getSelectionProvidingPart().getObject()).addOperation(operation);
207 if(entity!=null){
208 entity.removeTypeDesignation(element);
209 }
210 }
211 updateToolbar();
212 }
213
214 @Override
215 public void setTaxonBase(TaxonBase entity) {
216 this.taxonBase = entity;
217 TaxonName name = HibernateProxyHelper.deproxy(entity.getName());
218 setEntity(name);
219 }
220
221 @Override
222 public void setTaxonBaseWithoutUpdate(TaxonBase entity) {
223 this.setTaxonBase(entity);
224 }
225
226 private boolean isSpecimenType(){
227 Rank rank = getEntity() == null ? null : getEntity().getRank();
228 if(rank == null){
229 return false;
230 }
231 return rank.isSpecies() || rank.isInfraSpecific();
232 }
233
234 @Override
235 public TaxonBase getTaxonBase() {
236 return taxonBase;
237 }
238
239 @Override
240 public TypeDesignationBase addExisting() {
241 return null;
242 }
243
244 @Override
245 public boolean allowAddExisting() {
246 return false;
247 }
248 }