Dynamic calculator sample supports binding of array values. Modified to execute from classes only (again) and not require the built of whole deployed site.
1.1 --- a/javaquery/demo-calculator-dynamic/pom.xml Mon Mar 25 13:48:45 2013 +0100
1.2 +++ b/javaquery/demo-calculator-dynamic/pom.xml Mon Mar 25 14:15:09 2013 +0100
1.3 @@ -27,8 +27,7 @@
1.4 </execution>
1.5 </executions>
1.6 <configuration>
1.7 - <directory>${project.build.directory}/${project.build.finalName}-bck2brwsr/public_html</directory>
1.8 - <startpage>index.xhtml</startpage>
1.9 + <startpage>org/apidesign/bck2brwsr/demo/calc/Calculator.xhtml</startpage>
1.10 </configuration>
1.11 </plugin>
1.12 <plugin>
2.1 --- a/javaquery/demo-calculator-dynamic/src/main/java/org/apidesign/bck2brwsr/demo/calc/Calc.java Mon Mar 25 13:48:45 2013 +0100
2.2 +++ b/javaquery/demo-calculator-dynamic/src/main/java/org/apidesign/bck2brwsr/demo/calc/Calc.java Mon Mar 25 14:15:09 2013 +0100
2.3 @@ -17,9 +17,11 @@
2.4 */
2.5 package org.apidesign.bck2brwsr.demo.calc;
2.6
2.7 +import java.util.List;
2.8 import org.apidesign.bck2brwsr.htmlpage.api.ComputedProperty;
2.9 import org.apidesign.bck2brwsr.htmlpage.api.On;
2.10 import static org.apidesign.bck2brwsr.htmlpage.api.OnEvent.*;
2.11 +import org.apidesign.bck2brwsr.htmlpage.api.OnFunction;
2.12 import org.apidesign.bck2brwsr.htmlpage.api.Page;
2.13 import org.apidesign.bck2brwsr.htmlpage.api.Property;
2.14
2.15 @@ -34,12 +36,11 @@
2.16 @Property(name = "display", type = double.class),
2.17 @Property(name = "operation", type = String.class),
2.18 @Property(name = "hover", type = boolean.class),
2.19 - @Property(name = "results", type = String.class, array = true)
2.20 + @Property(name = "history", type = double.class, array = true)
2.21 })
2.22 public class Calc {
2.23 static {
2.24 - Calculator m = new Calculator();
2.25 - m.applyBindings();
2.26 + new Calculator().applyBindings().setOperation("plus");
2.27 }
2.28
2.29 @On(event = CLICK, id="clear")
2.30 @@ -67,16 +68,26 @@
2.31
2.32 @On(event = CLICK, id="result")
2.33 static void computeTheValue(Calculator c) {
2.34 - final double val = compute(
2.35 + final double newValue = compute(
2.36 c.getOperation(),
2.37 c.getMemory(),
2.38 c.getDisplay()
2.39 );
2.40 - c.getResults().add("another result " + val);
2.41 - c.setDisplay(val);
2.42 + c.setDisplay(newValue);
2.43 + c.getHistory().add(newValue);
2.44 c.setMemory(0);
2.45 }
2.46
2.47 + @OnFunction
2.48 + static void recoverMemory(Calculator c, double data) {
2.49 + c.setDisplay(data);
2.50 + }
2.51 +
2.52 + @OnFunction
2.53 + static void removeMemory(Calculator c, double data) {
2.54 + c.getHistory().remove(data);
2.55 + }
2.56 +
2.57 private static double compute(String op, double memory, double display) {
2.58 switch (op) {
2.59 case "plus": return memory + display;
2.60 @@ -113,4 +124,9 @@
2.61 }
2.62 return "Attempt to compute " + memory + " " + operation + " " + display + " = " + compute(operation, memory, display);
2.63 }
2.64 +
2.65 + @ComputedProperty
2.66 + static boolean emptyHistory(List<?> history) {
2.67 + return history.isEmpty();
2.68 + }
2.69 }
3.1 --- a/javaquery/demo-calculator-dynamic/src/main/resources/org/apidesign/bck2brwsr/demo/calc/Calculator.xhtml Mon Mar 25 13:48:45 2013 +0100
3.2 +++ b/javaquery/demo-calculator-dynamic/src/main/resources/org/apidesign/bck2brwsr/demo/calc/Calculator.xhtml Mon Mar 25 14:15:09 2013 +0100
3.3 @@ -78,10 +78,15 @@
3.4 </table>
3.5 <div data-bind="text: displayPreview"></div>
3.6
3.7 - <h3>Results</h3>
3.8 + <h4>Previous Results</h4>
3.9
3.10 - <ul data-bind="foreach : results">
3.11 - <li>Item: <b data-bind="text: $data"></b></li>
3.12 + <div data-bind="if: emptyHistory">No results yet.</div>
3.13 + <ul data-bind="foreach: history">
3.14 + <li>
3.15 + <span data-bind="text: $data"/> -
3.16 + <a href="#" data-bind="click: $root.recoverMemory">Use</a>
3.17 + <a href="#" data-bind="click: $root.removeMemory">Remove</a>
3.18 + </li>
3.19 </ul>
3.20
3.21 <script src="bck2brwsr.js"></script>
3.22 @@ -91,75 +96,5 @@
3.23 </script>
3.24
3.25 <hr/>
3.26 - <pre>
3.27 - <span class="keyword-directive">package</span> org.apidesign.bck2brwsr.mavenhtml;
3.28 -
3.29 - <span class="keyword-directive">import</span> org.apidesign.bck2brwsr.htmlpage.api.OnClick;
3.30 - <span class="keyword-directive">import</span> org.apidesign.bck2brwsr.htmlpage.api.Page;
3.31 -
3.32 - <span class="comment">/**</span> <span class="comment">HTML5</span><span class="comment"> & </span><span class="comment">Java</span> <span class="comment">demo</span> <span class="comment">showing</span> <span class="comment">the</span> <span class="comment">power</span> <span class="comment">of</span> <a href="http://wiki.apidesign.org/wiki/AnnotationProcessor">annotation processors</a>
3.33 - <span class="comment"> * </span><span class="comment">as</span> <span class="comment">well</span> <span class="comment">as</span> <span class="comment">other</span> <span class="comment">goodies</span><span class="comment">, including type-safe association between</span>
3.34 - <span class="comment"> * </span><span class="comment">an XHTML page and Java.</span>
3.35 - <span class="comment"> * </span>
3.36 - <span class="comment"> * </span><span class="ST1">@author</span> <span class="comment">Jaroslav</span> <span class="comment">Tulach</span> <span class="ST0"><jaroslav.tulach@apidesign.org></span>
3.37 - <span class="comment">*/</span>
3.38 - @Page(xhtml=<span class="string">"</span><span class="string">Calculator.xhtml</span><span class="string">"</span>)
3.39 - <span class="keyword-directive">public</span> <span class="keyword-directive">class</span> App {
3.40 - <span class="keyword-directive">private</span> <span class="keyword-directive">static</span> <span class="keyword-directive">double</span> memory;
3.41 - <span class="keyword-directive">private</span> <span class="keyword-directive">static</span> String operation;
3.42 -
3.43 - @OnClick(id=<span class="string">"</span><span class="string">clear</span><span class="string">"</span>)
3.44 - <span class="keyword-directive">static</span> <span class="keyword-directive">void</span> clear() {
3.45 - memory = <span class="number">0</span>;
3.46 - operation = <span class="keyword-directive">null</span>;
3.47 - Calculator.DISPLAY.setValue(<span class="string">"</span><span class="string">0</span><span class="string">"</span>);
3.48 - }
3.49 -
3.50 - @OnClick(id= { <span class="string">"</span><span class="string">plus</span><span class="string">"</span>, <span class="string">"</span><span class="string">minus</span><span class="string">"</span>, <span class="string">"</span><span class="string">mul</span><span class="string">"</span>, <span class="string">"</span><span class="string">div</span><span class="string">"</span> })
3.51 - <span class="keyword-directive">static</span> <span class="keyword-directive">void</span> applyOp(String op) {
3.52 - memory = getValue();
3.53 - operation = op;
3.54 - Calculator.DISPLAY.setValue(<span class="string">"</span><span class="string">0</span><span class="string">"</span>);
3.55 - }
3.56 -
3.57 - @OnClick(id=<span class="string">"</span><span class="string">result</span><span class="string">"</span>)
3.58 - <span class="keyword-directive">static</span> <span class="keyword-directive">void</span> computeTheValue() {
3.59 - <span class="keyword-directive">switch</span> (operation) {
3.60 - <span class="keyword-directive">case</span> <span class="string">"</span><span class="string">plus</span><span class="string">"</span>: setValue(memory + getValue()); <span class="keyword-directive">break</span>;
3.61 - <span class="keyword-directive">case</span> <span class="string">"</span><span class="string">minus</span><span class="string">"</span>: setValue(memory - getValue()); <span class="keyword-directive">break</span>;
3.62 - <span class="keyword-directive">case</span> <span class="string">"</span><span class="string">mul</span><span class="string">"</span>: setValue(memory * getValue()); <span class="keyword-directive">break</span>;
3.63 - <span class="keyword-directive">case</span> <span class="string">"</span><span class="string">div</span><span class="string">"</span>: setValue(memory / getValue()); <span class="keyword-directive">break</span>;
3.64 - <span class="keyword-directive">default</span>: <span class="keyword-directive">throw</span> <span class="keyword-directive">new</span> IllegalStateException(operation);
3.65 - }
3.66 - }
3.67 -
3.68 - @OnClick(id={<span class="string">"</span><span class="string">n0</span><span class="string">"</span>, <span class="string">"</span><span class="string">n1</span><span class="string">"</span>, <span class="string">"</span><span class="string">n2</span><span class="string">"</span>, <span class="string">"</span><span class="string">n3</span><span class="string">"</span>, <span class="string">"</span><span class="string">n4</span><span class="string">"</span>, <span class="string">"</span><span class="string">n5</span><span class="string">"</span>, <span class="string">"</span><span class="string">n6</span><span class="string">"</span>, <span class="string">"</span><span class="string">n7</span><span class="string">"</span>, <span class="string">"</span><span class="string">n8</span><span class="string">"</span>, <span class="string">"</span><span class="string">n9</span><span class="string">"</span>})
3.69 - <span class="keyword-directive">static</span> <span class="keyword-directive">void</span> addDigit(String digit) {
3.70 - digit = digit.substring(<span class="number">1</span>);
3.71 - String v = Calculator.DISPLAY.getValue();
3.72 - <span class="keyword-directive">if</span> (getValue() == <span class="number">0.0</span>) {
3.73 - Calculator.DISPLAY.setValue(digit);
3.74 - } <span class="keyword-directive">else</span> {
3.75 - Calculator.DISPLAY.setValue(v + digit);
3.76 - }
3.77 - }
3.78 -
3.79 - <span class="keyword-directive">private</span> <span class="keyword-directive">static</span> <span class="keyword-directive">void</span> setValue(<span class="keyword-directive">double</span> v) {
3.80 - StringBuilder sb = <span class="keyword-directive">new</span> StringBuilder();
3.81 - sb.append(v);
3.82 - Calculator.DISPLAY.setValue(sb.toString());
3.83 - }
3.84 -
3.85 - <span class="keyword-directive">private</span> <span class="keyword-directive">static</span> <span class="keyword-directive">double</span> getValue() {
3.86 - <span class="keyword-directive">try</span> {
3.87 - <span class="keyword-directive">return</span> Double.parseDouble(Calculator.DISPLAY.getValue());
3.88 - } <span class="keyword-directive">catch</span> (NumberFormatException ex) {
3.89 - Calculator.DISPLAY.setValue(<span class="string">"</span><span class="string">err</span><span class="string">"</span>);
3.90 - <span class="keyword-directive">return</span> <span class="number">0.0</span>;
3.91 - }
3.92 - }
3.93 - }
3.94 -
3.95 - </pre>
3.96 </body>
3.97 </html>