ref #8233 Ask for saving before cloning type designation
[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
10 package eu.etaxonomy.taxeditor.ui.section.name;
11
12 import java.util.Collection;
13 import java.util.Comparator;
14
15 import org.eclipse.core.commands.operations.IOperationHistory;
16 import org.eclipse.core.runtime.IStatus;
17 import org.eclipse.e4.ui.workbench.modeling.EPartService;
18 import org.eclipse.jface.action.Action;
19 import org.eclipse.jface.action.IAction;
20 import org.eclipse.jface.action.ToolBarManager;
21 import org.eclipse.jface.resource.ImageDescriptor;
22 import org.eclipse.jface.wizard.WizardDialog;
23 import org.eclipse.swt.graphics.ImageData;
24
25 import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
26 import eu.etaxonomy.cdm.api.service.INameService;
27 import eu.etaxonomy.cdm.api.service.UpdateResult;
28 import eu.etaxonomy.cdm.api.service.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.TypeDesignationBase;
35 import eu.etaxonomy.cdm.model.taxon.TaxonBase;
36 import eu.etaxonomy.taxeditor.editor.ITaxonEditor;
37 import eu.etaxonomy.taxeditor.l10n.Messages;
38 import eu.etaxonomy.taxeditor.model.AbstractUtility;
39 import eu.etaxonomy.taxeditor.model.ImageResources;
40 import eu.etaxonomy.taxeditor.model.MessagingUtils;
41 import eu.etaxonomy.taxeditor.operation.IPostOperationEnabled;
42 import eu.etaxonomy.taxeditor.preference.IPreferenceKeys;
43 import eu.etaxonomy.taxeditor.preference.PreferencesUtil;
44 import eu.etaxonomy.taxeditor.store.CdmStore;
45 import eu.etaxonomy.taxeditor.store.StoreUtil;
46 import eu.etaxonomy.taxeditor.ui.element.CdmFormFactory;
47 import eu.etaxonomy.taxeditor.ui.element.ICdmFormElement;
48 import eu.etaxonomy.taxeditor.ui.section.AbstractEntityCollectionSection;
49 import eu.etaxonomy.taxeditor.ui.section.ITaxonBaseDetailSection;
50 import eu.etaxonomy.taxeditor.ui.section.name.operation.DeleteTypeDesignationOperation;
51 import eu.etaxonomy.taxeditor.ui.section.name.type.CloneTypeWizard;
52 import eu.etaxonomy.taxeditor.view.e4.details.DetailsPartE4;
53 import eu.etaxonomy.taxeditor.workbench.part.IE4SavablePart;
54
55 /**
56 * @author n.hoffmann
57 * @created May 17, 2010
58 */
59 public class TypeDesignationSection extends AbstractEntityCollectionSection<TaxonName, TypeDesignationBase> implements ITaxonBaseDetailSection {
60
61 private TaxonBase taxonBase;
62
63 public TypeDesignationSection(CdmFormFactory formFactory, ConversationHolder conversation,
64 ICdmFormElement parentElement, int style) {
65 super(formFactory, conversation, parentElement, Messages.TypeDesignationSection_TYPE_DESIGNATIONS, style);
66 }
67
68 @Override
69 protected void addAction(ToolBarManager toolBarManager) {
70 if(!isSpecimenType() ||
71 getEntity().getTypeDesignations().isEmpty()
72 || getEntity().getTypeDesignations().stream().noneMatch(designation->designation instanceof SpecimenTypeDesignation)){
73 return;
74 }
75 Action cloneAction = new Action(Messages.TypeDesignationSection_CREATE_DUPLICATE, IAction.AS_PUSH_BUTTON){
76 @Override
77 public void run() {
78 DetailsPartE4 detailsView = AbstractUtility.getDetailsView(getFormFactory().getContext().get((EPartService.class)));
79 if(detailsView!=null
80 && detailsView.getSelectionProvidingPart().getObject() instanceof IE4SavablePart
81 && StoreUtil.promptCheckIsDirty(((IE4SavablePart)detailsView.getSelectionProvidingPart().getObject()))){
82 return;
83 }
84 CloneTypeWizard wizard = new CloneTypeWizard(getEntity());
85 WizardDialog dialog = new WizardDialog(getShell(), wizard);
86
87 if (dialog.open() == IStatus.OK) {
88 SpecimenTypeDesignation baseTypeDesignation = HibernateProxyHelper.deproxy(wizard.getBaseTypeDesignation());
89 UpdateResult result = CdmStore.getService(INameService.class).cloneTypeDesignation(
90 wizard.getTaxonName().getUuid(),
91 baseTypeDesignation,
92 wizard.getAccessionNumber(),
93 wizard.getCollection().getUuid(),
94 wizard.getTypeStatus());
95 if(!result.isOk()){
96 MessagingUtils.warningDialog(Messages.TypeDesignationSection_DUPLICATE_FAILED, this, result.getExceptions().toString());
97 }
98 StoreUtil.reflowParentScrolledForm(getLayoutComposite(), true);
99 internalUpdateSection(false);
100 }
101 }
102 };
103 cloneAction.setImageDescriptor(new ImageDescriptor() {
104
105 @Override
106 public ImageData getImageData() {
107 return ImageResources.getImage(ImageResources.COPY_ICON).getImageData();
108 }
109 });
110 cloneAction.setToolTipText(Messages.TypeDesignationSection_CREATE_DUPLICATE);
111
112 toolBarManager.add(cloneAction);
113 }
114
115 @Override
116 public void addElement(TypeDesignationBase element) {
117 getEntity().addTypeDesignation(element, PreferencesUtil.getBooleanValue(IPreferenceKeys.ADD_TYPES_TO_ALL_NAMES));
118 updateToolbar();
119 }
120
121 @Override
122 public TypeDesignationBase createNewElement() {
123 if(isSpecimenType()){
124 return SpecimenTypeDesignation.NewInstance();
125 }else{
126 return NameTypeDesignation.NewInstance();
127 }
128 }
129
130 @Override
131 public Collection<TypeDesignationBase> getCollection(TaxonName entity) {
132 if (entity == null){
133 return null;
134 }
135 return entity.getTypeDesignations();
136 }
137
138 @Override
139 public Comparator<TypeDesignationBase> getComparator() {
140 return new TypeDesignationComparator();
141 }
142
143 @Override
144 public String getEmptyString() {
145 return Messages.TypeDesignationSection_NO_TYPES_YET;
146 }
147
148 @Override
149 protected String getTooltipString() {
150 return Messages.TypeDesignationSection_ADD_TYPE;
151 }
152
153 @Override
154 public void removeElement(TypeDesignationBase element) {
155 boolean removeTypeDesignationFromAllTypifiedNames = PreferencesUtil.getBooleanValue(IPreferenceKeys.ADD_TYPES_TO_ALL_NAMES);
156 TaxonName entity = removeTypeDesignationFromAllTypifiedNames ? null : getEntity();
157 DetailsPartE4 detailsView = AbstractUtility.getDetailsView(getFormFactory().getContext().get((EPartService.class)));
158 if(detailsView!=null
159 && detailsView.getSelectionProvidingPart().getObject() instanceof ITaxonEditor
160 && detailsView.getSelectionProvidingPart().getObject() instanceof IPostOperationEnabled) {
161 DeleteTypeDesignationOperation operation = new DeleteTypeDesignationOperation(
162 "Remove type designation",
163 IOperationHistory.GLOBAL_UNDO_CONTEXT,
164 entity,
165 element,
166 (IPostOperationEnabled) detailsView.getSelectionProvidingPart().getObject(),
167 null);
168 ((ITaxonEditor) detailsView.getSelectionProvidingPart().getObject()).addOperation(operation);
169 }
170 if(entity!=null){
171 entity.removeTypeDesignation(element);
172 }
173 updateToolbar();
174 }
175
176 @Override
177 public void setTaxonBase(TaxonBase entity) {
178 this.taxonBase = entity;
179 TaxonName name = HibernateProxyHelper.deproxy(entity.getName());
180 setEntity(name);
181 }
182
183 private boolean isSpecimenType(){
184 Rank rank = getEntity().getRank();
185 if(rank==null){
186 return false;
187 }
188 return rank.isSpecies() || rank.isInfraSpecific();
189 }
190
191 @Override
192 public TaxonBase getTaxonBase() {
193 return taxonBase;
194 }
195
196 @Override
197 public TypeDesignationBase addExisting() {
198 return null;
199 }
200
201 @Override
202 public boolean allowAddExisting() {
203 return false;
204 }
205 }