X-Git-Url: http://wamblee.org/gitweb/?a=blobdiff_plain;f=wicket%2Fcomponents%2Fsrc%2Fmain%2Fjava%2Forg%2Fwamblee%2Fwicket%2Fjquery%2FAbstractJQueryBehavior.java;h=d49110dd3d14e929162d149d2e3ba950abea3b22;hb=a55dd335d284bdcc981191b03c23fe85ef253faa;hp=b1d271346ffe605579333ed8cf7f72bd84cceecc;hpb=3c455180fb6fbe82bbb935c9ccbc212769d4591c;p=utils diff --git a/wicket/components/src/main/java/org/wamblee/wicket/jquery/AbstractJQueryBehavior.java b/wicket/components/src/main/java/org/wamblee/wicket/jquery/AbstractJQueryBehavior.java index b1d27134..d49110dd 100644 --- a/wicket/components/src/main/java/org/wamblee/wicket/jquery/AbstractJQueryBehavior.java +++ b/wicket/components/src/main/java/org/wamblee/wicket/jquery/AbstractJQueryBehavior.java @@ -23,19 +23,33 @@ import org.apache.wicket.behavior.IBehavior; import org.apache.wicket.markup.html.IHeaderResponse; import org.wamblee.wicket.behavior.CompositeBehavior; +import flexjson.JSONSerializer; + /** * Abstract JQuery hehavior class that makes it easy to write jQuery behaviors: * * + * The ready function will be invoked as part of a ready handler and will invoke + * a function with two arguments. The first is the id of the component and the second + * is a configuration object. + *

+ * The second parameter is obtained through a call to {@link #getConfigurationJavascript()}. + * + * * @author Erik Brakkee * + * */ -public class AbstractJQueryBehavior extends CompositeBehavior { +public class AbstractJQueryBehavior extends CompositeBehavior { + + private static final String DEFAULT_NAMESPACE = "org.wamblee"; + private static JSONSerializer DEFAULT_JSON_SERIALIZER = new JSONSerializer(); private Component component; private String function; @@ -44,8 +58,8 @@ public class AbstractJQueryBehavior extends CompositeBehavior { * Constructs the behavior. * * @param aFunction - * Function to be invoked from the ready handler. This function is invoked with a - * CSS selector that identifies the component. + * Function to be invoked from the ready handler. This function + * is invoked with a CSS selector that identifies the component. * @param aBehaviors * Behaviors to add in addition to the basic JQuery stuff. */ @@ -84,34 +98,92 @@ public class AbstractJQueryBehavior extends CompositeBehavior { @Override public void renderHead(IHeaderResponse aResponse) { super.renderHead(aResponse); - String jsString = createReadyFunction(function, component); + String jsString = createReadyFunction(); aResponse.renderJavascript(jsString, null); } /** * Creates a jQuery ready handler that invokes a given javascript function - * with the id of a component. + * with the id of a component and with a second parameter of parameters to + * pass additional information to the function. * * @param aFunction - * Javascript function to invoke. + * Javascript function to invoke, the name of this function must + * include the namespace as it is called from a global scope. * @param aComponent * Component to invoke the id for. * @return */ - public static String createReadyFunction(String aFunction, - Component aComponent) { - if (!aComponent.getOutputMarkupId()) { + String createReadyFunction() { + if (!component.getOutputMarkupId()) { throw new IllegalStateException( "The component " + - aComponent + + component + " does not have its markup id set so this ready handler will not have any effect"); } StringBuffer js = new StringBuffer(); js.append("jQuery(function(){"); - js.append("org.wamblee." + aFunction + "(\"#" + - aComponent.getMarkupId() + "\");"); + js.append(function + "("); + js.append("\"#" + component.getMarkupId() + "\""); + String config = getConfigurationJavascript(); + if (config != null) { + js.append(","); + js.append(config); + } + js.append(");"); js.append("});"); String jsString = js.toString(); return jsString; } + + /** + * Returns a javascript object that is passed as second argument to the + * ready function. This method uses {@link #getConfigurationObject()} to + * obtain the configuration object to use which is then serialized to + * javascript using {@link JSONSerializer}. Subclasses can override the + * default JSONSerializer by implementing {@link #getCustomSerializer()}. + *

+ * Subclasses should override this method to perform custom serialization. + * + * @return Configuration object in javascript. + */ + protected String getConfigurationJavascript() { + Object config = getConfigurationObject(); + return getActualSerializer().serialize(config); + } + + /** + * Gets the actual serializer to use. It uses {@link #getCustomSerializer()} + * to check if there is a custom serializer available. + * + * @return Serializer. + */ + private JSONSerializer getActualSerializer() { + JSONSerializer serializer = getCustomSerializer(); + if (serializer != null) { + return serializer; + } + return DEFAULT_JSON_SERIALIZER; + } + + /** + * Returns the serializer to use. Implementations can override this method + * to perform custom initialization of the serializer knowing the type of + * configuration object to use. + * + * @return Custom serializer to use. + */ + protected JSONSerializer getCustomSerializer() { + return null; + } + + /** + * Gets the configuration object to use. This is transformed to JSON using + * the serializer. + * + * @return Configuration object. + */ + protected ConfigType getConfigurationObject() { + return null; + } }