package org.ripple.power.ui.view;
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;
public class WaitCursorEventQueue extends EventQueue {
public WaitCursorEventQueue(int delay) {
this.delay = delay;
waitTimer = new WaitCursorTimer();
waitTimer.setDaemon(true);
waitTimer.start();
}
protected void dispatchEvent(AWTEvent event) {
waitTimer.startTimer(event.getSource());
try {
super.dispatchEvent(event);
} finally {
waitTimer.stopTimer();
}
}
private int delay;
private WaitCursorTimer waitTimer;
private class WaitCursorTimer extends Thread {
private Object source;
private Component parent;
synchronized void startTimer(Object source) {
this.source = source;
notify();
}
synchronized void stopTimer() {
if (parent == null) {
interrupt();
} else {
parent.setCursor(null);
parent = null;
}
}
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) {
}
}
}
}
}