1*cdf0e10cSrcweir import com.sun.star.accessibility.*; 2*cdf0e10cSrcweir import com.sun.star.lang.EventObject; 3*cdf0e10cSrcweir 4*cdf0e10cSrcweir import java.util.LinkedList; 5*cdf0e10cSrcweir 6*cdf0e10cSrcweir /** The event queue singleton dispatches events received from OpenOffice.org 7*cdf0e10cSrcweir applications in a thread separate from the AWB main thread. 8*cdf0e10cSrcweir 9*cdf0e10cSrcweir The queue of event objects, LinkedList<Runnable> The queue object will 10*cdf0e10cSrcweir also serve as lock for the consumer/producer type syncronization. 11*cdf0e10cSrcweir */ 12*cdf0e10cSrcweir class EventQueue 13*cdf0e10cSrcweir implements Runnable 14*cdf0e10cSrcweir { 15*cdf0e10cSrcweir public boolean mbVerbose = false; 16*cdf0e10cSrcweir public boolean mbHandleDisposingEventsSynchronous = true; 17*cdf0e10cSrcweir 18*cdf0e10cSrcweir public synchronized static EventQueue Instance () 19*cdf0e10cSrcweir { 20*cdf0e10cSrcweir if (maInstance == null) 21*cdf0e10cSrcweir maInstance = new EventQueue (); 22*cdf0e10cSrcweir return maInstance; 23*cdf0e10cSrcweir } 24*cdf0e10cSrcweir 25*cdf0e10cSrcweir public void addEvent (Runnable aEvent) 26*cdf0e10cSrcweir { 27*cdf0e10cSrcweir synchronized (maMonitor) 28*cdf0e10cSrcweir { 29*cdf0e10cSrcweir if (mbVerbose) 30*cdf0e10cSrcweir System.out.println ("queing regular event " + aEvent); 31*cdf0e10cSrcweir maRegularQueue.addLast (aEvent); 32*cdf0e10cSrcweir maMonitor.notify (); 33*cdf0e10cSrcweir } 34*cdf0e10cSrcweir } 35*cdf0e10cSrcweir 36*cdf0e10cSrcweir 37*cdf0e10cSrcweir public void addDisposingEvent (Runnable aEvent) 38*cdf0e10cSrcweir { 39*cdf0e10cSrcweir if (mbHandleDisposingEventsSynchronous) 40*cdf0e10cSrcweir aEvent.run (); 41*cdf0e10cSrcweir else 42*cdf0e10cSrcweir synchronized (maMonitor) 43*cdf0e10cSrcweir { 44*cdf0e10cSrcweir if (mbVerbose) 45*cdf0e10cSrcweir System.out.println ("queing disposing event " + aEvent); 46*cdf0e10cSrcweir maDisposingQueue.addLast (aEvent); 47*cdf0e10cSrcweir maMonitor.notify (); 48*cdf0e10cSrcweir } 49*cdf0e10cSrcweir } 50*cdf0e10cSrcweir 51*cdf0e10cSrcweir 52*cdf0e10cSrcweir private EventQueue () 53*cdf0e10cSrcweir { 54*cdf0e10cSrcweir maMonitor = new Boolean (true); 55*cdf0e10cSrcweir maRegularQueue = new LinkedList(); 56*cdf0e10cSrcweir maDisposingQueue = new LinkedList(); 57*cdf0e10cSrcweir new Thread(this, "AWB.EventQueue").start(); 58*cdf0e10cSrcweir } 59*cdf0e10cSrcweir 60*cdf0e10cSrcweir 61*cdf0e10cSrcweir /// This thread's main method: deliver all events 62*cdf0e10cSrcweir public void run() 63*cdf0e10cSrcweir { 64*cdf0e10cSrcweir // in an infinite loop, check for events to deliver, then 65*cdf0e10cSrcweir // wait on lock (which will be notified when new events arrive) 66*cdf0e10cSrcweir while( true ) 67*cdf0e10cSrcweir { 68*cdf0e10cSrcweir Runnable aEvent = null; 69*cdf0e10cSrcweir do 70*cdf0e10cSrcweir { 71*cdf0e10cSrcweir synchronized (maMonitor) 72*cdf0e10cSrcweir { 73*cdf0e10cSrcweir if (maDisposingQueue.size() > 0) 74*cdf0e10cSrcweir { 75*cdf0e10cSrcweir aEvent = (Runnable)maDisposingQueue.removeFirst(); 76*cdf0e10cSrcweir if (mbVerbose) 77*cdf0e10cSrcweir System.out.println ("delivering disposing event " + aEvent); 78*cdf0e10cSrcweir } 79*cdf0e10cSrcweir else if (maRegularQueue.size() > 0) 80*cdf0e10cSrcweir { 81*cdf0e10cSrcweir aEvent = (Runnable)maRegularQueue.removeFirst(); 82*cdf0e10cSrcweir if (mbVerbose) 83*cdf0e10cSrcweir System.out.println ("delivering regular event " + aEvent); 84*cdf0e10cSrcweir } 85*cdf0e10cSrcweir else 86*cdf0e10cSrcweir aEvent = null; 87*cdf0e10cSrcweir } 88*cdf0e10cSrcweir if (aEvent != null) 89*cdf0e10cSrcweir { 90*cdf0e10cSrcweir try 91*cdf0e10cSrcweir { 92*cdf0e10cSrcweir aEvent.run(); 93*cdf0e10cSrcweir } 94*cdf0e10cSrcweir catch( Throwable e ) 95*cdf0e10cSrcweir { 96*cdf0e10cSrcweir System.out.println( 97*cdf0e10cSrcweir "caught exception during event delivery: " + e ); 98*cdf0e10cSrcweir e.printStackTrace(); 99*cdf0e10cSrcweir } 100*cdf0e10cSrcweir } 101*cdf0e10cSrcweir } 102*cdf0e10cSrcweir while( aEvent != null ); 103*cdf0e10cSrcweir 104*cdf0e10cSrcweir try 105*cdf0e10cSrcweir { 106*cdf0e10cSrcweir synchronized (maMonitor) 107*cdf0e10cSrcweir { 108*cdf0e10cSrcweir maMonitor.wait(); 109*cdf0e10cSrcweir } 110*cdf0e10cSrcweir } 111*cdf0e10cSrcweir catch (Exception e) 112*cdf0e10cSrcweir { 113*cdf0e10cSrcweir // can't wait? odd! 114*cdf0e10cSrcweir System.err.println("Can't wait!"); 115*cdf0e10cSrcweir e.printStackTrace(); 116*cdf0e10cSrcweir } 117*cdf0e10cSrcweir } 118*cdf0e10cSrcweir } 119*cdf0e10cSrcweir 120*cdf0e10cSrcweir private static EventQueue maInstance = null; 121*cdf0e10cSrcweir private Object maMonitor; 122*cdf0e10cSrcweir private LinkedList maRegularQueue; 123*cdf0e10cSrcweir private LinkedList maDisposingQueue; 124*cdf0e10cSrcweir } 125*cdf0e10cSrcweir 126*cdf0e10cSrcweir 127