Author: ivaynberg
Date: Sat Jul 10 23:52:02 2010
New Revision: 962950

URL: http://svn.apache.org/viewvc?rev=962950&view=rev
Log:
forward port IAjaxRegionMarkupIdProvider feature

Added:
    
wicket/trunk/wicket/src/main/java/org/apache/wicket/ajax/IAjaxRegionMarkupIdProvider.java
   (with props)
Modified:
    
wicket/trunk/wicket/src/main/java/org/apache/wicket/ajax/AjaxRequestTarget.java

Modified: 
wicket/trunk/wicket/src/main/java/org/apache/wicket/ajax/AjaxRequestTarget.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/ajax/AjaxRequestTarget.java?rev=962950&r1=962949&r2=962950&view=diff
==============================================================================
--- 
wicket/trunk/wicket/src/main/java/org/apache/wicket/ajax/AjaxRequestTarget.java 
(original)
+++ 
wicket/trunk/wicket/src/main/java/org/apache/wicket/ajax/AjaxRequestTarget.java 
Sat Jul 10 23:52:02 2010
@@ -33,6 +33,8 @@ import org.apache.wicket.Component;
 import org.apache.wicket.MarkupContainer;
 import org.apache.wicket.Page;
 import org.apache.wicket.WicketRuntimeException;
+import org.apache.wicket.ajax.AjaxRequestTarget.IListener;
+import org.apache.wicket.behavior.IBehavior;
 import org.apache.wicket.markup.html.IHeaderResponse;
 import org.apache.wicket.markup.html.internal.HeaderResponse;
 import org.apache.wicket.markup.html.internal.HtmlHeaderContainer;
@@ -678,11 +680,35 @@ public class AjaxRequestTarget implement
 
                        if (!containsAncestorFor(component))
                        {
-                               respondComponent(response, markupId, component);
+                               respondComponent(response, 
getAjaxRegionMarkupId(component), component);
                        }
                }
        }
 
+       private String getAjaxRegionMarkupId(Component component)
+       {
+               String markupId = null;
+               for (IBehavior behavior : component.getBehaviors())
+               {
+                       if (behavior instanceof IAjaxRegionMarkupIdProvider)
+                       {
+                               markupId = 
((IAjaxRegionMarkupIdProvider)behavior).getAjaxRegionMarkupId(component);
+                       }
+               }
+               if (markupId == null)
+               {
+                       if (component instanceof IAjaxRegionMarkupIdProvider)
+                       {
+                               markupId = 
((IAjaxRegionMarkupIdProvider)component).getAjaxRegionMarkupId(component);
+                       }
+               }
+               if (markupId == null)
+               {
+                       markupId = component.getMarkupId();
+               }
+               return markupId;
+       }
+
        /**
         * Checks if the target contains an ancestor for the given component
         * 

Added: 
wicket/trunk/wicket/src/main/java/org/apache/wicket/ajax/IAjaxRegionMarkupIdProvider.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/ajax/IAjaxRegionMarkupIdProvider.java?rev=962950&view=auto
==============================================================================
--- 
wicket/trunk/wicket/src/main/java/org/apache/wicket/ajax/IAjaxRegionMarkupIdProvider.java
 (added)
+++ 
wicket/trunk/wicket/src/main/java/org/apache/wicket/ajax/IAjaxRegionMarkupIdProvider.java
 Sat Jul 10 23:52:02 2010
@@ -0,0 +1,97 @@
+/*
+ * 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.ajax;
+
+import org.apache.wicket.Component;
+import org.apache.wicket.markup.html.form.TextField;
+
+/**
+ * A mixin that allows behaviors and components to override the id of the 
markup region that will be
+ * updated via ajax. If this mixin is not used then {...@link 
Component#getMarkupId()} is used.
+ * <p>
+ * This mixin is useful when behaviors write directly to the response. Lets 
examine a simple
+ * behavior that wraps the component in a paragraph tag:
+ * 
+ * <pre>
+ * class PB extends AbstractBehavior
+ * {
+ *     public void onBeforeRender(Component c)
+ *     {
+ *             c.getResponse().write(&quot;&lt;p&gt;&quot;);
+ *     }
+ * 
+ *     public void onComponentRendered(Component c)
+ *     {
+ *             c.getResponse().write(&quot;&lt;/p&gt;&quot;);
+ *     }
+ * }
+ * </pre>
+ * 
+ * If we add this behavior to a {...@link TextField} the generated markup will 
be:
+ * 
+ * <pre>
+ * &lt;p&gt;&lt;input wicket:id="name" type="text"&gt;&lt;/p&gt;
+ * </pre>
+ * 
+ * If we then update this {...@link TextField} via ajax the generated markup 
will erroneously be:
+ * 
+ * <pre>
+ * &lt;p&gt;&lt;p&gt;&lt;input wicket:id="name" 
type="text"&gt;&lt;/p&gt;&lt;/p&gt;
+ * </pre>
+ * 
+ * Notice the doubling of the {...@code <p>} tags. This is happening because 
every ajax render the
+ * input field is replaced with the markup that contains the input field 
surrounded by paragraph
+ * tags.
+ * 
+ * To fix this we can modify our behavior as follows:
+ * 
+ * <pre>
+ * class PB extends AbstractBehavior implements IAjaxRegionMarkupIdProvider
+ * {
+ *     public void onBeforeRender(Component c)
+ *     {
+ *             c.getResponse().write(&quot;&lt;p id='&quot; + c.getMarkupId() 
+ &quot;_p'&gt;&quot;);
+ *     }
+ * 
+ *     public void onComponentRendered(Component c)
+ *     {
+ *             c.getResponse().write(&quot;&lt;/p&gt;&quot;);
+ *     }
+ * 
+ *     public String getAjaxRegionMarkupId(Component component)
+ *     {
+ *             return component.getMarkupId() + &quot;_p&quot;;
+ *     }
+ * }
+ * </pre>
+ * 
+ * Now, the ajax update will properly replace the markup region that includes 
the paragraph tags
+ * with the generated markup.
+ * 
+ * </p>
+ * <p>
+ * In the rare case that {...@link Component} needs to implement this 
interface the {...@code component}
+ * argument of the {...@link #getAjaxRegionMarkupId(Component)} method can be 
safely ignored because it
+ * will be the component itself.
+ * </p>
+ * 
+ * @author Igor Vaynberg (ivaynberg)
+ */
+public interface IAjaxRegionMarkupIdProvider
+{
+       String getAjaxRegionMarkupId(Component component);
+}

Propchange: 
wicket/trunk/wicket/src/main/java/org/apache/wicket/ajax/IAjaxRegionMarkupIdProvider.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain


Reply via email to