/*
 * @author Ranides Atterwim <ranides@gmail.com>
 * @copyright Ranides Atterwim
 * @license WTFPL
 * @url http://ranides.net/projects/assira
 */
package net.ranides.assira.time;

import java.util.TimerTask;

/**
 * Użycie:
 * <pre>
 *   {@code LazyInvoker action = new LazyInvoker(true, 1000) { 
 *      public void run() {
 *        // action ...
 *      }
 *   };}</pre>
 * Następnie np w "onKeyPress" kolejkujemy wykonanie:
 * <pre>
 *  {@code action.runLazy() }</pre>
 * 
 * Mimo, że {@link #runLazy} może być wywoływane wielokrotnie w odstępach 
 * {@code t<1000}, to {@link #run} uruchomi się tylko raz, {@code 1000}ms 
 * po ostatnim wywołaniu {@link #runLazy}.
 * 
 * @author ranides
 * @todo (migration) assira
 */
public abstract class LazyInvoker implements Runnable {
    
    private TimerTask task;
    private final int delay;
    private final boolean awt;

    public LazyInvoker(boolean awt, int delay) {
        this.delay = delay;
        this.awt = awt;
    }
        
    public void runLazy() {
        synchronized(this) {
            if (task != null) {
                task.cancel();
            }
            task = awt ? TimeUtils.runAfterUI(delay, this) : TimeUtils.runAfter(delay, this);
        }
    }

}
