aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMarko Grönroos <magi@iki.fi>2008-07-03 13:10:11 +0000
committerMarko Grönroos <magi@iki.fi>2008-07-03 13:10:11 +0000
commitaf895f9596858e252685bf73f61ecdbd4d656c6e (patch)
treec8e9cbac2f7fe5cc4f39bba5549abdb476239ef8 /src
parent5e5f0e5990f19f23455d85a84727063e7fcf97f4 (diff)
downloadvaadin-framework-af895f9596858e252685bf73f61ecdbd4d656c6e.tar.gz
vaadin-framework-af895f9596858e252685bf73f61ecdbd4d656c6e.zip
Fixed #1867 further.
svn changeset:5030/svn branch:trunk
Diffstat (limited to 'src')
-rw-r--r--src/com/itmill/toolkit/data/Validator.java12
-rw-r--r--src/com/itmill/toolkit/terminal/CompositeErrorMessage.java21
-rw-r--r--src/com/itmill/toolkit/ui/AbstractComponent.java9
-rw-r--r--src/com/itmill/toolkit/ui/AbstractField.java14
-rw-r--r--src/com/itmill/toolkit/ui/Form.java42
5 files changed, 78 insertions, 20 deletions
diff --git a/src/com/itmill/toolkit/data/Validator.java b/src/com/itmill/toolkit/data/Validator.java
index fbdbef78cf..b8381094ac 100644
--- a/src/com/itmill/toolkit/data/Validator.java
+++ b/src/com/itmill/toolkit/data/Validator.java
@@ -146,4 +146,16 @@ public interface Validator {
}
}
+
+ public class EmptyValueException extends Validator.InvalidValueException {
+ /**
+ * Serial generated by eclipse.
+ */
+ private static final long serialVersionUID = -4488988853486652602L;
+
+ public EmptyValueException(String message) {
+ super(message);
+ }
+
+ }
}
diff --git a/src/com/itmill/toolkit/terminal/CompositeErrorMessage.java b/src/com/itmill/toolkit/terminal/CompositeErrorMessage.java
index c1caf6942c..f42736084f 100644
--- a/src/com/itmill/toolkit/terminal/CompositeErrorMessage.java
+++ b/src/com/itmill/toolkit/terminal/CompositeErrorMessage.java
@@ -107,6 +107,27 @@ public class CompositeErrorMessage implements ErrorMessage {
public Iterator iterator() {
return errors.iterator();
}
+
+ /**
+ * Checks recursively if one of the error messages of the composite message
+ * is given class or contains one inside further composition.
+ *
+ * @param exceptionClass Class to search for.
+ * @return true if an error message of the given class was found inside.
+ */
+ public boolean hasErrorMessageClass(Class exceptionClass) {
+ for (Iterator i = iterator(); i.hasNext();) {
+ ErrorMessage msg = (ErrorMessage) i.next();
+ if (exceptionClass.isInstance(msg))
+ return true;
+ if (msg instanceof CompositeErrorMessage) {
+ boolean recursionResult = ((CompositeErrorMessage)msg).hasErrorMessageClass(exceptionClass);
+ if (recursionResult)
+ return true; // Was found
+ }
+ }
+ return false;
+ }
/**
* @see com.itmill.toolkit.terminal.Paintable#paint(com.itmill.toolkit.terminal.PaintTarget)
diff --git a/src/com/itmill/toolkit/ui/AbstractComponent.java b/src/com/itmill/toolkit/ui/AbstractComponent.java
index f4db9214ed..a4e662aa64 100644
--- a/src/com/itmill/toolkit/ui/AbstractComponent.java
+++ b/src/com/itmill/toolkit/ui/AbstractComponent.java
@@ -13,8 +13,10 @@ import java.util.Locale;
import java.util.Map;
import com.itmill.toolkit.Application;
+import com.itmill.toolkit.data.Validator.EmptyValueException;
import com.itmill.toolkit.event.EventRouter;
import com.itmill.toolkit.event.MethodEventSource;
+import com.itmill.toolkit.terminal.CompositeErrorMessage;
import com.itmill.toolkit.terminal.ErrorMessage;
import com.itmill.toolkit.terminal.PaintException;
import com.itmill.toolkit.terminal.PaintTarget;
@@ -624,7 +626,12 @@ public abstract class AbstractComponent implements Component, MethodEventSource
final ErrorMessage error = getErrorMessage();
if (error != null) {
- error.paint(target);
+ // Do not display empty value errors for
+ // empty required fields.
+ if (!(error instanceof EmptyValueException ||
+ (error instanceof CompositeErrorMessage &&
+ ((CompositeErrorMessage)error).hasErrorMessageClass(EmptyValueException.class))))
+ error.paint(target);
}
} else {
target.addAttribute("invisible", true);
diff --git a/src/com/itmill/toolkit/ui/AbstractField.java b/src/com/itmill/toolkit/ui/AbstractField.java
index 055b857b81..5d43a7d728 100644
--- a/src/com/itmill/toolkit/ui/AbstractField.java
+++ b/src/com/itmill/toolkit/ui/AbstractField.java
@@ -617,18 +617,6 @@ public abstract class AbstractField extends AbstractComponent implements Field,
return true;
}
- public class EmptyValueException extends Validator.InvalidValueException {
- /**
- * Serial generated by eclipse.
- */
- private static final long serialVersionUID = -4488988853486652602L;
-
- public EmptyValueException(String message) {
- super(message);
- }
-
- }
-
/**
* Checks the validity of the Validatable by validating the field with all
* attached validators.
@@ -643,7 +631,7 @@ public abstract class AbstractField extends AbstractComponent implements Field,
if (isRequired()) {
if (isEmpty()) {
- throw new EmptyValueException(requiredError);
+ throw new Validator.EmptyValueException(requiredError);
}
}
diff --git a/src/com/itmill/toolkit/ui/Form.java b/src/com/itmill/toolkit/ui/Form.java
index 5f0863ff51..266aa780d4 100644
--- a/src/com/itmill/toolkit/ui/Form.java
+++ b/src/com/itmill/toolkit/ui/Form.java
@@ -15,8 +15,10 @@ import com.itmill.toolkit.data.Item;
import com.itmill.toolkit.data.Property;
import com.itmill.toolkit.data.Validatable;
import com.itmill.toolkit.data.Validator;
+import com.itmill.toolkit.data.Validator.EmptyValueException;
import com.itmill.toolkit.data.Validator.InvalidValueException;
import com.itmill.toolkit.data.util.BeanItem;
+import com.itmill.toolkit.terminal.CompositeErrorMessage;
import com.itmill.toolkit.terminal.ErrorMessage;
import com.itmill.toolkit.terminal.PaintException;
import com.itmill.toolkit.terminal.PaintTarget;
@@ -169,6 +171,17 @@ public class Form extends AbstractField implements Item.Editor, Buffered, Item,
if (formFooter != null) {
formFooter.paint(target);
}
+
+ // AbstractComponent.paint() does not paint EmptyValueExceptions and
+ // filters them out, but Form wants to paint them, so we have to
+ // see if the error was skipped.
+ // Efficiency note: also AbstractComponent.paint() calls
+ // getErrorMessage(), which is a bit heavy call.
+ final ErrorMessage error = getErrorMessage();
+ if (error instanceof EmptyValueException ||
+ (error instanceof CompositeErrorMessage &&
+ ((CompositeErrorMessage)error).hasErrorMessageClass(EmptyValueException.class)))
+ error.paint(target);
}
/**
@@ -182,22 +195,39 @@ public class Form extends AbstractField implements Item.Editor, Buffered, Item,
* validation fails also on empty errors.
*/
public ErrorMessage getErrorMessage() {
+ // Reimplement the checking of validation error by using
+ // getErrorMessage() recursively instead of validate().
+ ErrorMessage validationError = null;
for (final Iterator i = propertyIds.iterator(); i.hasNext();) {
try {
AbstractComponent field = (AbstractComponent) fields.get(i
.next());
- ErrorMessage e = field.getErrorMessage();
- if (e != null) {
+ validationError = field.getErrorMessage();
+ if (validationError != null) {
// Skip empty errors
- if ("".equals(e.toString())) {
+ if (validationError.toString().isEmpty())
continue;
- }
- return e;
+ break;
}
} catch (ClassCastException ignored) {
}
}
- return null;
+
+ // The rest is reimplementation of the latter part of
+ // AbstractField.getErrorMessage()
+
+ // Check if there are any systems errors
+ final ErrorMessage superError = super.getErrorMessage();
+
+ // Return if there are no errors at all
+ if (superError == null && validationError == null
+ && currentBufferedSourceException == null) {
+ return null;
+ }
+
+ // Throw combination of the error types
+ return new CompositeErrorMessage(new ErrorMessage[] { superError,
+ validationError, currentBufferedSourceException });
}
/*