/* * Copyright (c) 2016, Alex Blewitt, Bandlem Ltd * Copyright (c) 2016, Packt Publishing Ltd * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html */ package com.packtpub.e4.clock.ui; import java.time.ZoneId; import java.time.ZonedDateTime; import org.eclipse.swt.SWT; import org.eclipse.swt.events.PaintEvent; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.RGB; import org.eclipse.swt.widgets.Canvas; import org.eclipse.swt.widgets.Composite; public class ClockWidget extends Canvas { private final Color color; private ZoneId zone = ZoneId.systemDefault(); public ClockWidget(Composite parent, int style, RGB rgb) { super(parent, style); this.color = new Color(parent.getDisplay(), rgb); addDisposeListener(e -> color.dispose()); addPaintListener(this::drawClock); Runnable redraw = () -> { while (!this.isDisposed()) { this.getDisplay().asyncExec(() -> this.redraw()); try { Thread.sleep(1000); } catch (InterruptedException e) { return; } } }; new Thread(redraw, "TickTock").start(); } private void drawClock(PaintEvent e) { e.gc.drawArc(e.x, e.y, e.width - 1, e.height - 1, 0, 360); ZonedDateTime now = ZonedDateTime.now(zone); int seconds = now.getSecond(); int arc = (15 - seconds) * 6 % 360; if (handColor == null) { e.gc.setBackground(color); } else { e.gc.setBackground(handColor); } e.gc.fillArc(e.x, e.y, e.width - 1, e.height - 1, arc - 1, 2); e.gc.setBackground(e.display.getSystemColor(SWT.COLOR_BLACK)); int hours = now.getHour(); arc = (3 - hours) * 30 % 360; e.gc.fillArc(e.x, e.y, e.width - 1, e.height - 1, arc - 5, 10); } public Point computeSize(int w, int h, boolean changed) { int size; if (w == SWT.DEFAULT) { size = h; } else if (h == SWT.DEFAULT) { size = w; } else { size = Math.min(w, h); } if (size == SWT.DEFAULT) { size = 50; } return new Point(size, size); } public void setZone(ZoneId zone) { this.zone = zone; } // This does not work - add a dispose listener instead // @Override // public void dispose() { // if (color != null && !color.isDisposed()) // color.dispose(); // super.dispose(); // } private Color handColor; public Color getHandColor() { if (handColor == null) { return color; } else { return handColor; } } public void setHandColor(Color color) { handColor = color; } }