]> source.dussan.org Git - vaadin-framework.git/commitdiff
Fix and testcase for #2107 : Field on client may not allways repaint when status...
authorJoonas Lehtinen <joonas.lehtinen@itmill.com>
Tue, 23 Sep 2008 15:59:38 +0000 (15:59 +0000)
committerJoonas Lehtinen <joonas.lehtinen@itmill.com>
Tue, 23 Sep 2008 15:59:38 +0000 (15:59 +0000)
svn changeset:5490/svn branch:trunk

src/com/itmill/toolkit/tests/tickets/Ticket2107.java [new file with mode: 0644]
src/com/itmill/toolkit/ui/AbstractField.java

diff --git a/src/com/itmill/toolkit/tests/tickets/Ticket2107.java b/src/com/itmill/toolkit/tests/tickets/Ticket2107.java
new file mode 100644 (file)
index 0000000..adba8ae
--- /dev/null
@@ -0,0 +1,61 @@
+package com.itmill.toolkit.tests.tickets;
+
+import com.itmill.toolkit.Application;
+import com.itmill.toolkit.data.Property;
+import com.itmill.toolkit.data.Validator;
+import com.itmill.toolkit.data.Property.ValueChangeEvent;
+import com.itmill.toolkit.ui.Button;
+import com.itmill.toolkit.ui.TextField;
+import com.itmill.toolkit.ui.Window;
+import com.itmill.toolkit.ui.Window.Notification;
+
+public class Ticket2107 extends Application {
+
+    public void init() {
+        final Window w = new Window("Testing for #2107");
+        setMainWindow(w);
+
+        final TextField tf = new TextField(
+                "Required field that validated the input");
+        tf
+                .setDescription("Enter someting and click outside the field to activate");
+        tf.setRequired(true);
+        tf.setImmediate(true);
+        tf.addListener(new Property.ValueChangeListener() {
+
+            public void valueChange(ValueChangeEvent event) {
+                w.showNotification("TextField is " + (tf.isValid() ? "" : "in")
+                        + "valid, with error: " + tf.getErrorMessage(),
+                        Notification.TYPE_WARNING_MESSAGE);
+            }
+        });
+        tf.addValidator(new Validator() {
+
+            public boolean isValid(Object value) {
+                return value != null && value.toString().length() > 3;
+            }
+
+            public void validate(Object value) throws InvalidValueException {
+                if (!isValid(value)) {
+                    throw new InvalidValueException(
+                            "Text length must exceed 3 characters");
+                }
+            }
+        });
+        w.addComponent(tf);
+
+        final Button b = new Button(
+                "Field should use error message. (!) should be shown when empty.",
+                false);
+        w.addComponent(b);
+        b.setImmediate(true);
+        b.addListener(new Property.ValueChangeListener() {
+            public void valueChange(ValueChangeEvent event) {
+                tf
+                        .setRequiredError(b.booleanValue() ? "Field must not be empty"
+                                : null);
+            }
+        });
+    }
+
+}
index 11209b56f51796a85330d9d6124057e757b7aabe..285d1a3dfed2768f904007e26a9d59abb24aea5a 100644 (file)
@@ -431,6 +431,12 @@ public abstract class AbstractField extends AbstractComponent implements Field,
                 throw new Property.ReadOnlyException();
             }
 
+            // Repaint is needed even when the client thinks that it knows the
+            // new state if validity of the component may change
+            if (repaintIsNotNeeded && (isRequired() || getValidators() != null)) {
+                repaintIsNotNeeded = false;
+            }
+
             // If invalid values are not allowed, the value must be checked
             if (!isInvalidAllowed()) {
                 final Collection v = getValidators();
@@ -750,7 +756,8 @@ public abstract class AbstractField extends AbstractComponent implements Field,
             try {
                 validate();
             } catch (Validator.InvalidValueException e) {
-                if (!"".equals(e.getMessage())) {
+                String msg = e.getMessage();
+                if (msg != null && !"".equals(msg)) {
                     validationError = e;
                 }
             }
@@ -1052,6 +1059,15 @@ public abstract class AbstractField extends AbstractComponent implements Field,
         requestRepaint();
     }
 
+    /**
+     * Set the error that is show if this field is required, but empty. When
+     * setting requiredMessage to be "" or null, no error pop-up or exclamation
+     * mark is shown for a empty required field. This faults to "". Even in
+     * those cases isValid() returns false for empty required fields.
+     * 
+     * @param requiredMessage
+     *            Message to be shown when this field is required, but empty.
+     */
     public void setRequiredError(String requiredMessage) {
         requiredError = requiredMessage;
         requestRepaint();