jaroslav@1941: /** jaroslav@1941: * Back 2 Browser Bytecode Translator jaroslav@1941: * Copyright (C) 2012-2015 Jaroslav Tulach jaroslav@1941: * jaroslav@1941: * This program is free software: you can redistribute it and/or modify jaroslav@1941: * it under the terms of the GNU General Public License as published by jaroslav@1941: * the Free Software Foundation, version 2 of the License. jaroslav@1941: * jaroslav@1941: * This program is distributed in the hope that it will be useful, jaroslav@1941: * but WITHOUT ANY WARRANTY; without even the implied warranty of jaroslav@1941: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the jaroslav@1941: * GNU General Public License for more details. jaroslav@1941: * jaroslav@1941: * You should have received a copy of the GNU General Public License jaroslav@1941: * along with this program. Look for COPYING file in the top folder. jaroslav@1941: * If not, see http://opensource.org/licenses/GPL-2.0. jaroslav@1941: */ jaroslav@1941: package org.apidesign.bck2brwsr.kosample; jaroslav@1941: jaroslav@1947: import java.util.Timer; jaroslav@1944: import java.util.TimerTask; jaroslav@1941: import net.java.html.json.ComputedProperty; jaroslav@1941: import net.java.html.json.Function; jaroslav@1941: import net.java.html.json.Model; jaroslav@1947: import net.java.html.json.ModelOperation; jaroslav@1941: import net.java.html.json.Property; jaroslav@1941: import org.apidesign.bck2brwsr.kosample.js.Dialogs; jaroslav@1941: jaroslav@1941: /** Model annotation generates class Data with jaroslav@1941: * one message property, boolean property and read only words property jaroslav@1941: */ jaroslav@1947: @Model(className = "Data", targetId="", instance = true, properties = { jaroslav@1941: @Property(name = "message", type = String.class), jaroslav@1941: @Property(name = "rotating", type = boolean.class) jaroslav@1941: }) jaroslav@1941: final class DataModel { jaroslav@1941: @ComputedProperty static java.util.List words(String message) { jaroslav@1941: String[] arr = new String[6]; jaroslav@1941: String[] words = message == null ? new String[0] : message.split(" ", 6); jaroslav@1941: for (int i = 0; i < 6; i++) { jaroslav@1941: arr[i] = words.length > i ? words[i] : "!"; jaroslav@1941: } jaroslav@1941: return java.util.Arrays.asList(arr); jaroslav@1941: } jaroslav@1941: jaroslav@1941: @Function static void turnAnimationOn(Data model) { jaroslav@1941: model.setRotating(true); jaroslav@1941: } jaroslav@1941: jaroslav@1941: @Function static void turnAnimationOff(final Data model) { jaroslav@1941: Dialogs.confirmByUser("Really turn off?", new Runnable() { jaroslav@1941: @Override jaroslav@1941: public void run() { jaroslav@1941: model.setRotating(false); jaroslav@1941: } jaroslav@1941: }); jaroslav@1941: } jaroslav@1941: jaroslav@1947: private static final Timer TIMER = new Timer("Pending tasks"); jaroslav@1944: private static void schedule(Runnable run, long delay) { jaroslav@1944: TIMER.schedule(new TimerTask() { jaroslav@1944: @Override jaroslav@1944: public void run() { jaroslav@1944: run.run(); jaroslav@1944: } jaroslav@1944: }, delay); jaroslav@1944: } jaroslav@1944: jaroslav@1941: @Function static void rotate5s(final Data model) { jaroslav@1941: model.setRotating(true); jaroslav@1944: schedule(() -> model.setRotating(false), 5000); jaroslav@1941: } jaroslav@1941: jaroslav@1941: @Function static void showScreenSize(Data model) { jaroslav@1941: model.setMessage(Dialogs.screenSize()); jaroslav@1941: } jaroslav@1941: private static Data ui; jaroslav@1941: /** jaroslav@1941: * Called when the page is ready. jaroslav@1941: */ jaroslav@1941: static void onPageLoad() throws Exception { jaroslav@1941: ui = new Data(); jaroslav@1941: ui.setMessage("Hello World from HTML and Java!"); jaroslav@1941: ui.applyBindings(); jaroslav@1947: jaroslav@1947: schedule(() -> ui.startTest(), 1000); jaroslav@1947: } jaroslav@1947: jaroslav@1947: // jaroslav@1947: // testing jaroslav@1947: // jaroslav@1947: jaroslav@1947: @ModelOperation jaroslav@1947: static void startTest(Data model) { jaroslav@1947: Dialogs.triggerClick("beginTest"); jaroslav@1947: } jaroslav@1947: jaroslav@1947: private boolean inTesting; jaroslav@1947: jaroslav@1947: @Function jaroslav@1947: void beginTest(Data model) { jaroslav@1947: if (inTesting) { jaroslav@1947: model.setRotating(false); jaroslav@1947: model.setMessage("Hello World from HTML and Java!"); jaroslav@1947: inTesting = false; jaroslav@1947: return; jaroslav@1947: } jaroslav@1947: jaroslav@1947: inTesting = true; jaroslav@1947: model.setMessage("In testing mode stop Automatic testing?"); jaroslav@1947: model.setRotating(true); jaroslav@1947: schedule(() -> { jaroslav@1947: if (inTesting) { jaroslav@1947: model.setMessage("In testing mode count down 3s"); jaroslav@1947: } jaroslav@1947: }, 3000); jaroslav@1947: schedule(() -> { jaroslav@1947: if (inTesting) { jaroslav@1947: model.setMessage("In testing mode count down 2s"); jaroslav@1947: } jaroslav@1947: }, 4000); jaroslav@1947: schedule(() -> { jaroslav@1947: if (inTesting) { jaroslav@1947: model.setMessage("In testing mode count down 1s"); jaroslav@1947: } jaroslav@1947: }, 5000); jaroslav@1947: schedule(() -> { jaroslav@1947: if (inTesting) { jaroslav@1947: model.setMessage("Finished testing mode close the browser"); jaroslav@1947: model.setRotating(false); jaroslav@1947: System.exit(0); jaroslav@1947: } jaroslav@1947: }, 6000); jaroslav@1941: } jaroslav@1941: }