You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by pa...@apache.org on 2012/01/13 08:24:19 UTC

[2/4] git commit: extra methods to generate JS callback functions for AJAX calls

extra methods to generate JS callback functions for AJAX calls


Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/e62cd40b
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/e62cd40b
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/e62cd40b

Branch: refs/heads/master
Commit: e62cd40baa2e5818d924633bdf813325eb647d88
Parents: d640337
Author: Emond Papegaaij <pa...@apache.org>
Authored: Fri Jan 13 08:17:56 2012 +0100
Committer: Emond Papegaaij <pa...@apache.org>
Committed: Fri Jan 13 08:18:04 2012 +0100

----------------------------------------------------------------------
 .../wicket/ajax/AbstractDefaultAjaxBehavior.java   |  104 ++++++++++++--
 1 files changed, 89 insertions(+), 15 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/e62cd40b/wicket-core/src/main/java/org/apache/wicket/ajax/AbstractDefaultAjaxBehavior.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/ajax/AbstractDefaultAjaxBehavior.java b/wicket-core/src/main/java/org/apache/wicket/ajax/AbstractDefaultAjaxBehavior.java
index 62921c5..46702a1 100644
--- a/wicket-core/src/main/java/org/apache/wicket/ajax/AbstractDefaultAjaxBehavior.java
+++ b/wicket-core/src/main/java/org/apache/wicket/ajax/AbstractDefaultAjaxBehavior.java
@@ -16,6 +16,10 @@
  */
 package org.apache.wicket.ajax;
 
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map.Entry;
+
 import org.apache.wicket.Component;
 import org.apache.wicket.Page;
 import org.apache.wicket.ajax.attributes.AjaxCallListener;
@@ -38,10 +42,6 @@ import org.apache.wicket.request.resource.ResourceReference;
 import org.apache.wicket.resource.CoreLibrariesContributor;
 import org.apache.wicket.util.string.Strings;
 
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map.Entry;
-
 /**
  * The base class for Wicket's default AJAX implementation.
  * 
@@ -70,7 +70,8 @@ public abstract class AbstractDefaultAjaxBehavior extends AbstractAjaxBehavior
 	}
 
 	/**
-	 * @see org.apache.wicket.behavior.AbstractAjaxBehavior#renderHead(Component, org.apache.wicket.markup.head.IHeaderResponse)
+	 * @see org.apache.wicket.behavior.AbstractAjaxBehavior#renderHead(Component,
+	 *      org.apache.wicket.markup.head.IHeaderResponse)
 	 */
 	@Override
 	public void renderHead(Component component, IHeaderResponse response)
@@ -82,7 +83,7 @@ public abstract class AbstractDefaultAjaxBehavior extends AbstractAjaxBehavior
 		Url baseUrl = RequestCycle.get().getUrlRenderer().getBaseUrl();
 		CharSequence ajaxBaseUrl = Strings.escapeMarkup(baseUrl.toString());
 		response.render(JavaScriptHeaderItem.forScript("Wicket.Ajax.baseUrl=\"" + ajaxBaseUrl +
-				"\";", "wicket-ajax-base-url"));
+			"\";", "wicket-ajax-base-url"));
 
 		renderExtraHeaderContributors(component, response);
 	}
@@ -90,27 +91,29 @@ public abstract class AbstractDefaultAjaxBehavior extends AbstractAjaxBehavior
 	/**
 	 * Renders header contribution by JavaScriptFunctionBody instances which additionally implement
 	 * IComponentAwareHeaderContributor interface.
-	 *
+	 * 
 	 * @param component
-	 *      the component assigned to this behavior
+	 *            the component assigned to this behavior
 	 * @param response
-	 *      the current header response
+	 *            the current header response
 	 */
 	private void renderExtraHeaderContributors(Component component, IHeaderResponse response)
 	{
 		AjaxRequestAttributes attributes = getAttributes();
 
 		List<IAjaxCallListener> ajaxCallListeners = attributes.getAjaxCallListeners();
-		for (IAjaxCallListener ajaxCallListener : ajaxCallListeners) {
+		for (IAjaxCallListener ajaxCallListener : ajaxCallListeners)
+		{
 			if (ajaxCallListener instanceof IComponentAwareHeaderContributor)
 			{
-				IComponentAwareHeaderContributor contributor = (IComponentAwareHeaderContributor) ajaxCallListener;
+				IComponentAwareHeaderContributor contributor = (IComponentAwareHeaderContributor)ajaxCallListener;
 				contributor.renderHead(component, response);
 			}
 		}
 
 		List<JavaScriptPrecondition> preconditions = attributes.getPreconditions();
-		for (JavaScriptPrecondition precondition : preconditions) {
+		for (JavaScriptPrecondition precondition : preconditions)
+		{
 			precondition.renderHead(component, response);
 		}
 	}
@@ -151,7 +154,10 @@ public abstract class AbstractDefaultAjaxBehavior extends AbstractAjaxBehavior
 			attributes.getPreconditions().add(precondition);
 		}
 
-		AjaxCallListener backwardCompatibleAjaxCallListener = new AjaxCallListener() {
+		AjaxCallListener backwardCompatibleAjaxCallListener = new AjaxCallListener()
+		{
+			private static final long serialVersionUID = 1L;
+
 			@Override
 			public CharSequence getSuccessHandler(Component component)
 			{
@@ -324,10 +330,12 @@ public abstract class AbstractDefaultAjaxBehavior extends AbstractAjaxBehavior
 			}
 
 			String[] eventNames = attributes.getEventNames();
-			if (eventNames.length == 1) {
+			if (eventNames.length == 1)
+			{
 				attributesJson.put("e", eventNames[0]);
 			}
-			else {
+			else
+			{
 				for (String eventName : eventNames)
 				{
 					attributesJson.append("e", eventName);
@@ -403,6 +411,72 @@ public abstract class AbstractDefaultAjaxBehavior extends AbstractAjaxBehavior
 	}
 
 	/**
+	 * Generates a javascript function that can take parameters and performs an AJAX call which
+	 * includes these parameters. The generated code looks like this:
+	 * 
+	 * <pre>
+	 * function(param1, param2) {
+	 *    var attrs = attrsJson;
+	 *    var params = {'param1': param1, 'param2': param2};
+	 *    attrs.ep = jQuery.extend(attrs.ep, params);
+	 *    Wicket.Ajax.ajax(attrs);
+	 * }
+	 * </pre>
+	 * 
+	 * @param extraParameters
+	 * @return A function that can be used as a callback function in javascript
+	 */
+	protected CharSequence getCallbackFunction(String... extraParameters)
+	{
+		StringBuilder sb = new StringBuilder();
+		sb.append("function (");
+		boolean first = true;
+		for (String curExtraParameter : extraParameters)
+		{
+			if (!first)
+				sb.append(",");
+			sb.append(curExtraParameter);
+		}
+		sb.append(") {\n");
+		sb.append(getCallbackFunctionBody(extraParameters));
+		sb.append("}\n");
+		return sb;
+	}
+
+	/**
+	 * Generates the body the {@linkplain #getCallbackFunction(String...) callback function}. To
+	 * embed this code directly into a piece of javascript, make sure the extra parameters are
+	 * available as local variables, global variables or within the closure.
+	 * 
+	 * @param extraParameters
+	 * @return The body of the {@linkplain #getCallbackFunction(String...) callback function}.
+	 */
+	protected CharSequence getCallbackFunctionBody(String... extraParameters)
+	{
+		AjaxRequestAttributes attributes = getAttributes();
+		CharSequence attrsJson = renderAjaxAttributes(getComponent(), attributes);
+		StringBuilder sb = new StringBuilder();
+		sb.append("var attrs = ");
+		sb.append(attrsJson);
+		sb.append(";\n");
+		sb.append("var params = {");
+		boolean first = true;
+		for (String curExtraParameter : extraParameters)
+		{
+			if (!first)
+				sb.append(",");
+			sb.append("'").append(curExtraParameter).append("': ").append(curExtraParameter);
+		}
+		sb.append("};\n");
+		if (attributes.getExtraParameters().isEmpty())
+			sb.append("attrs.ep = params;\n");
+		else
+			sb.append("attrs.ep = jQuery.extend(attrs.ep, params);\n");
+		sb.append("Wicket.Ajax.ajax(attrs);\n");
+		return sb;
+	}
+
+	/**
 	 * @return an optional javascript expression that determines whether the request will actually
 	 *         execute (in form of return XXX;);
 	 * @deprecated Use {@link org.apache.wicket.ajax.attributes.AjaxRequestAttributes}