E4/EAS/Eventing System 事件系统
组件应该可以侦听到任何它感兴趣的事件,它应该可以很容易的发布/订阅事件,同时应当保持代码的良好可读性,方便开发扩展。
Eclipse 3.x API
在Eclipse 3.x中,提供了大量的事件。比如透视图事件存在四个并行事件:IPerspectiveListener、IPerspectiveListener2、IPerspectiveListener3和IPerspectiveListener!
侦听窗体激活事件
workbenchPage.addPartListener(new IPartListener() {
public void partActivated(IWorkbenchPart part) {
// do something
}
/* Other code not shown here */
});
发送窗体激活事件
public void firePageActivated(final IWorkbenchPage page) {
Object[] array = getListeners();
for (int i = 0; i < array.length; i++) {
final IPageListener l = (IPageListener) array[i];
SafeRunner.run(new SafeRunnable() {
public void run() {
l.pageActivated(page);
}
});
}
}
发布异步事件
在SWT中,可以使用Display的asyncExec方法执行异步线程,这将在Display的事件循环系统中进行调度。
Runnable runnable = new Runnable() {
public void run() {
// send out the event
}
};
display.asyncExec(runnable);
也可以使用Job执行非UI线程
final Runnable runnable = new Runnable() {
public void run() {
// send out the event
}
};
Job job = new Job("Event posting job") {
protected IStatus run(IProgressMonitor monitor) {
runnable.run();
return Status.OK_STATUS;
}
};
job.schedule();
Runnable runnable = new Runnable() {
public void run() {
// send out the event
}
};
Thread thread = new Thread(runnable);
thread.start();
E4(Java)
在E4中,新增IEventBrokerAPI。
侦听窗体激活事件
IEventBroker eventBroker = (IEventBroker) eclipseContext.get(IEventBroker.class.getName());
eventBroker.subscribe(IUIEvents.ElementContainer.Topic, null,
new EventHandler() {
public void handleEvent(Event event) {
if (event.getProperty(IUIEvents.EventTags.AttName).equals(IUIEvents.ElementContainer.ActiveChild)) {
Object newPart = event.getProperty(IUIEvents.EventTags.NewValue);
if (newPart instanceof MPart) {
// do something
}
}
}
}, /* headless */ false);
发送窗体激活事件
Map data = new HashMap();
map.put(IUIEvents.EventTags.AttName, IUIEvents.ElementContainer.ActiveChild);
map.put(IUIEvents.EventTags.Element, partStack);
map.put(IUIEvents.EventTags.OldValue, oldPart);
map.put(IUIEvents.EventTags.NewValue, newPart);
map.put(IUIEvents.EventTags.Type, IUIEvents.EventTypes.Set);
IEventBroker eventBroker = (IEventBroker) eclipseContext.get(IEventBroker.class.getName());
eventBroker.send(IUIEvents.ElementContainer.Topic, data);
发布异步事件
使用IEventBroker的post(String,Object)方法可以异步发送事件
IEventBroker eventBroker = (IEventBroker) eclipseContext.get(IEventBroker.class.getName());
eventBroker.post(eventTopic, data);