/* @VaadinApache2LicenseForJavaFiles@ */ package com.vaadin.terminal; import com.vaadin.shared.JavaScriptExtensionState; import com.vaadin.terminal.gwt.client.ApplicationConnection; import com.vaadin.ui.JavaScriptFunction; /** * Base class for Extensions with all client-side logic implemented using * JavaScript. *

* When a new JavaScript extension is initialized in the browser, the framework * will look for a globally defined JavaScript function that will initialize the * extension. The name of the initialization function is formed by replacing . * with _ in the name of the server-side class. If no such function is defined, * each super class is used in turn until a match is found. The framework will * thus first attempt with com_example_MyExtension for the * server-side * com.example.MyExtension extends AbstractJavaScriptExtension * class. If MyExtension instead extends com.example.SuperExtension * , then com_example_SuperExtension will also be attempted if * com_example_MyExtension has not been defined. *

* * The initialization function will be called with this pointing to * a connector wrapper object providing integration to Vaadin with the following * functions: *

* The connector wrapper also supports these special functions: * *

* * Values in the Shared State and in RPC calls are converted between Java and * JavaScript using the following conventions: *

* * @author Vaadin Ltd * @version @VERSION@ * @since 7.0.0 */ public abstract class AbstractJavaScriptExtension extends AbstractExtension { private JavaScriptCallbackHelper callbackHelper = new JavaScriptCallbackHelper( this); @Override protected void registerRpc(T implementation, Class rpcInterfaceType) { super.registerRpc(implementation, rpcInterfaceType); callbackHelper.registerRpc(rpcInterfaceType); } /** * Register a {@link JavaScriptFunction} that can be called from the * JavaScript using the provided name. A JavaScript function with the * provided name will be added to the connector wrapper object (initially * available as this). Calling that JavaScript function will * cause the call method in the registered {@link JavaScriptFunction} to be * invoked with the same arguments. * * @param functionName * the name that should be used for client-side callback * @param function * the {@link JavaScriptFunction} object that will be invoked * when the JavaScript function is called */ protected void addFunction(String functionName, JavaScriptFunction function) { callbackHelper.registerCallback(functionName, function); } /** * Invoke a named function that the connector JavaScript has added to the * JavaScript connector wrapper object. The arguments should only contain * data types that can be represented in JavaScript including primitives, * their boxed types, arrays, String, List, Set, Map, Connector and * JavaBeans. * * @param name * the name of the function * @param arguments * function arguments */ protected void callFunction(String name, Object... arguments) { callbackHelper.invokeCallback(name, arguments); } @Override public JavaScriptExtensionState getState() { return (JavaScriptExtensionState) super.getState(); } }