/*
* Created on Mar 24, 2006
*/
package org.seqcode.projects.seqview;
import java.util.*;
import org.seqcode.gseutils.*;
/**
* @author tdanford
*/
public class EventHandler<X extends EventObject> implements Listener<X> {
private LinkedList<X> eventQueue;
private LinkedList<Listener<X>> listeners;
private HandlerRunner runner;
public EventHandler() {
eventQueue = new LinkedList<X>();
listeners = new LinkedList<Listener<X>>();
Thread t = new Thread((runner = new HandlerRunner()));
t.start();
}
public synchronized void addEventListener(Listener<X> m) {
listeners.addLast(m);
}
/* (non-Javadoc)
* @see org.seqcode.gseutils.Listener#eventRegistered(java.lang.Object)
*/
public synchronized void eventRegistered(X e) {
System.out.println("+++ Adding HAE to Event Queue");
eventQueue.addLast(e);
//eventQueue.notifyAll();
handlerNotify();
}
private synchronized void handlerWait() {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
private synchronized void handlerNotify() {
notifyAll();
}
private X getNextEvent() {
X evt = null;
synchronized(this) {
while(evt == null) {
handlerWait();
if(!eventQueue.isEmpty()) {
System.out.println("--- Removing HAE From Event Queue");
evt = eventQueue.removeFirst();
}
}
}
return evt;
}
private class HandlerRunner implements Runnable {
private boolean continueRunning;
public HandlerRunner() {
continueRunning = true;
}
public void stop() { continueRunning = false; }
/* (non-Javadoc)
* @see java.lang.Runnable#run()
*/
public void run() {
while(continueRunning) {
X evt = getNextEvent();
synchronized(EventHandler.this) {
for(Listener<X> m : listeners) {
m.eventRegistered(evt);
}
}
}
}
}
}