ref #9861: adapt editor to changes in termnodeDto-featurestateDto
[taxeditor.git] / eu.etaxonomy.taxeditor.store / src / main / java / eu / etaxonomy / taxeditor / ui / section / AbstractCdmDetailElement.java
index f32e795b43283737f58022cf496afab3f37a84b3..8c30439a9cd694f3a3da9e92c091f1547a5ad643 100644 (file)
@@ -8,7 +8,6 @@
  */
 package eu.etaxonomy.taxeditor.ui.section;
 
-import java.util.ArrayList;
 import java.util.Collection;
 import java.util.EnumSet;
 import java.util.Observable;
@@ -16,8 +15,6 @@ import java.util.Observer;
 
 import org.eclipse.jface.util.PropertyChangeEvent;
 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.widgets.Display;
 
@@ -33,26 +30,28 @@ 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
+               extends AbstractRelevanceFormElement
                implements ICdmDetailElement<T>, Observer{
 
        private T entity;
 
-       private boolean irrelevant;
-
        protected boolean enabled = true;
 
        private LabelElement warnForReferencedObjects;
@@ -66,13 +65,8 @@ public abstract class AbstractCdmDetailElement<T>
                formFactory.addPropertyChangeListener(this);
                CdmStore.getLoginManager().addObserver(this);
 
-               getLayoutComposite().getParent().addDisposeListener(new DisposeListener() {
-
-            @Override
-            public void widgetDisposed(DisposeEvent e) {
-                CdmStore.getLoginManager().deleteObserver(AbstractCdmDetailElement.this);
-            }
-        });
+               getLayoutComposite().getParent().addDisposeListener(
+                       e -> CdmStore.getLoginManager().deleteObserver(AbstractCdmDetailElement.this));
        }
 
        /**
@@ -91,6 +85,17 @@ public abstract class AbstractCdmDetailElement<T>
         updateContent();
        }
 
+       public void setEntityWithoutUpdate(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 || (getEntity() instanceof CdmBase && StoreUtil.getCdmEntity(getEntity()).getId() == 0)) {
+            // new entity, not yet saved
+            requiredCrud = EnumSet.of(CRUD.CREATE);
+        } else {
+            requiredCrud = EnumSet.of(CRUD.UPDATE);
+        }
+       }
+
        @Override
     public T getEntity() {
                return entity;
@@ -113,13 +118,9 @@ public abstract class AbstractCdmDetailElement<T>
 
        /**
         * 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;
@@ -146,37 +147,33 @@ public abstract class AbstractCdmDetailElement<T>
     }
 
     @Override
-    public void setIrrelevant(boolean irrelevant) {
-        this.irrelevant = irrelevant;
-        setIrrelevant(irrelevant, null);
+    public CacheRelevance cacheRelevance() {
+        return cacheRelevanceHelper.cacheRelevance();
+    }
+
+    @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();
     }
 
        /**
-        * <p>
-        * Setter for the field <code>irrelevant</code>.
-        * </p>
-        *
-        * @param irrelevant
-        *            a boolean.
-        * @param except
-        *            a {@link java.util.Collection} object.
+        * Updates the cache relevance state of all internal elements of this
+        * AbstractCdmDetailElement.
         */
-       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);
-                               }
-                       }
-               }
+       @Override
+    public void updateCacheRelevance(){
+           CacheRelevanceHelper.updateCacheRelevanceForSubelements(getElements());
        }
 
        /**
@@ -244,10 +241,6 @@ public abstract class AbstractCdmDetailElement<T>
                MessagingUtils.error(event.getSource().getClass(), event.getException());
        }
 
-       public boolean isIrrelevant() {
-               return irrelevant;
-       }
-
        @Override
     public ConversationHolder getConversationHolder() {
                if (getParentElement() instanceof IConversationEnabled) {
@@ -270,18 +263,12 @@ public abstract class AbstractCdmDetailElement<T>
     }
 
     protected void updateControlStates(){
-        Collection<Object> except = new ArrayList<Object>();
-        for(ICdmFormElement formElement:getElements()){
-            if(formElement instanceof IEnableableFormElement && !((IEnableableFormElement) formElement).isEnabled()){
-                except.add(formElement);
-            }
-        }
         if (getEntity() != null && getEntity() instanceof CdmBase){
-            enabled = CdmStore.currentAuthentiationHasPermission(StoreUtil.getCdmEntity(getEntity()), requiredCrud);
+            enabled = enabled && CdmStore.currentAuthentiationHasPermission(StoreUtil.getCdmEntity(getEntity()), requiredCrud);
         }else{
             enabled = true;
         }
-        setEnabled(enabled, except);
+        setEnabled(enabled);
     }
 
        public LabelElement getWarnForReferencedObjects() {
@@ -304,7 +291,6 @@ public abstract class AbstractCdmDetailElement<T>
                                getWarnForReferencedObjects().setLayout(LayoutConstants.FILL(2, 3));
                                getWarnForReferencedObjects().setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_RED));
                                formFactory.createLabel(formElement, "");
-
                        }
                }
            }
@@ -319,5 +305,4 @@ public abstract class AbstractCdmDetailElement<T>
                        getWarnForReferencedObjects().setVisible(isVisible);
                }
        }
-
-}
+}
\ No newline at end of file