- update parent scroll form on property change (fixes #4881)
[taxeditor.git] / eu.etaxonomy.taxeditor.store / src / main / java / eu / etaxonomy / taxeditor / ui / section / AbstractCdmDetailElement.java
index ff6292ab6f0ff8284ddb664a8066527e6b2808a5..950452bd34ac285bc7183e9ad83511729a18e66d 100644 (file)
@@ -1,57 +1,68 @@
 // $Id$
 /**
  * Copyright (C) 2007 EDIT
- * European Distributed Institute of Taxonomy 
+ * European Distributed Institute of Taxonomy
  * http://www.e-taxonomy.eu
- * 
+ *
  * 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;
 import java.util.Collection;
+import java.util.EnumSet;
+import java.util.Observable;
+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.ui.forms.widgets.ScrolledForm;
 
 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.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.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.ISelectable;
 
 /**
  * <p>
  * Abstract AbstractCdmDetailElement class.
  * </p>
- * 
+ *
  * @author n.hoffmann
  * @created Feb 26, 2010
  * @version 1.0
  */
-public abstract class AbstractCdmDetailElement<T> extends
-               AbstractCdmFormElement implements IEntityElement<T>,
-               IEnableableFormElement, IConversationEnabled, ISelectable {
+public abstract class AbstractCdmDetailElement<T> extends AbstractCdmFormElement implements ICdmDetailElement<T>, Observer {
 
        private T entity;
 
        private boolean irrelevant;
 
+       private boolean enabled;
+
+       private EnumSet<CRUD> requiredCrud = null;
+
        /**
         * <p>
         * Constructor for AbstractCdmDetailElement.
         * </p>
-        * 
+        *
         * @param formFactory
         *            a {@link eu.etaxonomy.taxeditor.ui.element.CdmFormFactory}
         *            object.
@@ -63,35 +74,48 @@ public abstract class AbstractCdmDetailElement<T> extends
         */
        public AbstractCdmDetailElement(CdmFormFactory formFactory,
                        ICdmFormElement formElement) {
-               super(formFactory, (ICdmFormElement) formElement);
+               super(formFactory, formElement);
                // register as property change listener
                formFactory.addPropertyChangeListener(this);
+               CdmStore.getLoginManager().addObserver(this);
+
+               getLayoutComposite().getParent().addDisposeListener(new DisposeListener() {
+
+            @Override
+            public void widgetDisposed(DisposeEvent e) {
+                CdmStore.getLoginManager().deleteObserver(AbstractCdmDetailElement.this);
+            }
+        });
        }
 
        /**
         * Sets the entity and updates controls
-        * 
+        *
         * @param entity
         *            a T object.
         */
-       public void setEntity(T entity) {
-               this.entity = entity;
-               updateContent();
+       @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) {
+            // new entity, not yet saved
+            requiredCrud = EnumSet.of(CRUD.CREATE);
+        } else {
+            requiredCrud = EnumSet.of(CRUD.UPDATE);
+        }
+        updateContent();
        }
 
-       /*
-        * (non-Javadoc)
-        * 
-        * @see eu.etaxonomy.taxeditor.forms.IEntityElement#getEntity()
-        */
        /**
         * <p>
         * Getter for the field <code>entity</code>.
         * </p>
-        * 
+        *
         * @return a T object.
         */
-       public T getEntity() {
+       @Override
+    public T getEntity() {
                return entity;
        }
 
@@ -101,17 +125,26 @@ public abstract class AbstractCdmDetailElement<T> extends
        protected void updateContent() {
                removeElements();
                createControls(this, entity, SWT.WRAP);
-               getLayoutComposite().layout();
+               reflowParentScrolledForm(true);
+
+               updateControlStates();
+       }
+
+       protected void reflowParentScrolledForm(boolean flushCashes){
+           ScrolledForm scrolledForm = null;
+           Composite parent = getLayoutComposite().getParent();
+           while(parent!=null && !(parent instanceof ScrolledForm)){
+               parent = parent.getParent();
+           }
+           scrolledForm = (ScrolledForm)parent;
+           if(scrolledForm!=null){
+               scrolledForm.reflow(flushCashes);
+           }
        }
 
-       /*
-        * (non-Javadoc)
-        * 
-        * @see
-        * eu.etaxonomy.taxeditor.forms.ISelectableComposite#setSelected(boolean)
-        */
        /** {@inheritDoc} */
-       public void setSelected(boolean selected) {
+       @Override
+    public void setSelected(boolean selected) {
                Composite section = getLayoutComposite().getParent();
                section.setBackground(selected ? SELECTED : getPersistentBackground());
        }
@@ -119,7 +152,7 @@ public abstract class AbstractCdmDetailElement<T> extends
        /**
         * Sets all field to the given enablement state except the objects in
         * collection except
-        * 
+        *
         * @see eu.etaxonomy.taxeditor.ui.element.IEnableableFormElement#setEnabled(boolean)
         * @param enabled
         *            a boolean.
@@ -127,6 +160,7 @@ public abstract class AbstractCdmDetailElement<T> extends
         *            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;
@@ -139,11 +173,16 @@ public abstract class AbstractCdmDetailElement<T> extends
                }
        }
 
+       @Override
+       public boolean isEnabled() {
+           return enabled;
+       }
+
        /**
         * <p>
         * Setter for the field <code>irrelevant</code>.
         * </p>
-        * 
+        *
         * @param irrelevant
         *            a boolean.
         * @param except
@@ -168,19 +207,21 @@ public abstract class AbstractCdmDetailElement<T> extends
        }
 
        /** {@inheritDoc} */
-       public void setEnabled(boolean enabled) {
+       @Override
+    public void setEnabled(boolean enabled) {
                setEnabled(enabled, null);
        }
 
        /** {@inheritDoc} */
-       public void setIrrelevant(boolean irrelevant) {
+       @Override
+    public void setIrrelevant(boolean irrelevant) {
                this.irrelevant = irrelevant;
                setIrrelevant(irrelevant, null);
        }
 
        /**
         * Create all content elements
-        * 
+        *
         * @param formElement
         *            a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
         *            object.
@@ -241,12 +282,13 @@ public abstract class AbstractCdmDetailElement<T> extends
                if (getParentElement() instanceof AbstractCdmDetailSection) {
                        ((AbstractCdmDetailSection) getParentElement()).updateTitle();
                }
+               reflowParentScrolledForm(true);
        }
 
        /**
         * Gets called when the source of the event is a child widget of this
         * widget.
-        * 
+        *
         * @param eventSource
         *            a {@link java.lang.Object} object.
         */
@@ -256,7 +298,7 @@ public abstract class AbstractCdmDetailElement<T> extends
         * <p>
         * handleException
         * </p>
-        * 
+        *
         * @param event
         *            a
         *            {@link eu.etaxonomy.taxeditor.ui.element.CdmPropertyChangeEvent}
@@ -264,14 +306,14 @@ public abstract class AbstractCdmDetailElement<T> extends
         */
        public void handleException(CdmPropertyChangeEvent event) {
                // override this in subclasses if you want to deal with the error
-               StoreUtil.error(event.getSource().getClass(), event.getException());
+               MessagingUtils.error(event.getSource().getClass(), event.getException());
        }
 
        /**
         * <p>
         * isIrrelevant
         * </p>
-        * 
+        *
         * @return a boolean.
         */
        public boolean isIrrelevant() {
@@ -282,11 +324,12 @@ public abstract class AbstractCdmDetailElement<T> extends
         * <p>
         * getConversationHolder
         * </p>
-        * 
+        *
         * @return a {@link eu.etaxonomy.cdm.api.conversation.ConversationHolder}
         *         object.
         */
-       public ConversationHolder getConversationHolder() {
+       @Override
+    public ConversationHolder getConversationHolder() {
                if (getParentElement() instanceof IConversationEnabled) {
                        return ((IConversationEnabled) getParentElement())
                                        .getConversationHolder();
@@ -296,6 +339,25 @@ public abstract class AbstractCdmDetailElement<T> extends
        }
 
        /** {@inheritDoc} */
-       public void update(CdmDataChangeMap changeEvents) {
+       @Override
+    public void update(CdmDataChangeMap changeEvents) {
        }
+
+       @Override
+    public void update(Observable o, Object arg){
+        if(o instanceof LoginManager){
+            updateControlStates();
+        }
+    }
+
+
+    protected void updateControlStates(){
+        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);
+    }
 }