From: Joonas Lehtinen Date: Tue, 23 Sep 2008 15:59:38 +0000 (+0000) Subject: Fix and testcase for #2107 : Field on client may not allways repaint when status... X-Git-Tag: 6.7.0.beta1~4110 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=420523142edba0ff315c63c127c9d8817b2fb70e;p=vaadin-framework.git Fix and testcase for #2107 : Field on client may not allways repaint when status changes from invalid to valid. svn changeset:5490/svn branch:trunk --- diff --git a/src/com/itmill/toolkit/tests/tickets/Ticket2107.java b/src/com/itmill/toolkit/tests/tickets/Ticket2107.java new file mode 100644 index 0000000000..adba8aed27 --- /dev/null +++ b/src/com/itmill/toolkit/tests/tickets/Ticket2107.java @@ -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); + } + }); + } + +} diff --git a/src/com/itmill/toolkit/ui/AbstractField.java b/src/com/itmill/toolkit/ui/AbstractField.java index 11209b56f5..285d1a3dfe 100644 --- a/src/com/itmill/toolkit/ui/AbstractField.java +++ b/src/com/itmill/toolkit/ui/AbstractField.java @@ -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();