ref #8225 Fix deletion of not persisted type designations
[taxeditor.git] / eu.etaxonomy.taxeditor.store / src / main / java / eu / etaxonomy / taxeditor / ui / section / name / TypeDesignationSection.java
index 8b40d8a0b2dbe6c7e03c83f1cef8762d31b3c2e7..20676122f3a6b9d76b1e06213374e33fcb7fc562 100644 (file)
@@ -1,9 +1,8 @@
-// $Id$
 /**
 * Copyright (C) 2007 EDIT
-* European Distributed Institute of Taxonomy 
+* European Distributed Institute of Taxonomy
 * http://www.e-taxonomy.eu
-* 
+*
 * The contents of this file are subject to the Mozilla Public License Version 1.1
 * See LICENSE.TXT at the top of this package for the full license terms.
 */
 package eu.etaxonomy.taxeditor.ui.section.name;
 
 import java.util.Collection;
+import java.util.Comparator;
+
+import org.eclipse.core.commands.operations.IOperationHistory;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.e4.ui.workbench.modeling.EPartService;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.action.ToolBarManager;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.swt.graphics.ImageData;
 
 import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
+import eu.etaxonomy.cdm.api.service.INameService;
+import eu.etaxonomy.cdm.api.service.UpdateResult;
+import eu.etaxonomy.cdm.api.service.name.TypeDesignationComparator;
 import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
 import eu.etaxonomy.cdm.model.name.NameTypeDesignation;
-import eu.etaxonomy.cdm.model.name.NonViralName;
 import eu.etaxonomy.cdm.model.name.Rank;
 import eu.etaxonomy.cdm.model.name.SpecimenTypeDesignation;
-import eu.etaxonomy.cdm.model.name.TaxonNameBase;
+import eu.etaxonomy.cdm.model.name.TaxonName;
 import eu.etaxonomy.cdm.model.name.TypeDesignationBase;
 import eu.etaxonomy.cdm.model.taxon.TaxonBase;
-import eu.etaxonomy.taxeditor.ui.forms.CdmFormFactory;
-import eu.etaxonomy.taxeditor.ui.forms.ICdmFormElement;
+import eu.etaxonomy.taxeditor.editor.ITaxonEditor;
+import eu.etaxonomy.taxeditor.l10n.Messages;
+import eu.etaxonomy.taxeditor.model.AbstractUtility;
+import eu.etaxonomy.taxeditor.model.ImageResources;
+import eu.etaxonomy.taxeditor.model.MessagingUtils;
+import eu.etaxonomy.taxeditor.operation.IPostOperationEnabled;
+import eu.etaxonomy.taxeditor.preference.IPreferenceKeys;
+import eu.etaxonomy.taxeditor.preference.PreferencesUtil;
+import eu.etaxonomy.taxeditor.store.CdmStore;
+import eu.etaxonomy.taxeditor.store.StoreUtil;
+import eu.etaxonomy.taxeditor.ui.element.CdmFormFactory;
+import eu.etaxonomy.taxeditor.ui.element.ICdmFormElement;
 import eu.etaxonomy.taxeditor.ui.section.AbstractEntityCollectionSection;
 import eu.etaxonomy.taxeditor.ui.section.ITaxonBaseDetailSection;
+import eu.etaxonomy.taxeditor.ui.section.name.operation.DeleteTypeDesignationOperation;
+import eu.etaxonomy.taxeditor.ui.section.name.type.CloneTypeWizard;
+import eu.etaxonomy.taxeditor.view.e4.details.DetailsPartE4;
+import eu.etaxonomy.taxeditor.workbench.part.IE4SavablePart;
 
 /**
- * <p>TypeDesignationSection class.</p>
- *
  * @author n.hoffmann
  * @created May 17, 2010
- * @version 1.0
  */
-public class TypeDesignationSection extends AbstractEntityCollectionSection<TaxonNameBase, TypeDesignationBase> implements ITaxonBaseDetailSection {
+public class TypeDesignationSection extends AbstractEntityCollectionSection<TaxonName, TypeDesignationBase> implements ITaxonBaseDetailSection {
 
        private TaxonBase taxonBase;
 
-       /**
-        * <p>Constructor for TypeDesignationSection.</p>
-        *
-        * @param formFactory a {@link eu.etaxonomy.taxeditor.ui.forms.CdmFormFactory} object.
-        * @param conversation a {@link eu.etaxonomy.cdm.api.conversation.ConversationHolder} object.
-        * @param parentElement a {@link eu.etaxonomy.taxeditor.ui.forms.ICdmFormElement} object.
-        * @param style a int.
-        */
        public TypeDesignationSection(CdmFormFactory formFactory, ConversationHolder conversation,
                        ICdmFormElement parentElement, int style) {
-               super(formFactory, conversation, parentElement, "Type Designations", style);
+               super(formFactory, conversation, parentElement, Messages.TypeDesignationSection_TYPE_DESIGNATIONS, style);
+       }
+
+       @Override
+       protected void addAction(ToolBarManager toolBarManager) {
+           if(!isSpecimenType() ||
+                   getEntity().getTypeDesignations().isEmpty()
+                   || getEntity().getTypeDesignations().stream().noneMatch(designation->designation instanceof SpecimenTypeDesignation)){
+               return;
+           }
+           Action cloneAction = new Action(Messages.TypeDesignationSection_CREATE_DUPLICATE, IAction.AS_PUSH_BUTTON){
+            @Override
+            public void run() {
+                DetailsPartE4 detailsView = AbstractUtility.getDetailsView(getFormFactory().getContext().get((EPartService.class)));
+                if(detailsView!=null
+                        && detailsView.getSelectionProvidingPart().getObject() instanceof IE4SavablePart
+                        && StoreUtil.promptCheckIsDirty(((IE4SavablePart)detailsView.getSelectionProvidingPart().getObject()))){
+                    return;
+                }
+                CloneTypeWizard wizard = new CloneTypeWizard(getEntity());
+                WizardDialog dialog = new WizardDialog(getShell(), wizard);
+
+                if (dialog.open() == IStatus.OK) {
+                    SpecimenTypeDesignation baseTypeDesignation = HibernateProxyHelper.deproxy(wizard.getBaseTypeDesignation());
+                    UpdateResult result = CdmStore.getService(INameService.class).cloneTypeDesignation(
+                            wizard.getTaxonName().getUuid(),
+                            baseTypeDesignation,
+                            wizard.getAccessionNumber(),
+                            wizard.getBarcode(),
+                            wizard.getCatalogNumber(),
+                            wizard.getCollection().getUuid(),
+                            wizard.getTypeStatus());
+                    if(!result.isOk()){
+                        MessagingUtils.warningDialog(Messages.TypeDesignationSection_DUPLICATE_FAILED, this, result.getExceptions().toString());
+                    }
+                    StoreUtil.reflowParentScrolledForm(getLayoutComposite(), true);
+                    internalUpdateSection(false);
+                }
+            }
+        };
+        cloneAction.setImageDescriptor(new ImageDescriptor() {
+
+            @Override
+            public ImageData getImageData() {
+                return ImageResources.getImage(ImageResources.COPY_ICON).getImageData();
+            }
+        });
+        cloneAction.setToolTipText(Messages.TypeDesignationSection_CREATE_DUPLICATE);
+
+        toolBarManager.add(cloneAction);
        }
-       
-       /** {@inheritDoc} */
+
        @Override
        public void addElement(TypeDesignationBase element) {
-               getEntity().addTypeDesignation(element, false);
+               getEntity().addTypeDesignation(element, PreferencesUtil.getBooleanValue(IPreferenceKeys.ADD_TYPES_TO_ALL_NAMES));
+               updateToolbar();
        }
 
-       /** {@inheritDoc} */
        @Override
        public TypeDesignationBase createNewElement() {
                if(isSpecimenType()){
@@ -66,51 +129,79 @@ public class TypeDesignationSection extends AbstractEntityCollectionSection<Taxo
                }
        }
 
-       /** {@inheritDoc} */
        @Override
-       public Collection<TypeDesignationBase> getCollection(TaxonNameBase entity) {
+       public Collection<TypeDesignationBase> getCollection(TaxonName entity) {
+               if (entity == null){
+                       return null;
+               }
                return entity.getTypeDesignations();
        }
 
-       /** {@inheritDoc} */
+       @Override
+       public Comparator<TypeDesignationBase> getComparator() {
+        return new TypeDesignationComparator();
+       }
+
        @Override
        public String getEmptyString() {
-               return "No type designations yet.";
+               return Messages.TypeDesignationSection_NO_TYPES_YET;
        }
 
-       /** {@inheritDoc} */
        @Override
        protected String getTooltipString() {
-               return "Add a type designation";
+               return Messages.TypeDesignationSection_ADD_TYPE;
        }
 
-       /** {@inheritDoc} */
        @Override
        public void removeElement(TypeDesignationBase element) {
-               getEntity().removeTypeDesignation(element);
+               boolean removeTypeDesignationFromAllTypifiedNames = PreferencesUtil.getBooleanValue(IPreferenceKeys.ADD_TYPES_TO_ALL_NAMES);
+               TaxonName entity = removeTypeDesignationFromAllTypifiedNames ? null : getEntity();
+               DetailsPartE4 detailsView = AbstractUtility.getDetailsView(getFormFactory().getContext().get((EPartService.class)));
+               if(!element.isPersited() && entity!=null){
+            entity.removeTypeDesignation(element);
+               }
+               else if(detailsView!=null
+                       && detailsView.getSelectionProvidingPart().getObject() instanceof ITaxonEditor
+                       && detailsView.getSelectionProvidingPart().getObject() instanceof IPostOperationEnabled) {
+            DeleteTypeDesignationOperation operation = new DeleteTypeDesignationOperation(
+                    "Remove type designation",
+                    IOperationHistory.GLOBAL_UNDO_CONTEXT,
+                    entity,
+                    element,
+                    (IPostOperationEnabled) detailsView.getSelectionProvidingPart().getObject(),
+                    null);
+            ((ITaxonEditor) detailsView.getSelectionProvidingPart().getObject()).addOperation(operation);
+               }
+               updateToolbar();
        }
 
-       /*
-        * (non-Javadoc)
-        * @see eu.etaxonomy.taxeditor.section.ITaxonDetailSection#setTaxon(eu.etaxonomy.cdm.model.taxon.TaxonBase)
-        */
-       /** {@inheritDoc} */
-       public void setTaxonBase(TaxonBase entity) {
+       @Override
+    public void setTaxonBase(TaxonBase entity) {
                this.taxonBase = entity;
-               NonViralName name = (NonViralName) HibernateProxyHelper.deproxy(entity.getName());
+               TaxonName name = HibernateProxyHelper.deproxy(entity.getName());
                setEntity(name);
        }
-       
+
        private boolean isSpecimenType(){
                Rank rank = getEntity().getRank();
+               if(rank==null){
+                       return false;
+               }
                return rank.isSpecies() || rank.isInfraSpecific();
        }
 
-       /* (non-Javadoc)
-        * @see eu.etaxonomy.taxeditor.section.ITaxonDetailSection#getTaxon(eu.etaxonomy.cdm.model.taxon.TaxonBase)
-        */
        @Override
        public TaxonBase getTaxonBase() {
                return taxonBase;
        }
+
+    @Override
+    public TypeDesignationBase addExisting() {
+        return null;
+    }
+
+    @Override
+    public boolean allowAddExisting() {
+        return false;
+    }
 }