summaryrefslogtreecommitdiffstats
path: root/src/com/vaadin/ui/JavaScript.java
diff options
context:
space:
mode:
authorLeif Åstrand <leif@vaadin.com>2012-06-14 17:29:49 +0300
committerLeif Åstrand <leif@vaadin.com>2012-06-14 17:29:49 +0300
commitd44e06fc50415d3dcdc93ad8c711a2c4f2664e6e (patch)
treef87b0664fc3d6ccd3cf604b73b4bdcd1164a4658 /src/com/vaadin/ui/JavaScript.java
parent0c06e5ac6e854ff428290db0697c11ebde97adb0 (diff)
downloadvaadin-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.java84
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;
+ }
+
+}