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);

posted @ 2011-07-15 14:22  vwpolo  阅读(608)  评论(0编辑  收藏  举报