KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > net > sf > panoptes > swing > cursor > CursorManager


1 package net.sf.panoptes.swing.cursor;
2
3 import java.awt.AWTEvent JavaDoc;
4 import java.awt.EventQueue JavaDoc;
5 import java.awt.Toolkit JavaDoc;
6 import java.awt.event.InputEvent JavaDoc;
7 import java.util.ArrayList JavaDoc;
8 import java.util.Iterator JavaDoc;
9 import java.util.Stack JavaDoc;
10
11 class CursorManager {
12   private final DelayTimer waitTimer;
13   private final Stack JavaDoc dispatchedEvents;
14   private boolean needsCleanup;
15
16   public CursorManager(DelayTimer waitTimer) {
17     this.dispatchedEvents = new Stack JavaDoc();
18     this.waitTimer = waitTimer;
19   }
20   private void cleanUp() {
21     if (((DispatchedEvent) dispatchedEvents.peek()).resetCursor()) {
22       clearQueueOfInputEvents();
23     }
24   }
25   private void clearQueueOfInputEvents() {
26     EventQueue JavaDoc q = Toolkit.getDefaultToolkit().getSystemEventQueue();
27     synchronized (q) {
28       ArrayList JavaDoc nonInputEvents = gatherNonInputEvents(q);
29       for (Iterator JavaDoc it = nonInputEvents.iterator(); it.hasNext();)
30         q.postEvent((AWTEvent JavaDoc)it.next());
31     }
32   }
33   private ArrayList JavaDoc gatherNonInputEvents(EventQueue JavaDoc systemQueue) {
34     ArrayList JavaDoc events = new ArrayList JavaDoc();
35     while (systemQueue.peekEvent() != null) {
36       try {
37         AWTEvent JavaDoc nextEvent = systemQueue.getNextEvent();
38         if (!(nextEvent instanceof InputEvent JavaDoc)) {
39           events.add(nextEvent);
40         }
41       } catch (InterruptedException JavaDoc ie) {
42         Thread.currentThread().interrupt();
43       }
44     }
45     return events;
46   }
47   public void push(Object JavaDoc source) {
48     if (needsCleanup) {
49       waitTimer.stopTimer();
50       cleanUp(); //this corrects the state when a modal dialog
51
//opened last time round
52
}
53     dispatchedEvents.push(new DispatchedEvent(source));
54     needsCleanup = true;
55   }
56   public void pop() {
57     cleanUp();
58     dispatchedEvents.pop();
59     if (!dispatchedEvents.isEmpty()) {
60       //this will be stopped if getNextEvent() is called -
61
//used to watch for modal dialogs closing
62
waitTimer.startTimer();
63     } else {
64       needsCleanup = false;
65     }
66   }
67   public void setCursor() {
68     ((DispatchedEvent) dispatchedEvents.peek()).setCursor();
69   }
70 }
Popular Tags