Eclipse:在特定视图的命令中转换动作

时间:2012-12-04 17:06:35

标签: eclipse eclipse-rcp e4

我的原始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是全局处理程序服务。它   没有提供特殊的激活范围或生命周期。

1 个答案:

答案 0 :(得分:1)

对不起,在问之前我应该​​再等一会儿,我想出来了!

我改变了,

IHandlerService handlerService = (IHandlerService) getSite().getService(IHandlerService.class); 

IHandlerService handlerService = (IHandlerService) PlatformUI.getWorkbench().getService(IHandlerService.class);

它有效。 我会留下这个问题,以防它帮助其他人。