package org.korsakow.ide.ui.controller; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.Collection; import java.util.Hashtable; import javax.swing.Timer; /** * Schedules runnables by class. Used so that tasks that need to be performed once * but may be scheduled several times over a short period are only run once. * @author d * */ public class CommonTaskScheduler implements ActionListener { private Hashtable<Class, Runnable> queue = new Hashtable<Class, Runnable>(); Timer timer; private boolean paused = false; public CommonTaskScheduler() { timer = new Timer(100, this); } public boolean has(Class key) { return queue.containsKey(key); } public void start() { paused = false; if (!timer.isRunning()) timer.start(); } public void stop() { paused = true; if (timer.isRunning()) timer.stop(); } public void enqueue(Runnable runnable) { Class clazz = runnable.getClass(); queue.put(clazz, runnable); if (!paused && !timer.isRunning()) timer.start(); } public void actionPerformed(ActionEvent event) { Collection<Runnable> runs = new ArrayList<Runnable>(queue.values()); queue.clear(); for (Runnable runnable : runs) runnable.run(); if (queue.isEmpty()) timer.stop(); } }