2 * Copyright (C) 2007 EDIT
3 * European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
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.
9 package eu
.etaxonomy
.taxeditor
.ui
.section
.name
;
11 import java
.util
.Collection
;
12 import java
.util
.Comparator
;
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
;
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
;
58 * @created May 17, 2010
60 public class TypeDesignationSection
extends AbstractEntityCollectionSection
<TaxonName
, TypeDesignationBase
> implements ITaxonBaseDetailSection
{
62 private static final Logger logger
= LogManager
.getLogger();
64 private TaxonBase
<?
> taxonBase
;
66 public TypeDesignationSection(CdmFormFactory formFactory
,
67 ICdmFormElement parentElement
, int style
) {
68 super(formFactory
, parentElement
, Messages
.TypeDesignationSection_TYPE_DESIGNATIONS
, style
);
72 protected void addAction(ToolBarManager toolBarManager
) {
74 // add textual type designation button
75 Action addTextualTypeDesignationAction
= new Action("Add", IAction
.AS_PUSH_BUTTON
){
78 TextualTypeDesignation textualTypeDesignation
= TextualTypeDesignation
.NewInstance();
79 addElement(textualTypeDesignation
);
80 if(! getSection().isExpanded()) {
81 getSection().setExpanded(true);
83 internalUpdateSection(true);
86 addTextualTypeDesignationAction
.setImageDescriptor(new ImageDescriptor() {
89 public ImageData
getImageData() {
90 return ImageResources
.getImage(ImageResources
.ADD_TEXT
).getImageData();
93 addTextualTypeDesignationAction
.setToolTipText("Add textual type designation");
94 toolBarManager
.add(addTextualTypeDesignationAction
);
97 if(!isSpecimenType() ||
98 getEntity().getTypeDesignations().isEmpty()
99 || getEntity().getTypeDesignations().stream().noneMatch(designation
->designation
instanceof SpecimenTypeDesignation
)){
102 Action cloneAction
= new Action(Messages
.TypeDesignationSection_CREATE_DUPLICATE
, IAction
.AS_PUSH_BUTTON
){
105 DetailsPartE4 detailsView
= AbstractUtility
.getDetailsView(getFormFactory().getContext().get((EPartService
.class)));
107 && detailsView
.getSelectionProvidingPart().getObject() instanceof IE4SavablePart
108 && StoreUtil
.promptCheckIsDirty(((IE4SavablePart
)detailsView
.getSelectionProvidingPart().getObject()))){
111 CloneTypeWizard wizard
= new CloneTypeWizard(getEntity());
112 WizardDialog dialog
= new WizardDialog(getShell(), wizard
);
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(),
119 wizard
.getAccessionNumber(),
121 wizard
.getCatalogNumber(),
122 wizard
.getCollection().getUuid(),
123 wizard
.getTypeStatus(),
124 wizard
.getStableIdentifier());
126 MessagingUtils
.warningDialog(Messages
.TypeDesignationSection_DUPLICATE_FAILED
, this, result
.getExceptions().toString());
128 StoreUtil
.reflowParentScrolledForm(getLayoutComposite(), true);
129 internalUpdateSection(false);
133 cloneAction
.setImageDescriptor(new ImageDescriptor() {
136 public ImageData
getImageData() {
137 return ImageResources
.getImage(ImageResources
.ADD_DOUBLE
).getImageData();
140 cloneAction
.setToolTipText(Messages
.TypeDesignationSection_CREATE_DUPLICATE
);
142 toolBarManager
.add(cloneAction
);
146 public void addElement(TypeDesignationBase element
) {
147 getEntity().addTypeDesignation(element
, PreferencesUtil
.getBooleanValue(IPreferenceKeys
.ADD_TYPES_TO_ALL_NAMES
));
152 public TypeDesignationBase
createNewElement() {
153 if(isSpecimenType()){
154 return SpecimenTypeDesignation
.NewInstance();
156 return NameTypeDesignation
.NewInstance();
161 public Collection
<TypeDesignationBase
> getCollection(TaxonName entity
) {
165 return entity
.getTypeDesignations();
169 public Comparator
<TypeDesignationBase
> getComparator() {
170 return new TypeDesignationComparator();
174 public String
getEmptyString() {
175 return Messages
.TypeDesignationSection_NO_TYPES_YET
;
179 protected String
getTooltipString() {
180 return Messages
.TypeDesignationSection_ADD_TYPE
;
184 public void removeElement(TypeDesignationBase element
) {
185 DetailsPartE4 detailsView
= AbstractUtility
.getDetailsView(getFormFactory().getContext().get((EPartService
.class)));
187 && detailsView
.getSelectionProvidingPart().getObject() instanceof IE4SavablePart
188 && StoreUtil
.promptCheckIsDirty(((IE4SavablePart
)detailsView
.getSelectionProvidingPart().getObject()))){
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
);
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
,
204 (IPostOperationEnabled
) detailsView
.getSelectionProvidingPart().getObject(),
206 ((ITaxonEditor
) detailsView
.getSelectionProvidingPart().getObject()).addOperation(operation
);
208 entity
.removeTypeDesignation(element
);
215 public void setTaxonBase(TaxonBase entity
) {
216 this.taxonBase
= entity
;
217 TaxonName name
= HibernateProxyHelper
.deproxy(entity
.getName());
222 public void setTaxonBaseWithoutUpdate(TaxonBase entity
) {
223 this.setTaxonBase(entity
);
226 private boolean isSpecimenType(){
227 Rank rank
= getEntity() == null ?
null : getEntity().getRank();
231 return rank
.isSpecies() || rank
.isInfraSpecific();
235 public TaxonBase
getTaxonBase() {
240 public TypeDesignationBase
addExisting() {
245 public boolean allowAddExisting() {