/*
* JavaXYQ Engine
*
* javaxyq@2008 all rights.
* http://www.javaxyq.com
*/
package com.javaxyq.event;
import java.awt.Component;
import java.util.EventObject;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
/**
* @author ����ΰ
* @history 2008-6-18 ����ΰ �½�
*/
public class EventDispatcher<S extends EventTarget, E extends EventObject> extends Thread{
/** �¼�������ʵ���� */
private static final Map<Object, EventDispatcher> instances = new HashMap<Object, EventDispatcher>();
private static EventDispatcher dispatcher;
private BlockingQueue<E> eventQueue = new LinkedBlockingQueue<E>();
//private EventProcessor eventProcessor = null;
private static int processorCount;
private static final int ANY_EVENT = -1;
private EventDispatcher() {
//eventProcessor = new EventProcessor();
//eventProcessor.start();
processorCount++;
setName("EventDispatcher-" + processorCount);
setDaemon(true);
}
public void dispatchEvent(E evt) {
eventQueue.offer(evt);
}
synchronized public static <T1 extends EventTarget, T2 extends EventObject> EventDispatcher<T1, T2> getInstance(
Class<T1> clazz1, Class<T2> clazz2) {
EventDispatcher<T1, T2> dispatcher = instances.get(clazz1);
if (dispatcher == null) {
dispatcher = new EventDispatcher<T1, T2>();
instances.put(clazz1, dispatcher);
dispatcher.start();
}
return dispatcher;
}
synchronized public static EventDispatcher getInstance() {
if (dispatcher == null) {
dispatcher = new EventDispatcher();
dispatcher.start();
}
return dispatcher;
}
public void pumpEvents(Conditional cond) {
pumpEvents(ANY_EVENT, cond);
}
/**
* TODO filter events
* @param anyEvent
* @param cond
*/
public void pumpEvents(int id, Conditional cond) {
while (cond.evaluate()) {
// System.out.println(this.getId()+" "+this.getName());
try {
// �ȴ���һ���¼�
E evt = eventQueue.take();
if (evt != null) {
//System.out.println("handle event: "+evt);
((S) evt.getSource()).handleEvent(evt);
}
} catch (Exception e) {
System.err.println("event process error!");
e.printStackTrace();
}
}
}
public void run() {
System.out.println(getName()+" starting...");
pumpEvents(new Conditional() {
public boolean evaluate() {
return true;
}
});
System.out.println(getName()+" stopped.");
}
/**
* @param currentThread
* @param cond
*/
public static void pumpEvents(Thread currentThread, Conditional cond) {
if (currentThread instanceof EventDispatcher) {
EventDispatcher dispatcher = (EventDispatcher) currentThread;
dispatcher.pumpEvents(cond);
}
}
/* private class EventProcessor extends Thread {
public EventProcessor() {
processorCount++;
setName("EventProcessor-" + processorCount);
setDaemon(true);
}
@Override
public void run() {
while (true) {
// System.out.println(this.getId()+" "+this.getName());
try {
// �ȴ���һ���¼�
E evt = eventQueue.take();
if (evt != null) {
((S) evt.getSource()).handleEvent(evt);
}
} catch (Exception e) {
System.err.println("event process error!");
e.printStackTrace();
}
}
}
}
*/
}