1.1 --- a/javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/ConvertTypes.java Mon Apr 15 07:08:55 2013 +0200
1.2 +++ b/javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/ConvertTypes.java Mon Apr 15 18:30:30 2013 +0200
1.3 @@ -17,6 +17,7 @@
1.4 */
1.5 package org.apidesign.bck2brwsr.htmlpage;
1.6
1.7 +import netscape.javascript.JSObject;
1.8 import org.apidesign.bck2brwsr.core.JavaScriptBody;
1.9
1.10 /**
1.11 @@ -44,6 +45,12 @@
1.12
1.13 public static <T> T toModel(Class<T> modelClass, Object object, String property) {
1.14 Object ret = getProperty(object, property);
1.15 + if (ret instanceof JSObject) {
1.16 + Object real = ((JSObject)ret).getMember("koModel");
1.17 + if (real != null) {
1.18 + ret = real;
1.19 + }
1.20 + }
1.21 if (ret == null || modelClass.isInstance(ret)) {
1.22 return modelClass.cast(ret);
1.23 }
1.24 @@ -71,7 +78,15 @@
1.25 + "var p = object[property]; return p ? p : null;"
1.26 )
1.27 private static Object getProperty(Object object, String property) {
1.28 - return null;
1.29 + if (property == null) {
1.30 + return object;
1.31 + } else {
1.32 + if (object instanceof JSObject) {
1.33 + JSObject jo = (JSObject)object;
1.34 + return jo.getMember(property);
1.35 + }
1.36 + return null;
1.37 + }
1.38 }
1.39
1.40 public static String createJSONP(Object[] jsonResult, Runnable whenDone) {
2.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
2.2 +++ b/javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/KOFunction.java Mon Apr 15 18:30:30 2013 +0200
2.3 @@ -0,0 +1,46 @@
2.4 +/**
2.5 + * Back 2 Browser Bytecode Translator
2.6 + * Copyright (C) 2012 Jaroslav Tulach <jaroslav.tulach@apidesign.org>
2.7 + *
2.8 + * This program is free software: you can redistribute it and/or modify
2.9 + * it under the terms of the GNU General Public License as published by
2.10 + * the Free Software Foundation, version 2 of the License.
2.11 + *
2.12 + * This program is distributed in the hope that it will be useful,
2.13 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
2.14 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2.15 + * GNU General Public License for more details.
2.16 + *
2.17 + * You should have received a copy of the GNU General Public License
2.18 + * along with this program. Look for COPYING file in the top folder.
2.19 + * If not, see http://opensource.org/licenses/GPL-2.0.
2.20 + */
2.21 +package org.apidesign.bck2brwsr.htmlpage;
2.22 +
2.23 +import java.lang.reflect.Method;
2.24 +import java.util.logging.Level;
2.25 +import java.util.logging.Logger;
2.26 +
2.27 +/** Represents callback from Knockout.js to Java.
2.28 + *
2.29 + * @author Jaroslav Tulach <jtulach@netbeans.org>
2.30 + */
2.31 +public final class KOFunction {
2.32 + private static final Logger LOG = Logger.getLogger(KOFunction.class.getName());
2.33 + private final Object model;
2.34 + private final Method method;
2.35 +
2.36 + KOFunction(Object model, String method) throws NoSuchMethodException {
2.37 + this.method = model.getClass().getDeclaredMethod(method, Object.class, Object.class);
2.38 + this.method.setAccessible(true);
2.39 + this.model = model;
2.40 + }
2.41 +
2.42 + public void call(Object data, Object ev) {
2.43 + try {
2.44 + this.method.invoke(model, data, ev);
2.45 + } catch (Throwable ex) {
2.46 + LOG.log(Level.SEVERE, "Can't call " + method + " on " + model, ex);
2.47 + }
2.48 + }
2.49 +}
3.1 --- a/javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/Knockout.java Mon Apr 15 07:08:55 2013 +0200
3.2 +++ b/javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/Knockout.java Mon Apr 15 18:30:30 2013 +0200
3.3 @@ -82,9 +82,18 @@
3.4 + " ret.toString = function() { return 'KObject' + cnt + ' value: ' + value + ' props: ' + Object.keys(this); };"
3.5 + " return ret;"
3.6 + " };"
3.7 +
3.8 + " scope.KObject.array= function() {"
3.9 + " return Array.prototype.slice.call(arguments);"
3.10 + " };"
3.11 +
3.12 + + " scope.KObject.expose = function(bindings, model, prop, sig) {"
3.13 + + " bindings[prop] = function(data, ev) {"
3.14 + + " console.log(\" callback on prop: \" + prop);"
3.15 + + " model[sig](data, ev);"
3.16 + + " };"
3.17 + + " };"
3.18 +
3.19 + "})(window); window.KObject"
3.20 );
3.21 }
3.22 @@ -186,6 +195,8 @@
3.23 try {
3.24 KOProperty kop = new KOProperty(model, strip(getter), strip(setter));
3.25 bnd.call("bnd", ko, bindings, kop, prop, "get", "set", primitive, array);
3.26 +
3.27 + ((JSObject)bindings).setMember("koModel", model);
3.28 LOG.log(Level.INFO, "binding defined for {0}: {1}", new Object[]{prop, ((JSObject)bindings).getMember(prop)});
3.29 } catch (Throwable ex) {
3.30 LOG.log(Level.INFO, "binding failed for {0} on {1}", new Object[]{prop, bindings});
3.31 @@ -205,6 +216,12 @@
3.32 private static void expose(
3.33 Object bindings, Object model, String prop, String sig
3.34 ) {
3.35 + try {
3.36 + KOFunction f = new KOFunction(model, strip(sig));
3.37 + KObject.call("expose", bindings, f, prop, "call");
3.38 + } catch (Throwable ex) {
3.39 + LOG.log(Level.SEVERE, "Cannot define binding for " + prop + " in model " + model, ex);
3.40 + }
3.41 }
3.42
3.43 @JavaScriptBody(args = { "bindings" }, body = "ko.applyBindings(bindings);")