Author: knopp
Date: Tue Dec 26 08:45:35 2006
New Revision: 490326

URL: http://svn.apache.org/viewvc?view=rev&rev=490326
Log:
Attach component on ajax render

Modified:
    
incubator/wicket/branches/wicket-1.x/wicket/src/main/java/wicket/ajax/AjaxRequestTarget.java
    
incubator/wicket/branches/wicket-1.x/wicket/src/main/java/wicket/protocol/http/portlet/PortletRenderResponseStrategy.java
    
incubator/wicket/branches/wicket-1.x/wicket/src/main/java/wicket/request/target/component/ComponentRequestTarget.java

Modified: 
incubator/wicket/branches/wicket-1.x/wicket/src/main/java/wicket/ajax/AjaxRequestTarget.java
URL: 
http://svn.apache.org/viewvc/incubator/wicket/branches/wicket-1.x/wicket/src/main/java/wicket/ajax/AjaxRequestTarget.java?view=diff&rev=490326&r1=490325&r2=490326
==============================================================================
--- 
incubator/wicket/branches/wicket-1.x/wicket/src/main/java/wicket/ajax/AjaxRequestTarget.java
 (original)
+++ 
incubator/wicket/branches/wicket-1.x/wicket/src/main/java/wicket/ajax/AjaxRequestTarget.java
 Tue Dec 26 08:45:35 2006
@@ -34,6 +34,8 @@
 import wicket.Page;
 import wicket.RequestCycle;
 import wicket.Response;
+import wicket.Component.IVisitor;
+import wicket.feedback.IFeedback;
 import wicket.markup.html.internal.HtmlHeaderContainer;
 import wicket.markup.parser.filter.HtmlHeaderSectionHandler;
 import wicket.protocol.http.WebResponse;
@@ -361,15 +363,8 @@
                                respondInvocation(response, js);
                        }
 
-                       it = markupIdToComponent.entrySet().iterator();
-                       while (it.hasNext())
-                       {
-                               final Map.Entry entry = (Entry)it.next();
-                               final Component component = 
(Component)entry.getValue();
-                               final String markupId = (String)entry.getKey();
-
-                               respondComponent(response, markupId, component);
-                       }
+                       // process added components
+                       respondComponents(response);
 
                        it = appendJavascripts.iterator();
                        while (it.hasNext())
@@ -390,6 +385,80 @@
                }
        }
 
+        
+       /**
+        * Processes components added to the target. This involves attaching
+        * components, rendering markup into a client side xml envelope, and
+        * detaching them
+        *
+        * @param response
+        */
+       private void respondComponents(WebResponse response)
+       {
+               Iterator it;
+
+               try
+               {
+                       // process feedback
+                       it = markupIdToComponent.entrySet().iterator();
+                       while (it.hasNext())
+                       {
+                               final Component component = 
(Component)((Entry)it.next()).getValue();
+                               if (component instanceof MarkupContainer)
+                               {
+                                       MarkupContainer container = 
(MarkupContainer)component;
+
+                                       // collect feedback
+                                       
container.visitChildren(IFeedback.class, new IVisitor()
+                                       {
+                                               public Object 
component(Component component)
+                                               {
+                                                       
((IFeedback)component).updateFeedback();
+                                                       return 
IVisitor.CONTINUE_TRAVERSAL;
+                                               }
+                                       });
+                               }
+
+                               if (component instanceof IFeedback)
+                               {
+                                       ((IFeedback)component).updateFeedback();
+                               }
+                       }
+
+                       // attach components
+                       it = markupIdToComponent.entrySet().iterator();
+                       while (it.hasNext())
+                       {
+                               final Component component = 
(Component)((Entry)it.next()).getValue();
+                               component.internalAttach();
+                       }
+
+                       // process component markup
+                       it = markupIdToComponent.entrySet().iterator();
+                       while (it.hasNext())
+                       {
+                               final Map.Entry entry = (Entry)it.next();
+                               final Component component = 
(Component)entry.getValue();
+                               final String markupId = (String)entry.getKey();
+
+                               respondComponent(response, markupId, component);
+                       }
+
+               }
+               finally
+               {
+                       // detach
+                       it = markupIdToComponent.entrySet().iterator();
+                       while (it.hasNext())
+                       {
+                               final Component component = 
(Component)((Entry)it.next()).getValue();
+                               component.getPage().internalDetach();
+                               // we are done since we detached the page
+                               break;
+                       }
+               }
+       }
+       
        /**
         * @see java.lang.Object#toString()
         */

Modified: 
incubator/wicket/branches/wicket-1.x/wicket/src/main/java/wicket/protocol/http/portlet/PortletRenderResponseStrategy.java
URL: 
http://svn.apache.org/viewvc/incubator/wicket/branches/wicket-1.x/wicket/src/main/java/wicket/protocol/http/portlet/PortletRenderResponseStrategy.java?view=diff&rev=490326&r1=490325&r2=490326
==============================================================================
--- 
incubator/wicket/branches/wicket-1.x/wicket/src/main/java/wicket/protocol/http/portlet/PortletRenderResponseStrategy.java
 (original)
+++ 
incubator/wicket/branches/wicket-1.x/wicket/src/main/java/wicket/protocol/http/portlet/PortletRenderResponseStrategy.java
 Tue Dec 26 08:45:35 2006
@@ -25,16 +25,18 @@
 import wicket.Page;
 import wicket.RequestCycle;
 import wicket.Response;
+import wicket.Component.IVisitor;
+import wicket.feedback.IFeedback;
 import wicket.markup.html.internal.HtmlHeaderContainer;
 import wicket.markup.parser.filter.HtmlHeaderSectionHandler;
 import wicket.request.compound.IResponseStrategy;
 import wicket.request.target.component.PageRequestTarget;
 
 /**
- * Portlet render ResponseStrategy handles outputting of the header 
contributions 
- * into the response. 
+ * Portlet render ResponseStrategy handles outputting of the header
+ * contributions into the response.
  * 
- * Portlets do not support real header contribution. 
+ * Portlets do not support real header contribution.
  * 
  * @author Janne Hietamäki
  */
@@ -50,23 +52,24 @@
                if (requestTarget != null)
                {
                        Application.get().logResponseTarget(requestTarget);
-                       respondHeaderContribution(requestCycle,requestTarget);
+                       respondHeaderContribution(requestCycle, requestTarget);
                        requestTarget.respond(requestCycle);
                }
        }
 
-       private void respondHeaderContribution(final RequestCycle 
requestCycle,final IRequestTarget requestTarget)
+       private void respondHeaderContribution(final RequestCycle requestCycle,
+                       final IRequestTarget requestTarget)
        {
-               if(requestTarget instanceof PageRequestTarget)
+               if (requestTarget instanceof PageRequestTarget)
                {
-                       final PageRequestTarget 
target=(PageRequestTarget)requestTarget;
+                       final PageRequestTarget target = 
(PageRequestTarget)requestTarget;
                        final Response response = 
RequestCycle.get().getResponse();
-                       final Page page=target.getPage();
+                       final Page page = target.getPage();
 
                        final HtmlHeaderContainer header = new 
HtmlHeaderContainer(
                                        HtmlHeaderSectionHandler.HEADER_ID);
 
-                       if(page.get(HtmlHeaderSectionHandler.HEADER_ID) != null)
+                       if (page.get(HtmlHeaderSectionHandler.HEADER_ID) != 
null)
                        {
                                page.replace(header);
                        }
@@ -92,16 +95,42 @@
                        });
 
 
-                       header.visitChildren(new Component.IVisitor()
+                       // collect feedback, is this really necessary for a 
header
+                       // container?
+                       header.visitChildren(IFeedback.class, new IVisitor()
                        {
                                public Object component(Component component)
                                {
-                                       page.startComponentRender(component);
-                                       component.renderComponent();
-                                       page.endComponentRender(component);
-                                       return CONTINUE_TRAVERSAL;
+                                       ((IFeedback)component).updateFeedback();
+                                       return IVisitor.CONTINUE_TRAVERSAL;
                                }
                        });
+
+                       if (header instanceof IFeedback)
+                       {
+                               ((IFeedback)header).updateFeedback();
+                       }
+
+                       header.internalAttach();
+
+                       try
+                       {
+                               header.visitChildren(new Component.IVisitor()
+                               {
+                                       public Object component(Component 
component)
+                                       {
+                                               
page.startComponentRender(component);
+                                               component.renderComponent();
+                                               
page.endComponentRender(component);
+                                               return CONTINUE_TRAVERSAL;
+                                       }
+                               });
+                       }
+                       finally
+                       {
+                               header.internalDetach();
+                       }
+
                        page.remove(header);
                }
        }

Modified: 
incubator/wicket/branches/wicket-1.x/wicket/src/main/java/wicket/request/target/component/ComponentRequestTarget.java
URL: 
http://svn.apache.org/viewvc/incubator/wicket/branches/wicket-1.x/wicket/src/main/java/wicket/request/target/component/ComponentRequestTarget.java?view=diff&rev=490326&r1=490325&r2=490326
==============================================================================
--- 
incubator/wicket/branches/wicket-1.x/wicket/src/main/java/wicket/request/target/component/ComponentRequestTarget.java
 (original)
+++ 
incubator/wicket/branches/wicket-1.x/wicket/src/main/java/wicket/request/target/component/ComponentRequestTarget.java
 Tue Dec 26 08:45:35 2006
@@ -17,8 +17,11 @@
 package wicket.request.target.component;
 
 import wicket.Component;
+import wicket.MarkupContainer;
 import wicket.Page;
 import wicket.RequestCycle;
+import wicket.Component.IVisitor;
+import wicket.feedback.IFeedback;
 
 /**
  * Default implementation of [EMAIL PROTECTED] 
wicket.request.target.component.IComponentRequestTarget}.
@@ -68,7 +71,38 @@
                else
                {
                        // Render the component
-                       component.renderComponent();
+                       try
+                       {
+                               // collect feedback
+                               if (component instanceof MarkupContainer)
+                               {
+                                       MarkupContainer container = 
(MarkupContainer)component;
+
+                                       
container.visitChildren(IFeedback.class, new IVisitor()
+                                       {
+                                               public Object 
component(Component component)
+                                               {
+                                                       
((IFeedback)component).updateFeedback();
+                                                       return 
IVisitor.CONTINUE_TRAVERSAL;
+                                               }
+                                       });
+                               }
+
+                               if (component instanceof IFeedback)
+                               {
+                                       ((IFeedback)component).updateFeedback();
+                               }
+
+                               // attach
+                               component.internalAttach();
+
+                               // Render the component
+                               component.renderComponent();
+                       }
+                       finally
+                       {
+                               component.getPage().internalDetach();
+                       }
                }
 
                if (page != null)


Reply via email to