/* @VaadinApache2LicenseForJavaFiles@ */ package com.vaadin.terminal; import java.lang.reflect.Method; import java.util.Arrays; import java.util.HashMap; import java.util.Map; import com.vaadin.external.json.JSONArray; import com.vaadin.external.json.JSONException; import com.vaadin.tools.ReflectTools; import com.vaadin.ui.JavaScript.JavaScriptCallbackRpc; import com.vaadin.ui.JavaScriptCallback; public class JavaScriptCallbackHelper { private static final Method CALL_METHOD = ReflectTools.findMethod( JavaScriptCallbackRpc.class, "call", String.class, JSONArray.class); private AbstractClientConnector connector; private Map callbacks = new HashMap(); private JavaScriptCallbackRpc javascriptCallbackRpc; public JavaScriptCallbackHelper(AbstractClientConnector connector) { this.connector = connector; } public void registerCallback(String functionName, JavaScriptCallback javaScriptCallback) { callbacks.put(functionName, javaScriptCallback); ensureRpc(); } private void ensureRpc() { if (javascriptCallbackRpc == null) { javascriptCallbackRpc = new JavaScriptCallbackRpc() { public void call(String name, JSONArray arguments) { JavaScriptCallback callback = callbacks.get(name); try { callback.call(arguments); } catch (JSONException e) { throw new IllegalArgumentException(e); } } }; connector.registerRpc(javascriptCallbackRpc); } } public void invokeCallback(String name, Object... arguments) { JSONArray args = new JSONArray(Arrays.asList(arguments)); connector.addMethodInvocationToQueue( JavaScriptCallbackRpc.class.getName(), CALL_METHOD, new Object[] { name, args }); connector.requestRepaint(); } }