diff options
author | Leif Åstrand <leif@vaadin.com> | 2012-06-14 17:29:49 +0300 |
---|---|---|
committer | Leif Åstrand <leif@vaadin.com> | 2012-06-14 17:29:49 +0300 |
commit | d44e06fc50415d3dcdc93ad8c711a2c4f2664e6e (patch) | |
tree | f87b0664fc3d6ccd3cf604b73b4bdcd1164a4658 /src/com/vaadin/ui/JavaScript.java | |
parent | 0c06e5ac6e854ff428290db0697c11ebde97adb0 (diff) | |
download | vaadin-framework-d44e06fc50415d3dcdc93ad8c711a2c4f2664e6e.tar.gz vaadin-framework-d44e06fc50415d3dcdc93ad8c711a2c4f2664e6e.zip |
JavascriptManager -> JavaScript and changes based on review (#6730)
Diffstat (limited to 'src/com/vaadin/ui/JavaScript.java')
-rw-r--r-- | src/com/vaadin/ui/JavaScript.java | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/src/com/vaadin/ui/JavaScript.java b/src/com/vaadin/ui/JavaScript.java new file mode 100644 index 0000000000..dcd8540947 --- /dev/null +++ b/src/com/vaadin/ui/JavaScript.java @@ -0,0 +1,84 @@ +/* +@VaadinApache2LicenseForJavaFiles@ + */ + +package com.vaadin.ui; + +import java.util.HashMap; +import java.util.Map; + +import com.vaadin.external.json.JSONArray; +import com.vaadin.external.json.JSONException; +import com.vaadin.terminal.AbstractExtension; +import com.vaadin.terminal.Extension; +import com.vaadin.terminal.gwt.client.communication.ServerRpc; +import com.vaadin.terminal.gwt.client.extensions.javascriptmanager.ExecuteJavaScriptRpc; +import com.vaadin.terminal.gwt.client.extensions.javascriptmanager.JavascriptManagerState; + +public class JavaScript extends AbstractExtension { + private Map<String, JavascriptCallback> callbacks = new HashMap<String, JavascriptCallback>(); + + // Can not be defined in client package as this JSONArray is not available + // in GWT + public interface JavascriptCallbackRpc extends ServerRpc { + public void call(String name, JSONArray arguments); + } + + public JavaScript() { + registerRpc(new JavascriptCallbackRpc() { + public void call(String name, JSONArray arguments) { + JavascriptCallback callback = callbacks.get(name); + // TODO handle situation if name is not registered + try { + callback.call(arguments); + } catch (JSONException e) { + throw new IllegalArgumentException(e); + } + } + }); + } + + @Override + public JavascriptManagerState getState() { + return (JavascriptManagerState) super.getState(); + } + + public void addCallback(String name, JavascriptCallback callback) { + callbacks.put(name, callback); + if (getState().getNames().add(name)) { + requestRepaint(); + } + } + + public void removeCallback(String name) { + callbacks.remove(name); + if (getState().getNames().remove(name)) { + requestRepaint(); + } + } + + public void execute(String script) { + getRpcProxy(ExecuteJavaScriptRpc.class).executeJavaScript(script); + } + + public static JavaScript getCurrent() { + return Root.getCurrentRoot().getJavaScript(); + } + + private static JavaScript getJavascript(Root root) { + // TODO Add caching to avoid iterating collection every time + // Caching should use weak references to avoid memory leaks -> cache + // should be transient to avoid serialization problems + for (Extension extension : root.getExtensions()) { + if (extension instanceof JavaScript) { + return (JavaScript) extension; + } + } + + // Extend root if it isn't yet done + JavaScript javascript = new JavaScript(); + javascript.extend(root); + return javascript; + } + +} |