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@513: package org.apidesign.bck2brwsr.demo.calc; jaroslav@141: jaroslav@505: 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@505: @Property(name = "memory", type = double.class), jaroslav@505: @Property(name = "display", type = double.class), jaroslav@505: @Property(name = "operation", type = String.class), jaroslav@763: @Property(name = "hover", type = boolean.class), jaroslav@763: @Property(name = "results", type = String.class, array = true) jaroslav@492: }) jaroslav@513: public class Calc { jaroslav@513: static { jaroslav@763: Calculator m = new Calculator(); jaroslav@763: m.applyBindings(); jaroslav@513: } jaroslav@141: jaroslav@435: @On(event = CLICK, id="clear") jaroslav@513: static void clear(Calculator c) { jaroslav@513: c.setMemory(0); jaroslav@513: c.setOperation(null); jaroslav@513: c.setDisplay(0); jtulach@197: } jtulach@197: jaroslav@435: @On(event = CLICK, id= { "plus", "minus", "mul", "div" }) jaroslav@831: static void applyOp(Calculator c, String id) { jaroslav@513: c.setMemory(c.getDisplay()); jaroslav@831: c.setOperation(id); jaroslav@513: c.setDisplay(0); jaroslav@505: } jaroslav@505: jaroslav@505: @On(event = MOUSE_OVER, id= { "result" }) jaroslav@831: static void attemptingIn(Calculator c) { jaroslav@513: c.setHover(true); jaroslav@505: } jaroslav@505: @On(event = MOUSE_OUT, id= { "result" }) jaroslav@831: static void attemptingOut(Calculator c) { jaroslav@513: c.setHover(false); jtulach@197: } jtulach@197: jaroslav@435: @On(event = CLICK, id="result") jaroslav@513: static void computeTheValue(Calculator c) { jaroslav@763: final double val = compute( jaroslav@513: c.getOperation(), jaroslav@513: c.getMemory(), jaroslav@513: c.getDisplay() jaroslav@763: ); jaroslav@763: c.getResults().add("another result " + val); jaroslav@763: c.setDisplay(val); jaroslav@513: c.setMemory(0); jaroslav@505: } jaroslav@505: jaroslav@505: private static double compute(String op, double memory, double display) { jaroslav@505: switch (op) { jaroslav@505: case "plus": return memory + display; jaroslav@505: case "minus": return memory - display; jaroslav@505: case "mul": return memory * display; jaroslav@505: case "div": return memory / display; jaroslav@505: 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@831: static void addDigit(String id, Calculator c) { jaroslav@831: id = id.substring(1); jaroslav@492: jaroslav@513: double v = c.getDisplay(); jaroslav@492: if (v == 0.0) { jaroslav@831: c.setDisplay(Integer.parseInt(id)); jtulach@197: } else { jaroslav@505: String txt = Double.toString(v); jaroslav@505: if (txt.endsWith(".0")) { jaroslav@505: txt = txt.substring(0, txt.length() - 2); jaroslav@505: } jaroslav@831: txt = txt + id; jaroslav@513: c.setDisplay(Double.parseDouble(txt)); jaroslav@141: } jaroslav@141: } jaroslav@505: jaroslav@505: @ComputedProperty jaroslav@505: public static String displayPreview( jaroslav@505: double display, boolean hover, double memory, String operation jaroslav@505: ) { jaroslav@505: if (!hover) { jaroslav@505: return "Type numbers and perform simple operations! Press '=' to get result."; jaroslav@505: } jaroslav@505: return "Attempt to compute " + memory + " " + operation + " " + display + " = " + compute(operation, memory, display); jaroslav@505: } jaroslav@141: }