我的原始RCP是在3.x中启动的,目前我在Juno上使用兼容层运行它。我正在考虑进行软迁移,所以我开始慢慢改变我的做法。我正在做的一件事就是将我的行为变成命令。
我有一个视图(就像一个目录浏览器),它当前将操作添加到视图的工具栏和弹出菜单中。这些操作在视图中调用特定方法,例如,在一个目录中调用。
通过操作很容易做到这一点因为我只是在View类本身创建我的动作并以编程方式将它们添加到工具栏
IToolBarManager mgr = getViewSite().getActionBars().getToolBarManager();
mgr.add(upDirectory);
mgr.add(refresh);
mgr.add(changeRoot);
并从createPartControl()
upDirectory = new Action("Go up one directory") {
public void run() {
goUpOneDirectory();
}
};
其中goUpOneDirectory()
是视图中的方法
如果我想将其转换为命令,我希望能够在我的处理程序中访问该视图的方法。所以我尝试了以下内容,
private void createHandlers()
{
IHandlerService handlerService = (IHandlerService) getSite().getService(IHandlerService.class);
IHandler upDirHandler = new AbstractHandler() {
public Object execute(ExecutionEvent event)
throws ExecutionException {
goUpOneDirectory();
return null;
}
};
handlerService.activateHandler("updir.id", upDirHandler);
}
在createHandlers
中调用createPartControl
,并通过plugin.xml将命令添加到视图的工具栏中。问题是,当我的视图失焦时,它会禁用这些命令的工具栏中的按钮。
我希望它们始终保持启用状态。我怎么能这样做?
我知道isEnabled()
一直都会返回true,所以我不确定为什么会这样。 activateHanlder在createPartControl
中被调用一次,所以我觉得它应该一直保持活动状态。
编辑:好的,我刚看到this,
工作台部件站点中的IHandlerService是部件处理程序 服务。通过部件处理程序服务激活的任何处理程序都将 仅当该部分处于活动状态时才有效。任何听众都加入了 部件处理器服务将在部件处理时被移除,并且 任何活动的处理程序将被停用(但不会被处置)。
那我该怎么做呢,
Workbench中的IHandlerService是全局处理程序服务。它 没有提供特殊的激活范围或生命周期。
答案 0 :(得分:1)
对不起,在问之前我应该再等一会儿,我想出来了!
我改变了,
IHandlerService handlerService = (IHandlerService) getSite().getService(IHandlerService.class);
到
IHandlerService handlerService = (IHandlerService) PlatformUI.getWorkbench().getService(IHandlerService.class);
它有效。 我会留下这个问题,以防它帮助其他人。