minor - avoid NPE
authorKatja Luther <k.luther@bgbm.org>
Thu, 20 Jun 2019 11:20:56 +0000 (13:20 +0200)
committerKatja Luther <k.luther@bgbm.org>
Thu, 27 Jun 2019 12:23:32 +0000 (14:23 +0200)
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/selection/EntitySelectionElement.java

index 63a6967f1e15d7e631107cb6e431c06b6bf341a0..3db1bea0875cd2479f61e69726ee8ad3e12950b6 100644 (file)
-/**
- *
- */
-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.api.service.IService;
-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.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.reference.Reference;
-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.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;
-
-/**
- * @author n.hoffmann
- * @created Nov 17, 2009
- * @version 1.0
- * @param <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
-        */
-       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;
-
-       private final String labelString;
-
-       private Composite selectableComposite;
-
-       private Button button_remove;
-
-       private final boolean isEditable;
-
-       private final boolean isDeletable;
-       private final boolean isExternal;
-
-//     private final ConversationHolder conversation;
-       private Class<T> clazz;
-
-       public EntitySelectionElement(CdmFormFactory formFactory,
-//                     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.conversation = conversation;
-
-               if (isSelectable && formFactory.getSelectionProvider() != null) {
-                       selectionArbitrator = formFactory.createSelectionArbitrator(this);
-               }
-
-               createControls(getLayoutComposite(), SWT.NULL);
-               if (filterElement){
-                   setFilteredEntity(entity);
-               }else{
-                   setEntity(entity);
-               }
-       }
-
-    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) {
-
-               label = formFactory.createLabel(getLayoutComposite(), labelString,
-                               SWT.NULL);
-
-               addControl(label);
-
-               selectableComposite = formFactory.createComposite(getLayoutComposite());
-
-               int columns = 2;
-               if (isEditable) {
-                       columns += 1;
-               }
-               if (isDeletable) {
-                       columns += 1;
-               }
-               if (isExternal) {
-            columns += 1;
-        }
-
-               selectableComposite.setLayout(LayoutConstants.LAYOUT(columns, false));
-               selectableComposite.setLayoutData(LayoutConstants.FILL_HORIZONTALLY());
-
-               addControl(selectableComposite);
-
-               text = formFactory.createText(selectableComposite, null, SWT.WRAP);
-               text.setEditable(false);
-               addControl(text);
-
-               text.setLayoutData(LayoutConstants.FILL_HORIZONTALLY());
-               text.setBackground(StoreUtil
-                               .getColor(Resources.COLOR_TEXT_DISABLED_BACKGROUND));
-
-               button_selection = formFactory.createButton(selectableComposite, null,
-                               SWT.PUSH);
-               button_selection.setImage(ImageResources
-                               .getImage(ImageResources.BROWSE_ICON));
-               button_selection.setToolTipText("Browse existing");
-
-               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);
-                       button_edit.setImage(ImageResources
-                                       .getImage(ImageResources.EDIT_ICON));
-                       button_edit.setToolTipText("Edit");
-                       addControl(button_edit);
-                       button_edit.addSelectionListener(new EditListener(this));
-               }
-
-               if (isDeletable) {
-                       button_remove = formFactory.createButton(selectableComposite, null,
-                                       SWT.PUSH);
-                       button_remove.setImage(ImageResources
-                                       .getImage(ImageResources.TRASH_ICON));
-                       button_remove.setToolTipText("Remove");
-                       addControl(button_remove);
-                       button_remove.addSelectionListener(new DeleteListener(this));
-               }
-       }
-
-       @Override
-    public void widgetSelected(SelectionEvent e) {
-           if (e.getSource().equals(button_selection) ){
-               T selection = SelectionDialogFactory.getSelectionFromDialog(clazz, getShell(), //getConversationHolder(),
-                       getEntity(), getParentElement());
-            setSelectionInternal(selection);
-            if(!getLayoutComposite().isDisposed()){
-                StoreUtil.reflowParentScrolledForm(getLayoutComposite(), true);
-            }
-           }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.
-        */
-       public T getSelection() {
-               return entity;
-       }
-
-       /*
-        * (non-Javadoc)
-        *
-        * @see
-        * eu.etaxonomy.taxeditor.forms.IEnableableFormElement#setEnabled(boolean)
-        */
-       /** {@inheritDoc} */
-       @Override
-       public void setEnabled(boolean enabled) {
-
-               button_selection.setEnabled(enabled);
-               if (isDeletable){
-                   button_remove.setEnabled(enabled);
-               }
-               if (isEditable) {
-                       updateButtonStates();
-               }
-
-       }
-
-       /* (non-Javadoc)
-        * @see eu.etaxonomy.taxeditor.ui.element.IEnableableFormElement#isEnabled()
-        */
-       @Override
-       public boolean isEnabled() {
-           return button_selection.isEnabled();
-       }
-
-       /**
-        * <p>
-        * setSelectionInternal
-        * </p>
-        *
-        * @param selection
-        *            a T object.
-        */
-       protected void setSelectionInternal(T selection) {
-               if (selection != null && !selection.equals(this.entity)) {
-                       setEntity(selection);
-                       firePropertyChangeEvent(new CdmPropertyChangeEvent(this, null));
-               }
-       }
-
-       /**
-        * <p>
-        * Setter for the field <code>entity</code>.
-        * </p>
-        *
-        * @param selection
-        *            a T object.
-        */
-       public void setEntity(T selection) {
-               this.entity = selection;
-               updateElement();
-       }
-
-       /**
-        * Updates this elements view
-        */
-       protected void updateElement() {
-               String title = CdmUtils.Nz(getTitle());
-               text.setText(title); // title can be null
-               if (isEditable) {
-                       updateButtonStates();
-               }
-       }
-
-    public void updateFromWizard() {
-               updateElement();
-               firePropertyChangeEvent(new CdmPropertyChangeEvent(this, null));
-       }
-
-       /**
-        * <p>
-        * getTitle
-        * </p>
-        *
-        * @return a {@link java.lang.String} object.
-        */
-       protected String getTitle() {
-               if (entity != null){
-                       if(entity instanceof Group){
-                               return ((Group) entity).getName();
-                       } else if(entity instanceof GrantedAuthority){
-                               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 "";
-       }
-
-       /** {@inheritDoc} */
-       @Override
-       public void setSelected(boolean selected) {
-               setBackground(selected ? SELECTED : getPersistentBackground());
-       }
-
-       /*
-        * (non-Javadoc)
-        *
-        * @see eu.etaxonomy.taxeditor.forms.IEntityElement#getEntity()
-        */
-       /**
-        * <p>
-        * Getter for the field <code>entity</code>.
-        * </p>
-        *
-        * @return a T object.
-        */
-       @Override
-       public T getEntity() {
-               return entity;
-       }
-
-       /*
-        * (non-Javadoc)
-        *
-        * @see eu.etaxonomy.taxeditor.forms.section.cdmdetail.ISelectableElement#
-        * getSelectionArbitrator()
-        */
-       /**
-        * <p>
-        * Getter for the field <code>selectionArbitrator</code>.
-        * </p>
-        *
-        * @return a {@link eu.etaxonomy.taxeditor.ui.element.SelectionArbitrator}
-        *         object.
-        */
-       @Override
-       public SelectionArbitrator getSelectionArbitrator() {
-               return selectionArbitrator;
-       }
-
-       /**
-        * Convenient access to current shell
-        *
-        * @return a {@link org.eclipse.swt.widgets.Shell} object.
-        */
-    public Shell getShell() {
-               return getLayoutComposite().getShell();
-       }
-
-       /** {@inheritDoc} */
-       @Override
-       public void setIrrelevant(boolean irrelevant) {
-               String colorId = irrelevant ? Resources.COLOR_COMPOSITE_IRRELEVANT
-                               : Resources.COLOR_TEXT_DISABLED_BACKGROUND;
-
-               Color color = StoreUtil.getColor(colorId);
-               text.setBackground(color);
-       }
-
-       private class DeleteListener extends SelectionAdapter {
-
-               private final EntitySelectionElement<T> selectionElement;
-
-               public DeleteListener(EntitySelectionElement<T> selectionElement) {
-                       this.selectionElement = selectionElement;
-               }
-
-               @Override
-               public void widgetSelected(SelectionEvent e) {
-                       setEntity(null);
-                       firePropertyChangeEvent(new CdmPropertyChangeEvent(
-                                       selectionElement, null));
-               }
-       }
-
-       private class EditListener extends SelectionAdapter {
-
-        private final EntitySelectionElement<T> selectionElement;
-
-               public EditListener(EntitySelectionElement<T> selectionElement) {
-                       this.selectionElement = selectionElement;
-               }
-
-               /** {@inheritDoc} */
-               @Override
-               public void widgetSelected(SelectionEvent e) {
-                       WizardDialog dialog = new WizardDialog(selectionElement.getShell(),
-                                       new EditFromSelectionWizard(selectionElement));
-                       if (dialog.open() == IStatus.OK) {
-                               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);
-                                       }
-                               }
-                       }
-               }
-       }
-
-       // not used
-       /** {@inheritDoc} */
-       @Override
-       public void widgetDefaultSelected(SelectionEvent e) {
-       }
-
-       /**
-        * <p>
-        * getConversationHolder
-        * </p>
-        *
-        * @return a {@link eu.etaxonomy.cdm.api.conversation.ConversationHolder}
-        *         object.
-        */
-//     @Override
-       public ConversationHolder getConversationHolder() {
-           if(getParentElement() instanceof IConversationEnabled) {
-            return ((IConversationEnabled)getParentElement()).getConversationHolder();
-        }
-           return null;
-       }
-
-       /** {@inheritDoc} */
-       @Override
-       public void setBackground(Color color) {
-           if(!label.isDisposed()){
-               label.setBackground(color);
-           }
-       }
-
-       /** {@inheritDoc} */
-       @Override
-       public void setLabel(String labelString) {
-               if (label != null) {
-                       label.setText(labelString);
-               }
-       }
-
-       /**
-        * <p>
-        * Getter for the field <code>label</code>.
-        * </p>
-        *
-        * @return a {@link java.lang.String} object.
-        */
-       @Override
-       public String getLabel() {
-               if (label != null) {
-                       return label.getText() + " : ";
-               }
-               return null;
-       }
-
-       /** {@inheritDoc} */
-//     @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));
-           }
-       }
-}
+/**\r
+ *\r
+ */\r
+package eu.etaxonomy.taxeditor.ui.selection;\r
+\r
+import java.util.EnumSet;\r
+import java.util.Observable;\r
+import java.util.Observer;\r
+\r
+import org.eclipse.core.runtime.IStatus;\r
+import org.eclipse.jface.wizard.WizardDialog;\r
+import org.eclipse.swt.SWT;\r
+import org.eclipse.swt.events.SelectionAdapter;\r
+import org.eclipse.swt.events.SelectionEvent;\r
+import org.eclipse.swt.events.SelectionListener;\r
+import org.eclipse.swt.graphics.Color;\r
+import org.eclipse.swt.widgets.Button;\r
+import org.eclipse.swt.widgets.Composite;\r
+import org.eclipse.swt.widgets.Label;\r
+import org.eclipse.swt.widgets.Shell;\r
+import org.eclipse.swt.widgets.Text;\r
+import org.springframework.security.core.GrantedAuthority;\r
+\r
+import eu.etaxonomy.cdm.api.conversation.ConversationHolder;\r
+import eu.etaxonomy.cdm.api.conversation.IConversationEnabled;\r
+import eu.etaxonomy.cdm.api.service.IService;\r
+import eu.etaxonomy.cdm.common.CdmUtils;\r
+import eu.etaxonomy.cdm.model.common.CdmBase;\r
+import eu.etaxonomy.cdm.model.common.Group;\r
+import eu.etaxonomy.cdm.model.common.IIdentifiableEntity;\r
+import eu.etaxonomy.cdm.model.common.User;\r
+import eu.etaxonomy.cdm.model.molecular.Amplification;\r
+import eu.etaxonomy.cdm.model.molecular.Primer;\r
+import eu.etaxonomy.cdm.model.reference.Reference;\r
+import eu.etaxonomy.cdm.persistence.hibernate.permission.CRUD;\r
+import eu.etaxonomy.taxeditor.model.ImageResources;\r
+import eu.etaxonomy.taxeditor.preference.Resources;\r
+import eu.etaxonomy.taxeditor.store.CdmStore;\r
+import eu.etaxonomy.taxeditor.store.LoginManager;\r
+import eu.etaxonomy.taxeditor.store.StoreUtil;\r
+import eu.etaxonomy.taxeditor.ui.dialog.selection.SelectionDialogFactory;\r
+import eu.etaxonomy.taxeditor.ui.element.AbstractCdmFormElement;\r
+import eu.etaxonomy.taxeditor.ui.element.CdmFormFactory;\r
+import eu.etaxonomy.taxeditor.ui.element.CdmPropertyChangeEvent;\r
+import eu.etaxonomy.taxeditor.ui.element.ICdmFormElement;\r
+import eu.etaxonomy.taxeditor.ui.element.IEnableableFormElement;\r
+import eu.etaxonomy.taxeditor.ui.element.IEntityElement;\r
+import eu.etaxonomy.taxeditor.ui.element.ILabeledElement;\r
+import eu.etaxonomy.taxeditor.ui.element.ISelectableElement;\r
+import eu.etaxonomy.taxeditor.ui.element.LayoutConstants;\r
+import eu.etaxonomy.taxeditor.ui.element.SelectionArbitrator;\r
+import eu.etaxonomy.taxeditor.ui.section.grantedAuthority.GrantedAuthorityLabelTextProvider;\r
+\r
+/**\r
+ * @author n.hoffmann\r
+ * @created Nov 17, 2009\r
+ * @version 1.0\r
+ * @param <T>\r
+ */\r
+public class EntitySelectionElement<T extends CdmBase> extends\r
+               AbstractCdmFormElement implements  SelectionListener, IEnableableFormElement, ISelectableElement, IEntityElement<T>, ILabeledElement, //IConversationEnabled,\r
+               Observer {\r
+\r
+       private static final EnumSet<CRUD> UPDATE = EnumSet.of(CRUD.UPDATE);\r
+       private static final EnumSet<CRUD> DELETE = EnumSet.of(CRUD.DELETE);\r
+       private static final EnumSet<CRUD> CREATE = EnumSet.of(CRUD.CREATE);\r
+\r
+       /**\r
+        * Bitmask for configuring functionality of selection element\r
+        */\r
+       public static final int NOTHING = 0; // 0000\r
+       public static final int EDITABLE = 1 << 0; // 0001\r
+       public static final int DELETABLE = 1 << 1; // 0010\r
+       public static final int SELECTABLE = 1 << 2; // 0100\r
+       public static final int EXTERNAL = 1 << 3; // 1000\r
+       public static final int ALL = EDITABLE | DELETABLE | SELECTABLE ; // 0111\r
+       public static final int ALL_WITH_EXT = EDITABLE | DELETABLE | SELECTABLE | EXTERNAL ; // 1111\r
+       protected T entity;\r
+       protected T filteredEntity;\r
+\r
+       protected Label label;\r
+       protected Text text;\r
+       protected Button button_selection;\r
+\r
+       protected Button button_selectionExt;\r
+\r
+       private SelectionArbitrator selectionArbitrator;\r
+\r
+       protected Button button_edit;\r
+\r
+       private final String labelString;\r
+\r
+       private Composite selectableComposite;\r
+\r
+       private Button button_remove;\r
+\r
+       private final boolean isEditable;\r
+\r
+       private final boolean isDeletable;\r
+       private final boolean isExternal;\r
+\r
+//     private final ConversationHolder conversation;\r
+       private Class<T> clazz;\r
+\r
+       public EntitySelectionElement(CdmFormFactory formFactory,\r
+//                     ConversationHolder conversation,\r
+               ICdmFormElement parentElement, Class<T> clazz,\r
+                       String labelString, T entity, int mode, int style, boolean filterElement) {\r
+               super(formFactory, parentElement);\r
+\r
+               this.clazz = clazz;\r
+               this.isEditable = (mode & EDITABLE) == EDITABLE;\r
+               this.isDeletable = (mode & DELETABLE) == DELETABLE;\r
+               this.isExternal= (mode & EXTERNAL) == EXTERNAL;\r
+               boolean isSelectable = (mode & SELECTABLE) == SELECTABLE;\r
+\r
+               this.labelString = (labelString == null || labelString.equals("")) ? "" : labelString;\r
+\r
+//             this.conversation = conversation;\r
+\r
+               if (isSelectable && formFactory.getSelectionProvider() != null) {\r
+                       selectionArbitrator = formFactory.createSelectionArbitrator(this);\r
+               }\r
+\r
+               createControls(getLayoutComposite(), SWT.NULL);\r
+               if (filterElement){\r
+                   setFilteredEntity(entity);\r
+               }else{\r
+                   setEntity(entity);\r
+               }\r
+       }\r
+\r
+    private void setFilteredEntity(T filterEntity) {\r
+        this.filteredEntity =filterEntity;\r
+\r
+    }\r
+\r
+    public EntitySelectionElement(CdmFormFactory formFactory,//ConversationHolder conversation,\r
+             ICdmFormElement parentElement, Class<T> clazz,\r
+            String labelString, T entity, int mode, int style){\r
+        this(formFactory, //conversation,\r
+                parentElement, clazz, labelString, entity, mode, style, false);\r
+    }\r
+\r
+       private void createControls(Composite parent, int style) {\r
+\r
+               label = formFactory.createLabel(getLayoutComposite(), labelString,\r
+                               SWT.NULL);\r
+\r
+               addControl(label);\r
+\r
+               selectableComposite = formFactory.createComposite(getLayoutComposite());\r
+\r
+               int columns = 2;\r
+               if (isEditable) {\r
+                       columns += 1;\r
+               }\r
+               if (isDeletable) {\r
+                       columns += 1;\r
+               }\r
+               if (isExternal) {\r
+            columns += 1;\r
+        }\r
+\r
+               selectableComposite.setLayout(LayoutConstants.LAYOUT(columns, false));\r
+               selectableComposite.setLayoutData(LayoutConstants.FILL_HORIZONTALLY());\r
+\r
+               addControl(selectableComposite);\r
+\r
+               text = formFactory.createText(selectableComposite, null, SWT.WRAP);\r
+               text.setEditable(false);\r
+               addControl(text);\r
+\r
+               text.setLayoutData(LayoutConstants.FILL_HORIZONTALLY());\r
+               text.setBackground(StoreUtil\r
+                               .getColor(Resources.COLOR_TEXT_DISABLED_BACKGROUND));\r
+\r
+               button_selection = formFactory.createButton(selectableComposite, null,\r
+                               SWT.PUSH);\r
+               button_selection.setImage(ImageResources\r
+                               .getImage(ImageResources.BROWSE_ICON));\r
+               button_selection.setToolTipText("Browse existing");\r
+\r
+               addControl(button_selection);\r
+               button_selection.addSelectionListener(this);\r
+               if (isExternal){\r
+               button_selectionExt = formFactory.createButton(selectableComposite, null,\r
+                    SWT.PUSH);\r
+               button_selectionExt.setImage(ImageResources\r
+                    .getImage(ImageResources.BROWSE_ICON));\r
+               button_selectionExt.setToolTipText("Browse existing from external cdm store");\r
+               button_selectionExt.setText("Ext");\r
+            addControl(button_selectionExt);\r
+            button_selectionExt.addSelectionListener(this);\r
+               }\r
+               if (isEditable) {\r
+                       button_edit = formFactory.createButton(selectableComposite, null,\r
+                                       SWT.PUSH);\r
+                       button_edit.setImage(ImageResources\r
+                                       .getImage(ImageResources.EDIT_ICON));\r
+                       button_edit.setToolTipText("Edit");\r
+                       addControl(button_edit);\r
+                       button_edit.addSelectionListener(new EditListener(this));\r
+               }\r
+\r
+               if (isDeletable) {\r
+                       button_remove = formFactory.createButton(selectableComposite, null,\r
+                                       SWT.PUSH);\r
+                       button_remove.setImage(ImageResources\r
+                                       .getImage(ImageResources.TRASH_ICON));\r
+                       button_remove.setToolTipText("Remove");\r
+                       addControl(button_remove);\r
+                       button_remove.addSelectionListener(new DeleteListener(this));\r
+               }\r
+       }\r
+\r
+       @Override\r
+    public void widgetSelected(SelectionEvent e) {\r
+           if (e.getSource().equals(button_selection) ){\r
+               T selection = SelectionDialogFactory.getSelectionFromDialog(clazz, getShell(), //getConversationHolder(),\r
+                       getEntity(), getParentElement());\r
+            setSelectionInternal(selection);\r
+            if(!getLayoutComposite().isDisposed()){\r
+                StoreUtil.reflowParentScrolledForm(getLayoutComposite(), true);\r
+            }\r
+           }else{\r
+               Reference selection = SelectionDialogFactory.getSelectionFromExtDialog(Reference.class, getShell(),//null,\r
+                       getParentElement());\r
+            setSelectionInternal((T)selection);\r
+           }\r
+\r
+       }\r
+\r
+       /**\r
+     * @return\r
+     */\r
+    public T getFilteredEntity() {\r
+\r
+        return this.filteredEntity;\r
+    }\r
+\r
+    /**\r
+        * Return the selected object\r
+        *\r
+        * @return a T object.\r
+        */\r
+       public T getSelection() {\r
+               return entity;\r
+       }\r
+\r
+       /*\r
+        * (non-Javadoc)\r
+        *\r
+        * @see\r
+        * eu.etaxonomy.taxeditor.forms.IEnableableFormElement#setEnabled(boolean)\r
+        */\r
+       /** {@inheritDoc} */\r
+       @Override\r
+       public void setEnabled(boolean enabled) {\r
+\r
+               button_selection.setEnabled(enabled);\r
+               if (isDeletable){\r
+                   button_remove.setEnabled(enabled);\r
+               }\r
+               if (isEditable) {\r
+                       updateButtonStates();\r
+               }\r
+\r
+       }\r
+\r
+       /* (non-Javadoc)\r
+        * @see eu.etaxonomy.taxeditor.ui.element.IEnableableFormElement#isEnabled()\r
+        */\r
+       @Override\r
+       public boolean isEnabled() {\r
+           return button_selection.isEnabled();\r
+       }\r
+\r
+       /**\r
+        * <p>\r
+        * setSelectionInternal\r
+        * </p>\r
+        *\r
+        * @param selection\r
+        *            a T object.\r
+        */\r
+       protected void setSelectionInternal(T selection) {\r
+               if (selection != null && !selection.equals(this.entity)) {\r
+                       setEntity(selection);\r
+                       firePropertyChangeEvent(new CdmPropertyChangeEvent(this, null));\r
+               }\r
+       }\r
+\r
+       /**\r
+        * <p>\r
+        * Setter for the field <code>entity</code>.\r
+        * </p>\r
+        *\r
+        * @param selection\r
+        *            a T object.\r
+        */\r
+       public void setEntity(T selection) {\r
+               this.entity = selection;\r
+               updateElement();\r
+       }\r
+\r
+       /**\r
+        * Updates this elements view\r
+        */\r
+       protected void updateElement() {\r
+               String title = CdmUtils.Nz(getTitle());\r
+               text.setText(title); // title can be null\r
+               if (isEditable) {\r
+                       updateButtonStates();\r
+               }\r
+       }\r
+\r
+    public void updateFromWizard() {\r
+               updateElement();\r
+               firePropertyChangeEvent(new CdmPropertyChangeEvent(this, null));\r
+       }\r
+\r
+       /**\r
+        * <p>\r
+        * getTitle\r
+        * </p>\r
+        *\r
+        * @return a {@link java.lang.String} object.\r
+        */\r
+       protected String getTitle() {\r
+               if (entity != null){\r
+                       if(entity instanceof Group){\r
+                               return ((Group) entity).getName();\r
+                       } else if(entity instanceof GrantedAuthority){\r
+                               return GrantedAuthorityLabelTextProvider.getText(((GrantedAuthority) entity));\r
+                       } else if(entity instanceof User){\r
+                return ((User) entity).getUsername();\r
+            } else if (entity instanceof Primer){\r
+                return ((Primer) entity).getLabel();\r
+            } else if (entity instanceof Amplification){\r
+                return ((Amplification) entity).getLabelCache();\r
+            }\r
+            else if(entity instanceof IIdentifiableEntity) {\r
+                return ((IIdentifiableEntity) entity).getTitleCache();\r
+            }\r
+\r
+               }\r
+               return "";\r
+       }\r
+\r
+       /** {@inheritDoc} */\r
+       @Override\r
+       public void setSelected(boolean selected) {\r
+               setBackground(selected ? SELECTED : getPersistentBackground());\r
+       }\r
+\r
+       /*\r
+        * (non-Javadoc)\r
+        *\r
+        * @see eu.etaxonomy.taxeditor.forms.IEntityElement#getEntity()\r
+        */\r
+       /**\r
+        * <p>\r
+        * Getter for the field <code>entity</code>.\r
+        * </p>\r
+        *\r
+        * @return a T object.\r
+        */\r
+       @Override\r
+       public T getEntity() {\r
+               return entity;\r
+       }\r
+\r
+       /*\r
+        * (non-Javadoc)\r
+        *\r
+        * @see eu.etaxonomy.taxeditor.forms.section.cdmdetail.ISelectableElement#\r
+        * getSelectionArbitrator()\r
+        */\r
+       /**\r
+        * <p>\r
+        * Getter for the field <code>selectionArbitrator</code>.\r
+        * </p>\r
+        *\r
+        * @return a {@link eu.etaxonomy.taxeditor.ui.element.SelectionArbitrator}\r
+        *         object.\r
+        */\r
+       @Override\r
+       public SelectionArbitrator getSelectionArbitrator() {\r
+               return selectionArbitrator;\r
+       }\r
+\r
+       /**\r
+        * Convenient access to current shell\r
+        *\r
+        * @return a {@link org.eclipse.swt.widgets.Shell} object.\r
+        */\r
+    public Shell getShell() {\r
+               return getLayoutComposite().getShell();\r
+       }\r
+\r
+       /** {@inheritDoc} */\r
+       @Override\r
+       public void setIrrelevant(boolean irrelevant) {\r
+               String colorId = irrelevant ? Resources.COLOR_COMPOSITE_IRRELEVANT\r
+                               : Resources.COLOR_TEXT_DISABLED_BACKGROUND;\r
+\r
+               Color color = StoreUtil.getColor(colorId);\r
+               text.setBackground(color);\r
+       }\r
+\r
+       private class DeleteListener extends SelectionAdapter {\r
+\r
+               private final EntitySelectionElement<T> selectionElement;\r
+\r
+               public DeleteListener(EntitySelectionElement<T> selectionElement) {\r
+                       this.selectionElement = selectionElement;\r
+               }\r
+\r
+               @Override\r
+               public void widgetSelected(SelectionEvent e) {\r
+                       setEntity(null);\r
+                       firePropertyChangeEvent(new CdmPropertyChangeEvent(\r
+                                       selectionElement, null));\r
+               }\r
+       }\r
+\r
+       private class EditListener extends SelectionAdapter {\r
+\r
+        private final EntitySelectionElement<T> selectionElement;\r
+\r
+               public EditListener(EntitySelectionElement<T> selectionElement) {\r
+                       this.selectionElement = selectionElement;\r
+               }\r
+\r
+               /** {@inheritDoc} */\r
+               @Override\r
+               public void widgetSelected(SelectionEvent e) {\r
+                       WizardDialog dialog = new WizardDialog(selectionElement.getShell(),\r
+                                       new EditFromSelectionWizard(selectionElement));\r
+                       if (dialog.open() == IStatus.OK) {\r
+                               selectionElement.updateFromWizard();\r
+                               //if the edited entity has already been persisted\r
+                               //but the transient entity is still set in this\r
+                               //EntitySelectionElement, re-load it and set it\r
+                               IService<T> service = CdmStore.getService(entity);\r
+                               if(entity.getId()==0){\r
+                                       T loadedEntity = service.load(entity.getUuid());\r
+                                       if(loadedEntity!=null){\r
+                                               setEntity(loadedEntity);\r
+                                       }\r
+                               }\r
+                       }\r
+               }\r
+       }\r
+\r
+       // not used\r
+       /** {@inheritDoc} */\r
+       @Override\r
+       public void widgetDefaultSelected(SelectionEvent e) {\r
+       }\r
+\r
+       /**\r
+        * <p>\r
+        * getConversationHolder\r
+        * </p>\r
+        *\r
+        * @return a {@link eu.etaxonomy.cdm.api.conversation.ConversationHolder}\r
+        *         object.\r
+        */\r
+//     @Override\r
+       public ConversationHolder getConversationHolder() {\r
+           if(getParentElement() instanceof IConversationEnabled) {\r
+            return ((IConversationEnabled)getParentElement()).getConversationHolder();\r
+        }\r
+           return null;\r
+       }\r
+\r
+       /** {@inheritDoc} */\r
+       @Override\r
+       public void setBackground(Color color) {\r
+\r
+           if(label != null && !label.isDisposed()){\r
+               label.setBackground(color);\r
+           }\r
+       }\r
+\r
+       /** {@inheritDoc} */\r
+       @Override\r
+       public void setLabel(String labelString) {\r
+               if (label != null) {\r
+                       label.setText(labelString);\r
+               }\r
+       }\r
+\r
+       /**\r
+        * <p>\r
+        * Getter for the field <code>label</code>.\r
+        * </p>\r
+        *\r
+        * @return a {@link java.lang.String} object.\r
+        */\r
+       @Override\r
+       public String getLabel() {\r
+               if (label != null) {\r
+                       return label.getText() + " : ";\r
+               }\r
+               return null;\r
+       }\r
+\r
+       /** {@inheritDoc} */\r
+//     @Override\r
+//     public void update(CdmDataChangeMap changeEvents) {\r
+//     }\r
+\r
+       /* (non-Javadoc)\r
+        * @see eu.etaxonomy.taxeditor.ui.element.AbstractCdmFormElement#removeElements()\r
+        */\r
+       @Override\r
+    public void removeElements(){\r
+               super.removeElements();\r
+               LoginManager loginManager = CdmStore.getLoginManager();\r
+               loginManager.addObserver(this);\r
+       }\r
+\r
+       @Override\r
+       public void update(Observable o, Object arg) {\r
+               if(o instanceof LoginManager){\r
+                       updateButtonStates();\r
+               }\r
+       }\r
+\r
+       private void updateButtonStates() {\r
+           if(button_edit != null && !button_selection.isDisposed()){\r
+               button_edit.setEnabled(isEditable && button_selection.isEnabled() && getEntity() != null  && CdmStore.currentAuthentiationHasPermission(getEntity(), UPDATE));\r
+           }\r
+       }\r
+}\r