# HG changeset patch # User Jaroslav Tulach # Date 1358888247 -3600 # Node ID 3ce069ec3312bc25bc75bd1fdf2c8777b22494b8 # Parent 8140ba8c005b82e07148a13e10d1a411592e1682 Test to verify Knockout can handle String properties diff -r 8140ba8c005b -r 3ce069ec3312 javaquery/api/pom.xml --- a/javaquery/api/pom.xml Tue Jan 22 19:27:00 2013 +0100 +++ b/javaquery/api/pom.xml Tue Jan 22 21:57:27 2013 +0100 @@ -64,5 +64,11 @@ jar test + + ${project.groupId} + vmtest + ${project.version} + test + diff -r 8140ba8c005b -r 3ce069ec3312 javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/Knockout.java --- a/javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/Knockout.java Tue Jan 22 19:27:00 2013 +0100 +++ b/javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/Knockout.java Tue Jan 22 21:57:27 2013 +0100 @@ -17,8 +17,10 @@ */ package org.apidesign.bck2brwsr.htmlpage; +import java.lang.reflect.Method; import org.apidesign.bck2brwsr.core.ExtraJavaScript; import org.apidesign.bck2brwsr.core.JavaScriptBody; +import org.apidesign.bck2brwsr.htmlpage.api.Element; /** Provides binding between models and * @@ -40,11 +42,17 @@ if (bindings == null) { bindings = new Knockout(); } - for (int i = 0; i < propsGettersAndSetters.length; i += 3) { - bind(bindings, model, propsGettersAndSetters[i], - propsGettersAndSetters[i + 1], - propsGettersAndSetters[i + 2] - ); + for (int i = 0; i < propsGettersAndSetters.length; i += 4) { + try { + Method getter = modelClass.getMethod(propsGettersAndSetters[i + 3]); + bind(bindings, model, propsGettersAndSetters[i], + propsGettersAndSetters[i + 1], + propsGettersAndSetters[i + 2], + getter.getReturnType().isPrimitive() + ); + } catch (NoSuchMethodException ex) { + Element.alert("Error: " + ex.getMessage()); + } } applyBindings(bindings); return bindings; @@ -56,7 +64,12 @@ public void valueHasMutated(String prop) { } - @JavaScriptBody(args = { "bindings", "model", "prop", "getter", "setter" }, body = + + @JavaScriptBody(args = { "id", "ev" }, body = "ko.utils.triggerEvent(window.document.getElementById(id), ev.substring(2));") + public static void triggerEvent(String id, String ev) { + } + + @JavaScriptBody(args = { "bindings", "model", "prop", "getter", "setter", "primitive" }, body = "var bnd = {\n" + " read: function() {\n" + " var v = model[getter]();\n" @@ -66,13 +79,13 @@ + "};\n" + "if (setter != null) {\n" + " bnd.write = function(val) {\n" - + " model[setter](new Number(val));\n" + + " model[setter](primitive ? new Number(val) : val);\n" + " };\n" + "}\n" + "bindings[prop] = ko.computed(bnd);" ) private static void bind( - Object bindings, Object model, String prop, String getter, String setter + Object bindings, Object model, String prop, String getter, String setter, boolean primitive ) { } diff -r 8140ba8c005b -r 3ce069ec3312 javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/PageProcessor.java --- a/javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/PageProcessor.java Tue Jan 22 19:27:00 2013 +0100 +++ b/javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/PageProcessor.java Tue Jan 22 21:57:27 2013 +0100 @@ -127,6 +127,10 @@ sep = ",\n"; } w.write("\n });\n return this;\n}\n"); + + w.write("public void triggerEvent(Element e, OnEvent ev) {\n"); + w.write(" org.apidesign.bck2brwsr.htmlpage.Knockout.triggerEvent(e.getId(), ev.getElementPropertyName());\n"); + w.write("}\n"); } w.append("}\n"); } finally { @@ -329,6 +333,7 @@ props.add(p.name()); props.add(gs[2]); props.add(gs[3]); + props.add(gs[0]); } } @@ -383,6 +388,7 @@ props.add(e.getSimpleName().toString()); props.add(gs[2]); props.add(null); + props.add(gs[0]); } return true; diff -r 8140ba8c005b -r 3ce069ec3312 javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/api/Element.java --- a/javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/api/Element.java Tue Jan 22 19:27:00 2013 +0100 +++ b/javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/api/Element.java Tue Jan 22 21:57:27 2013 +0100 @@ -30,6 +30,13 @@ this.id = id; } + /** Id of the element in the document. + * @return the id for this element + */ + public String getId() { + return id; + } + abstract void dontSubclass(); @JavaScriptBody( diff -r 8140ba8c005b -r 3ce069ec3312 javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/api/OnEvent.java --- a/javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/api/OnEvent.java Tue Jan 22 19:27:00 2013 +0100 +++ b/javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/api/OnEvent.java Tue Jan 22 21:57:27 2013 +0100 @@ -26,6 +26,7 @@ BLUR("onblur"), CAN_PLAY("oncanplay"), CAN_PLAY_THROUGH("oncanplaythrough"), + CHANGE("onchange"), CLICK("onclick"), CONTEXT_MENU("oncontextmenu"), DBL_CLICK("ondblclick"), @@ -82,6 +83,13 @@ this.id = id; } + /** The name of property this event is referenced by from an {@link Element}. + * For {@link OnEvent#CHANGE}, it is onchange. + */ + public String getElementPropertyName() { + return id; + } + /** What should happen when this even happen on one * of associated elements. Continue by calling {@link OnController#perform(java.lang.Runnable)} * method. diff -r 8140ba8c005b -r 3ce069ec3312 javaquery/api/src/test/java/org/apidesign/bck2brwsr/htmlpage/KnockoutTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/javaquery/api/src/test/java/org/apidesign/bck2brwsr/htmlpage/KnockoutTest.java Tue Jan 22 21:57:27 2013 +0100 @@ -0,0 +1,62 @@ +/** + * 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 org.apidesign.bck2brwsr.htmlpage.api.ComputedProperty; +import org.apidesign.bck2brwsr.htmlpage.api.OnEvent; +import org.apidesign.bck2brwsr.htmlpage.api.Page; +import org.apidesign.bck2brwsr.htmlpage.api.Property; +import org.apidesign.bck2brwsr.vmtest.BrwsrTest; +import org.apidesign.bck2brwsr.vmtest.HtmlFragment; +import org.apidesign.bck2brwsr.vmtest.VMTest; +import org.testng.annotations.Factory; + +/** + * + * @author Jaroslav Tulach + */ +@Page(xhtml="Knockout.xhtml", className="KnockoutModel", properties={ + @Property(name="name", type=String.class) +}) +public class KnockoutTest { + + @HtmlFragment( + "

Loading Bck2Brwsr's Hello World...

\n" + + "Your name: \n" + + "\n" + ) + @BrwsrTest public void modifyValueAssertChangeInModel() { + KnockoutModel m = new KnockoutModel(); + m.setName("Kukuc"); + m.applyBindings(); + assert "Kukuc".equals(m.INPUT.getValue()) : "Value is really kukuc: " + m.INPUT.getValue(); + m.INPUT.setValue("Jardo"); + m.triggerEvent(m.INPUT, OnEvent.CHANGE); + assert "Jardo".equals(m.getName()) : "Name property updated: " + m.getName(); + } + + @ComputedProperty + static String helloMessage(String name) { + return "Hello " + name + "!"; + } + + @Factory + public static Object[] create() { + return VMTest.create(KnockoutTest.class); + } +} diff -r 8140ba8c005b -r 3ce069ec3312 javaquery/api/src/test/resources/org/apidesign/bck2brwsr/htmlpage/Knockout.xhtml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/javaquery/api/src/test/resources/org/apidesign/bck2brwsr/htmlpage/Knockout.xhtml Tue Jan 22 21:57:27 2013 +0100 @@ -0,0 +1,25 @@ + + +

+

Loading Bck2Brwsr's Hello World...

+ Your name: + +