从 Eclipse 事件服务解码子事件

Decoding sub-events from Eclipse Event Service

Eclipse e4 RCP 应用程序有两个部分,一个是 PartStack 中类似编辑器的部分,可以同时打开多个部分。

其他部分只显示当前打开的类编辑器部分的文件名。 每次创建(或关闭)编辑器部分时,IEventBroker 发送和事件由另一部分(第二部分)解码。

为了实现上述目标,我创建了一个接口,其中包含事件主题和 send/receive 相应 类 中事件的方法。

到目前为止,我发现解码从编辑器部分发送到第二部分的事件的唯一方法是使用以下代码。

是否有任何 simpler/efficient 方法来 receive/decode 事件? 我不喜欢这一行:

broker.post(FileEvents.FILE_NEW, pair);

发送重复字符串 "FileEvents.FILE_NEW"。

这是带有事件常量的接口:

public interface FileEvents {
    String FILE_ALL_EVENTS = "FILE/*";
    String FILE_NEW = "FILE/NEW";
    String FILE_CLOSE = "FILE/CLOSE";
}

这是发送事件的类似于编辑器的部分:

public class EditorPart {
@Inject
IEventBroker broker;

SimpleEntry<String, File> pair;
File file;

//...

@PostConstruct
public void createComposite(){
    file = new File("myFilePath");
    pair = new SimpleEntry(FileEvents.FILE_NEW, file);
    broker.post(FileEvents.FILE_NEW, pair);
}

@PreDestroy
public void dispose(){
    pair = new SimpleEntry(FileEvents.FILE_CLOSE, file);
    broker.post(FileEvents.FILE_CLOSE, pair);
}
}

接收事件的部分

public class EventDecoderPart {

File receivedFile = new File("");
//....

@Inject
@Optional
public void updateListOfFiles(@UIEventTopic(FileEvents.FILE_ALL_EVENTS) SimpleEntry<String, File> receivedFileEntry) {

    switch(receivedFileEntry.getKey)
        case FileEvents.FILE_NEW:
            receivedFile = receivedFileEntry.getValue();
            //Process receivedFile...
            break;
        case FileEvents.FILE_CLOSE:
            receivedFile = receivedFileEntry.getValue();
            //Process receivedFile...
            break;
}
}

非常感谢

您可以使用两种方法分别接收这两个事件:

@Inject
@Optional
public void newFile(@UIEventTopic(FileEvents.FILE_NEW) SimpleEntry<String, File> receivedFileEntry) {
   // TODO new file event
}

@Inject
@Optional
public void closeFile(@UIEventTopic(FileEvents.FILE_CLOSE) SimpleEntry<String, File> receivedFileEntry) {
   // TODO close file event
}

这样就不需要在 SimpleEntry 中保存事件类型了。

或者,您可以使用单一方法,但使用包含主题和您的数据的完整 org.osgi.service.event.Event 事件数据:

@Inject
@Optional
public void updateListOfFiles(@UIEventTopic(FileEvents.FILE_ALL_EVENTS) Event event) {

  String topic = event.getTopic();

  Object data = event.getProperty(IEventBroker.DATA);

  SimpleEntry<String, File> receivedFileEntry = (SimpleEntry<String, File>)data;
}