]> source.dussan.org Git - vaadin-framework.git/commitdiff
Fixed readonly handling for fields (depends on property readonly
authorArtur Signell <artur@vaadin.com>
Fri, 9 Mar 2012 13:16:37 +0000 (15:16 +0200)
committerArtur Signell <artur@vaadin.com>
Tue, 13 Mar 2012 16:10:42 +0000 (18:10 +0200)
status) and enable state handling for components on client side
(depend on parent)

28 files changed:
src/com/vaadin/terminal/gwt/client/AbstractFieldState.java [new file with mode: 0644]
src/com/vaadin/terminal/gwt/client/ComponentConnector.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/AbstractFieldConnector.java [new file with mode: 0644]
src/com/vaadin/terminal/gwt/client/ui/AbstractSplitPanelConnector.java
src/com/vaadin/terminal/gwt/client/ui/CheckBoxConnector.java
src/com/vaadin/terminal/gwt/client/ui/ComboBoxConnector.java
src/com/vaadin/terminal/gwt/client/ui/FormConnector.java
src/com/vaadin/terminal/gwt/client/ui/FormLayoutConnector.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/PopupDateFieldConnector.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/TextFieldConnector.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/VLink.java
src/com/vaadin/terminal/gwt/client/ui/VScrollTable.java
src/com/vaadin/terminal/gwt/client/ui/WindowConnector.java
src/com/vaadin/terminal/gwt/client/ui/richtextarea/RichTextAreaConnector.java
src/com/vaadin/ui/AbstractField.java

diff --git a/src/com/vaadin/terminal/gwt/client/AbstractFieldState.java b/src/com/vaadin/terminal/gwt/client/AbstractFieldState.java
new file mode 100644 (file)
index 0000000..20d96c9
--- /dev/null
@@ -0,0 +1,37 @@
+package com.vaadin.terminal.gwt.client;
+
+import com.vaadin.ui.AbstractField;
+
+/**
+ * Shared state for {@link AbstractField}.
+ * 
+ * @author Vaadin Ltd
+ * @version @VERSION@
+ * @since 7.0.0
+ * 
+ */
+public class AbstractFieldState extends ComponentState {
+    private boolean propertyReadOnly = false;
+
+    /**
+     * Checks if the property data source for the Field is in read only mode.
+     * This affects the read only state of the field itself.
+     * 
+     * @return true if there is a property data source and it is set to read
+     *         only, false otherwise
+     */
+    public boolean isPropertyReadOnly() {
+        return propertyReadOnly;
+    }
+
+    /**
+     * Sets the read only state of the property data source.
+     * 
+     * @param propertyReadOnly
+     *            true if the property data source if read only, false otherwise
+     */
+    public void setPropertyReadOnly(boolean propertyReadOnly) {
+        this.propertyReadOnly = propertyReadOnly;
+    }
+
+}
index a083da0dff4c2da4eaccca11893f7c14f7fb2a0c..65cbbcaf0689eeb46e901307e8f41c08468a80d3 100644 (file)
@@ -106,4 +106,13 @@ public interface ComponentConnector extends Connector {
      *            The new parent of the connector
      */
     public void setParent(ComponentContainerConnector parent);
+
+    /**
+     * Checks if the connector is read only.
+     * 
+     * @deprecated This belongs in AbstractFieldConnector, see #8514
+     * @return true
+     */
+    @Deprecated
+    public boolean isReadOnly();
 }
index e639da950288a26ba2b21fb76491a17a58355205..086a2c7de36a96862aaf3c78ff5326f84c143546 100644 (file)
@@ -113,7 +113,7 @@ public class VCaption extends HTML {
                 style += " " + CLASSNAME + "-" + styles[i];
             }
         }
-        if (!owner.getState().isEnabled()) {
+        if (!owner.isEnabled()) {
             style += " " + ApplicationConnection.DISABLED_CLASSNAME;
         }
         setStyleName(style);
index 24baa22940b0f5a6153ef2828d7450eada0e37d4..d5a27d7abfb43115e2b2478cfbba1179cd40d50a 100644 (file)
@@ -40,7 +40,6 @@ public abstract class AbstractComponentConnector extends AbstractConnector
     private Widget widget;
 
     /* State variables */
-    private boolean enabled = true;
     private boolean visible = true;
 
     // shared state from the server to the client
@@ -157,12 +156,16 @@ public abstract class AbstractComponentConnector extends AbstractConnector
             ((Focusable) getWidget()).setTabIndex(uidl
                     .getIntAttribute("tabindex"));
         }
-        setEnabled(getState().isEnabled());
+
+        if (getWidget() instanceof FocusWidget) {
+            FocusWidget fw = (FocusWidget) getWidget();
+            fw.setEnabled(isEnabled());
+        }
 
         // Style names
         String styleName = getStyleNameFromUIDL(getWidget()
-                .getStylePrimaryName(), uidl, getState(),
-                getWidget() instanceof Field);
+                .getStylePrimaryName(), uidl, getWidget() instanceof Field,
+                this);
         getWidget().setStyleName(styleName);
 
         // Update tooltip
@@ -264,24 +267,21 @@ public abstract class AbstractComponentConnector extends AbstractConnector
         return declaredWidth;
     }
 
-    /**
-     * Sets the enabled state of this paintable
+    /*
+     * (non-Javadoc)
      * 
-     * @param enabled
-     *            true if the paintable is enabled, false otherwise
+     * @see com.vaadin.terminal.gwt.client.Connector#isEnabled()
      */
-    protected void setEnabled(boolean enabled) {
-        this.enabled = enabled;
-
-        if (getWidget() instanceof FocusWidget) {
-            FocusWidget fw = (FocusWidget) getWidget();
-            fw.setEnabled(enabled);
+    public boolean isEnabled() {
+        if (!getState().isEnabled()) {
+            return false;
         }
 
-    }
-
-    public boolean isEnabled() {
-        return enabled;
+        if (getParent() == null) {
+            return true;
+        } else {
+            return getParent().isEnabled();
+        }
     }
 
     /**
@@ -341,19 +341,20 @@ public abstract class AbstractComponentConnector extends AbstractConnector
      * @return
      */
     protected static String getStyleNameFromUIDL(String primaryStyleName,
-            UIDL uidl, ComponentState state, boolean field) {
-        boolean enabled = state.isEnabled();
+            UIDL uidl, boolean field, ComponentConnector connector) {
+        ComponentState state = connector.getState();
 
         StringBuffer styleBuf = new StringBuffer();
         styleBuf.append(primaryStyleName);
         styleBuf.append(" v-paintable");
 
-        // first disabling and read-only status
-        if (!enabled) {
+        // Uses connector methods to enable connectors to take hierarchy or
+        // multiple state variables into account
+        if (!connector.isEnabled()) {
             styleBuf.append(" ");
             styleBuf.append(ApplicationConnection.DISABLED_CLASSNAME);
         }
-        if (state.isReadOnly()) {
+        if (connector.isReadOnly()) {
             styleBuf.append(" ");
             styleBuf.append("v-readonly");
         }
@@ -372,6 +373,7 @@ public abstract class AbstractComponentConnector extends AbstractConnector
             }
         }
 
+        // TODO Move to AbstractFieldConnector
         // add modified classname to Fields
         if (field && uidl.hasAttribute("modified")) {
             styleBuf.append(" ");
@@ -394,6 +396,16 @@ public abstract class AbstractComponentConnector extends AbstractConnector
         return styleBuf.toString();
     }
 
+    /*
+     * (non-Javadoc)
+     * 
+     * @see com.vaadin.terminal.gwt.client.ComponentConnector#isReadOnly()
+     */
+    @Deprecated
+    public boolean isReadOnly() {
+        return getState().isReadOnly();
+    }
+
     /**
      * Sets the shared state for the paintable widget.
      * 
index 0068eb8960fc0d0a52204f2043ee6973e182e5b4..6aa5bf2fff93aa00071442870b487ba1fac66e8c 100644 (file)
@@ -12,7 +12,7 @@ import com.vaadin.terminal.gwt.client.LocaleNotLoadedException;
 import com.vaadin.terminal.gwt.client.UIDL;
 import com.vaadin.terminal.gwt.client.VConsole;
 
-public class AbstractDateFieldConnector extends AbstractComponentConnector {
+public class AbstractDateFieldConnector extends AbstractFieldConnector {
 
     @Override
     public void updateFromUIDL(UIDL uidl, ApplicationConnection client) {
@@ -27,8 +27,8 @@ public class AbstractDateFieldConnector extends AbstractComponentConnector {
         getWidget().paintableId = uidl.getId();
         getWidget().immediate = getState().isImmediate();
 
-        getWidget().readonly = getState().isReadOnly();
-        getWidget().enabled = getState().isEnabled();
+        getWidget().readonly = isReadOnly();
+        getWidget().enabled = isEnabled();
 
         if (uidl.hasAttribute("locale")) {
             final String locale = uidl.getStringAttribute("locale");
diff --git a/src/com/vaadin/terminal/gwt/client/ui/AbstractFieldConnector.java b/src/com/vaadin/terminal/gwt/client/ui/AbstractFieldConnector.java
new file mode 100644 (file)
index 0000000..8ef11a5
--- /dev/null
@@ -0,0 +1,24 @@
+package com.vaadin.terminal.gwt.client.ui;
+
+import com.google.gwt.core.client.GWT;
+import com.vaadin.terminal.gwt.client.AbstractFieldState;
+import com.vaadin.terminal.gwt.client.ComponentState;
+
+public abstract class AbstractFieldConnector extends AbstractComponentConnector {
+
+    @Override
+    public AbstractFieldState getState() {
+        return (AbstractFieldState) super.getState();
+    }
+
+    @Override
+    protected ComponentState createState() {
+        return GWT.create(AbstractFieldState.class);
+    }
+
+    @Override
+    public boolean isReadOnly() {
+        return super.isReadOnly() || getState().isPropertyReadOnly();
+    }
+
+}
index 2f0674b58da97f0258ca14aaa13e3e61caeec45e..ce2820b56debe69803d425f1c50cae186a0a6655 100644 (file)
@@ -75,7 +75,7 @@ public abstract class AbstractSplitPanelConnector extends
         if (!isRealUpdate(uidl)) {
             return;
         }
-        getWidget().setEnabled(getState().isEnabled());
+        getWidget().setEnabled(isEnabled());
 
         clickEventHandler.handleEventHandlerRegistration(client);
         if (getState().hasStyles()) {
index e59777ef31f6143dc212712f8104ead0de7fb992..d842104fabf0b236bfdb68b83095783fa48ca7e1 100644 (file)
@@ -12,7 +12,7 @@ import com.vaadin.terminal.gwt.client.EventHelper;
 import com.vaadin.terminal.gwt.client.UIDL;
 import com.vaadin.terminal.gwt.client.VTooltip;
 
-public class CheckBoxConnector extends AbstractComponentConnector {
+public class CheckBoxConnector extends AbstractFieldConnector {
 
     @Override
     protected boolean delegateCaptionHandling() {
@@ -55,7 +55,7 @@ public class CheckBoxConnector extends AbstractComponentConnector {
                     "none");
         }
 
-        if (getState().isReadOnly()) {
+        if (isReadOnly()) {
             getWidget().setEnabled(false);
         }
 
index d8fb48dc8d42909c3b6ba6e0f6de713dd44ecc9c..529046a307d2e626c38b88b75b547299b66fac69 100644 (file)
@@ -12,7 +12,7 @@ import com.vaadin.terminal.gwt.client.UIDL;
 import com.vaadin.terminal.gwt.client.Util;
 import com.vaadin.terminal.gwt.client.ui.VFilterSelect.FilterSelectSuggestion;
 
-public class ComboBoxConnector extends AbstractComponentConnector implements
+public class ComboBoxConnector extends AbstractFieldConnector implements
         SimpleManagedLayout {
 
     /*
@@ -29,8 +29,8 @@ public class ComboBoxConnector extends AbstractComponentConnector implements
         getWidget().client = client;
         getWidget().paintableId = uidl.getId();
 
-        getWidget().readonly = getState().isReadOnly();
-        getWidget().enabled = getState().isEnabled();
+        getWidget().readonly = isReadOnly();
+        getWidget().enabled = isEnabled();
 
         getWidget().tb.setEnabled(getWidget().enabled);
         getWidget().updateReadOnly();
index 9ff7a38ccf0643202ace6c72ad0a03069f1dc89b..3107780d596a8bb99872278eed80b689dadcf9be 100644 (file)
@@ -7,8 +7,10 @@ import com.google.gwt.core.client.GWT;
 import com.google.gwt.dom.client.Style.Unit;
 import com.google.gwt.event.dom.client.KeyDownEvent;
 import com.google.gwt.user.client.ui.Widget;
+import com.vaadin.terminal.gwt.client.AbstractFieldState;
 import com.vaadin.terminal.gwt.client.ApplicationConnection;
 import com.vaadin.terminal.gwt.client.ComponentConnector;
+import com.vaadin.terminal.gwt.client.ComponentState;
 import com.vaadin.terminal.gwt.client.ConnectorMap;
 import com.vaadin.terminal.gwt.client.UIDL;
 
@@ -176,4 +178,19 @@ public class FormConnector extends AbstractComponentContainerConnector
         form.footerContainer.getStyle().setMarginTop(-footerHeight, Unit.PX);
     }
 
+    @Override
+    public boolean isReadOnly() {
+        return super.isReadOnly() || getState().isPropertyReadOnly();
+    }
+
+    @Override
+    public AbstractFieldState getState() {
+        return (AbstractFieldState) super.getState();
+    }
+
+    @Override
+    protected ComponentState createState() {
+        return GWT.create(AbstractFieldState.class);
+    }
+
 }
index 598c8023dede0d28fd5b10a9c25273ad465badc7..52eb4c98264a7a898cdba1d9b34fd5f850ab3e2a 100644 (file)
@@ -8,6 +8,8 @@ import com.google.gwt.user.client.ui.Widget;
 import com.vaadin.terminal.gwt.client.ApplicationConnection;
 import com.vaadin.terminal.gwt.client.ComponentConnector;
 import com.vaadin.terminal.gwt.client.UIDL;
+import com.vaadin.terminal.gwt.client.ui.VFormLayout.Caption;
+import com.vaadin.terminal.gwt.client.ui.VFormLayout.ErrorFlag;
 
 public class FormLayoutConnector extends AbstractComponentContainerConnector {
     @Override
@@ -23,7 +25,16 @@ public class FormLayoutConnector extends AbstractComponentContainerConnector {
     }
 
     public void updateCaption(ComponentConnector component, UIDL uidl) {
-        getWidget().table.updateCaption(component, uidl);
+        final Caption c = getWidget().table.widgetToCaption.get(component
+                .getWidget());
+        if (c != null) {
+            c.updateCaption(uidl, component.getState(), component.isEnabled());
+        }
+        final ErrorFlag e = getWidget().table.widgetToError.get(component
+                .getWidget());
+        if (e != null) {
+            e.updateFromUIDL(uidl, component);
+        }
     }
 
     @Override
index 7d6e7e04ce5adf091a8295bef0f3340c34ad1cf0..21172becff4776e894a0cd2145d53b19895b7e7e 100644 (file)
@@ -29,8 +29,7 @@ public class LinkConnector extends AbstractComponentConnector {
 
         getWidget().client = client;
 
-        getWidget().enabled = getState().isEnabled();
-        getWidget().readonly = getState().isReadOnly();
+        getWidget().enabled = isEnabled();
 
         if (uidl.hasAttribute("name")) {
             getWidget().target = uidl.getStringAttribute("name");
index 62b1cb69a7148b8d64019cf67cb72790366f0171..60d25c5509a045bca9147dbb20a406a9a740be86 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().isEnabled();
+        getWidget().enabled = isEnabled();
 
         // For future connections
         getWidget().client = client;
index 41844da348cefcb2ae54198dc244bc2c94bd1828..fe7abce18cfc8c7bb0c28e187220339bfaf8365f 100644 (file)
@@ -7,8 +7,7 @@ package com.vaadin.terminal.gwt.client.ui;
 import com.vaadin.terminal.gwt.client.ApplicationConnection;
 import com.vaadin.terminal.gwt.client.UIDL;
 
-public abstract class OptionGroupBaseConnector extends
-        AbstractComponentConnector {
+public abstract class OptionGroupBaseConnector extends AbstractFieldConnector {
 
     @Override
     public void updateFromUIDL(UIDL uidl, ApplicationConnection client) {
@@ -24,8 +23,8 @@ public abstract class OptionGroupBaseConnector extends
 
         getWidget().selectedKeys = uidl.getStringArrayVariableAsSet("selected");
 
-        getWidget().readonly = getState().isReadOnly();
-        getWidget().disabled = !getState().isEnabled();
+        getWidget().readonly = isReadOnly();
+        getWidget().disabled = !isEnabled();
         getWidget().multiselect = "multi".equals(uidl
                 .getStringAttribute("selectmode"));
         getWidget().immediate = getState().isImmediate();
index 4c315046aa0cb6215d6ce9847dee19229cd25f28..0e4afde99ae16231c317dc94fb9671e80cfe0ddc 100644 (file)
@@ -35,8 +35,7 @@ public class PopupDateFieldConnector extends TextualDateConnector {
         super.updateFromUIDL(uidl, client);
 
         String popupStyleNames = getStyleNameFromUIDL(
-                VPopupCalendar.POPUP_PRIMARY_STYLE_NAME, uidl, getState(),
-                false);
+                VPopupCalendar.POPUP_PRIMARY_STYLE_NAME, uidl, false, this);
         popupStyleNames += " "
                 + VDateField.CLASSNAME
                 + "-"
index e5cd8f6d4d144cefddc509bf637475b2956c07b8..21c6a06a3671c7e0012395a9f57ad8c623a1e50f 100644 (file)
@@ -10,7 +10,7 @@ import com.google.gwt.user.client.ui.Widget;
 import com.vaadin.terminal.gwt.client.ApplicationConnection;
 import com.vaadin.terminal.gwt.client.UIDL;
 
-public class ProgressIndicatorConnector extends AbstractComponentConnector {
+public class ProgressIndicatorConnector extends AbstractFieldConnector {
 
     @Override
     public void updateFromUIDL(UIDL uidl, ApplicationConnection client) {
@@ -30,7 +30,7 @@ public class ProgressIndicatorConnector extends AbstractComponentConnector {
         if (getWidget().indeterminate) {
             String basename = VProgressIndicator.CLASSNAME + "-indeterminate";
             getWidget().addStyleName(basename);
-            if (!getState().isEnabled()) {
+            if (!isEnabled()) {
                 getWidget().addStyleName(basename + "-disabled");
             } else {
                 getWidget().removeStyleName(basename + "-disabled");
@@ -46,7 +46,7 @@ public class ProgressIndicatorConnector extends AbstractComponentConnector {
             }
         }
 
-        if (getState().isEnabled()) {
+        if (isEnabled()) {
             getWidget().interval = uidl.getIntAttribute("pollinginterval");
             getWidget().poller.scheduleRepeating(getWidget().interval);
         }
index 900e3af63392ecc3b8ffb1accfd9cc476dbd2e15..dcea66ca948c9a71ff24b3d6b62481e4d688191f 100644 (file)
@@ -10,7 +10,7 @@ import com.google.gwt.user.client.ui.Widget;
 import com.vaadin.terminal.gwt.client.ApplicationConnection;
 import com.vaadin.terminal.gwt.client.UIDL;
 
-public class SliderConnector extends AbstractComponentConnector {
+public class SliderConnector extends AbstractFieldConnector {
 
     @Override
     public void updateFromUIDL(UIDL uidl, ApplicationConnection client) {
@@ -25,8 +25,8 @@ public class SliderConnector extends AbstractComponentConnector {
         }
 
         getWidget().immediate = getState().isImmediate();
-        getWidget().disabled = !getState().isEnabled();
-        getWidget().readonly = getState().isReadOnly();
+        getWidget().disabled = !isEnabled();
+        getWidget().readonly = isReadOnly();
 
         getWidget().vertical = uidl.hasAttribute("vertical");
 
index eadefc94b38ed680282f465ab9406399c485ae22..0d17a7ccc248e1947e41f1b1c30db981338052b7 100644 (file)
@@ -8,9 +8,11 @@ import com.google.gwt.core.client.Scheduler;
 import com.google.gwt.dom.client.Style.Position;
 import com.google.gwt.user.client.Command;
 import com.google.gwt.user.client.ui.Widget;
+import com.vaadin.terminal.gwt.client.AbstractFieldState;
 import com.vaadin.terminal.gwt.client.ApplicationConnection;
 import com.vaadin.terminal.gwt.client.BrowserInfo;
 import com.vaadin.terminal.gwt.client.ComponentConnector;
+import com.vaadin.terminal.gwt.client.ComponentState;
 import com.vaadin.terminal.gwt.client.DirectionalManagedLayout;
 import com.vaadin.terminal.gwt.client.UIDL;
 import com.vaadin.terminal.gwt.client.Util;
@@ -55,7 +57,7 @@ public class TableConnector extends AbstractComponentContainerConnector
             return;
         }
 
-        getWidget().enabled = getState().isEnabled();
+        getWidget().enabled = isEnabled();
 
         if (BrowserInfo.get().isIE8() && !getWidget().enabled) {
             /*
@@ -79,7 +81,7 @@ public class TableConnector extends AbstractComponentContainerConnector
 
         getWidget().updateDragMode(uidl);
 
-        getWidget().updateSelectionProperties(uidl, getState());
+        getWidget().updateSelectionProperties(uidl, getState(), isReadOnly());
 
         if (uidl.hasAttribute("alb")) {
             getWidget().bodyActionKeys = uidl.getStringArrayAttribute("alb");
@@ -262,4 +264,20 @@ public class TableConnector extends AbstractComponentContainerConnector
     public void postLayout() {
         getWidget().sizeInit();
     }
+
+    @Override
+    public boolean isReadOnly() {
+        return super.isReadOnly() || getState().isPropertyReadOnly();
+    }
+
+    @Override
+    public AbstractFieldState getState() {
+        return (AbstractFieldState) super.getState();
+    }
+
+    @Override
+    protected ComponentState createState() {
+        return GWT.create(AbstractFieldState.class);
+    }
+
 }
index 1840ac159e64b4514bfa3e98e298fc3778cbb46f..0c44068cf55d13b910837caf2c72296773dac91e 100644 (file)
@@ -32,7 +32,7 @@ public abstract class TabsheetBaseConnector extends
 
         // Update member references
         getWidget().id = uidl.getId();
-        getWidget().disabled = !getState().isEnabled();
+        getWidget().disabled = !isEnabled();
 
         // Render content
         final UIDL tabs = uidl.getChildUIDL(0);
index 598bc05e197ca93a239393efbaf1f492760f57d7..e1fb3a56a85a5d9d36d81d4fecb1186b364a8bf9 100644 (file)
@@ -13,7 +13,7 @@ import com.vaadin.terminal.gwt.client.ApplicationConnection;
 import com.vaadin.terminal.gwt.client.UIDL;
 import com.vaadin.terminal.gwt.client.ui.ShortcutActionHandler.BeforeShortcutActionListener;
 
-public class TextFieldConnector extends AbstractComponentConnector implements
+public class TextFieldConnector extends AbstractFieldConnector implements
         BeforeShortcutActionListener {
 
     @Override
@@ -27,7 +27,7 @@ public class TextFieldConnector extends AbstractComponentConnector implements
             return;
         }
 
-        getWidget().setReadOnly(getState().isReadOnly());
+        getWidget().setReadOnly(isReadOnly());
 
         getWidget().inputPrompt = uidl
                 .getStringAttribute(VTextField.ATTR_INPUTPROMPT);
index b6e6095ef2aeaa67b1bfdeb90fb5fe8fabd406c6..9e670e46dffeaa7273ec7f68248e00493d1520ec 100644 (file)
@@ -7,7 +7,9 @@ import java.util.Iterator;
 
 import com.google.gwt.core.client.GWT;
 import com.google.gwt.user.client.ui.Widget;
+import com.vaadin.terminal.gwt.client.AbstractFieldState;
 import com.vaadin.terminal.gwt.client.ApplicationConnection;
+import com.vaadin.terminal.gwt.client.ComponentState;
 import com.vaadin.terminal.gwt.client.TooltipInfo;
 import com.vaadin.terminal.gwt.client.UIDL;
 import com.vaadin.terminal.gwt.client.ui.VTree.TreeNode;
@@ -43,8 +45,8 @@ public class TreeConnector extends AbstractComponentConnector {
 
         getWidget().immediate = getState().isImmediate();
 
-        getWidget().disabled = !getState().isEnabled();
-        getWidget().readonly = getState().isReadOnly();
+        getWidget().disabled = !isEnabled();
+        getWidget().readonly = isReadOnly();
 
         getWidget().dragMode = uidl.hasAttribute("dragMode") ? uidl
                 .getIntAttribute("dragMode") : 0;
@@ -235,4 +237,20 @@ public class TreeConnector extends AbstractComponentConnector {
         }
         containerNode.childrenLoaded = true;
     }
+
+    @Override
+    public boolean isReadOnly() {
+        return super.isReadOnly() || getState().isPropertyReadOnly();
+    }
+
+    @Override
+    public AbstractFieldState getState() {
+        return (AbstractFieldState) super.getState();
+    }
+
+    @Override
+    protected ComponentState createState() {
+        return GWT.create(AbstractFieldState.class);
+    }
+
 }
index 05a5e7d73d0eba88615930d2fc9a04546eef0dee..182156d0e4899b2e453e7aead0bc88b62c71bc10 100644 (file)
@@ -41,7 +41,7 @@ public class UploadConnector extends AbstractComponentConnector {
         }
         getWidget().fu.setName(getWidget().paintableId + "_file");
 
-        if (!getState().isEnabled() || getState().isReadOnly()) {
+        if (!isEnabled() || isReadOnly()) {
             getWidget().disableUpload();
         } else if (!uidl.getBooleanAttribute("state")) {
             // Enable the button only if an upload is not in progress
index cf9f35dc8d1e489490c330cf46b0fe1916cdc8cc..9beef5d2dfd9542e6ebe0fcfbf7d8889b9657e53 100644 (file)
@@ -50,9 +50,10 @@ public class VFormLayout extends SimplePanel {
      * 
      * @param state
      *            shared state of the component
+     * @param enabled
      * @return An array of stylenames
      */
-    private String[] getStylesFromState(ComponentState state) {
+    private String[] getStylesFromState(ComponentState state, boolean enabled) {
         List<String> styles = new ArrayList<String>();
         if (state.hasStyles()) {
             String[] stylesnames = state.getStyle().split(" ");
@@ -61,7 +62,7 @@ public class VFormLayout extends SimplePanel {
             }
         }
 
-        if (!state.isEnabled()) {
+        if (!enabled) {
             styles.add(ApplicationConnection.DISABLED_CLASSNAME);
         }
 
@@ -74,8 +75,8 @@ public class VFormLayout extends SimplePanel {
         private static final int COLUMN_ERRORFLAG = 1;
         private static final int COLUMN_WIDGET = 2;
 
-        private HashMap<Widget, Caption> widgetToCaption = new HashMap<Widget, Caption>();
-        private HashMap<Widget, ErrorFlag> widgetToError = new HashMap<Widget, ErrorFlag>();
+        HashMap<Widget, Caption> widgetToCaption = new HashMap<Widget, Caption>();
+        HashMap<Widget, ErrorFlag> widgetToError = new HashMap<Widget, ErrorFlag>();
 
         public VFormLayoutTable() {
             DOM.setElementProperty(getElement(), "cellPadding", "0");
@@ -178,18 +179,6 @@ public class VFormLayout extends SimplePanel {
             }
         }
 
-        public void updateCaption(ComponentConnector paintable, UIDL uidl) {
-            final Caption c = widgetToCaption.get(paintable.getWidget());
-            if (c != null) {
-                c.updateCaption(uidl, paintable.getState());
-            }
-            final ErrorFlag e = widgetToError.get(paintable.getWidget());
-            if (e != null) {
-                e.updateFromUIDL(uidl, paintable);
-            }
-
-        }
-
         /*
          * (non-Javadoc)
          * 
@@ -259,11 +248,12 @@ public class VFormLayout extends SimplePanel {
             setStyleName(styleName);
         }
 
-        public void updateCaption(UIDL uidl, ComponentState state) {
+        public void updateCaption(UIDL uidl, ComponentState state,
+                boolean enabled) {
             setVisible(!uidl.getBooleanAttribute("invisible"));
 
             // Update styles as they might have changed when the caption changed
-            setStyles(getStylesFromState(state));
+            setStyles(getStylesFromState(state, enabled));
 
             boolean isEmpty = true;
 
@@ -356,7 +346,7 @@ public class VFormLayout extends SimplePanel {
         }
     }
 
-    private class ErrorFlag extends HTML {
+    class ErrorFlag extends HTML {
         private static final String CLASSNAME = VFormLayout.CLASSNAME
                 + "-error-indicator";
         Element errorIndicatorElement;
index 674153b7164d85dfbac8fc31b95babccc8675f34..22c3d10657fe82dfc3263985dc1daab6f8c3d4b8 100644 (file)
@@ -31,8 +31,6 @@ public class VLink extends HTML implements ClickHandler {
 
     protected boolean enabled;
 
-    protected boolean readonly;
-
     protected int targetWidth;
 
     protected int targetHeight;
@@ -57,7 +55,7 @@ public class VLink extends HTML implements ClickHandler {
     }
 
     public void onClick(ClickEvent event) {
-        if (enabled && !readonly) {
+        if (enabled) {
             if (target == null) {
                 target = "_self";
             }
index 809a4dcb7228b826665634878a777cb6ffe72915..9166ffdf9fb5a165dfd48ad15c6f86a2dbf86f3a 100644 (file)
@@ -969,7 +969,8 @@ public class VScrollTable extends FlowPanel implements HasWidgets,
         }
     }
 
-    void updateSelectionProperties(UIDL uidl, ComponentState state) {
+    void updateSelectionProperties(UIDL uidl, ComponentState state,
+            boolean readOnly) {
         setMultiSelectMode(uidl.hasAttribute("multiselectmode") ? uidl
                 .getIntAttribute("multiselectmode") : MULTISELECT_MODE_DEFAULT);
 
@@ -977,7 +978,7 @@ public class VScrollTable extends FlowPanel implements HasWidgets,
                 .getBooleanAttribute("nsa") : true;
 
         if (uidl.hasAttribute("selectmode")) {
-            if (state.isReadOnly()) {
+            if (readOnly) {
                 selectMode = SelectMode.NONE;
             } else if (uidl.getStringAttribute("selectmode").equals("multi")) {
                 selectMode = SelectMode.MULTI;
index 5a00950a4870351052f37c96d6f1b31c5a0717af..7775766689c90afb1988400edbb91f46c147fb6c 100644 (file)
@@ -104,7 +104,7 @@ public class WindowConnector extends AbstractComponentContainerConnector
 
         getWidget().immediate = getState().isImmediate();
 
-        getWidget().setClosable(!getState().isReadOnly());
+        getWidget().setClosable(!isReadOnly());
 
         // Initialize the position form UIDL
         int positionx = uidl.getIntVariable("positionx");
index f60ed538138f70646dd765541a6f4cfdbc70982d..77835236a52ece1b436033e367271d6178dfeca8 100644 (file)
@@ -8,10 +8,10 @@ import com.google.gwt.user.client.Event;
 import com.google.gwt.user.client.ui.Widget;
 import com.vaadin.terminal.gwt.client.ApplicationConnection;
 import com.vaadin.terminal.gwt.client.UIDL;
-import com.vaadin.terminal.gwt.client.ui.AbstractComponentConnector;
+import com.vaadin.terminal.gwt.client.ui.AbstractFieldConnector;
 import com.vaadin.terminal.gwt.client.ui.ShortcutActionHandler.BeforeShortcutActionListener;
 
-public class RichTextAreaConnector extends AbstractComponentConnector implements
+public class RichTextAreaConnector extends AbstractFieldConnector implements
         BeforeShortcutActionListener {
 
     @Override
@@ -28,7 +28,7 @@ public class RichTextAreaConnector extends AbstractComponentConnector implements
             }
         }
         if (isRealUpdate(uidl)) {
-            getWidget().setEnabled(getState().isEnabled());
+            getWidget().setEnabled(isEnabled());
         }
 
         super.updateFromUIDL(uidl, client);
@@ -36,7 +36,7 @@ public class RichTextAreaConnector extends AbstractComponentConnector implements
             return;
         }
 
-        getWidget().setReadOnly(getState().isReadOnly());
+        getWidget().setReadOnly(isReadOnly());
         getWidget().immediate = getState().isImmediate();
         int newMaxLength = uidl.hasAttribute("maxLength") ? uidl
                 .getIntAttribute("maxLength") : -1;
index 109c20290957716445dbeedb58d171f8ccaed126..82d3d2af196ab5b1cd6ba31c0a3b16054d624698 100644 (file)
@@ -30,6 +30,7 @@ import com.vaadin.terminal.CompositeErrorMessage;
 import com.vaadin.terminal.ErrorMessage;
 import com.vaadin.terminal.PaintException;
 import com.vaadin.terminal.PaintTarget;
+import com.vaadin.terminal.gwt.client.AbstractFieldState;
 import com.vaadin.terminal.gwt.client.ui.AbstractComponentConnector;
 
 /**
@@ -730,6 +731,8 @@ public abstract class AbstractField<T> extends AbstractComponent implements
 
         // Sets the new data source
         dataSource = newDataSource;
+        getState().setPropertyReadOnly(
+                dataSource == null ? false : dataSource.isReadOnly());
 
         // Check if the current converter is compatible.
         if (newDataSource != null
@@ -1218,6 +1221,7 @@ public abstract class AbstractField<T> extends AbstractComponent implements
      * @see Property.ReadOnlyStatusChangeListener
      */
     public void readOnlyStatusChange(Property.ReadOnlyStatusChangeEvent event) {
+        getState().setPropertyReadOnly(event.getProperty().isReadOnly());
         requestRepaint();
     }
 
@@ -1613,4 +1617,13 @@ public abstract class AbstractField<T> extends AbstractComponent implements
         requestRepaint();
     }
 
+    @Override
+    public AbstractFieldState getState() {
+        return (AbstractFieldState) super.getState();
+    }
+
+    @Override
+    protected AbstractFieldState createState() {
+        return new AbstractFieldState();
+    }
 }