/*
* JavaXYQ Source Code
* by kylixs
* at 2009-11-26
* please visit http://javaxyq.googlecode.com
* or mail to kylixs@qq.com
*/
package com.javaxyq.event;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.util.EventObject;
import com.javaxyq.ui.Panel;
/**
* @author dewitt
* @date 2009-11-26 create
*/
public class EventDelegator implements EventTarget {
private static final EventDelegator instance = new EventDelegator();
private final static EventDispatcher<EventDelegator, EventObject> dispatcher = EventDispatcher.getInstance();
private EventDelegator() {
}
public static EventDelegator getInstance() {
return instance;
}
public boolean isDelegatedThread() {
return Thread.currentThread() == dispatcher;
}
private static class DelegateEvent extends EventObject {
private EventObject event;
public DelegateEvent(EventDelegator delegator, EventObject evt) {
super(delegator);
this.event = evt;
}
public EventObject getEvent() {
return event;
}
}
@Override
public boolean handleEvent(EventObject evt) throws EventException {
if (evt instanceof DelegateEvent) {
EventObject event = ((DelegateEvent) evt).getEvent();
try {
Component comp = (Component) event.getSource();
Panel panel = findPanel(comp);
if(panel!=null) {
return panel.handleEvent(event);
}
} catch (Exception e) {
System.err.println("�����¼�ʧ�ܣ�" + event);
e.printStackTrace();
}
}
return false;
}
public void delegateEvent(EventObject event) {
if (event instanceof ActionEvent) {
ActionEvent ae = (ActionEvent) event;
String cmd = ae.getActionCommand();
// ���û������actionId������
if (cmd == null || cmd.trim().length() == 0) {
return;
}
}
dispatcher.dispatchEvent(new DelegateEvent(instance, event));
}
public void pumpEvents(Conditional cond) {
dispatcher.pumpEvents(cond);
}
/**
* ������������
* @param c
* @return
*/
private static Panel findPanel(Component c) {
for(;c!=null;) {
if (c instanceof Panel) {
break;
}
c=c.getParent();
}
return (Panel) c;
}
}