aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoonas Lehtinen <joonas.lehtinen@itmill.com>2008-09-23 15:59:38 +0000
committerJoonas Lehtinen <joonas.lehtinen@itmill.com>2008-09-23 15:59:38 +0000
commit420523142edba0ff315c63c127c9d8817b2fb70e (patch)
treee01c5d8db5780a03340962db3abc6709b1426c09
parent38bb5df3ca840f5cd7ac01fcb6ec5b4923f5596d (diff)
downloadvaadin-framework-420523142edba0ff315c63c127c9d8817b2fb70e.tar.gz
vaadin-framework-420523142edba0ff315c63c127c9d8817b2fb70e.zip
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
-rw-r--r--src/com/itmill/toolkit/tests/tickets/Ticket2107.java61
-rw-r--r--src/com/itmill/toolkit/ui/AbstractField.java18
2 files changed, 78 insertions, 1 deletions
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();