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