fix #7395: add check for Nonviral nomenclatutal code in checkForDeletableParts
[taxeditor.git] / eu.etaxonomy.taxeditor.store / src / main / java / eu / etaxonomy / taxeditor / ui / selection / EntitySelectionElement.java
index 0b0f89b2c13c9d93d4053110713f79a791161a8d..30ebf05424735d0362dbfb1c6fc614e09cd73e48 100644 (file)
@@ -8,7 +8,6 @@ import java.util.Observable;
 import java.util.Observer;
 
 import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.NullProgressMonitor;
 import org.eclipse.jface.wizard.WizardDialog;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.SelectionAdapter;
@@ -24,35 +23,17 @@ import org.springframework.security.core.GrantedAuthority;
 
 import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
 import eu.etaxonomy.cdm.api.conversation.IConversationEnabled;
-import eu.etaxonomy.cdm.api.service.IAgentService;
-import eu.etaxonomy.cdm.api.service.ICollectionService;
-import eu.etaxonomy.cdm.api.service.INameService;
-import eu.etaxonomy.cdm.api.service.IOccurrenceService;
-import eu.etaxonomy.cdm.api.service.IReferenceService;
 import eu.etaxonomy.cdm.api.service.IService;
-import eu.etaxonomy.cdm.api.service.IUserService;
-import eu.etaxonomy.cdm.api.service.molecular.IAmplificationService;
-import eu.etaxonomy.cdm.api.service.molecular.IPrimerService;
 import eu.etaxonomy.cdm.common.CdmUtils;
-import eu.etaxonomy.cdm.model.agent.Institution;
-import eu.etaxonomy.cdm.model.agent.Person;
-import eu.etaxonomy.cdm.model.agent.Team;
 import eu.etaxonomy.cdm.model.common.CdmBase;
 import eu.etaxonomy.cdm.model.common.Group;
-import eu.etaxonomy.cdm.model.common.ICdmBase;
 import eu.etaxonomy.cdm.model.common.IIdentifiableEntity;
 import eu.etaxonomy.cdm.model.common.User;
 import eu.etaxonomy.cdm.model.molecular.Amplification;
 import eu.etaxonomy.cdm.model.molecular.Primer;
-import eu.etaxonomy.cdm.model.name.NonViralName;
-import eu.etaxonomy.cdm.model.occurrence.Collection;
-import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;
 import eu.etaxonomy.cdm.model.reference.Reference;
-import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap;
 import eu.etaxonomy.cdm.persistence.hibernate.permission.CRUD;
-import eu.etaxonomy.taxeditor.model.AbstractUtility;
 import eu.etaxonomy.taxeditor.model.ImageResources;
-import eu.etaxonomy.taxeditor.model.MessagingUtils;
 import eu.etaxonomy.taxeditor.preference.Resources;
 import eu.etaxonomy.taxeditor.store.CdmStore;
 import eu.etaxonomy.taxeditor.store.LoginManager;
@@ -71,17 +52,14 @@ import eu.etaxonomy.taxeditor.ui.element.SelectionArbitrator;
 import eu.etaxonomy.taxeditor.ui.section.grantedAuthority.GrantedAuthorityLabelTextProvider;
 
 /**
- * <p>
- * Abstract AbstractSelectionElement class.
- * </p>
- *
  * @author n.hoffmann
  * @created Nov 17, 2009
  * @version 1.0
  * @param <T>
  */
-public class EntitySelectionElement<T extends ICdmBase> extends
-               AbstractCdmFormElement implements  SelectionListener, IEnableableFormElement, ISelectableElement, IEntityElement<T>, ILabeledElement, IConversationEnabled, Observer {
+public class EntitySelectionElement<T extends CdmBase> extends
+               AbstractCdmFormElement implements  SelectionListener, IEnableableFormElement, ISelectableElement, IEntityElement<T>, ILabeledElement, //IConversationEnabled,
+               Observer {
 
        private static final EnumSet<CRUD> UPDATE = EnumSet.of(CRUD.UPDATE);
        private static final EnumSet<CRUD> DELETE = EnumSet.of(CRUD.DELETE);
@@ -90,18 +68,22 @@ public class EntitySelectionElement<T extends ICdmBase> extends
        /**
         * Bitmask for configuring functionality of selection element
         */
-       public static final int NOTHING = 0; // 000
-       public static final int EDITABLE = 1 << 0; // 001
-       public static final int DELETABLE = 1 << 1; // 010
-       public static final int SELECTABLE = 1 << 2; // 100
-       public static final int ALL = EDITABLE | DELETABLE | SELECTABLE; // 111
-
+       public static final int NOTHING = 0; // 0000
+       public static final int EDITABLE = 1 << 0; // 0001
+       public static final int DELETABLE = 1 << 1; // 0010
+       public static final int SELECTABLE = 1 << 2; // 0100
+       public static final int EXTERNAL = 1 << 3; // 1000
+       public static final int ALL = EDITABLE | DELETABLE | SELECTABLE ; // 0111
+       public static final int ALL_WITH_EXT = EDITABLE | DELETABLE | SELECTABLE | EXTERNAL ; // 1111
        protected T entity;
+       protected T filteredEntity;
 
        protected Label label;
        protected Text text;
        protected Button button_selection;
 
+       protected Button button_selectionExt;
+
        private SelectionArbitrator selectionArbitrator;
 
        protected Button button_edit;
@@ -115,66 +97,50 @@ public class EntitySelectionElement<T extends ICdmBase> extends
        private final boolean isEditable;
 
        private final boolean isDeletable;
+       private final boolean isExternal;
 
-       private final ConversationHolder conversation;
+//     private final ConversationHolder conversation;
        private Class<T> clazz;
 
-       /**
-        * <p>
-        * Constructor for AbstractSelectionElement.
-        * </p>
-        *
-        * @param formFactory
-        *            a {@link eu.etaxonomy.taxeditor.ui.element.CdmFormFactory}
-        *            object.
-        * @param conversation
-        *            TODO
-        * @param parentElement
-        *            a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
-        *            object.
-        * @param labelString
-        *            a {@link java.lang.String} object.
-        * @param entity
-        *            a T object.
-        * @param isEditable
-        *            a boolean.
-        * @param isSelectable
-        *            a boolean.
-        * @param isDeletable
-        *            a boolean.
-        * @param style
-        *            a int.
-        * @param <T>
-        *            a T object.
-        */
        public EntitySelectionElement(CdmFormFactory formFactory,
-                       ConversationHolder conversation, ICdmFormElement parentElement,
-                       String labelString, T entity, int mode, int style) {
+//                     ConversationHolder conversation,
+               ICdmFormElement parentElement, Class<T> clazz,
+                       String labelString, T entity, int mode, int style, boolean filterElement) {
                super(formFactory, parentElement);
 
+               this.clazz = clazz;
                this.isEditable = (mode & EDITABLE) == EDITABLE;
                this.isDeletable = (mode & DELETABLE) == DELETABLE;
+               this.isExternal= (mode & EXTERNAL) == EXTERNAL;
                boolean isSelectable = (mode & SELECTABLE) == SELECTABLE;
 
-               this.labelString = (labelString == null || labelString.equals("")) ? "" : labelString + " : ";
+               this.labelString = (labelString == null || labelString.equals("")) ? "" : labelString;
 
-               this.conversation = conversation;
+//             this.conversation = conversation;
 
                if (isSelectable && formFactory.getSelectionProvider() != null) {
                        selectionArbitrator = formFactory.createSelectionArbitrator(this);
                }
 
                createControls(getLayoutComposite(), SWT.NULL);
-
-               setEntity(entity);
+               if (filterElement){
+                   setFilteredEntity(entity);
+               }else{
+                   setEntity(entity);
+               }
        }
 
-       public EntitySelectionElement(CdmFormFactory formFactory,
-                       ConversationHolder conversation, ICdmFormElement parentElement, Class<T> clazz,
-                       String labelString, T entity, int mode, int style) {
-               this(formFactory, conversation, parentElement, labelString, entity, mode, style);
-               this.clazz = clazz;
-       }
+    private void setFilteredEntity(T filterEntity) {
+        this.filteredEntity =filterEntity;
+
+    }
+
+    public EntitySelectionElement(CdmFormFactory formFactory,//ConversationHolder conversation,
+             ICdmFormElement parentElement, Class<T> clazz,
+            String labelString, T entity, int mode, int style){
+        this(formFactory, //conversation,
+                parentElement, clazz, labelString, entity, mode, style, false);
+    }
 
        private void createControls(Composite parent, int style) {
 
@@ -192,6 +158,9 @@ public class EntitySelectionElement<T extends ICdmBase> extends
                if (isDeletable) {
                        columns += 1;
                }
+               if (isExternal) {
+            columns += 1;
+        }
 
                selectableComposite.setLayout(LayoutConstants.LAYOUT(columns, false));
                selectableComposite.setLayoutData(LayoutConstants.FILL_HORIZONTALLY());
@@ -214,7 +183,16 @@ public class EntitySelectionElement<T extends ICdmBase> extends
 
                addControl(button_selection);
                button_selection.addSelectionListener(this);
-
+               if (isExternal){
+               button_selectionExt = formFactory.createButton(selectableComposite, null,
+                    SWT.PUSH);
+               button_selectionExt.setImage(ImageResources
+                    .getImage(ImageResources.BROWSE_ICON));
+               button_selectionExt.setToolTipText("Browse existing from external cdm store");
+               button_selectionExt.setText("Ext");
+            addControl(button_selectionExt);
+            button_selectionExt.addSelectionListener(this);
+               }
                if (isEditable) {
                        button_edit = formFactory.createButton(selectableComposite, null,
                                        SWT.PUSH);
@@ -238,11 +216,27 @@ public class EntitySelectionElement<T extends ICdmBase> extends
 
        @Override
     public void widgetSelected(SelectionEvent e) {
-               T selection = SelectionDialogFactory.getSelectionFromDialog(clazz, getShell(), getConversationHolder(), getEntity());
-               setSelectionInternal(selection);
+           if (e.getSource().equals(button_selection) ){
+               T selection = SelectionDialogFactory.getSelectionFromDialog(clazz, getShell(), //getConversationHolder(),
+                       getFilteredEntity(), getParentElement());
+            setSelectionInternal(selection);
+           }else{
+               Reference selection = SelectionDialogFactory.getSelectionFromExtDialog(Reference.class, getShell(),//null,
+                       getParentElement());
+            setSelectionInternal((T)selection);
+           }
+
        }
 
        /**
+     * @return
+     */
+    public T getFilteredEntity() {
+
+        return this.filteredEntity;
+    }
+
+    /**
         * Return the selected object
         *
         * @return a T object.
@@ -260,10 +254,15 @@ public class EntitySelectionElement<T extends ICdmBase> extends
        /** {@inheritDoc} */
        @Override
        public void setEnabled(boolean enabled) {
+
                button_selection.setEnabled(enabled);
+               if (isDeletable){
+                   button_remove.setEnabled(enabled);
+               }
                if (isEditable) {
                        updateButtonStates();
                }
+
        }
 
        /* (non-Javadoc)
@@ -327,9 +326,7 @@ public class EntitySelectionElement<T extends ICdmBase> extends
         */
        protected String getTitle() {
                if (entity != null){
-                       if(entity instanceof IIdentifiableEntity) {
-                               return ((IIdentifiableEntity) entity).getTitleCache();
-                       } else if(entity instanceof Group){
+                       if(entity instanceof Group){
                                return ((Group) entity).getName();
                        } else if(entity instanceof GrantedAuthority){
                                return GrantedAuthorityLabelTextProvider.getText(((GrantedAuthority) entity));
@@ -340,6 +337,9 @@ public class EntitySelectionElement<T extends ICdmBase> extends
             } else if (entity instanceof Amplification){
                 return ((Amplification) entity).getLabelCache();
             }
+            else if(entity instanceof IIdentifiableEntity) {
+                return ((IIdentifiableEntity) entity).getTitleCache();
+            }
 
                }
                return "";
@@ -424,8 +424,6 @@ public class EntitySelectionElement<T extends ICdmBase> extends
 
        private class EditListener extends SelectionAdapter {
 
-        private static final String TRANSIENT_EDITING_WARNING_TEXT = "Warning: All changes for this element are directly reflected in the data base.\nThe \"Cancel\" button has no effect";
-        private static final String TRANSIENT_EDITING_WARNING_TITLE = "CDM element not yet saved.";
         private final EntitySelectionElement<T> selectionElement;
 
                public EditListener(EntitySelectionElement<T> selectionElement) {
@@ -435,78 +433,21 @@ public class EntitySelectionElement<T extends ICdmBase> extends
                /** {@inheritDoc} */
                @Override
                public void widgetSelected(SelectionEvent e) {
-                   T originalEntity = selectionElement.getEntity();
-                   T clonedEntity = null;
-                   IService<T> service = null;
-                   if(originalEntity instanceof CdmBase){
-                       //get corresponding service
-                       if(entity instanceof Reference<?>){
-                           service = (IService<T>) CdmStore.getService(IReferenceService.class);
-                       }
-                       else if (entity instanceof Team || entity instanceof Person || entity instanceof Institution) {
-                           service = (IService<T>) CdmStore.getService(IAgentService.class);
-                       }
-                       else if (entity instanceof NonViralName) {
-                           service = (IService<T>) CdmStore.getService(INameService.class);
-                       }
-                       else if (entity instanceof SpecimenOrObservationBase) {
-                           service = (IService<T>) CdmStore.getService(IOccurrenceService.class);
-                       }
-                       else if (entity instanceof Collection) {
-                           service = (IService<T>) CdmStore.getService(ICollectionService.class);
-                       }
-                       else if (entity instanceof User) {
-                           service = (IService<T>) CdmStore.getService(IUserService.class);
-                       }
-                       else if (entity instanceof Primer) {
-                           service = (IService<T>) CdmStore.getService(IPrimerService.class);
-                       }
-                       else if (entity instanceof Amplification) {
-                           service = (IService<T>) CdmStore.getService(IAmplificationService.class);
-                       }
-                       //check if original already exists in data base. If not then do not clone and all changes will be persisted directly -> Warning to user.
-                if(service !=null && service.find(originalEntity.getUuid())==null){
-                    if(MessagingUtils.confirmDialog(TRANSIENT_EDITING_WARNING_TITLE, "["+originalEntity.getClass().getSimpleName()+"]"+originalEntity + " has to be saved before it can be edited. Save now?")){
-                        service.save(originalEntity);
-                        AbstractUtility.getActiveEditor().doSave(new NullProgressMonitor());
-                    }
-                    else{
-                        //transient CDM elements should not be edited to avoid merge conflicts
-                        // when the elements are cascaded
-                        return;
-                    }
-                }
-                else{
-                    try {
-                        //clone original
-                        clonedEntity = (T) ((CdmBase) originalEntity).clone();
-                    } catch (CloneNotSupportedException e1) {
-                        MessagingUtils.warningDialog(TRANSIENT_EDITING_WARNING_TITLE, this, TRANSIENT_EDITING_WARNING_TEXT);
-                    }
-                }
-
-                   }
-                   if(clonedEntity!=null){
-                       selectionElement.setEntity(clonedEntity);
-                   }
                        WizardDialog dialog = new WizardDialog(selectionElement.getShell(),
                                        new EditFromSelectionWizard(selectionElement));
                        if (dialog.open() == IStatus.OK) {
-                           if(service!=null && clonedEntity!=null){//check if cloning happened
-                               T editedClonedEntity = selectionElement.getEntity();
-                               editedClonedEntity.setId(originalEntity.getId());
-                               editedClonedEntity.setUuid(originalEntity.getUuid());
-
-                               //merge clone and original
-                               service.merge(editedClonedEntity);
-                               originalEntity = service.load(originalEntity.getUuid());
-
-                           }
-                           selectionElement.setEntity(originalEntity);
                                selectionElement.updateFromWizard();
+                               //if the edited entity has already been persisted
+                               //but the transient entity is still set in this
+                               //EntitySelectionElement, re-load it and set it
+                               IService<T> service = CdmStore.getService(entity);
+                               if(entity.getId()==0){
+                                       T loadedEntity = service.load(entity.getUuid());
+                                       if(loadedEntity!=null){
+                                               setEntity(loadedEntity);
+                                       }
+                               }
                        }
-                       //be sure to reset to original in all cases
-                       selectionElement.setEntity(originalEntity);
                }
        }
 
@@ -524,9 +465,12 @@ public class EntitySelectionElement<T extends ICdmBase> extends
         * @return a {@link eu.etaxonomy.cdm.api.conversation.ConversationHolder}
         *         object.
         */
-       @Override
+//     @Override
        public ConversationHolder getConversationHolder() {
-               return conversation;
+           if(getParentElement() instanceof IConversationEnabled) {
+            return ((IConversationEnabled)getParentElement()).getConversationHolder();
+        }
+           return null;
        }
 
        /** {@inheritDoc} */
@@ -561,9 +505,9 @@ public class EntitySelectionElement<T extends ICdmBase> extends
        }
 
        /** {@inheritDoc} */
-       @Override
-       public void update(CdmDataChangeMap changeEvents) {
-       }
+//     @Override
+//     public void update(CdmDataChangeMap changeEvents) {
+//     }
 
        /* (non-Javadoc)
         * @see eu.etaxonomy.taxeditor.ui.element.AbstractCdmFormElement#removeElements()
@@ -584,7 +528,7 @@ public class EntitySelectionElement<T extends ICdmBase> extends
 
        private void updateButtonStates() {
            if(button_edit != null && !button_selection.isDisposed()){
-               button_edit.setEnabled(isEditable && button_selection.isEnabled() && getEntity() != null  && CdmStore.currentAuthentiationHasPermission((CdmBase) getEntity(), UPDATE));
+               button_edit.setEnabled(isEditable && button_selection.isEnabled() && getEntity() != null  && CdmStore.currentAuthentiationHasPermission(getEntity(), UPDATE));
            }
        }
 }