javaquery/demo-calculator/src/main/java/org/apidesign/bck2brwsr/demo/calc/staticcompilation/Calc.java
2 * Back 2 Browser Bytecode Translator
3 * Copyright (C) 2012-2015 Jaroslav Tulach <jaroslav.tulach@apidesign.org>
5 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, version 2 of the License.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program. Look for COPYING file in the top folder.
16 * If not, see http://opensource.org/licenses/GPL-2.0.
18 package org.apidesign.bck2brwsr.demo.calc.staticcompilation;
20 import java.util.List;
21 import org.apidesign.bck2brwsr.core.JavaScriptBody;
22 import org.apidesign.bck2brwsr.htmlpage.api.ComputedProperty;
23 import org.apidesign.bck2brwsr.htmlpage.api.On;
24 import static org.apidesign.bck2brwsr.htmlpage.api.OnEvent.*;
25 import org.apidesign.bck2brwsr.htmlpage.api.OnFunction;
26 import org.apidesign.bck2brwsr.htmlpage.api.Page;
27 import org.apidesign.bck2brwsr.htmlpage.api.Property;
29 /** HTML5 & Java demo showing the power of
30 * <a href="http://wiki.apidesign.org/wiki/AnnotationProcessor">annotation processors</a>
31 * as well as other goodies.
33 * @author Jaroslav Tulach <jaroslav.tulach@apidesign.org>
35 @Page(xhtml="Calculator.xhtml", properties = {
36 @Property(name = "memory", type = double.class),
37 @Property(name = "display", type = double.class),
38 @Property(name = "operation", type = String.class),
39 @Property(name = "hover", type = boolean.class),
40 @Property(name = "history", type = double.class, array = true)
43 public static void main(String... args) throws Exception {
44 new Calculator().applyBindings().setOperation("plus");
48 @On(event = CLICK, id="clear")
49 static void clear(Calculator c) {
55 @On(event = CLICK, id= { "plus", "minus", "mul", "div" })
56 static void applyOp(Calculator c, String id) {
57 c.setMemory(c.getDisplay());
62 @On(event = MOUSE_OVER, id= { "result" })
63 static void attemptingIn(Calculator c) {
66 @On(event = MOUSE_OUT, id= { "result" })
67 static void attemptingOut(Calculator c) {
71 @On(event = CLICK, id="result")
72 static void computeTheValue(Calculator c) {
73 final double newValue = compute(
78 c.setDisplay(newValue);
79 if (!c.getHistory().contains(newValue)) {
80 c.getHistory().add(newValue);
86 static void recoverMemory(Calculator c, double data) {
91 static void removeMemory(Calculator c, double data) {
92 c.getHistory().remove(data);
95 private static double compute(String op, double memory, double display) {
97 case "plus": return memory + display;
98 case "minus": return memory - display;
99 case "mul": return memory * display;
100 case "div": return memory / display;
101 default: throw new IllegalStateException(op);
105 @On(event = CLICK, id={"n0", "n1", "n2", "n3", "n4", "n5", "n6", "n7", "n8", "n9"})
106 static void addDigit(String id, Calculator c) {
107 id = id.substring(1);
109 double v = c.getDisplay();
111 c.setDisplay(Integer.parseInt(id));
113 String txt = Double.toString(v);
114 if (txt.endsWith(".0")) {
115 txt = txt.substring(0, txt.length() - 2);
118 c.setDisplay(Double.parseDouble(txt));
123 public static String displayPreview(
124 double display, boolean hover, double memory, String operation
127 return "Type numbers and perform simple operations! Press '=' to get result.";
129 return "Attempt to compute " + memory + " " + operation + " " + display + " = " + compute(operation, memory, display);
133 static boolean emptyHistory(List<?> history) {
134 return history.isEmpty();
137 @JavaScriptBody(args = { }, body =
138 "var xhttp = new XMLHttpRequest();\n" +
139 "xhttp.open('GET', '/?exit=true', true);\n" +
142 private static native void notifyFinish();