# HG changeset patch # User Jaroslav Tulach # Date 1366043430 -7200 # Node ID 9ddce13e8ff9bb497ce964fc9fbf493bf27da264 # Parent b41a01a6d9986076e2c1398bcc2bd3407dd08bb6 Can call @OnFunction diff -r b41a01a6d998 -r 9ddce13e8ff9 javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/ConvertTypes.java --- a/javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/ConvertTypes.java Mon Apr 15 07:08:55 2013 +0200 +++ b/javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/ConvertTypes.java Mon Apr 15 18:30:30 2013 +0200 @@ -17,6 +17,7 @@ */ package org.apidesign.bck2brwsr.htmlpage; +import netscape.javascript.JSObject; import org.apidesign.bck2brwsr.core.JavaScriptBody; /** @@ -44,6 +45,12 @@ public static T toModel(Class modelClass, Object object, String property) { Object ret = getProperty(object, property); + if (ret instanceof JSObject) { + Object real = ((JSObject)ret).getMember("koModel"); + if (real != null) { + ret = real; + } + } if (ret == null || modelClass.isInstance(ret)) { return modelClass.cast(ret); } @@ -71,7 +78,15 @@ + "var p = object[property]; return p ? p : null;" ) private static Object getProperty(Object object, String property) { - return null; + if (property == null) { + return object; + } else { + if (object instanceof JSObject) { + JSObject jo = (JSObject)object; + return jo.getMember(property); + } + return null; + } } public static String createJSONP(Object[] jsonResult, Runnable whenDone) { diff -r b41a01a6d998 -r 9ddce13e8ff9 javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/KOFunction.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/KOFunction.java Mon Apr 15 18:30:30 2013 +0200 @@ -0,0 +1,46 @@ +/** + * Back 2 Browser Bytecode Translator + * Copyright (C) 2012 Jaroslav Tulach + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. Look for COPYING file in the top folder. + * If not, see http://opensource.org/licenses/GPL-2.0. + */ +package org.apidesign.bck2brwsr.htmlpage; + +import java.lang.reflect.Method; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** Represents callback from Knockout.js to Java. + * + * @author Jaroslav Tulach + */ +public final class KOFunction { + private static final Logger LOG = Logger.getLogger(KOFunction.class.getName()); + private final Object model; + private final Method method; + + KOFunction(Object model, String method) throws NoSuchMethodException { + this.method = model.getClass().getDeclaredMethod(method, Object.class, Object.class); + this.method.setAccessible(true); + this.model = model; + } + + public void call(Object data, Object ev) { + try { + this.method.invoke(model, data, ev); + } catch (Throwable ex) { + LOG.log(Level.SEVERE, "Can't call " + method + " on " + model, ex); + } + } +} diff -r b41a01a6d998 -r 9ddce13e8ff9 javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/Knockout.java --- a/javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/Knockout.java Mon Apr 15 07:08:55 2013 +0200 +++ b/javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/Knockout.java Mon Apr 15 18:30:30 2013 +0200 @@ -82,9 +82,18 @@ + " ret.toString = function() { return 'KObject' + cnt + ' value: ' + value + ' props: ' + Object.keys(this); };" + " return ret;" + " };" + + " scope.KObject.array= function() {" + " return Array.prototype.slice.call(arguments);" + " };" + + + " scope.KObject.expose = function(bindings, model, prop, sig) {" + + " bindings[prop] = function(data, ev) {" + + " console.log(\" callback on prop: \" + prop);" + + " model[sig](data, ev);" + + " };" + + " };" + + "})(window); window.KObject" ); } @@ -186,6 +195,8 @@ try { KOProperty kop = new KOProperty(model, strip(getter), strip(setter)); bnd.call("bnd", ko, bindings, kop, prop, "get", "set", primitive, array); + + ((JSObject)bindings).setMember("koModel", model); LOG.log(Level.INFO, "binding defined for {0}: {1}", new Object[]{prop, ((JSObject)bindings).getMember(prop)}); } catch (Throwable ex) { LOG.log(Level.INFO, "binding failed for {0} on {1}", new Object[]{prop, bindings}); @@ -205,6 +216,12 @@ private static void expose( Object bindings, Object model, String prop, String sig ) { + try { + KOFunction f = new KOFunction(model, strip(sig)); + KObject.call("expose", bindings, f, prop, "call"); + } catch (Throwable ex) { + LOG.log(Level.SEVERE, "Cannot define binding for " + prop + " in model " + model, ex); + } } @JavaScriptBody(args = { "bindings" }, body = "ko.applyBindings(bindings);")