1 package net.sf.panoptes.swing.cursor; 2 3 import java.awt.AWTEvent ; 4 import java.awt.EventQueue ; 5 import java.awt.Toolkit ; 6 import java.awt.event.InputEvent ; 7 import java.util.ArrayList ; 8 import java.util.Iterator ; 9 import java.util.Stack ; 10 11 class CursorManager { 12 private final DelayTimer waitTimer; 13 private final Stack dispatchedEvents; 14 private boolean needsCleanup; 15 16 public CursorManager(DelayTimer waitTimer) { 17 this.dispatchedEvents = new Stack (); 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 q = Toolkit.getDefaultToolkit().getSystemEventQueue(); 27 synchronized (q) { 28 ArrayList nonInputEvents = gatherNonInputEvents(q); 29 for (Iterator it = nonInputEvents.iterator(); it.hasNext();) 30 q.postEvent((AWTEvent )it.next()); 31 } 32 } 33 private ArrayList gatherNonInputEvents(EventQueue systemQueue) { 34 ArrayList events = new ArrayList (); 35 while (systemQueue.peekEvent() != null) { 36 try { 37 AWTEvent nextEvent = systemQueue.getNextEvent(); 38 if (!(nextEvent instanceof InputEvent )) { 39 events.add(nextEvent); 40 } 41 } catch (InterruptedException ie) { 42 Thread.currentThread().interrupt(); 43 } 44 } 45 return events; 46 } 47 public void push(Object source) { 48 if (needsCleanup) { 49 waitTimer.stopTimer(); 50 cleanUp(); } 53 dispatchedEvents.push(new DispatchedEvent(source)); 54 needsCleanup = true; 55 } 56 public void pop() { 57 cleanUp(); 58 dispatchedEvents.pop(); 59 if (!dispatchedEvents.isEmpty()) { 60 waitTimer.startTimer(); 63 } else { 64 needsCleanup = false; 65 } 66 } 67 public void setCursor() { 68 ((DispatchedEvent) dispatchedEvents.peek()).setCursor(); 69 } 70 } | Popular Tags |