Author: knopp
Date: Sat Mar  3 07:13:48 2007
New Revision: 514168

URL: http://svn.apache.org/viewvc?view=rev&rev=514168
Log:
Refactor to fix problem when AbstractAjaxTimerBehavior is added to component, 
that is not rendered during the ajax update.

Modified:
    
incubator/wicket/branches/wicket-1.x/wicket/src/main/java/wicket/ajax/AbstractAjaxTimerBehavior.java
    
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/markup/html/internal/HeaderResponse.java
    
incubator/wicket/branches/wicket-1.x/wicket/src/main/java/wicket/markup/html/internal/HtmlHeaderContainer.java
    
incubator/wicket/branches/wicket-1.x/wicket/src/test/java/wicket/ajax/markup/html/componentMap/SimpleTestPageExpectedResult-1.html

Modified: 
incubator/wicket/branches/wicket-1.x/wicket/src/main/java/wicket/ajax/AbstractAjaxTimerBehavior.java
URL: 
http://svn.apache.org/viewvc/incubator/wicket/branches/wicket-1.x/wicket/src/main/java/wicket/ajax/AbstractAjaxTimerBehavior.java?view=diff&rev=514168&r1=514167&r2=514168
==============================================================================
--- 
incubator/wicket/branches/wicket-1.x/wicket/src/main/java/wicket/ajax/AbstractAjaxTimerBehavior.java
 (original)
+++ 
incubator/wicket/branches/wicket-1.x/wicket/src/main/java/wicket/ajax/AbstractAjaxTimerBehavior.java
 Sat Mar  3 07:13:48 2007
@@ -16,7 +16,6 @@
  */
 package wicket.ajax;
 
-import wicket.RequestCycle;
 import wicket.markup.html.IHeaderResponse;
 import wicket.util.time.Duration;
 
@@ -61,16 +60,9 @@
        {
                super.renderHead(response);
 
-
                if (!stopped)
                {
-                       if (RequestCycle.get().getRequestTarget() instanceof 
AjaxRequestTarget) {
-                               
response.renderJavascript(getJsTimeoutCall(updateInterval), null);
-                       }
-                       else
-                       {
-                               
response.renderOnLoadJavascript(getJsTimeoutCall(updateInterval));
-                       }
+                       
response.renderOnLoadJavascript(getJsTimeoutCall(updateInterval));
                }
        }
 
@@ -93,6 +85,11 @@
        protected final void respond(final AjaxRequestTarget target)
        {
                onTimer(target);
+               
+               if (!stopped)
+               {
+                       
target.getHeaderResponse().renderOnLoadJavascript(getJsTimeoutCall(updateInterval));
+               }
        }
 
        /**

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=514168&r1=514167&r2=514168
==============================================================================
--- 
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
 Sat Mar  3 07:13:48 2007
@@ -18,6 +18,7 @@
 
 import java.io.OutputStream;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.Iterator;
 import java.util.LinkedHashMap;
@@ -35,7 +36,9 @@
 import wicket.MarkupContainer;
 import wicket.Page;
 import wicket.RequestCycle;
+import wicket.ResourceReference;
 import wicket.Response;
+import wicket.WicketRuntimeException;
 import wicket.Component.IVisitor;
 import wicket.feedback.IFeedback;
 import wicket.markup.html.IHeaderResponse;
@@ -341,11 +344,11 @@
        }
 
        /**
-        * Sets the focus in the browser to the given component.
-        * The markup id must be set.
+        * Sets the focus in the browser to the given component. The markup id 
must
+        * be set.
         * 
         * @param component
-        *                      The component to get the focus.         
+        *            The component to get the focus.
         */
        public final void focusComponent(Component component)
        {
@@ -361,7 +364,7 @@
                }
                appendJavascript("Wicket.Focus.setFocusOnId('" + 
component.getMarkupId() + "');");
        }
-       
+
 
        /**
         * Adds javascript that will be evaluated on the client side after
@@ -720,37 +723,136 @@
                encodingBodyResponse.reset();
        }
 
+       /**
+        * Header response for an ajax request.
+        * 
+        * @author Matej Knopp
+        */
        private class AjaxHeaderResponse extends HeaderResponse
        {
 
                private static final long serialVersionUID = 1L;
 
+               private void checkHeaderRendering()
+               {
+                       if (headerRendering == false)
+                       {
+                               throw new WicketRuntimeException(
+                                               "Only methods that can be 
called on IHeaderResponse outside renderHead() are renderOnLoadJavascript and 
renderOnDomReadyJavascript");
+                       }
+               }
+
+               public void renderCSSReference(ResourceReference reference, 
String media)
+               {
+                       checkHeaderRendering();
+                       super.renderCSSReference(reference, media);
+               }
+
+               public void renderCSSReference(String url)
+               {
+                       checkHeaderRendering();
+                       super.renderCSSReference(url);
+               }
+
+               public void renderCSSReference(String url, String media)
+               {
+                       checkHeaderRendering();
+                       super.renderCSSReference(url, media);
+               }
+
+               public void renderJavascript(CharSequence javascript, String id)
+               {
+                       checkHeaderRendering();
+                       super.renderJavascript(javascript, id);
+               }
+
+               public void renderCSSReference(ResourceReference reference)
+               {
+                       checkHeaderRendering();
+                       super.renderCSSReference(reference);
+               }
+
+               public void renderJavascriptReference(ResourceReference 
reference)
+               {
+                       checkHeaderRendering();
+                       super.renderJavascriptReference(reference);
+               }
+
+               public void renderJavascriptReference(String url)
+               {
+                       checkHeaderRendering();
+                       super.renderJavascriptReference(url);
+               }
+
+               public void renderString(CharSequence string)
+               {
+                       checkHeaderRendering();
+                       super.renderString(string);
+               }
+
                /**
                 * Construct.
                 * 
                 * @param response
                 */
-               public AjaxHeaderResponse(Response response)
+               public AjaxHeaderResponse()
                {
-                       super(response);
+
                }
 
                public void renderOnDomReadyJavascript(String javascript)
                {
-                       // execute the javascript as first javascript after 
component
-                       // replacement
-                       appendJavascripts.add(0, javascript);
+                       List token = Arrays.asList(new Object[] { 
"javascript-event", "domready", javascript });
+                       if (wasRendered(token) == false)
+                       {
+                               // execute the javascript as first javascript 
after component
+                               // replacement
+                               appendJavascripts.add(0, javascript);
+                               markRendered(token);
+                       }
                }
 
                public void renderOnLoadJavascript(String javascript)
                {
-                       // execute the javascript after all other scripts are 
executed
-                       appendJavascripts.add(javascript);
+                       List token = Arrays.asList(new Object[] { 
"javascript-event", "load", javascript });
+                       if (wasRendered(token) == false)
+                       {
+                               // execute the javascript after all other 
scripts are executed
+                               appendJavascripts.add(javascript);
+                               markRendered(token);
+                       }
+               }
+
+               public Response getResponse()
+               {
+                       return RequestCycle.get().getResponse();
                }
        };
 
+       // whether a header contribution is being rendered
+       private boolean headerRendering = false;
        private HtmlHeaderContainer header = null;
 
+       private IHeaderResponse headerResponse;
+
+       /**
+        * Returns the header response associated with current 
AjaxRequestTarget.
+        * 
+        * Beware that only renderOnDomReadyJavascript and 
renderOnLoadJavascript
+        * can be called outside the renderHeader(IHeaderResponse response) 
method.
+        * Calls to other render** methods will result in an exception being 
thrown.
+        * 
+        * @return header response
+        */
+       public IHeaderResponse getHeaderResponse()
+       {
+               if (headerResponse == null)
+               {
+                       headerResponse = new AjaxHeaderResponse();
+               }
+               return headerResponse;
+       }
+
        /**
         * 
         * @param response
@@ -758,19 +860,24 @@
         */
        private void respondHeaderContribution(final Response response, final 
Component component)
        {
+               headerRendering = true;
+
+               // create the htmlheadercontainer if needed
                if (header == null)
                {
                        header = new 
HtmlHeaderContainer(HtmlHeaderSectionHandler.HEADER_ID)
                        {
                                private static final long serialVersionUID = 1L;
 
-                               protected IHeaderResponse 
newHeaderResponse(Response response)
+                               protected IHeaderResponse newHeaderResponse()
                                {
-                                       return new AjaxHeaderResponse(response);
+                                       return 
AjaxRequestTarget.this.getHeaderResponse();
                                }
                        };
                }
 
+               // add or replace the container to page
+               
                if (component.getPage().get(HtmlHeaderSectionHandler.HEADER_ID) 
!= null)
                {
                        component.getPage().replace(header);
@@ -780,10 +887,13 @@
                        component.getPage().add(header);
                }
 
+               // save old response, set new 
                Response oldResponse = 
RequestCycle.get().setResponse(encodingHeaderResponse);
 
                encodingHeaderResponse.reset();
 
+               // render the head of component and all it's children
+               
                component.renderHead(header);
 
                if (component instanceof MarkupContainer)
@@ -805,6 +915,8 @@
                        });
                }
 
+               // revert to old response
+               
                RequestCycle.get().setResponse(oldResponse);
 
                if (encodingHeaderResponse.getContents().length() != 0)
@@ -829,6 +941,8 @@
 
                        response.write("</header-contribution>");
                }
+
+               headerRendering = false;
        }
 
        /**

Modified: 
incubator/wicket/branches/wicket-1.x/wicket/src/main/java/wicket/markup/html/internal/HeaderResponse.java
URL: 
http://svn.apache.org/viewvc/incubator/wicket/branches/wicket-1.x/wicket/src/main/java/wicket/markup/html/internal/HeaderResponse.java?view=diff&rev=514168&r1=514167&r2=514168
==============================================================================
--- 
incubator/wicket/branches/wicket-1.x/wicket/src/main/java/wicket/markup/html/internal/HeaderResponse.java
 (original)
+++ 
incubator/wicket/branches/wicket-1.x/wicket/src/main/java/wicket/markup/html/internal/HeaderResponse.java
 Sat Mar  3 07:13:48 2007
@@ -23,7 +23,6 @@
 
 import wicket.RequestCycle;
 import wicket.ResourceReference;
-import wicket.Response;
 import wicket.markup.html.IHeaderResponse;
 import wicket.markup.html.WicketEventReference;
 import wicket.util.string.JavascriptUtils;
@@ -34,12 +33,10 @@
  * @author Matej Knopp
  * @author Igor Vaynberg (ivaynberg)
  */
-public class HeaderResponse implements IHeaderResponse
+public abstract class HeaderResponse implements IHeaderResponse
 {
        private static final long serialVersionUID = 1L;
 
-       private final Response response;
-
        private final Set rendered = new HashSet();
 
        /**
@@ -48,9 +45,9 @@
         * @param response
         *            response used to write the head elements
         */
-       public HeaderResponse(Response response)
+       public HeaderResponse()
        {
-               this.response = response;
+               
        }
 
        /**
@@ -64,7 +61,7 @@
        /**
         * @see 
wicket.markup.html.IHeaderResponse#renderCSSReference(wicket.markup.html.ResourceReference)
         */
-       public final void renderCSSReference(ResourceReference reference)
+       public void renderCSSReference(ResourceReference reference)
        {
                CharSequence url = RequestCycle.get().urlFor(reference);
                renderCSSReference(url.toString(), null);
@@ -97,16 +94,16 @@
                List token = Arrays.asList(new Object[] { "css", url, media });
                if (wasRendered(token) == false)
                {
-                       response.write("<link rel=\"stylesheet\" 
type=\"text/css\" href=\"");
-                       response.write(url);
-                       response.write("\"");
+                       getResponse().write("<link rel=\"stylesheet\" 
type=\"text/css\" href=\"");
+                       getResponse().write(url);
+                       getResponse().write("\"");
                        if (media != null)
                        {
-                               response.write(" media=\"");
-                               response.write(media);
-                               response.write("\"");
+                               getResponse().write(" media=\"");
+                               getResponse().write(media);
+                               getResponse().write("\"");
                        }
-                       response.println(" />");
+                       getResponse().println(" />");
                        markRendered(token);
                }
        }
@@ -114,7 +111,7 @@
        /**
         * @see 
wicket.markup.html.IHeaderResponse#renderJavascriptReference(wicket.markup.html.ResourceReference)
         */
-       public final void renderJavascriptReference(ResourceReference reference)
+       public void renderJavascriptReference(ResourceReference reference)
        {
                CharSequence url = RequestCycle.get().urlFor(reference);
                renderJavascriptReference(url.toString());
@@ -123,7 +120,7 @@
        /**
         * @see 
wicket.markup.html.IHeaderResponse#renderJavascriptReference(java.lang.String)
         */
-       public final void renderJavascriptReference(String url)
+       public void renderJavascriptReference(String url)
        {
                List token = Arrays.asList(new Object[] { "javascript", url });
                if (wasRendered(token) == false)
@@ -151,7 +148,7 @@
        /**
         * @see 
wicket.markup.html.IHeaderResponse#renderString(java.lang.CharSequence)
         */
-       public final void renderString(CharSequence string)
+       public void renderString(CharSequence string)
        {
                String token = string.toString();
                if (wasRendered(token) == false)
@@ -170,21 +167,18 @@
        }
 
        /**
-        * @see wicket.markup.html.IHeaderResponse#getResponse()
-        */
-       public final Response getResponse()
-       {
-               return response;
-       }
-
-       /**
         * @see 
wicket.markup.html.IHeaderResponse#renderOnDomReadyJavascript(java.lang.String)
         */
        public void renderOnDomReadyJavascript(String javascript)
        {
-               renderJavascriptReference(WicketEventReference.INSTANCE);
-               JavascriptUtils.writeJavascript(getResponse(),
-                               "Wicket.Event.add(window, \"domready\", 
function() { " + javascript + ";});");
+               List token = Arrays.asList(new Object[] { "javascript-event", 
"domready", javascript });
+               if (wasRendered(token) == false)
+               {
+                       
renderJavascriptReference(WicketEventReference.INSTANCE);
+                       JavascriptUtils.writeJavascript(getResponse(),
+                                       "Wicket.Event.add(window, \"domready\", 
function() { " + javascript + ";});");
+                       markRendered(token);
+               }
        }
 
        /**
@@ -192,8 +186,14 @@
         */
        public void renderOnLoadJavascript(String javascript)
        {
-               renderJavascriptReference(WicketEventReference.INSTANCE);
-               JavascriptUtils.writeJavascript(getResponse(),
-                               "Wicket.Event.add(window, \"load\", function() 
{ " + javascript + ";});");
+               List token = Arrays.asList(new Object[] { "javascript-event", 
"load", javascript });
+               if (wasRendered(token) == false)
+               {
+                       
renderJavascriptReference(WicketEventReference.INSTANCE);
+                       JavascriptUtils.writeJavascript(getResponse(),
+                                       "Wicket.Event.add(window, \"load\", 
function() { " + javascript + ";});");
+                       markRendered(token);
+               }
        }
+
 }

Modified: 
incubator/wicket/branches/wicket-1.x/wicket/src/main/java/wicket/markup/html/internal/HtmlHeaderContainer.java
URL: 
http://svn.apache.org/viewvc/incubator/wicket/branches/wicket-1.x/wicket/src/main/java/wicket/markup/html/internal/HtmlHeaderContainer.java?view=diff&rev=514168&r1=514167&r2=514168
==============================================================================
--- 
incubator/wicket/branches/wicket-1.x/wicket/src/main/java/wicket/markup/html/internal/HtmlHeaderContainer.java
 (original)
+++ 
incubator/wicket/branches/wicket-1.x/wicket/src/main/java/wicket/markup/html/internal/HtmlHeaderContainer.java
 Sat Mar  3 07:13:48 2007
@@ -297,9 +297,14 @@
         * @param response
         * @return new header response
         */
-       protected IHeaderResponse newHeaderResponse(Response response)
+       protected IHeaderResponse newHeaderResponse()
        {
-               return new HeaderResponse(response);
+               return new HeaderResponse() {
+                       public Response getResponse()
+                       {
+                               return HtmlHeaderContainer.this.getResponse();
+                       }
+               };
        }
 
        /**
@@ -311,7 +316,7 @@
        {
                if (this.headerResponse == null)
                {
-                       headerResponse = newHeaderResponse(getResponse());
+                       headerResponse = newHeaderResponse();
                }
                return headerResponse;
        }

Modified: 
incubator/wicket/branches/wicket-1.x/wicket/src/test/java/wicket/ajax/markup/html/componentMap/SimpleTestPageExpectedResult-1.html
URL: 
http://svn.apache.org/viewvc/incubator/wicket/branches/wicket-1.x/wicket/src/test/java/wicket/ajax/markup/html/componentMap/SimpleTestPageExpectedResult-1.html?view=diff&rev=514168&r1=514167&r2=514168
==============================================================================
--- 
incubator/wicket/branches/wicket-1.x/wicket/src/test/java/wicket/ajax/markup/html/componentMap/SimpleTestPageExpectedResult-1.html
 (original)
+++ 
incubator/wicket/branches/wicket-1.x/wicket/src/test/java/wicket/ajax/markup/html/componentMap/SimpleTestPageExpectedResult-1.html
 Sat Mar  3 07:13:48 2007
@@ -6,8 +6,4 @@
 
 <script type="text/javascript" 
src="resources/wicket.ajax.AbstractDefaultAjaxBehavior/wicket-ajax-debug-drag.js"></script>
 <script type="text/javascript" 
src="resources/wicket.ajax.AbstractDefaultAjaxBehavior/wicket-ajax-debug.js"></script>
-<script type="text/javascript" ><!--/*--><![CDATA[/*><!--*/
-setTimeout("var 
wcall=wicketAjaxGet('?wicket:interface=:0:testPanel:baseSpan:linja1:-1:IUnversionedBehaviorListener:0&wicket:ignoreIfNotActive=true',
 function() { }, function() { });", 2000);
-/*-->]^]^>*/</script>
-
-</head>]]></header-contribution><component id="linja10" ><![CDATA[<span 
wicket:id="linja1" id="linja10">1</span>]]></component></ajax-response>
\ No newline at end of file
+</head>]]></header-contribution><component id="linja10" ><![CDATA[<span 
wicket:id="linja1" 
id="linja10">1</span>]]></component><evaluate><![CDATA[setTimeout("var 
wcall=wicketAjaxGet('?wicket:interface=:0:testPanel:baseSpan:linja1:-1:IUnversionedBehaviorListener:0&wicket:ignoreIfNotActive=true',
 function() { }, function() { });", 2000);]]></evaluate></ajax-response>
\ No newline at end of file


Reply via email to