Revision: 1756 http://svn.sourceforge.net/spring-rich-c/?rev=1756&view=rev Author: jhoskens Date: 2007-05-22 05:56:35 -0700 (Tue, 22 May 2007)
Log Message: ----------- Parent/child nesting of ValidationResultsReporter replaced by nesting of ValidationResultsModels. The former was a bad idea and was a pain when managing a huge hierarchy. The latter solves this by chaining the models and providing the opportunity to bundle results and their events. Modified Paths: -------------- trunk/spring-richclient/support/src/main/java/org/springframework/binding/form/support/DefaultFormModel.java trunk/spring-richclient/support/src/main/java/org/springframework/binding/validation/support/DefaultValidationResultsModel.java trunk/spring-richclient/support/src/main/java/org/springframework/richclient/form/AbstractForm.java trunk/spring-richclient/support/src/test/java/org/springframework/binding/validation/DefaultValidationResultsModelTests.java Modified: trunk/spring-richclient/support/src/main/java/org/springframework/binding/form/support/DefaultFormModel.java =================================================================== --- trunk/spring-richclient/support/src/main/java/org/springframework/binding/form/support/DefaultFormModel.java 2007-05-22 12:52:55 UTC (rev 1755) +++ trunk/spring-richclient/support/src/main/java/org/springframework/binding/form/support/DefaultFormModel.java 2007-05-22 12:56:35 UTC (rev 1756) @@ -157,13 +157,19 @@ { super.addChild(child); if (child instanceof ValidatingFormModel) + { + getValidationResults().add(((ValidatingFormModel)child).getValidationResults()); child.addPropertyChangeListener(ValidationResultsModel.HAS_ERRORS_PROPERTY, errorChangeHandler); + } } public void removeChild(HierarchicalFormModel child) { if (child instanceof ValidatingFormModel) + { + getValidationResults().remove(((ValidatingFormModel)child).getValidationResults()); child.removePropertyChangeListener(ValidationResultsModel.HAS_ERRORS_PROPERTY, errorChangeHandler); + } super.removeChild(child); } Modified: trunk/spring-richclient/support/src/main/java/org/springframework/binding/validation/support/DefaultValidationResultsModel.java =================================================================== --- trunk/spring-richclient/support/src/main/java/org/springframework/binding/validation/support/DefaultValidationResultsModel.java 2007-05-22 12:52:55 UTC (rev 1755) +++ trunk/spring-richclient/support/src/main/java/org/springframework/binding/validation/support/DefaultValidationResultsModel.java 2007-05-22 12:56:35 UTC (rev 1756) @@ -18,6 +18,7 @@ import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.ArrayList; +import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Set; @@ -38,7 +39,7 @@ * * @author Oliver Hutchison */ -public class DefaultValidationResultsModel implements ValidationResultsModel { +public class DefaultValidationResultsModel implements ValidationResultsModel, ValidationListener { private final EventListenerListHelper validationListeners = new EventListenerListHelper(ValidationListener.class); @@ -57,6 +58,8 @@ }; private final ValidationResultsModel delegateFor; + + private List children = new ArrayList(); private ValidationResults validationResults = EmptyValidationResults.INSTANCE; @@ -130,40 +133,115 @@ updateValidationResults(EmptyValidationResults.INSTANCE); } + /** + * Check children too. + */ public boolean getHasErrors() { - return validationResults.getHasErrors(); + if (validationResults.getHasErrors()) + return true; + Iterator childIter = children.iterator(); + while (childIter.hasNext()) + { + ValidationResultsModel childModel = (ValidationResultsModel)childIter.next(); + if (childModel.getHasErrors()) + return true; + } + return false; } public boolean getHasInfo() { - return validationResults.getHasInfo(); + if (validationResults.getHasInfo()) + return true; + Iterator childIter = children.iterator(); + while (childIter.hasNext()) + { + ValidationResultsModel childModel = (ValidationResultsModel)childIter.next(); + if (childModel.getHasInfo()) + return true; + } + return false; } public boolean getHasWarnings() { - return validationResults.getHasWarnings(); + if (validationResults.getHasWarnings()) + return true; + Iterator childIter = children.iterator(); + while (childIter.hasNext()) + { + ValidationResultsModel childModel = (ValidationResultsModel)childIter.next(); + if (childModel.getHasWarnings()) + return true; + } + return false; } public int getMessageCount() { - return validationResults.getMessageCount(); + int count = validationResults.getMessageCount(); + Iterator childIter = children.iterator(); + while (childIter.hasNext()) + { + ValidationResultsModel childModel = (ValidationResultsModel)childIter.next(); + count += childModel.getMessageCount(); + } + return count; } public int getMessageCount(Severity severity) { - return validationResults.getMessageCount(severity); + int count = validationResults.getMessageCount(severity); + Iterator childIter = children.iterator(); + while (childIter.hasNext()) + { + ValidationResultsModel childModel = (ValidationResultsModel)childIter.next(); + count += childModel.getMessageCount(severity); + } + return count; } public int getMessageCount(String propertyName) { - return validationResults.getMessageCount(propertyName); + int count = validationResults.getMessageCount(propertyName); + Iterator childIter = children.iterator(); + while (childIter.hasNext()) + { + ValidationResultsModel childModel = (ValidationResultsModel)childIter.next(); + count += childModel.getMessageCount(propertyName); + } + return count; } public Set getMessages() { - return validationResults.getMessages(); + Set messages = new HashSet(); + messages.addAll(validationResults.getMessages()); + Iterator childIter = children.iterator(); + while (childIter.hasNext()) + { + ValidationResultsModel childModel = (ValidationResultsModel)childIter.next(); + messages.addAll(childModel.getMessages()); + } + return messages; } public Set getMessages(Severity severity) { - return validationResults.getMessages(severity); + Set messages = new HashSet(); + messages.addAll(validationResults.getMessages(severity)); + Iterator childIter = children.iterator(); + while (childIter.hasNext()) + { + ValidationResultsModel childModel = (ValidationResultsModel)childIter.next(); + messages.addAll(childModel.getMessages(severity)); + } + return messages; } public Set getMessages(String propertyName) { - return validationResults.getMessages(propertyName); + Set messages = new HashSet(); + messages.addAll(validationResults.getMessages(propertyName)); + Iterator childIter = children.iterator(); + while (childIter.hasNext()) + { + ValidationResultsModel childModel = (ValidationResultsModel)childIter.next(); + messages.addAll(childModel.getMessages(propertyName)); + } + return messages; } public void addValidationListener(ValidationListener listener) { @@ -237,4 +315,31 @@ public String toString() { return new ToStringCreator(this).append("messages", getMessages()).toString(); } + + + /** + * Add a validationResultsModel as a child to this one. + * + * @param validationResultsModel + */ + public void add(ValidationResultsModel validationResultsModel) + { + children.add(validationResultsModel); + validationResultsModel.addValidationListener(this); + } + + /** + * Remove the given validationResultsModel from the list of children. + * + * @param validationResultsModel + */ + public void remove(ValidationResultsModel validationResultsModel) + { + if (children.remove(validationResultsModel)) + validationResultsModel.removeValidationListener(this); + } + + public void validationResultsChanged(ValidationResults results) { + fireValidationResultsChanged(); + } } \ No newline at end of file Modified: trunk/spring-richclient/support/src/main/java/org/springframework/richclient/form/AbstractForm.java =================================================================== --- trunk/spring-richclient/support/src/main/java/org/springframework/richclient/form/AbstractForm.java 2007-05-22 12:52:55 UTC (rev 1755) +++ trunk/spring-richclient/support/src/main/java/org/springframework/richclient/form/AbstractForm.java 2007-05-22 12:56:35 UTC (rev 1756) @@ -19,7 +19,6 @@ import java.beans.PropertyChangeListener; import java.util.ArrayList; import java.util.HashMap; -import java.util.Iterator; import java.util.List; import java.util.Map; @@ -190,12 +189,6 @@ public void addChildForm(Form childForm) { childForms.put( childForm.getId(), childForm ); getFormModel().addChild(childForm.getFormModel()); - Iterator it = validationResultsReporters.iterator(); - while (it.hasNext()) - { - ValidationResultsReporter reporter = (ValidationResultsReporter)it.next(); - childForm.addValidationResultsReporter(reporter.createChild(childForm.getFormModel().getValidationResults())); - } } /** @@ -228,12 +221,6 @@ public void removeChildForm(Form childForm) { getFormModel().removeChild(childForm.getFormModel()); childForms.remove(childForm.getId()); - Iterator it = childForm.getValidationResultsReporters().iterator(); - while (it.hasNext()) - { - ValidationResultsReporter reporter = (ValidationResultsReporter)it.next(); - reporter.removeParent(); - } } /** * Return a child form of this form with the given form id. @@ -646,20 +633,11 @@ * will be constructed and returned. All registered child forms will be attached * to the same <code>guarded</code> and <code>messageReceiver</code> as this form. */ - public ValidationResultsReporter newSingleLineResultsReporter(Guarded guarded, Messagable messageReceiver) { + public ValidationResultsReporter newSingleLineResultsReporter(Messagable messageReceiver) { SimpleValidationResultsReporter reporter = - new SimpleValidationResultsReporter( formModel.getValidationResults(), guarded, messageReceiver ); + new SimpleValidationResultsReporter( formModel.getValidationResults(), messageReceiver ); - // Configure all our child forms with this same data - for( Iterator iter = childForms.values().iterator(); iter.hasNext(); ) { - Form childForm = (Form) iter.next(); - ValidationResultsReporter child = childForm.newSingleLineResultsReporter( guarded, messageReceiver ); - reporter.addChild( child ); - childForm.getFormModel().validate(); // Force an initial validation - } - validationResultsReporters.add(reporter); - return reporter; } @@ -698,4 +676,16 @@ public void reset() { getFormModel().reset(); } + + public void addGuarded(Guarded guarded) { + formGuard.addGuarded(guarded, FormGuard.FORMERROR_GUARDED); + } + + public void addGuarded(Guarded guarded, int mask) { + formGuard.addGuarded(guarded, mask); + } + + public void removeGuarded(Guarded guarded) { + formGuard.removeGuarded(guarded); + } } \ No newline at end of file Modified: trunk/spring-richclient/support/src/test/java/org/springframework/binding/validation/DefaultValidationResultsModelTests.java =================================================================== --- trunk/spring-richclient/support/src/test/java/org/springframework/binding/validation/DefaultValidationResultsModelTests.java 2007-05-22 12:52:55 UTC (rev 1755) +++ trunk/spring-richclient/support/src/test/java/org/springframework/binding/validation/DefaultValidationResultsModelTests.java 2007-05-22 12:56:35 UTC (rev 1756) @@ -18,6 +18,7 @@ import junit.framework.TestCase; import org.springframework.binding.support.TestPropertyChangeListener; +import org.springframework.binding.validation.support.DefaultValidationMessage; import org.springframework.binding.validation.support.DefaultValidationResults; import org.springframework.binding.validation.support.DefaultValidationResultsModel; @@ -141,6 +142,16 @@ assertEquals(3, field1Listener.eventCount()); assertEquals(3, nullListener.eventCount()); } + + public void testMessageCount() { + DefaultValidationResultsModel resultsModel = new DefaultValidationResultsModel(); + resultsModel.addMessage(new DefaultValidationMessage("property1", Severity.ERROR, "message1")); + resultsModel.addMessage(new DefaultValidationMessage("property1", Severity.INFO, "message2")); + resultsModel.addMessage(new DefaultValidationMessage("property2", Severity.ERROR, "message3")); + assertEquals("Number of messages should be 3", 3, resultsModel.getMessageCount()); + assertEquals("Number of messages registered for property1 should be 2", 2, resultsModel.getMessageCount("property1")); + assertEquals("Number of messages flagged as INFO should be 1", 1, resultsModel.getMessageCount(Severity.INFO)); + } private ValidationResults getResults(String field, Severity severity) { DefaultValidationResults vr = new DefaultValidationResults(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. ------------------------------------------------------------------------- This SF.net email is sponsored by DB2 Express Download DB2 Express C - the FREE version of DB2 express and take control of your XML. No limits. Just data. Click to get it now. http://sourceforge.net/powerbar/db2/ _______________________________________________ spring-rich-c-cvs mailing list spring-rich-c-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/spring-rich-c-cvs