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