X-Git-Url: http://git.nikiroo.be/?p=fanfix.git;a=blobdiff_plain;f=src%2Fbe%2Fnikiroo%2Futils%2Fui%2FDelayWorker.java;fp=src%2Fbe%2Fnikiroo%2Futils%2Fui%2FDelayWorker.java;h=3618b89e51e25e28c6a549181065e89b59d67468;hp=0000000000000000000000000000000000000000;hb=f19b48e27a56ebab18687debd9ef52581a03f06d;hpb=dfa4091ccd9f46687c7326aa6bf2eaf588a7cb83 diff --git a/src/be/nikiroo/utils/ui/DelayWorker.java b/src/be/nikiroo/utils/ui/DelayWorker.java new file mode 100644 index 0000000..3618b89 --- /dev/null +++ b/src/be/nikiroo/utils/ui/DelayWorker.java @@ -0,0 +1,220 @@ +package be.nikiroo.utils.ui; + +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; +import java.util.TreeSet; + +import javax.swing.SwingWorker; + +/** + * This class helps you delay some graphical actions and execute the most recent + * ones when under contention. + *
+ * How does it work? + *
+ * Can be called even if already paused, will just do nothing in that + * context. + */ + public void pause() { + paused = true; + } + + /** + * Check if the {@link DelayWorker} is currently paused. + * + * @return TRUE if it is + */ + public boolean isPaused() { + return paused; + } + + /** + * Resume the system after a pause. + *
+ * Can be called even if already running, will just do nothing in that + * context. + */ + public void resume() { + synchronized (waiter) { + paused = false; + wakeup(); + } + } + + /** + * Stop the system. + *
+ * Note: this is final, you MUST NOT call {@link DelayWorker#start()} + * a second time (but see {@link DelayWorker#pause()} and + * {@link DelayWorker#resume()} instead). + */ + public void stop() { + synchronized (waiter) { + cont = false; + wakeup(); + } + } + + /** + * Clear all the processes that were put on the queue but not yet scheduled + * to be executed -- note that it will still continue on the processes + * currently scheduled to run. + */ + public void clear() { + synchronized (lazyEnCoursLock) { + lazyEnCours.clear(); + wip.clear(); + } + } + + /** + * Put a new process in the delay queue. + * + * @param id + * the ID of this process (if you want to skip workers when they + * are superseded by a new one, you need to use the same ID key) + * @param worker + * the process to delay + */ + public void delay(final String id, final SwingWorker worker) { + synchronized (lazyEnCoursLock) { + lazyEnCours.put(id, worker); + } + + wakeup(); + } + + /** + * Wake up the loop thread. + */ + private void wakeup() { + synchronized (waiter) { + waiter.notifyAll(); + } + } +}