18f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggipackage aurelienribon.utils.swing;
28f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi
38f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggiimport java.awt.event.ActionEvent;
48f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggiimport java.awt.event.ActionListener;
58f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggiimport javax.swing.JPanel;
68f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggiimport javax.swing.Timer;
78f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi
88f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi/**
98f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi * @author Aurelien Ribon | http://www.aurelienribon.com
108f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi */
118f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggipublic abstract class DrawingCanvas extends JPanel {
128f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi	private final Timer timer;
138f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi	private long lastMillis;
148f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi	private Callback callback;
158f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi
168f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi	public DrawingCanvas() {
178f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi		timer = new Timer(1000/60, loop);
188f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi		timer.setRepeats(true);
198f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi	}
208f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi
218f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi	protected abstract void update(int elapsedMillis);
228f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi
238f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi	public DrawingCanvas start() {
248f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi		lastMillis = System.currentTimeMillis();
258f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi		timer.start();
268f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi		return this;
278f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi	}
288f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi
298f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi	public void stop() {
308f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi		timer.stop();
318f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi	}
328f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi
338f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi	public void setCallback(Callback callback) {
348f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi		this.callback = callback;
358f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi	}
368f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi
378f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi	private final ActionListener loop = new ActionListener() {
388f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi		@Override public void actionPerformed(ActionEvent e) {
398f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi			final long millis = System.currentTimeMillis();
408f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi			final long delta = millis - lastMillis;
418f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi			lastMillis = millis;
428f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi
438f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi			update((int) delta);
448f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi			if (callback != null) callback.onUpdate((int) delta);
458f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi		}
468f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi	};
478f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi
488f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi	public interface Callback {
498f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi		public void onUpdate(int elapsedMillis);
508f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi	}
518f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi}
52