Eclipse RCP,什么时候创建处理程序?
Eclipse RCP, when is a Handler created?
我们有一个 RCP 3/4 混合应用程序和一个在 fragment.e4xmi 中定义的处理程序。
<fragments xsi:type="fragment:StringModelFragment" xmi:id="_X7-AID93EeKXHI5xGhqnKg" featurename="handlers" parentElementId="org.eclipse.[..].application">
<elements xsi:type="commands:Handler" [..]/>
<elements xsi:type="commands:Handler" xmi:id="_jx8voD93EeKXHI5xGhqnKg" elementId="[..].ui.handler.addToDatabase" contributionURI="bundleclass://[..].ui/[..].ui.handlers.AddToDatabaseHandler" command="_TlV-ID93EeKXHI5xGhqnKg"/>
<elements xsi:type="commands:Handler" [..]/>
public class AddToDatabaseHandler implements EventHandler {
private ISelectionMSD selection;
public AddToDatabaseHandler() {
System.err.println("Created " + this);
}
@Execute
public void execute(@Named(IServiceConstants.ACTIVE_PART) MPart part) {
System.err.println(this + ": Execute, selection is " + selection);
if(selection != null) {
// do something
}
}
@Override
public void handleEvent(Event event) {
if(event.getTopic().equals(UPDATE_SELECTION)) {
selection = (ISelectionMSD)event.getProperty(IEvents.PROPERTY_SELECTION);
System.err.println(this + ": Handle event, selection is " + selection);
}
}
}
我添加了一些 System.err,我可以看到这个处理程序的两个实例是通过 DI/反射隐式创建的。
1) 创建此处理程序的实例时是否有简单的解释?
2) 第一个创建的实例(就在平台启动时)错过了此 class 正在侦听的事件。所以它似乎没有作为事件侦听器添加到 EventAdmin 中。我能以某种方式调试它吗?
3) 对我来说这似乎是 "magic",第二个 class 何时何地以及如何注册以监听事件?这是平台在某个地方完成的,还是我只是错过了一些我们自己的代码?
非常感谢您的帮助!
我不确定您所说的 3/4 混合应用是什么意思。
e4 处理程序仅执行 @Execute
(和 @CanExecute
)方法,预计不会实现 EventHandler
,并且不会查找此方法或调用此方法。
如果您想处理事件,请使用 @EventTopic
或 @UIEventTopic
@Inject
@Optional
public void handleEvent(@EventTopic("topic id") Event event)
我们有一个 RCP 3/4 混合应用程序和一个在 fragment.e4xmi 中定义的处理程序。
<fragments xsi:type="fragment:StringModelFragment" xmi:id="_X7-AID93EeKXHI5xGhqnKg" featurename="handlers" parentElementId="org.eclipse.[..].application">
<elements xsi:type="commands:Handler" [..]/>
<elements xsi:type="commands:Handler" xmi:id="_jx8voD93EeKXHI5xGhqnKg" elementId="[..].ui.handler.addToDatabase" contributionURI="bundleclass://[..].ui/[..].ui.handlers.AddToDatabaseHandler" command="_TlV-ID93EeKXHI5xGhqnKg"/>
<elements xsi:type="commands:Handler" [..]/>
public class AddToDatabaseHandler implements EventHandler {
private ISelectionMSD selection;
public AddToDatabaseHandler() {
System.err.println("Created " + this);
}
@Execute
public void execute(@Named(IServiceConstants.ACTIVE_PART) MPart part) {
System.err.println(this + ": Execute, selection is " + selection);
if(selection != null) {
// do something
}
}
@Override
public void handleEvent(Event event) {
if(event.getTopic().equals(UPDATE_SELECTION)) {
selection = (ISelectionMSD)event.getProperty(IEvents.PROPERTY_SELECTION);
System.err.println(this + ": Handle event, selection is " + selection);
}
}
}
我添加了一些 System.err,我可以看到这个处理程序的两个实例是通过 DI/反射隐式创建的。
1) 创建此处理程序的实例时是否有简单的解释?
2) 第一个创建的实例(就在平台启动时)错过了此 class 正在侦听的事件。所以它似乎没有作为事件侦听器添加到 EventAdmin 中。我能以某种方式调试它吗?
3) 对我来说这似乎是 "magic",第二个 class 何时何地以及如何注册以监听事件?这是平台在某个地方完成的,还是我只是错过了一些我们自己的代码?
非常感谢您的帮助!
我不确定您所说的 3/4 混合应用是什么意思。
e4 处理程序仅执行 @Execute
(和 @CanExecute
)方法,预计不会实现 EventHandler
,并且不会查找此方法或调用此方法。
如果您想处理事件,请使用 @EventTopic
或 @UIEventTopic
@Inject
@Optional
public void handleEvent(@EventTopic("topic id") Event event)