Merge branch 'release/5.3.0'
[taxeditor.git] / eu.etaxonomy.taxeditor.store / src / main / java / eu / etaxonomy / taxeditor / ui / section / AbstractCdmDetailElement.java
index aea5c881647bd8d01db433f1f47f258c63fa6d9b..6ed49262a0ba7bd39ed7c9ba9443367f9fa33ca2 100644 (file)
@@ -1,4 +1,3 @@
-// $Id$
 /**
  * Copyright (C) 2007 EDIT
  * European Distributed Institute of Taxonomy
 /**
  * Copyright (C) 2007 EDIT
  * European Distributed Institute of Taxonomy
@@ -10,6 +9,7 @@
 
 package eu.etaxonomy.taxeditor.ui.section;
 
 
 package eu.etaxonomy.taxeditor.ui.section;
 
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.EnumSet;
 import java.util.Observable;
 import java.util.Collection;
 import java.util.EnumSet;
 import java.util.Observable;
@@ -20,14 +20,17 @@ import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.DisposeEvent;
 import org.eclipse.swt.events.DisposeListener;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.events.DisposeEvent;
 import org.eclipse.swt.events.DisposeListener;
 import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
 
 import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
 import eu.etaxonomy.cdm.api.conversation.IConversationEnabled;
 
 import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
 import eu.etaxonomy.cdm.api.conversation.IConversationEnabled;
-import eu.etaxonomy.cdm.model.name.TaxonNameBase;
+import eu.etaxonomy.cdm.common.CdmUtils;
+import eu.etaxonomy.cdm.model.common.CdmBase;
+import eu.etaxonomy.cdm.model.name.TaxonName;
 import eu.etaxonomy.cdm.model.taxon.TaxonBase;
 import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap;
 import eu.etaxonomy.cdm.persistence.hibernate.permission.CRUD;
 import eu.etaxonomy.cdm.model.taxon.TaxonBase;
 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.MessagingUtils;
 import eu.etaxonomy.taxeditor.store.CdmStore;
 import eu.etaxonomy.taxeditor.store.LoginManager;
 import eu.etaxonomy.taxeditor.store.StoreUtil;
 import eu.etaxonomy.taxeditor.store.CdmStore;
 import eu.etaxonomy.taxeditor.store.LoginManager;
 import eu.etaxonomy.taxeditor.store.StoreUtil;
@@ -36,38 +39,26 @@ 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.CdmPropertyChangeEvent;
 import eu.etaxonomy.taxeditor.ui.element.ICdmFormElement;
 import eu.etaxonomy.taxeditor.ui.element.IEnableableFormElement;
+import eu.etaxonomy.taxeditor.ui.element.LabelElement;
+import eu.etaxonomy.taxeditor.ui.element.LayoutConstants;
 
 /**
 
 /**
- * <p>
- * Abstract AbstractCdmDetailElement class.
- * </p>
  *
  * @author n.hoffmann
  * @created Feb 26, 2010
  *
  * @author n.hoffmann
  * @created Feb 26, 2010
- * @version 1.0
  */
  */
-public abstract class AbstractCdmDetailElement<T> extends AbstractCdmFormElement implements ICdmDetailElement<T>, Observer {
+public abstract class AbstractCdmDetailElement<T> extends AbstractCdmFormElement implements ICdmDetailElement<T>, Observer, IEnableableFormElement{
 
        private T entity;
 
        private boolean irrelevant;
 
 
        private T entity;
 
        private boolean irrelevant;
 
+       private boolean enabled = true;
+
+       private LabelElement warnForReferencedObjects;
+
        private EnumSet<CRUD> requiredCrud = null;
 
        private EnumSet<CRUD> requiredCrud = null;
 
-       /**
-        * <p>
-        * Constructor for AbstractCdmDetailElement.
-        * </p>
-        *
-        * @param formFactory
-        *            a {@link eu.etaxonomy.taxeditor.ui.element.CdmFormFactory}
-        *            object.
-        * @param formElement
-        *            a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
-        *            object.
-        * @param <T>
-        *            a T object.
-        */
        public AbstractCdmDetailElement(CdmFormFactory formFactory,
                        ICdmFormElement formElement) {
                super(formFactory, formElement);
        public AbstractCdmDetailElement(CdmFormFactory formFactory,
                        ICdmFormElement formElement) {
                super(formFactory, formElement);
@@ -94,7 +85,7 @@ public abstract class AbstractCdmDetailElement<T> extends AbstractCdmFormElement
     public void setEntity(T entity) {
         this.entity = entity;
         // the id is always 0 if the entity was not yet saved, so it is new in this case
     public void setEntity(T entity) {
         this.entity = entity;
         // the id is always 0 if the entity was not yet saved, so it is new in this case
-        if(StoreUtil.getCdmEntity(getEntity()).getId() == 0) {
+        if(getEntity() == null || StoreUtil.getCdmEntity(getEntity()).getId() == 0) {
             // new entity, not yet saved
             requiredCrud = EnumSet.of(CRUD.CREATE);
         } else {
             // new entity, not yet saved
             requiredCrud = EnumSet.of(CRUD.CREATE);
         } else {
@@ -103,18 +94,6 @@ public abstract class AbstractCdmDetailElement<T> extends AbstractCdmFormElement
         updateContent();
        }
 
         updateContent();
        }
 
-       /*
-        * (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;
        @Override
     public T getEntity() {
                return entity;
@@ -125,20 +104,13 @@ public abstract class AbstractCdmDetailElement<T> extends AbstractCdmFormElement
         */
        protected void updateContent() {
                removeElements();
         */
        protected void updateContent() {
                removeElements();
-               createControls(this, entity, SWT.WRAP);
-               getLayoutComposite().layout();
+               createControls(this, entity, SWT.NONE);
+               StoreUtil.reflowParentScrolledForm(getLayoutComposite(), true);
 
                updateControlStates();
        }
 
 
                updateControlStates();
        }
 
-       /*
-        * (non-Javadoc)
-        *
-        * @see
-        * eu.etaxonomy.taxeditor.forms.ISelectableComposite#setSelected(boolean)
-        */
-       /** {@inheritDoc} */
-       @Override
+    @Override
     public void setSelected(boolean selected) {
                Composite section = getLayoutComposite().getParent();
                section.setBackground(selected ? SELECTED : getPersistentBackground());
     public void setSelected(boolean selected) {
                Composite section = getLayoutComposite().getParent();
                section.setBackground(selected ? SELECTED : getPersistentBackground());
@@ -155,6 +127,7 @@ public abstract class AbstractCdmDetailElement<T> extends AbstractCdmFormElement
         *            a {@link java.util.Collection} object.
         */
        public void setEnabled(boolean enabled, Collection<Object> except) {
         *            a {@link java.util.Collection} object.
         */
        public void setEnabled(boolean enabled, Collection<Object> except) {
+           this.enabled = enabled;
                for (ICdmFormElement element : getElements()) {
                        if (element instanceof IEnableableFormElement) {
                                IEnableableFormElement enableableElement = (IEnableableFormElement) element;
                for (ICdmFormElement element : getElements()) {
                        if (element instanceof IEnableableFormElement) {
                                IEnableableFormElement enableableElement = (IEnableableFormElement) element;
@@ -167,6 +140,11 @@ public abstract class AbstractCdmDetailElement<T> extends AbstractCdmFormElement
                }
        }
 
                }
        }
 
+       @Override
+       public boolean isEnabled() {
+           return enabled;
+       }
+
        /**
         * <p>
         * Setter for the field <code>irrelevant</code>.
        /**
         * <p>
         * Setter for the field <code>irrelevant</code>.
@@ -256,14 +234,13 @@ public abstract class AbstractCdmDetailElement<T> extends AbstractCdmFormElement
        }
 
        protected void handleTitleCacheRelevantChange(PropertyChangeEvent event) {
        }
 
        protected void handleTitleCacheRelevantChange(PropertyChangeEvent event) {
-               boolean isRelevant = getEntity() instanceof TaxonNameBase
+               boolean isRelevant = getEntity() instanceof TaxonName
                                || getEntity() instanceof TaxonBase;
                isRelevant &= this instanceof AbstractIdentifiableEntityDetailElement;
 
                if (isRelevant) {
                        ((AbstractIdentifiableEntityDetailElement) this)
                                        .updateToggleableCacheField();
                                || getEntity() instanceof TaxonBase;
                isRelevant &= this instanceof AbstractIdentifiableEntityDetailElement;
 
                if (isRelevant) {
                        ((AbstractIdentifiableEntityDetailElement) this)
                                        .updateToggleableCacheField();
-                       updateParentSection();
                }
        }
 
                }
        }
 
@@ -271,6 +248,8 @@ public abstract class AbstractCdmDetailElement<T> extends AbstractCdmFormElement
                if (getParentElement() instanceof AbstractCdmDetailSection) {
                        ((AbstractCdmDetailSection) getParentElement()).updateTitle();
                }
                if (getParentElement() instanceof AbstractCdmDetailSection) {
                        ((AbstractCdmDetailSection) getParentElement()).updateTitle();
                }
+               //NOTE: This slows down the rendering of the details view
+//             StoreUtil.reflowParentScrolledForm(getLayoutComposite(), true);
        }
 
        /**
        }
 
        /**
@@ -282,40 +261,15 @@ public abstract class AbstractCdmDetailElement<T> extends AbstractCdmFormElement
         */
        public abstract void handleEvent(Object eventSource);
 
         */
        public abstract void handleEvent(Object eventSource);
 
-       /**
-        * <p>
-        * handleException
-        * </p>
-        *
-        * @param event
-        *            a
-        *            {@link eu.etaxonomy.taxeditor.ui.element.CdmPropertyChangeEvent}
-        *            object.
-        */
        public void handleException(CdmPropertyChangeEvent event) {
                // override this in subclasses if you want to deal with the error
        public void handleException(CdmPropertyChangeEvent event) {
                // override this in subclasses if you want to deal with the error
-               AbstractUtility.error(event.getSource().getClass(), event.getException());
+               MessagingUtils.error(event.getSource().getClass(), event.getException());
        }
 
        }
 
-       /**
-        * <p>
-        * isIrrelevant
-        * </p>
-        *
-        * @return a boolean.
-        */
        public boolean isIrrelevant() {
                return irrelevant;
        }
 
        public boolean isIrrelevant() {
                return irrelevant;
        }
 
-       /**
-        * <p>
-        * getConversationHolder
-        * </p>
-        *
-        * @return a {@link eu.etaxonomy.cdm.api.conversation.ConversationHolder}
-        *         object.
-        */
        @Override
     public ConversationHolder getConversationHolder() {
                if (getParentElement() instanceof IConversationEnabled) {
        @Override
     public ConversationHolder getConversationHolder() {
                if (getParentElement() instanceof IConversationEnabled) {
@@ -340,6 +294,44 @@ public abstract class AbstractCdmDetailElement<T> extends AbstractCdmFormElement
 
 
     protected void updateControlStates(){
 
 
     protected void updateControlStates(){
-        setEnabled(getEntity() != null && CdmStore.currentAuthentiationHasPermission(StoreUtil.getCdmEntity(getEntity()), requiredCrud));
+        Collection<Object> except = new ArrayList<Object>();
+        for(ICdmFormElement formElement:getElements()){
+            if(formElement instanceof IEnableableFormElement && !((IEnableableFormElement) formElement).isEnabled()){
+                except.add(formElement);
+            }
+        }
+        setEnabled(getEntity() != null && CdmStore.currentAuthentiationHasPermission(StoreUtil.getCdmEntity(getEntity()), requiredCrud), except);
     }
     }
+
+       public LabelElement getWarnForReferencedObjects() {
+               return warnForReferencedObjects;
+       }
+
+       public void setWarnForReferencedObjects(LabelElement warnForReferencedObjects) {
+               this.warnForReferencedObjects = warnForReferencedObjects;
+       }
+
+       public void setWarnForReferencingObjects(ICdmFormElement formElement){
+           if (getEntity() instanceof CdmBase){
+               CdmBase cdmBase = (CdmBase) getEntity();
+               if (cdmBase.getId() != 0){
+                       long referencingObjectsCount = CdmStore.getCommonService().getReferencingObjectsCount(cdmBase);
+
+                       if (referencingObjectsCount > 1){
+                               setWarnForReferencedObjects(formFactory.createLabel(formElement, CdmUtils.Nz("The "+ cdmBase.getUserFriendlyTypeName()+" is referenced by " + referencingObjectsCount+ " objects, if you change it, it is changed for all these objects")));
+                               getWarnForReferencedObjects().setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_RED));
+                               getWarnForReferencedObjects().setLayout(LayoutConstants.FILL(2, 3));
+                               getWarnForReferencedObjects().setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_RED));
+
+                       }
+               }
+           }
+       }
+
+       public void setWarnForReferencingObjectsVisible(boolean isVisible){
+               if (getWarnForReferencedObjects() != null){
+                       getWarnForReferencedObjects().setVisible(isVisible);
+               }
+       }
+
 }
 }