Can call @OnFunction fx
authorJaroslav Tulach <jaroslav.tulach@apidesign.org>
Mon, 15 Apr 2013 18:30:30 +0200
branchfx
changeset 9909ddce13e8ff9
parent 989 b41a01a6d998
child 991 a28d8ee85ba9
Can call @OnFunction
javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/ConvertTypes.java
javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/KOFunction.java
javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/Knockout.java
     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);")