解码Eclipse事件服务

时间:2016-03-09 11:09:20

标签: eclipse events rcp

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

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

为了实现上述目标,我创建了一个包含事件主题的接口以及在各个类中发送/接收事件的方法。

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

是否有更简单/有效的方式来接收/解码事件? 我不喜欢这一行:

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

非常感谢

1 个答案:

答案 0 :(得分:1)

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

@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;
}