package dew.demo.time; import java.util.ArrayList; import java.util.List; import net.java.html.json.ComputedProperty; import net.java.html.json.Model; import net.java.html.json.ModelOperation; import net.java.html.json.Property; @Model(className = "ClockModel", properties = { @Property(name = "time", type = long.class) }) final class ClockCntrl { @ComputedProperty static int second(long time) { long sec = time / 1000L; return (int)(sec % 60); } @ComputedProperty static int minute(long time) { long min = time / (60 * 1000L); return (int)(min % 60); } @ComputedProperty static int hour(long time) { return (int) exactHour(time); } private static double exactHour(long time) { double hour = time / (3600.0 * 1000); return Math.IEEEremainder(hour, 12.0); } @ComputedProperty static String transformSecond(long time) { return "rotate(" + (second(time) * 6 + 90) + "deg)"; } @ComputedProperty static String transformMinute(long time) { return "rotate(" + (minute(time) * 6 + 90) + "deg)"; } @ComputedProperty static String transformHour(long time) { return "rotate(" + (exactHour(time) * 30.0 + 90) + "deg)"; } @ComputedProperty static List transformByQuarter() { return anglesBy(90); } @ComputedProperty static List transformByFive() { return anglesBy(30); } @ComputedProperty static List transformByOne() { return anglesBy(6); } private static List anglesBy(int by) { List arr = new ArrayList<>(); for (int angle = 0; angle < 360; angle += by) { arr.add("rotate(" + angle + "deg)"); } return arr; } @ModelOperation static void update(final ClockModel model, final boolean repeating) { model.setTime(System.currentTimeMillis()); if (repeating) { java.util.Timer timer = new java.util.Timer("Rotates a while"); timer.schedule(new java.util.TimerTask() { @Override public void run() { update(model, repeating); } }, 1000); } } static { new ClockModel().applyBindings().update(true); } }