diff options
author | Johannes Dahlström <johannesd@vaadin.com> | 2012-06-19 11:24:20 +0300 |
---|---|---|
committer | Johannes Dahlström <johannesd@vaadin.com> | 2012-06-19 11:24:20 +0300 |
commit | 0d06d0f434ac8c616fb08a16de5c8fa53cc03954 (patch) | |
tree | 3fa197445ed79a86642a022d54950d8e0eedbbaf /src | |
parent | 37a934c2f0c0a8edb7c580ff3a5b351778256368 (diff) | |
parent | 6750c529283be82e4f868ca6f389927e577189cf (diff) | |
download | vaadin-framework-0d06d0f434ac8c616fb08a16de5c8fa53cc03954.tar.gz vaadin-framework-0d06d0f434ac8c616fb08a16de5c8fa53cc03954.zip |
Merge remote-tracking branch 'origin/master'
Diffstat (limited to 'src')
6 files changed, 94 insertions, 45 deletions
diff --git a/src/com/vaadin/annotations/LoadScripts.java b/src/com/vaadin/annotations/LoadScripts.java index f2b72407f7..84ac2d2fb7 100644 --- a/src/com/vaadin/annotations/LoadScripts.java +++ b/src/com/vaadin/annotations/LoadScripts.java @@ -8,8 +8,16 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; +/** + * Temporary hack used for ensuring external javascript libraries are included. + * To add a javascript, add this annotation to your Root class. + * + * @deprecated Will be removed in favor of a more robust solution before version + * 7.0.0 + */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) +@Deprecated public @interface LoadScripts { public String[] value(); diff --git a/src/com/vaadin/terminal/gwt/client/JavaScriptConnectorHelper.java b/src/com/vaadin/terminal/gwt/client/JavaScriptConnectorHelper.java index d2a2a5329e..bd62a759cb 100644 --- a/src/com/vaadin/terminal/gwt/client/JavaScriptConnectorHelper.java +++ b/src/com/vaadin/terminal/gwt/client/JavaScriptConnectorHelper.java @@ -14,6 +14,7 @@ import java.util.Set; import com.google.gwt.core.client.JavaScriptObject; import com.google.gwt.core.client.JsArray; import com.google.gwt.json.client.JSONArray; +import com.google.gwt.user.client.Element; import com.vaadin.terminal.gwt.client.communication.MethodInvocation; import com.vaadin.terminal.gwt.client.communication.StateChangeEvent; import com.vaadin.terminal.gwt.client.communication.StateChangeEvent.StateChangeHandler; @@ -44,7 +45,9 @@ public class JavaScriptConnectorHelper { // Wildcard rpc object rpcObjects.put("", JavaScriptObject.createObject()); + } + public void init() { connector.addStateChangeHandler(new StateChangeHandler() { public void onStateChanged(StateChangeEvent stateChangeEvent) { JavaScriptObject wrapper = getConnectorWrapper(); @@ -81,7 +84,7 @@ public class JavaScriptConnectorHelper { // Init after setting up callbacks & rpc if (!inited) { - init(); + initJavaScript(); inited = true; } @@ -104,7 +107,7 @@ public class JavaScriptConnectorHelper { return object; } - private boolean init() { + private boolean initJavaScript() { ApplicationConfiguration conf = connector.getConnection() .getConfiguration(); ArrayList<String> attemptedNames = new ArrayList<String>(); @@ -146,17 +149,13 @@ public class JavaScriptConnectorHelper { private JavaScriptObject getConnectorWrapper() { if (connectorWrapper == null) { - connectorWrapper = createConnectorWrapper(); + connectorWrapper = createConnectorWrapper(this, nativeState, + rpcMap, connector.getConnectorId(), rpcObjects); } return connectorWrapper; } - protected JavaScriptObject createConnectorWrapper() { - return createConnectorWrapper(this, nativeState, rpcMap, - connector.getConnectorId(), rpcObjects); - } - private static native void fireNativeStateChange( JavaScriptObject connectorWrapper) /*-{ @@ -174,6 +173,9 @@ public class JavaScriptConnectorHelper { 'getConnectorId': function() { return connectorId; }, + 'getParentId': $entry(function(connectorId) { + return h.@com.vaadin.terminal.gwt.client.JavaScriptConnectorHelper::getParentId(Ljava/lang/String;)(connectorId); + }), 'getState': function() { return nativeState; }, @@ -183,6 +185,9 @@ public class JavaScriptConnectorHelper { } return rpcObjects.@java.util.Map::get(Ljava/lang/Object;)(iface); }), + 'getWidgetElement': $entry(function(connectorId) { + return h.@com.vaadin.terminal.gwt.client.JavaScriptConnectorHelper::getWidgetElement(Ljava/lang/String;)(connectorId); + }), 'registerRpc': function(iface, rpcHandler) { //registerRpc(handler) -> registerRpc('', handler); if (!rpcHandler) { @@ -206,6 +211,37 @@ public class JavaScriptConnectorHelper { }); }-*/; + private String getParentId(String connectorId) { + ServerConnector target = getConnector(connectorId); + if (target == null) { + return null; + } + ServerConnector parent = target.getParent(); + if (parent == null) { + return null; + } else { + return parent.getConnectorId(); + } + } + + private Element getWidgetElement(String connectorId) { + ServerConnector target = getConnector(connectorId); + if (target instanceof ComponentConnector) { + return ((ComponentConnector) target).getWidget().getElement(); + } else { + return null; + } + } + + private ServerConnector getConnector(String connectorId) { + if (connectorId == null || connectorId.length() == 0) { + return connector; + } + + return ConnectorMap.get(connector.getConnection()) + .getConnector(connectorId); + } + private void fireRpc(String iface, String method, JsArray<JavaScriptObject> arguments) { if (iface == null) { @@ -304,7 +340,7 @@ public class JavaScriptConnectorHelper { private static native void invokeCallback(JavaScriptObject connector, String name, JavaScriptObject arguments) /*-{ - connector[name](arguments); + connector[name].apply(connector, arguments); }-*/; private static native void invokeJsRpc(JavaScriptObject rpcMap, diff --git a/src/com/vaadin/terminal/gwt/client/JavaScriptExtension.java b/src/com/vaadin/terminal/gwt/client/JavaScriptExtension.java index e3dafab9bd..61c50dbcb4 100644 --- a/src/com/vaadin/terminal/gwt/client/JavaScriptExtension.java +++ b/src/com/vaadin/terminal/gwt/client/JavaScriptExtension.java @@ -15,6 +15,12 @@ public class JavaScriptExtension extends AbstractExtensionConnector implements private final JavaScriptConnectorHelper helper = new JavaScriptConnectorHelper( this); + @Override + protected void init() { + super.init(); + helper.init(); + } + public JavaScriptConnectorHelper getJavascriptConnectorHelper() { return helper; } diff --git a/src/com/vaadin/terminal/gwt/client/extensions/javascriptmanager/JavaScriptManagerConnector.java b/src/com/vaadin/terminal/gwt/client/extensions/javascriptmanager/JavaScriptManagerConnector.java index 72bd253ecb..d0bd4a1bf1 100644 --- a/src/com/vaadin/terminal/gwt/client/extensions/javascriptmanager/JavaScriptManagerConnector.java +++ b/src/com/vaadin/terminal/gwt/client/extensions/javascriptmanager/JavaScriptManagerConnector.java @@ -52,7 +52,18 @@ public class JavaScriptManagerConnector extends AbstractExtensionConnector { private native void addCallback(String name) /*-{ var m = this; - $wnd[name] = $entry(function() { + var target = $wnd; + var parts = name.split('.'); + + for(var i = 0; i < parts.length - 1; i++) { + var part = parts[i]; + if (target[part] === undefined) { + target[part] = {}; + } + target = target[part]; + } + + target[parts[parts.length - 1]] = $entry(function() { //Must make a copy because arguments is an array-like object (not instanceof Array), causing suboptimal JSON encoding var args = Array.prototype.slice.call(arguments, 0); m.@com.vaadin.terminal.gwt.client.extensions.javascriptmanager.JavaScriptManagerConnector::sendRpc(Ljava/lang/String;Lcom/google/gwt/core/client/JsArray;)(name, args); @@ -60,9 +71,25 @@ public class JavaScriptManagerConnector extends AbstractExtensionConnector { }-*/; // TODO only remove what we actually added + // TODO We might leave empty objects behind, but there's no good way of + // knowing whether they are unused private native void removeCallback(String name) /*-{ - delete $wnd[name]; + var target = $wnd; + var parts = name.split('.'); + + for(var i = 0; i < parts.length - 1; i++) { + var part = parts[i]; + if (target[part] === undefined) { + $wnd.console.log(part,'not defined in',target); + // No longer attached -> nothing more to do + return; + } + target = target[part]; + } + + $wnd.console.log('removing',parts[parts.length - 1],'from',target); + delete target[parts[parts.length - 1]]; }-*/; private static native void eval(String Script) diff --git a/src/com/vaadin/terminal/gwt/client/ui/JavaScriptComponentConnector.java b/src/com/vaadin/terminal/gwt/client/ui/JavaScriptComponentConnector.java index 47afe95771..ab5280fee9 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/JavaScriptComponentConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/JavaScriptComponentConnector.java @@ -3,8 +3,6 @@ */ package com.vaadin.terminal.gwt.client.ui; -import com.google.gwt.core.client.JavaScriptObject; -import com.google.gwt.user.client.Element; import com.vaadin.terminal.gwt.client.JavaScriptConnectorHelper; import com.vaadin.terminal.gwt.client.communication.HasJavaScriptConnectorHelper; import com.vaadin.ui.AbstractJavaScriptComponent; @@ -20,28 +18,19 @@ public class JavaScriptComponentConnector extends AbstractComponentConnector java.util.ArrayList<String> attemptedNames) { getWidget().showNoInitFound(attemptedNames); } - - @Override - protected JavaScriptObject createConnectorWrapper() { - JavaScriptObject connectorWrapper = super.createConnectorWrapper(); - addGetWidgetElement(connectorWrapper, getWidget().getElement()); - return connectorWrapper; - } }; - private static native void addGetWidgetElement( - JavaScriptObject connectorWrapper, Element element) - /*-{ - connectorWrapper.getWidgetElement = function() { - return element; - }; - }-*/; - @Override public JavaScriptWidget getWidget() { return (JavaScriptWidget) super.getWidget(); } + @Override + protected void init() { + super.init(); + helper.init(); + } + public JavaScriptConnectorHelper getJavascriptConnectorHelper() { return helper; } diff --git a/src/com/vaadin/ui/JavaScript.java b/src/com/vaadin/ui/JavaScript.java index fb1dba2f20..234f37f8a6 100644 --- a/src/com/vaadin/ui/JavaScript.java +++ b/src/com/vaadin/ui/JavaScript.java @@ -10,7 +10,6 @@ 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; @@ -65,20 +64,4 @@ public class JavaScript extends AbstractExtension { 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; - } - } |