Move getService to CdmStore
[taxeditor.git] / eu.etaxonomy.taxeditor.store / src / main / java / eu / etaxonomy / taxeditor / ui / selection / EntitySelectionElement.java
index b7555cf7b173cfb59509d4ad7a5f9b001c00d413..3b5cf35e60576e64081a70fd955f78dd78c7c109 100644 (file)
@@ -3,35 +3,52 @@
  */
 package eu.etaxonomy.taxeditor.ui.selection;
 
+import java.util.EnumSet;
+import java.util.Observable;
+import java.util.Observer;
+
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.jface.wizard.WizardDialog;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.SelectionAdapter;
 import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
 import org.eclipse.swt.graphics.Color;
 import org.eclipse.swt.widgets.Button;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Label;
 import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
 import org.springframework.security.core.GrantedAuthority;
 
 import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
+import eu.etaxonomy.cdm.api.conversation.IConversationEnabled;
 import eu.etaxonomy.cdm.common.CdmUtils;
+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.persistence.hibernate.CdmDataChangeMap;
+import eu.etaxonomy.cdm.persistence.hibernate.permission.CRUD;
 import eu.etaxonomy.taxeditor.model.ImageResources;
 import eu.etaxonomy.taxeditor.preference.Resources;
+import eu.etaxonomy.taxeditor.store.CdmStore;
+import eu.etaxonomy.taxeditor.store.LoginManager;
 import eu.etaxonomy.taxeditor.store.StoreUtil;
-import eu.etaxonomy.taxeditor.ui.campanula.compatibility.ICdmFormElement;
-import eu.etaxonomy.taxeditor.ui.campanula.compatibility.IEntitySelectionElement;
 import eu.etaxonomy.taxeditor.ui.dialog.selection.SelectionDialogFactory;
 import eu.etaxonomy.taxeditor.ui.element.AbstractCdmFormElement;
 import eu.etaxonomy.taxeditor.ui.element.CdmFormFactory;
 import eu.etaxonomy.taxeditor.ui.element.CdmPropertyChangeEvent;
+import eu.etaxonomy.taxeditor.ui.element.ICdmFormElement;
+import eu.etaxonomy.taxeditor.ui.element.IEnableableFormElement;
+import eu.etaxonomy.taxeditor.ui.element.IEntityElement;
+import eu.etaxonomy.taxeditor.ui.element.ILabeledElement;
+import eu.etaxonomy.taxeditor.ui.element.ISelectableElement;
 import eu.etaxonomy.taxeditor.ui.element.LayoutConstants;
 import eu.etaxonomy.taxeditor.ui.element.SelectionArbitrator;
+import eu.etaxonomy.taxeditor.ui.section.grantedAuthority.GrantedAuthorityLabelTextProvider;
 
 /**
  * <p>
@@ -43,8 +60,12 @@ import eu.etaxonomy.taxeditor.ui.element.SelectionArbitrator;
  * @version 1.0
  * @param <T>
  */
-public class EntitySelectionElement<T extends ICdmBase> extends
-               AbstractCdmFormElement implements IEntitySelectionElement<T>{
+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);
+       private static final EnumSet<CRUD> CREATE = EnumSet.of(CRUD.CREATE);
 
        /**
         * Bitmask for configuring functionality of selection element
@@ -58,7 +79,7 @@ public class EntitySelectionElement<T extends ICdmBase> extends
        protected T entity;
 
        protected Label label;
-       protected Label text;
+       protected Text text;
        protected Button button_selection;
 
        private SelectionArbitrator selectionArbitrator;
@@ -115,7 +136,7 @@ public class EntitySelectionElement<T extends ICdmBase> extends
                this.isDeletable = (mode & DELETABLE) == DELETABLE;
                boolean isSelectable = (mode & SELECTABLE) == SELECTABLE;
 
-               this.labelString = labelString;
+               this.labelString = (labelString == null || labelString.equals("")) ? "" : labelString + " : ";
 
                this.conversation = conversation;
 
@@ -137,7 +158,7 @@ public class EntitySelectionElement<T extends ICdmBase> extends
 
        private void createControls(Composite parent, int style) {
 
-               label = formFactory.createLabel(getLayoutComposite(), labelString + " : ",
+               label = formFactory.createLabel(getLayoutComposite(), labelString,
                                SWT.NULL);
 
                addControl(label);
@@ -157,7 +178,8 @@ public class EntitySelectionElement<T extends ICdmBase> extends
 
                addControl(selectableComposite);
 
-               text = formFactory.createLabel(selectableComposite, null, SWT.WRAP);
+               text = formFactory.createText(selectableComposite, null, SWT.WRAP);
+               text.setEditable(false);
                addControl(text);
 
                text.setLayoutData(LayoutConstants.FILL_HORIZONTALLY());
@@ -196,7 +218,7 @@ public class EntitySelectionElement<T extends ICdmBase> extends
 
        @Override
     public void widgetSelected(SelectionEvent e) {
-               T selection = SelectionDialogFactory.getSelectionFromDialog(clazz, getShell(), getConversationHolder(), getEntity());
+               T selection = SelectionDialogFactory.getSelectionFromDialog(clazz, getShell(), getConversationHolder(), getEntity(), getParentElement());
                setSelectionInternal(selection);
        }
 
@@ -218,10 +240,23 @@ 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) {
-                       button_edit.setEnabled(enabled && entity != null);
+                       updateButtonStates();
                }
+
+       }
+
+       /* (non-Javadoc)
+        * @see eu.etaxonomy.taxeditor.ui.element.IEnableableFormElement#isEnabled()
+        */
+       @Override
+       public boolean isEnabled() {
+           return button_selection.isEnabled();
        }
 
        /**
@@ -257,16 +292,12 @@ public class EntitySelectionElement<T extends ICdmBase> extends
         */
        protected void updateElement() {
                String title = CdmUtils.Nz(getTitle());
-               // we have to duplicate ampersands otherwise they are treated as
-               // mnenomic (see Label.setText() documentation)
-               title = title.replace("&", "&&");
                text.setText(title); // title can be null
                if (isEditable) {
-                       button_edit.setEnabled(entity != null);
+                       updateButtonStates();
                }
        }
 
-       @Override
     public void updateFromWizard() {
                updateElement();
                firePropertyChangeEvent(new CdmPropertyChangeEvent(this, null));
@@ -281,13 +312,21 @@ 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 ((GrantedAuthority) entity).getAuthority();
-                       }
+                               return GrantedAuthorityLabelTextProvider.getText(((GrantedAuthority) entity));
+                       } else if(entity instanceof User){
+                return ((User) entity).getUsername();
+            } else if (entity instanceof Primer){
+                return ((Primer) entity).getLabel();
+            } else if (entity instanceof Amplification){
+                return ((Amplification) entity).getLabelCache();
+            }
+            else if(entity instanceof IIdentifiableEntity) {
+                return ((IIdentifiableEntity) entity).getTitleCache();
+            }
+
                }
                return "";
        }
@@ -339,7 +378,6 @@ public class EntitySelectionElement<T extends ICdmBase> extends
         *
         * @return a {@link org.eclipse.swt.widgets.Shell} object.
         */
-       @Override
     public Shell getShell() {
                return getLayoutComposite().getShell();
        }
@@ -372,7 +410,7 @@ public class EntitySelectionElement<T extends ICdmBase> extends
 
        private class EditListener extends SelectionAdapter {
 
-               private final EntitySelectionElement<T> selectionElement;
+        private final EntitySelectionElement<T> selectionElement;
 
                public EditListener(EntitySelectionElement<T> selectionElement) {
                        this.selectionElement = selectionElement;
@@ -384,6 +422,7 @@ public class EntitySelectionElement<T extends ICdmBase> extends
                        WizardDialog dialog = new WizardDialog(selectionElement.getShell(),
                                        new EditFromSelectionWizard(selectionElement));
                        if (dialog.open() == IStatus.OK) {
+
                                selectionElement.updateFromWizard();
                        }
                }
@@ -411,7 +450,9 @@ public class EntitySelectionElement<T extends ICdmBase> extends
        /** {@inheritDoc} */
        @Override
        public void setBackground(Color color) {
-               label.setBackground(color);
+           if(!label.isDisposed()){
+               label.setBackground(color);
+           }
        }
 
        /** {@inheritDoc} */
@@ -441,4 +482,27 @@ public class EntitySelectionElement<T extends ICdmBase> extends
        @Override
        public void update(CdmDataChangeMap changeEvents) {
        }
+
+       /* (non-Javadoc)
+        * @see eu.etaxonomy.taxeditor.ui.element.AbstractCdmFormElement#removeElements()
+        */
+       @Override
+    public void removeElements(){
+               super.removeElements();
+               LoginManager loginManager = CdmStore.getLoginManager();
+               loginManager.addObserver(this);
+       }
+
+       @Override
+       public void update(Observable o, Object arg) {
+               if(o instanceof LoginManager){
+                       updateButtonStates();
+               }
+       }
+
+       private void updateButtonStates() {
+           if(button_edit != null && !button_selection.isDisposed()){
+               button_edit.setEnabled(isEditable && button_selection.isEnabled() && getEntity() != null  && CdmStore.currentAuthentiationHasPermission(getEntity(), UPDATE));
+           }
+       }
 }