/*
* codjo.net
*
* Common Apache License 2.0
*/
package net.codjo.gui;
import java.awt.AWTEvent;
import java.awt.Component;
import java.awt.Cursor;
import java.awt.EventQueue;
import java.awt.MenuComponent;
import java.awt.MenuContainer;
import javax.swing.SwingUtilities;
/**
* Gestion de l'affichage du curseur 'Sablier'
*
* @version $Revision: 1.3 $
*
*
*/
public class WaitCursorEventQueue extends EventQueue {
private int delay;
private WaitCursorTimer waitTimer;
/**
* Constructor for the WaitCursorEventQueue object
*
* @param delay D�lai (millisecondes) avant affichage du sablier
*/
public WaitCursorEventQueue(int delay) {
this.delay = delay;
waitTimer = new WaitCursorTimer();
waitTimer.setDaemon(true);
waitTimer.start();
}
/**
* Description of the Method
*
* @param event Description of the Parameter
*/
protected void dispatchEvent(AWTEvent event) {
waitTimer.startTimer(event.getSource());
try {
super.dispatchEvent(event);
}
finally {
waitTimer.stopTimer();
}
}
private class WaitCursorTimer extends Thread {
private Object source;
private Component parent;
/**
* Main processing method for the WaitCursorTimer object
*/
public synchronized void run() {
while (true) {
try {
wait();
wait(delay);
if (source instanceof Component) {
parent = SwingUtilities.getRoot((Component)source);
}
else if (source instanceof MenuComponent) {
MenuContainer mParent = ((MenuComponent)source).getParent();
if (mParent instanceof Component) {
parent = SwingUtilities.getRoot((Component)mParent);
}
}
if (parent != null && parent.isShowing()) {
parent.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
}
}
catch (InterruptedException ie) {}
}
}
synchronized void startTimer(Object source) {
this.source = source;
notify();
}
synchronized void stopTimer() {
if (parent == null) {
interrupt();
}
else {
parent.setCursor(null);
parent = null;
}
parent = null;
source = null;
}
}
}