]> source.dussan.org Git - vaadin-framework.git/commitdiff
Use ComponentState for storing the state, not just as a communication
authorArtur Signell <artur@vaadin.com>
Sun, 4 Mar 2012 10:19:31 +0000 (12:19 +0200)
committerArtur Signell <artur@vaadin.com>
Tue, 13 Mar 2012 16:10:34 +0000 (18:10 +0200)
mechanism. Changed isDisabled to more logical isEnabled in state.

18 files changed:
src/com/vaadin/terminal/gwt/client/ComponentState.java
src/com/vaadin/terminal/gwt/client/VCaption.java
src/com/vaadin/terminal/gwt/client/ui/AbstractComponentConnector.java
src/com/vaadin/terminal/gwt/client/ui/AbstractDateFieldConnector.java
src/com/vaadin/terminal/gwt/client/ui/AbstractSplitPanelConnector.java
src/com/vaadin/terminal/gwt/client/ui/ComboBoxConnector.java
src/com/vaadin/terminal/gwt/client/ui/LinkConnector.java
src/com/vaadin/terminal/gwt/client/ui/MenuBarConnector.java
src/com/vaadin/terminal/gwt/client/ui/OptionGroupBaseConnector.java
src/com/vaadin/terminal/gwt/client/ui/ProgressIndicatorConnector.java
src/com/vaadin/terminal/gwt/client/ui/SliderConnector.java
src/com/vaadin/terminal/gwt/client/ui/TableConnector.java
src/com/vaadin/terminal/gwt/client/ui/TabsheetBaseConnector.java
src/com/vaadin/terminal/gwt/client/ui/TreeConnector.java
src/com/vaadin/terminal/gwt/client/ui/UploadConnector.java
src/com/vaadin/terminal/gwt/client/ui/VFormLayout.java
src/com/vaadin/terminal/gwt/client/ui/richtextarea/RichTextAreaConnector.java
src/com/vaadin/ui/AbstractComponent.java

index 4cf7c7fe139203493c0614460577b5d36cb8bd21..e42afd6d03217dab0f0280aafd0d6cc9a635f5e7 100644 (file)
@@ -5,6 +5,7 @@
 package com.vaadin.terminal.gwt.client;
 
 import com.vaadin.terminal.gwt.client.communication.SharedState;
+import com.vaadin.ui.Component;
 
 /**
  * Default shared state implementation for UI components.
@@ -19,11 +20,12 @@ public class ComponentState extends SharedState {
     private boolean readOnly = false;
     private boolean immediate = false;
     private String style = "";
-    private boolean disabled = false;
+    private boolean enabled = true;
     private String description = "";
     // Note: for the caption, there is a difference between null and an empty
     // string!
     private String caption = null;
+    private boolean visible = true;
 
     /**
      * Returns the component height as set by the server.
@@ -180,26 +182,26 @@ public class ComponentState extends SharedState {
     }
 
     /**
-     * Returns true if the component is disabled.
+     * Returns true if the component is enabled.
      * 
      * @see com.vaadin.ui.Component#isEnabled()
      * 
-     * @return true if the component is disabled
+     * @return true if the component is enabled
      */
-    public boolean isDisabled() {
-        return disabled;
+    public boolean isEnabled() {
+        return enabled;
     }
 
     /**
-     * Disables or enables the component.
+     * Enables or disables the component.
      * 
      * @see com.vaadin.ui.Component#setEnabled(boolean)
      * 
-     * @param disabled
+     * @param enabled
      *            new mode for the component
      */
-    public void setDisabled(boolean disabled) {
-        this.disabled = disabled;
+    public void setEnabled(boolean enabled) {
+        this.enabled = enabled;
     }
 
     /**
@@ -264,4 +266,26 @@ public class ComponentState extends SharedState {
         this.caption = caption;
     }
 
+    /**
+     * Returns the visibility state of the component. Note that this state is
+     * related to the component only, not its parent. This might differ from
+     * what {@link Component#isVisible()} returns as this takes the hierarchy
+     * into account.
+     * 
+     * @return The visibility state.
+     */
+    public boolean isVisible() {
+        return visible;
+    }
+
+    /**
+     * Sets the visibility state of the component.
+     * 
+     * @param visible
+     *            The new visibility state.
+     */
+    public void setVisible(boolean visible) {
+        this.visible = visible;
+    }
+
 }
index 73ef5743211023e79b30c4f9d7e0b3c9b1b88737..b7d66612a9e0a79e21cb111cd107f83cb2b9553c 100644 (file)
@@ -113,7 +113,7 @@ public class VCaption extends HTML {
                 style += " " + CLASSNAME + "-" + styles[i];
             }
         }
-        if (owner.getState().isDisabled()) {
+        if (!owner.getState().isEnabled()) {
             style += " " + ApplicationConnection.DISABLED_CLASSNAME;
         }
         setStyleName(style);
index f648428c6a992d6a0f17b4832d15c215ff7762bb..446d941399bbf81f867a9f2bf2fd7d5a8e7f0f58 100644 (file)
@@ -173,7 +173,7 @@ public abstract class AbstractComponentConnector extends AbstractConnector
             ((Focusable) getWidget()).setTabIndex(uidl
                     .getIntAttribute("tabindex"));
         }
-        setEnabled(!getState().isDisabled());
+        setEnabled(getState().isEnabled());
 
         // Style names
         String styleName = getStyleNameFromUIDL(getWidget()
@@ -358,7 +358,7 @@ public abstract class AbstractComponentConnector extends AbstractConnector
      */
     protected static String getStyleNameFromUIDL(String primaryStyleName,
             UIDL uidl, ComponentState state, boolean field) {
-        boolean enabled = !state.isDisabled();
+        boolean enabled = state.isEnabled();
 
         StringBuffer styleBuf = new StringBuffer();
         styleBuf.append(primaryStyleName);
index c2652adbd455680b92ff112c2e8d72878693f19a..0068eb8960fc0d0a52204f2043ee6973e182e5b4 100644 (file)
@@ -28,7 +28,7 @@ public class AbstractDateFieldConnector extends AbstractComponentConnector {
         getWidget().immediate = getState().isImmediate();
 
         getWidget().readonly = getState().isReadOnly();
-        getWidget().enabled = !getState().isDisabled();
+        getWidget().enabled = getState().isEnabled();
 
         if (uidl.hasAttribute("locale")) {
             final String locale = uidl.getStringAttribute("locale");
index 91ee5a148a44fbd8c19e13dd8a2621837fe8625b..2f0674b58da97f0258ca14aaa13e3e61caeec45e 100644 (file)
@@ -75,7 +75,7 @@ public abstract class AbstractSplitPanelConnector extends
         if (!isRealUpdate(uidl)) {
             return;
         }
-        getWidget().setEnabled(!getState().isDisabled());
+        getWidget().setEnabled(getState().isEnabled());
 
         clickEventHandler.handleEventHandlerRegistration(client);
         if (getState().hasStyles()) {
index 0781ddf3f94aa0cb514456e1dcb47ee99aa06277..d8fb48dc8d42909c3b6ba6e0f6de713dd44ecc9c 100644 (file)
@@ -30,7 +30,7 @@ public class ComboBoxConnector extends AbstractComponentConnector implements
         getWidget().paintableId = uidl.getId();
 
         getWidget().readonly = getState().isReadOnly();
-        getWidget().enabled = !getState().isDisabled();
+        getWidget().enabled = getState().isEnabled();
 
         getWidget().tb.setEnabled(getWidget().enabled);
         getWidget().updateReadOnly();
index 9d23053a5bd813104a3ec0f75d342bee9670ca58..a8c10650c146330a10040611e14fd30f3ae7cdf5 100644 (file)
@@ -29,7 +29,7 @@ public class LinkConnector extends AbstractComponentConnector {
 
         getWidget().client = client;
 
-        getWidget().enabled = !getState().isDisabled();
+        getWidget().enabled = getState().isEnabled();
         getWidget().readonly = getState().isReadOnly();
 
         if (uidl.hasAttribute("name")) {
index 3000445a88f096849da63ce0787ce2e1f2b3de49..62b1cb69a7148b8d64019cf67cb72790366f0171 100644 (file)
@@ -38,7 +38,7 @@ public class MenuBarConnector extends AbstractComponentConnector implements
         getWidget().openRootOnHover = uidl
                 .getBooleanAttribute(VMenuBar.OPEN_ROOT_MENU_ON_HOWER);
 
-        getWidget().enabled = !getState().isDisabled();
+        getWidget().enabled = getState().isEnabled();
 
         // For future connections
         getWidget().client = client;
index 7cdb55457d1b4883969d13782526637a38405bff..41844da348cefcb2ae54198dc244bc2c94bd1828 100644 (file)
@@ -25,7 +25,7 @@ public abstract class OptionGroupBaseConnector extends
         getWidget().selectedKeys = uidl.getStringArrayVariableAsSet("selected");
 
         getWidget().readonly = getState().isReadOnly();
-        getWidget().disabled = getState().isDisabled();
+        getWidget().disabled = !getState().isEnabled();
         getWidget().multiselect = "multi".equals(uidl
                 .getStringAttribute("selectmode"));
         getWidget().immediate = getState().isImmediate();
index eda691e357614a5180e8bd0bc6cf82a04d46f6f2..e5cd8f6d4d144cefddc509bf637475b2956c07b8 100644 (file)
@@ -30,7 +30,7 @@ public class ProgressIndicatorConnector extends AbstractComponentConnector {
         if (getWidget().indeterminate) {
             String basename = VProgressIndicator.CLASSNAME + "-indeterminate";
             getWidget().addStyleName(basename);
-            if (getState().isDisabled()) {
+            if (!getState().isEnabled()) {
                 getWidget().addStyleName(basename + "-disabled");
             } else {
                 getWidget().removeStyleName(basename + "-disabled");
@@ -46,7 +46,7 @@ public class ProgressIndicatorConnector extends AbstractComponentConnector {
             }
         }
 
-        if (!getState().isDisabled()) {
+        if (getState().isEnabled()) {
             getWidget().interval = uidl.getIntAttribute("pollinginterval");
             getWidget().poller.scheduleRepeating(getWidget().interval);
         }
index b854aae818670c161304ad14f3cbd43a0bc9bc85..900e3af63392ecc3b8ffb1accfd9cc476dbd2e15 100644 (file)
@@ -25,7 +25,7 @@ public class SliderConnector extends AbstractComponentConnector {
         }
 
         getWidget().immediate = getState().isImmediate();
-        getWidget().disabled = getState().isDisabled();
+        getWidget().disabled = !getState().isEnabled();
         getWidget().readonly = getState().isReadOnly();
 
         getWidget().vertical = uidl.hasAttribute("vertical");
index 0aa6879802ebb4223d25e652586671bb0dde01e0..eadefc94b38ed680282f465ab9406399c485ae22 100644 (file)
@@ -55,7 +55,7 @@ public class TableConnector extends AbstractComponentContainerConnector
             return;
         }
 
-        getWidget().enabled = !getState().isDisabled();
+        getWidget().enabled = getState().isEnabled();
 
         if (BrowserInfo.get().isIE8() && !getWidget().enabled) {
             /*
index 3475f2d7164e846e3a1fdf3b78efb7ab78c629fa..8a52d5bb49bfe1a2bb18bf6b6e9e72e86c6487ce 100644 (file)
@@ -31,7 +31,7 @@ public abstract class TabsheetBaseConnector extends
 
         // Update member references
         getWidget().id = uidl.getId();
-        getWidget().disabled = getState().isDisabled();
+        getWidget().disabled = !getState().isEnabled();
 
         // Render content
         final UIDL tabs = uidl.getChildUIDL(0);
index 9b16e76a49b6d97792a0e30e8e44344946d5cf85..118b01fe03617fa5b52c0e22663935cf510d9ee8 100644 (file)
@@ -43,7 +43,7 @@ public class TreeConnector extends AbstractComponentConnector {
 
         getWidget().immediate = getState().isImmediate();
 
-        getWidget().disabled = getState().isDisabled();
+        getWidget().disabled = !getState().isEnabled();
         getWidget().readonly = getState().isReadOnly();
 
         getWidget().dragMode = uidl.hasAttribute("dragMode") ? uidl
index db943875253fbd1ad19aa63a54101226782bfedc..05a5e7d73d0eba88615930d2fc9a04546eef0dee 100644 (file)
@@ -41,7 +41,7 @@ public class UploadConnector extends AbstractComponentConnector {
         }
         getWidget().fu.setName(getWidget().paintableId + "_file");
 
-        if (getState().isDisabled() || getState().isReadOnly()) {
+        if (!getState().isEnabled() || getState().isReadOnly()) {
             getWidget().disableUpload();
         } else if (!uidl.getBooleanAttribute("state")) {
             // Enable the button only if an upload is not in progress
index 713a0ae55f8342eee868d52d46733789886855c3..b322be660121733a6ac1dea81b33b130be51c851 100644 (file)
@@ -61,7 +61,7 @@ public class VFormLayout extends SimplePanel {
             }
         }
 
-        if (state.isDisabled()) {
+        if (!state.isEnabled()) {
             styles.add(ApplicationConnection.DISABLED_CLASSNAME);
         }
 
index da32c1730e19f0e40f8534c3065d43e0929b5428..f60ed538138f70646dd765541a6f4cfdbc70982d 100644 (file)
@@ -28,7 +28,7 @@ public class RichTextAreaConnector extends AbstractComponentConnector implements
             }
         }
         if (isRealUpdate(uidl)) {
-            getWidget().setEnabled(!getState().isDisabled());
+            getWidget().setEnabled(getState().isEnabled());
         }
 
         super.updateFromUIDL(uidl, client);
index 12b67355ceee8e26fc571044979f984775d7f0d8..92e064a33fdc0e649c9e0da5487399903193f844 100644 (file)
@@ -64,11 +64,6 @@ public abstract class AbstractComponent implements Component, MethodEventSource
      */
     private ArrayList<String> styles;
 
-    /**
-     * Caption text.
-     */
-    private String caption;
-
     /**
      * Application specific data object. The component does not use or modify
      * this.
@@ -80,26 +75,6 @@ public abstract class AbstractComponent implements Component, MethodEventSource
      */
     private Resource icon;
 
-    /**
-     * Is the component enabled (its normal usage is allowed).
-     */
-    private boolean enabled = true;
-
-    /**
-     * Is the component visible (it is rendered).
-     */
-    private boolean visible = true;
-
-    /**
-     * Is the component read-only ?
-     */
-    private boolean readOnly = false;
-
-    /**
-     * Description of the usage (XML).
-     */
-    private String description = null;
-
     /**
      * The container this component resides in.
      */
@@ -120,12 +95,6 @@ public abstract class AbstractComponent implements Component, MethodEventSource
      */
     private ErrorMessage componentError = null;
 
-    /**
-     * Immediate mode: if true, all variable changes are required to be sent
-     * from the terminal immediately.
-     */
-    private boolean immediate = false;
-
     /**
      * Locale of this component.
      */
@@ -306,7 +275,7 @@ public abstract class AbstractComponent implements Component, MethodEventSource
      * the default documentation from implemented interface.
      */
     public String getCaption() {
-        return caption;
+        return getState().getCaption();
     }
 
     /**
@@ -319,7 +288,7 @@ public abstract class AbstractComponent implements Component, MethodEventSource
      *            the new caption <code>String</code> for the component.
      */
     public void setCaption(String caption) {
-        this.caption = caption;
+        getState().setCaption(caption);
         requestRepaint();
     }
 
@@ -393,7 +362,8 @@ public abstract class AbstractComponent implements Component, MethodEventSource
      * here, we use the default documentation from implemented interface.
      */
     public boolean isEnabled() {
-        return enabled && (parent == null || parent.isEnabled()) && isVisible();
+        return getState().isEnabled()
+                && (getParent() == null || getParent().isEnabled());
     }
 
     /*
@@ -401,29 +371,9 @@ public abstract class AbstractComponent implements Component, MethodEventSource
      * use the default documentation from implemented interface.
      */
     public void setEnabled(boolean enabled) {
-        if (this.enabled != enabled) {
-            boolean wasEnabled = this.enabled;
-            boolean wasEnabledInContext = isEnabled();
-
-            this.enabled = enabled;
-
-            boolean isEnabled = enabled;
-            boolean isEnabledInContext = isEnabled();
-
-            // If the actual enabled state (as rendered, in context) has not
-            // changed we do not need to repaint except if the parent is
-            // invisible.
-            // If the parent is invisible we must request a repaint so the
-            // component is repainted with the new enabled state when the parent
-            // is set visible again. This workaround is needed as isEnabled
-            // checks isVisible.
-            boolean needRepaint = (wasEnabledInContext != isEnabledInContext)
-                    || (wasEnabled != isEnabled && (getParent() == null || !getParent()
-                            .isVisible()));
-
-            if (needRepaint) {
-                requestRepaint();
-            }
+        if (getState().isEnabled() != enabled) {
+            getState().setEnabled(enabled);
+            requestRepaint();
         }
     }
 
@@ -433,7 +383,7 @@ public abstract class AbstractComponent implements Component, MethodEventSource
      * interface.
      */
     public boolean isImmediate() {
-        return immediate;
+        return getState().isImmediate();
     }
 
     /**
@@ -447,7 +397,7 @@ public abstract class AbstractComponent implements Component, MethodEventSource
      * @see Component#isImmediate()
      */
     public void setImmediate(boolean immediate) {
-        this.immediate = immediate;
+        getState().setImmediate(immediate);
         requestRepaint();
     }
 
@@ -457,7 +407,8 @@ public abstract class AbstractComponent implements Component, MethodEventSource
      * @see com.vaadin.ui.Component#isVisible()
      */
     public boolean isVisible() {
-        return visible && (getParent() == null || getParent().isVisible());
+        return getState().isVisible()
+                && (getParent() == null || getParent().isVisible());
     }
 
     /*
@@ -467,8 +418,8 @@ public abstract class AbstractComponent implements Component, MethodEventSource
      */
     public void setVisible(boolean visible) {
 
-        if (this.visible != visible) {
-            this.visible = visible;
+        if (getState().isVisible() != visible) {
+            getState().setVisible(visible);
             // Instead of requesting repaint normally we
             // fire the event directly to assure that the
             // event goes through event in the component might
@@ -535,7 +486,7 @@ public abstract class AbstractComponent implements Component, MethodEventSource
      * @return component's description <code>String</code>
      */
     public String getDescription() {
-        return description;
+        return getState().getDescription();
     }
 
     /**
@@ -552,7 +503,7 @@ public abstract class AbstractComponent implements Component, MethodEventSource
      *            the new description string for the component.
      */
     public void setDescription(String description) {
-        this.description = description;
+        getState().setDescription(description);
         requestRepaint();
     }
 
@@ -638,7 +589,7 @@ public abstract class AbstractComponent implements Component, MethodEventSource
      * here, we use the default documentation from implemented interface.
      */
     public boolean isReadOnly() {
-        return readOnly;
+        return getState().isReadOnly();
     }
 
     /*
@@ -646,7 +597,7 @@ public abstract class AbstractComponent implements Component, MethodEventSource
      * use the default documentation from implemented interface.
      */
     public void setReadOnly(boolean readOnly) {
-        this.readOnly = readOnly;
+        getState().setReadOnly(readOnly);
         requestRepaint();
     }
 
@@ -669,7 +620,7 @@ public abstract class AbstractComponent implements Component, MethodEventSource
      */
     public void attach() {
         requestRepaint();
-        if (!visible) {
+        if (!getState().isVisible()) {
             /*
              * Bypass the repaint optimization in childRequestedRepaint method
              * when attaching. When reattaching (possibly moving) -> must
@@ -874,13 +825,8 @@ public abstract class AbstractComponent implements Component, MethodEventSource
         }
         // basic state: caption, size, enabled, ...
 
-        if (!isVisible()) {
-            return null;
-        }
-
-        // TODO for now, this superclass always recreates the state from
-        // scratch, whereas subclasses should only modify it
-
+        // TODO This logic should be on the client side and the state should
+        // simply be a data object with "width" and "height".
         if (getHeight() >= 0
                 && (getHeightUnits() != Unit.PERCENTAGE || ComponentSizeValidator
                         .parentCanDefineHeight(this))) {
@@ -897,15 +843,10 @@ public abstract class AbstractComponent implements Component, MethodEventSource
             sharedState.setWidth("");
         }
 
-        sharedState.setImmediate(isImmediate());
-        sharedState.setReadOnly(isReadOnly());
-        sharedState.setDisabled(!isEnabled());
-
+        // TODO This should be an array in state and the logic for converting
+        // array -> class name should be on the client side
         sharedState.setStyle(getStyleName());
 
-        sharedState.setCaption(getCaption());
-        sharedState.setDescription(getDescription());
-
         // TODO icon also in shared state - how to convert Resource?
 
         return sharedState;
@@ -942,7 +883,7 @@ public abstract class AbstractComponent implements Component, MethodEventSource
             Collection<RepaintRequestListener> alreadyNotified) {
         // Invisible components (by flag in this particular component) do not
         // need repaints
-        if (!visible) {
+        if (!getState().isVisible()) {
             return;
         }