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


Reply via email to