Author: ivaynberg Date: Fri Sep 26 19:30:43 2008 New Revision: 699544 URL: http://svn.apache.org/viewvc?rev=699544&view=rev Log: WIKCET-1853
Added: wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/form/IFormModelUpdateListener.java (with props) Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/form/Form.java wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/form/FormComponent.java Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/form/Form.java URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/form/Form.java?rev=699544&r1=699543&r2=699544&view=diff ============================================================================== --- wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/form/Form.java (original) +++ wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/form/Form.java Fri Sep 26 19:30:43 2008 @@ -185,6 +185,52 @@ public abstract void validate(FormComponent<?> formComponent); } + + /** + * Visitor used to update component models + * + * @author Igor Vaynberg (ivaynberg) + */ + private static class FormModelUpdateVisitor implements Component.IVisitor<Component> + { + private final Form<?> formFilter; + + /** + * Constructor + * + * @param formFilter + */ + public FormModelUpdateVisitor(Form<?> formFilter) + { + this.formFilter = formFilter; + } + + /** [EMAIL PROTECTED] */ + public Object component(Component component) + { + if (component instanceof IFormModelUpdateListener) + { + final Form<?> form = Form.findForm(component); + if (form != null) + { + if (this.formFilter == null || this.formFilter == form) + { + if (form.isEnabled() && form.isEnableAllowed()) + { + if (component.isEnabled() && component.isEnableAllowed() && + component.isVisibleInHierarchy()) + { + ((IFormModelUpdateListener)component).updateModel(); + } + } + } + } + } + return Component.IVisitor.CONTINUE_TRAVERSAL; + } + } + + /** * */ @@ -1871,19 +1917,22 @@ */ private void internalUpdateFormComponentModels() { - visitFormComponentsPostOrder(new ValidationVisitor() + FormComponent.visitComponentsPostOrder(this, new FormModelUpdateVisitor(this)); + + MarkupContainer border = findParent(Border.class); + if (border != null) { - @Override - public void validate(FormComponent<?> formComponent) + Iterator<? extends Component> iter = border.iterator(); + Component.IVisitor<Component> visitor = new FormModelUpdateVisitor(null); + while (iter.hasNext()) { - Form<?> form = formComponent.getForm(); - if (form == Form.this) + Component child = iter.next(); + if (child instanceof IFormModelUpdateListener) { - // Potentially update the model - formComponent.updateModel(); + visitor.component(child); } } - }); + } } /** @@ -2110,5 +2159,36 @@ setDefaultModelObject(object); } + /** + * @param component + * @return The parent form for component + */ + public static Form<?> findForm(Component component) + { + class FindFormVisitor implements Component.IVisitor<Form<?>> + { + Form<?> form = null; + + public Object component(Form<?> component) + { + form = component; + return Component.IVisitor.STOP_TRAVERSAL; + } + } + + Form<?> form = component.findParent(Form.class); + if (form == null) + { + // check whether the form is a child of a surrounding border + final Border border = component.findParent(Border.class); + if (border != null) + { + FindFormVisitor formVisitor = new FindFormVisitor(); + border.visitChildren(Form.class, formVisitor); + form = formVisitor.form; + } + } + return form; + } } Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/form/FormComponent.java URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/form/FormComponent.java?rev=699544&r1=699543&r2=699544&view=diff ============================================================================== --- wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/form/FormComponent.java (original) +++ wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/form/FormComponent.java Fri Sep 26 19:30:43 2008 @@ -35,7 +35,6 @@ import org.apache.wicket.Page; import org.apache.wicket.WicketRuntimeException; import org.apache.wicket.markup.ComponentTag; -import org.apache.wicket.markup.html.border.Border; import org.apache.wicket.model.IModel; import org.apache.wicket.model.IPropertyReflectionAwareModel; import org.apache.wicket.util.convert.ConversionException; @@ -92,7 +91,8 @@ */ public abstract class FormComponent<T> extends LabeledWebMarkupContainer implements - IFormVisitorParticipant + IFormVisitorParticipant, + IFormModelUpdateListener { private static final Logger logger = LoggerFactory.getLogger(FormComponent.class); @@ -430,6 +430,72 @@ return null; } + /** + * Visits any form components inside component if it is a container, or component itself if it + * is itself a form component + * + * @param component + * starting point of the traversal + * + * @param visitor + * The visitor to call + */ + public static final void visitComponentsPostOrder(Component component, + final Component.IVisitor<Component> visitor) + { + if (visitor == null) + { + throw new IllegalArgumentException("Argument `visitor` cannot be null"); + } + + visitComponentsPostOrderHelper(component, visitor); + } + + + private static final Object visitComponentsPostOrderHelper(Component component, + final Component.IVisitor<Component> visitor) + { + if (component instanceof MarkupContainer) + { + final MarkupContainer container = (MarkupContainer)component; + if (container.size() > 0) + { + boolean visitChildren = true; + if (container instanceof IFormVisitorParticipant) + { + visitChildren = ((IFormVisitorParticipant)container).processChildren(); + } + if (visitChildren) + { + final Iterator<? extends Component> children = container.iterator(); + while (children.hasNext()) + { + final Component child = children.next(); + Object value = visitComponentsPostOrderHelper(child, visitor); + if (value == Component.IVisitor.STOP_TRAVERSAL) + { + return value; + } + else if (value == Component.IVisitor.CONTINUE_TRAVERSAL) + { + // noop + } + else if (value == Component.IVisitor.CONTINUE_TRAVERSAL_BUT_DONT_GO_DEEPER) + { + // noop + } + else + { + return value; + } + } + } + } + } + return visitor.component(component); + } + + private transient T convertedInput; /** @@ -646,36 +712,15 @@ */ public Form<?> getForm() { - class FindFormVisitor implements Component.IVisitor<Form<?>> - { - Form<?> form = null; - - public Object component(Form<?> component) - { - form = component; - return Component.IVisitor.STOP_TRAVERSAL; - } - } - - Form<?> form = findParent(Form.class); + Form<?> form = Form.findForm(this); if (form == null) { - // check whether the form is a child of a surrounding border - final Border border = findParent(Border.class); - if (border != null) - { - FindFormVisitor formVisitor = new FindFormVisitor(); - border.visitChildren(Form.class, formVisitor); - form = formVisitor.form; - } - if (form == null) - { - throw new WicketRuntimeException("Could not find Form parent for " + this); - } + throw new WicketRuntimeException("Could not find Form parent for " + this); } return form; } + /** * Gets the request parameter for this component as a string. * Added: wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/form/IFormModelUpdateListener.java URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/form/IFormModelUpdateListener.java?rev=699544&view=auto ============================================================================== --- wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/form/IFormModelUpdateListener.java (added) +++ wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/form/IFormModelUpdateListener.java Fri Sep 26 19:30:43 2008 @@ -0,0 +1,31 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.wicket.markup.html.form; + +/** + * A component that listens to form model updates. Form model updates happen after all validation + * has passed and form components are ready to commit their values into their models. + * + * @author ivaynberg + */ +public interface IFormModelUpdateListener +{ + /** + * Called when the component should update its model + */ + void updateModel(); +} Propchange: wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/form/IFormModelUpdateListener.java ------------------------------------------------------------------------------ svn:mime-type = text/plain