jaroslav@142: /** jaroslav@142: * Back 2 Browser Bytecode Translator jaroslav@142: * Copyright (C) 2012 Jaroslav Tulach jaroslav@142: * jaroslav@142: * This program is free software: you can redistribute it and/or modify jaroslav@142: * it under the terms of the GNU General Public License as published by jaroslav@142: * the Free Software Foundation, version 2 of the License. jaroslav@142: * jaroslav@142: * This program is distributed in the hope that it will be useful, jaroslav@142: * but WITHOUT ANY WARRANTY; without even the implied warranty of jaroslav@142: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the jaroslav@142: * GNU General Public License for more details. jaroslav@142: * jaroslav@142: * You should have received a copy of the GNU General Public License jaroslav@142: * along with this program. Look for COPYING file in the top folder. jaroslav@142: * If not, see http://opensource.org/licenses/GPL-2.0. jaroslav@142: */ jaroslav@511: package org.apidesign.bck2brwsr.demo.calc.staticcompilation; jaroslav@141: jaroslav@498: import org.apidesign.bck2brwsr.htmlpage.api.ComputedProperty; jaroslav@435: import org.apidesign.bck2brwsr.htmlpage.api.On; jaroslav@435: import static org.apidesign.bck2brwsr.htmlpage.api.OnEvent.*; jaroslav@141: import org.apidesign.bck2brwsr.htmlpage.api.Page; jaroslav@492: import org.apidesign.bck2brwsr.htmlpage.api.Property; jaroslav@141: jaroslav@198: /** HTML5 & Java demo showing the power of jaroslav@198: * annotation processors jaroslav@198: * as well as other goodies. jaroslav@198: * jaroslav@198: * @author Jaroslav Tulach jaroslav@198: */ jaroslav@492: @Page(xhtml="Calculator.xhtml", properties = { jaroslav@498: @Property(name = "memory", type = double.class), jaroslav@498: @Property(name = "display", type = double.class), jaroslav@498: @Property(name = "operation", type = String.class), jaroslav@877: @Property(name = "hover", type = boolean.class), jaroslav@877: @Property(name = "history", type = double.class, array = true) jaroslav@492: }) jaroslav@511: public class Calc { jaroslav@510: static { jaroslav@510: new Calculator().applyBindings(); jaroslav@510: } jaroslav@505: jaroslav@435: @On(event = CLICK, id="clear") jaroslav@510: static void clear(Calculator c) { jaroslav@510: c.setMemory(0); jaroslav@510: c.setOperation(null); jaroslav@510: c.setDisplay(0); jtulach@197: } jtulach@197: jaroslav@435: @On(event = CLICK, id= { "plus", "minus", "mul", "div" }) jaroslav@830: static void applyOp(Calculator c, String id) { jaroslav@510: c.setMemory(c.getDisplay()); jaroslav@830: c.setOperation(id); jaroslav@510: c.setDisplay(0); jtulach@197: } jaroslav@498: jaroslav@498: @On(event = MOUSE_OVER, id= { "result" }) jaroslav@830: static void attemptingIn(Calculator c) { jaroslav@510: c.setHover(true); jaroslav@498: } jaroslav@498: @On(event = MOUSE_OUT, id= { "result" }) jaroslav@830: static void attemptingOut(Calculator c) { jaroslav@510: c.setHover(false); jaroslav@498: } jtulach@197: jaroslav@435: @On(event = CLICK, id="result") jaroslav@510: static void computeTheValue(Calculator c) { jaroslav@877: final double newValue = compute( jaroslav@510: c.getOperation(), jaroslav@510: c.getMemory(), jaroslav@510: c.getDisplay() jaroslav@877: ); jaroslav@877: c.setDisplay(newValue); jaroslav@877: c.getHistory().add(newValue); jaroslav@510: c.setMemory(0); jaroslav@498: } jaroslav@498: jaroslav@498: private static double compute(String op, double memory, double display) { jaroslav@498: switch (op) { jaroslav@498: case "plus": return memory + display; jaroslav@498: case "minus": return memory - display; jaroslav@498: case "mul": return memory * display; jaroslav@498: case "div": return memory / display; jaroslav@498: default: throw new IllegalStateException(op); jtulach@197: } jtulach@197: } jtulach@197: jaroslav@435: @On(event = CLICK, id={"n0", "n1", "n2", "n3", "n4", "n5", "n6", "n7", "n8", "n9"}) jaroslav@830: static void addDigit(String id, Calculator c) { jaroslav@830: id = id.substring(1); jaroslav@492: jaroslav@510: double v = c.getDisplay(); jaroslav@492: if (v == 0.0) { jaroslav@830: c.setDisplay(Integer.parseInt(id)); jtulach@197: } else { jaroslav@495: String txt = Double.toString(v); jaroslav@495: if (txt.endsWith(".0")) { jaroslav@495: txt = txt.substring(0, txt.length() - 2); jaroslav@495: } jaroslav@830: txt = txt + id; jaroslav@510: c.setDisplay(Double.parseDouble(txt)); jtulach@197: } jaroslav@141: } jaroslav@498: jaroslav@498: @ComputedProperty jaroslav@498: public static String displayPreview( jaroslav@498: double display, boolean hover, double memory, String operation jaroslav@498: ) { jaroslav@498: if (!hover) { jaroslav@498: return "Type numbers and perform simple operations! Press '=' to get result."; jaroslav@498: } jaroslav@498: return "Attempt to compute " + memory + " " + operation + " " + display + " = " + compute(operation, memory, display); jaroslav@498: } jaroslav@141: }