Merge branch 'release/5.19.0'
[taxeditor.git] / eu.etaxonomy.taxeditor.store / src / main / java / eu / etaxonomy / taxeditor / ui / section / AbstractCdmDetailElement.java
index 0c2ba37276a6a37d77c486136113375d4037a0ff..ca12af7193df99d24c321706d1f7ab5598b8ff54 100644 (file)
@@ -6,7 +6,6 @@
  * 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;
 
 import java.util.ArrayList;
@@ -27,37 +26,40 @@ 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.name.TaxonName;
+import eu.etaxonomy.cdm.model.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.MessagingUtils;
 import eu.etaxonomy.taxeditor.store.CdmStore;
 import eu.etaxonomy.taxeditor.store.LoginManager;
 import eu.etaxonomy.taxeditor.store.StoreUtil;
-import eu.etaxonomy.taxeditor.ui.element.AbstractCdmFormElement;
+import eu.etaxonomy.taxeditor.ui.element.AbstractRelevanceFormElement;
+import eu.etaxonomy.taxeditor.ui.element.CacheRelevance;
+import eu.etaxonomy.taxeditor.ui.element.CacheRelevanceHelper;
 import eu.etaxonomy.taxeditor.ui.element.CdmFormFactory;
 import eu.etaxonomy.taxeditor.ui.element.CdmPropertyChangeEvent;
+import eu.etaxonomy.taxeditor.ui.element.ICacheRelevantFormElement;
 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;
+import eu.etaxonomy.taxeditor.ui.element.ToggleableTextElement;
 
 /**
- *
  * @author n.hoffmann
  * @created Feb 26, 2010
  */
-public abstract class AbstractCdmDetailElement<T> extends AbstractCdmFormElement implements ICdmDetailElement<T>, Observer {
+public abstract class AbstractCdmDetailElement<T>
+               extends AbstractRelevanceFormElement
+               implements ICdmDetailElement<T>, Observer{
 
        private T entity;
 
-       private boolean irrelevant;
+       protected boolean enabled = true;
 
-       private boolean enabled;
-       
        private LabelElement warnForReferencedObjects;
 
-       private EnumSet<CRUD> requiredCrud = null;
+       protected EnumSet<CRUD> requiredCrud = null;
 
        public AbstractCdmDetailElement(CdmFormFactory formFactory,
                        ICdmFormElement formElement) {
@@ -77,15 +79,12 @@ public abstract class AbstractCdmDetailElement<T> extends AbstractCdmFormElement
 
        /**
         * Sets the entity and updates controls
-        *
-        * @param entity
-        *            a T object.
         */
        @Override
     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(getEntity() == null || StoreUtil.getCdmEntity(getEntity()).getId() == 0) {
+        if(getEntity() == null || (getEntity() instanceof CdmBase && StoreUtil.getCdmEntity(getEntity()).getId() == 0)) {
             // new entity, not yet saved
             requiredCrud = EnumSet.of(CRUD.CREATE);
         } else {
@@ -104,9 +103,7 @@ public abstract class AbstractCdmDetailElement<T> extends AbstractCdmFormElement
         */
        protected void updateContent() {
                removeElements();
-               createControls(this, entity, SWT.WRAP);
-               reflowParentScrolledForm(true);
-
+               createControls(this, entity, SWT.NONE);
                updateControlStates();
        }
 
@@ -118,13 +115,9 @@ public abstract class AbstractCdmDetailElement<T> extends AbstractCdmFormElement
 
        /**
         * Sets all field to the given enablement state except the objects in
-        * collection except
+        * the collection except parameter.
         *
         * @see eu.etaxonomy.taxeditor.ui.element.IEnableableFormElement#setEnabled(boolean)
-        * @param enabled
-        *            a boolean.
-        * @param except
-        *            a {@link java.util.Collection} object.
         */
        public void setEnabled(boolean enabled, Collection<Object> except) {
            this.enabled = enabled;
@@ -145,62 +138,47 @@ public abstract class AbstractCdmDetailElement<T> extends AbstractCdmFormElement
            return enabled;
        }
 
-       /**
-        * <p>
-        * Setter for the field <code>irrelevant</code>.
-        * </p>
-        *
-        * @param irrelevant
-        *            a boolean.
-        * @param except
-        *            a {@link java.util.Collection} object.
-        */
-       public void setIrrelevant(boolean irrelevant, Collection<Object> except) {
-               // logger.warn("Setting " + this.getClass().getSimpleName() +
-               // " to irrelevant state: " + irrelevant);
-               for (ICdmFormElement element : getElements()) {
-                       if (element instanceof IEnableableFormElement) {
-                               IEnableableFormElement relevantElement = (IEnableableFormElement) element;
-                               if (except != null && except.contains(relevantElement)) {
-                                       // do nothing
-                                       // logger.warn("not setting elements irrelevance: " +
-                                       // relevantElement.getClass().getSimpleName() + " in :" +
-                                       // this.getClass().getSimpleName());
-                               } else {
-                                       relevantElement.setIrrelevant(irrelevant);
-                               }
-                       }
-               }
-       }
-
-       /** {@inheritDoc} */
-       @Override
+    @Override
     public void setEnabled(boolean enabled) {
-               setEnabled(enabled, null);
-       }
+        setEnabled(enabled, null);
+    }
+
+    @Override
+    public CacheRelevance cacheRelevance() {
+        return cacheRelevanceHelper.cacheRelevance();
+    }
 
-       /** {@inheritDoc} */
+    @Override
+    public void addDependsOnCache(ToggleableTextElement toggleElement) {
+        cacheRelevanceHelper.addDependsOnCache(toggleElement);
+    }
+
+    protected void registerCacheRelevance(ICacheRelevantFormElement element, ToggleableTextElement... toggleableCaches) {
+        if (element != null && toggleableCaches != null) {
+             for (ToggleableTextElement toggleableCache : toggleableCaches){
+                 if (toggleableCache != null){
+                     element.addDependsOnCache(toggleableCache);
+                 }
+             }
+        }
+//        updateCacheRelevance();
+    }
+
+       /**
+        * Updates the cache relevance state of all internal elements of this
+        * AbstractCdmDetailElement.
+        */
        @Override
-    public void setIrrelevant(boolean irrelevant) {
-               this.irrelevant = irrelevant;
-               setIrrelevant(irrelevant, null);
+    public void updateCacheRelevance(){
+           CacheRelevanceHelper.updateCacheRelevanceForSubelements(getElements());
        }
 
        /**
         * Create all content elements
-        *
-        * @param formElement
-        *            a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
-        *            object.
-        * @param entity
-        *            a T object.
-        * @param style
-        *            a int.
         */
        protected abstract void createControls(ICdmFormElement formElement,
                        T entity, int style);
 
-       /** {@inheritDoc} */
        @Override
        public void propertyChange(PropertyChangeEvent event) {
                if (event == null) {
@@ -213,9 +191,7 @@ public abstract class AbstractCdmDetailElement<T> extends AbstractCdmFormElement
 
                if (eventSource instanceof ICdmFormElement) {
                        ICdmFormElement eventElement = (ICdmFormElement) eventSource;
-                       ICdmFormElement eventElementContainer = eventElement
-                                       .getParentElement();
-
+                       ICdmFormElement eventElementContainer = eventElement.getParentElement();
                        if (eventElementContainer == this) {
                                if (event instanceof CdmPropertyChangeEvent) {
                                        if (((CdmPropertyChangeEvent) event).hasException()) {
@@ -239,25 +215,21 @@ public abstract class AbstractCdmDetailElement<T> extends AbstractCdmFormElement
                isRelevant &= this instanceof AbstractIdentifiableEntityDetailElement;
 
                if (isRelevant) {
-                       ((AbstractIdentifiableEntityDetailElement) this)
-                                       .updateToggleableCacheField();
-                       updateParentSection();
+                       ((AbstractIdentifiableEntityDetailElement<?>)this).updateToggleableCacheField();
                }
        }
 
        private void updateParentSection() {
                if (getParentElement() instanceof AbstractCdmDetailSection) {
-                       ((AbstractCdmDetailSection) getParentElement()).updateTitle();
+                       ((AbstractCdmDetailSection<?>) getParentElement()).updateTitle();
                }
-               reflowParentScrolledForm(true);
+               //NOTE: This slows down the rendering of the details view
+//             StoreUtil.reflowParentScrolledForm(getLayoutComposite(), true);
        }
 
        /**
         * Gets called when the source of the event is a child widget of this
         * widget.
-        *
-        * @param eventSource
-        *            a {@link java.lang.Object} object.
         */
        public abstract void handleEvent(Object eventSource);
 
@@ -266,10 +238,6 @@ public abstract class AbstractCdmDetailElement<T> extends AbstractCdmFormElement
                MessagingUtils.error(event.getSource().getClass(), event.getException());
        }
 
-       public boolean isIrrelevant() {
-               return irrelevant;
-       }
-
        @Override
     public ConversationHolder getConversationHolder() {
                if (getParentElement() instanceof IConversationEnabled) {
@@ -280,7 +248,6 @@ public abstract class AbstractCdmDetailElement<T> extends AbstractCdmFormElement
                                "Parent element should be IConversationEnabled");
        }
 
-       /** {@inheritDoc} */
        @Override
     public void update(CdmDataChangeMap changeEvents) {
        }
@@ -292,7 +259,6 @@ public abstract class AbstractCdmDetailElement<T> extends AbstractCdmFormElement
         }
     }
 
-
     protected void updateControlStates(){
         Collection<Object> except = new ArrayList<Object>();
         for(ICdmFormElement formElement:getElements()){
@@ -300,7 +266,12 @@ public abstract class AbstractCdmDetailElement<T> extends AbstractCdmFormElement
                 except.add(formElement);
             }
         }
-        setEnabled(getEntity() != null && CdmStore.currentAuthentiationHasPermission(StoreUtil.getCdmEntity(getEntity()), requiredCrud), except);
+        if (getEntity() != null && getEntity() instanceof CdmBase){
+            enabled = CdmStore.currentAuthentiationHasPermission(StoreUtil.getCdmEntity(getEntity()), requiredCrud);
+        }else{
+            enabled = true;
+        }
+        setEnabled(enabled, except);
     }
 
        public LabelElement getWarnForReferencedObjects() {
@@ -310,28 +281,31 @@ public abstract class AbstractCdmDetailElement<T> extends AbstractCdmFormElement
        public void setWarnForReferencedObjects(LabelElement warnForReferencedObjects) {
                this.warnForReferencedObjects = warnForReferencedObjects;
        }
-       
-       public void setWarnForReferencingObjects(ICdmFormElement formElement){
+
+       public void setWarnForReferencingObjects(ICdmFormElement formElement, int defaultReferencingObjects){
            if (getEntity() instanceof CdmBase){
                CdmBase cdmBase = (CdmBase) getEntity();
                if (cdmBase.getId() != 0){
-                       Integer referencingObjectsCount = CdmStore.getCommonService().getReferencingObjectsCount(cdmBase);
-       
-                       if (referencingObjectsCount > 1){
-                               setWarnForReferencedObjects(formFactory.createLabel(formElement, CdmUtils.Nz("The reference is referenced by " + referencingObjectsCount+ " objects, if you change it, it is changed for all these objects")));
+                       long referencingObjectsCount = CdmStore.getCommonService().getReferencingObjectsCount(cdmBase);
+
+                       if (referencingObjectsCount > defaultReferencingObjects){
+                               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));
-                               
+                               formFactory.createLabel(formElement, "");
                        }
                }
            }
        }
 
+       public void setWarnForReferencingObjects(ICdmFormElement formElement){
+           setWarnForReferencingObjects(formElement, 1);
+       }
+
        public void setWarnForReferencingObjectsVisible(boolean isVisible){
                if (getWarnForReferencedObjects() != null){
                        getWarnForReferencedObjects().setVisible(isVisible);
                }
        }
-       
-}
+}
\ No newline at end of file