import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;

/**
 * 
 * ToolTipGenerator
 *
 * @version     1.0
 * @author :    Kovalan Muniandy
 *
 */
 
 public class ToolTipGenerator extends java.awt.event.MouseMotionAdapter {
    Timer timer = null;
    ToolTipTrigger trigger = null;
    public ToolTipGenerator( ToolTipTrigger theTrigger, int delay ) {
        super();
        timer = new Timer( delay );
        timer.start();
        trigger = theTrigger;
    }
    Point pt = null;
    public void mouseMoved(MouseEvent e) {
        pt = e.getPoint();
        timer.restart();
    }
    protected class Timer extends Thread implements Runnable {
        long WAIT_TIME=0;
        long last = -1;
        Point lastPt = null;
        public Timer( long waitTime ) {
            WAIT_TIME = waitTime;
        }
        public void run() {
            while ( true ) {
                try {
                    long elapsed = -1;
                    if ( last != -1 && null != lastPt ) {
                        elapsed = System.currentTimeMillis() - last;
                        while ( elapsed > 0 && pt != null ) {
                            if ( elapsed > WAIT_TIME ) {
                                if ( lastPt.equals(pt) ) {
                                    try {
                                        trigger.startToolTip( pt );
                                    }
                                    catch ( Exception e ) {
                                        ConsoleDebugger.instance().DbgToConsole(
                                            "Couldn't trigger tooltip: " + e );
                                        e.printStackTrace();
                                    }
                                    lastPt = pt = null;
                                }
                            }
                            else
                                Thread.sleep( WAIT_TIME - elapsed );
                            elapsed = System.currentTimeMillis() - last;
                        }
                    }
                    lastPt = pt;
                    elapsed = System.currentTimeMillis() - last;
                    if ( last != -1 && elapsed < WAIT_TIME )
                        Thread.sleep( WAIT_TIME - elapsed );
                    else
                        Thread.sleep(60000);
                }
                catch ( InterruptedException e ) {
                }
            }
        }
        public void restart() {
            last = System.currentTimeMillis();
            interrupt();
        }
    }
 }