3

我最初的 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()返回结果一直为真,所以我不确定它为什么会发生。activateHanlder 被调用一次,createPartControl所以我觉得它应该一直保持活动状态。

编辑:好的,我刚看到这个

来自工作台部件站点的 IHandlerService 是部件处理程序服务。通过部件处理程序服务激活的任何处理程序仅在该部件处于活动状态时才处于活动状态。当部件被释放时,添加到部件处理程序服务的任何侦听器都将被删除,并且任何活动的处理程序都将被停用(但不被释放)。

那么我怎样才能得到这个,

工作台中的 IHandlerService 是全局处理程序服务。它没有提供特殊的激活范围或生命周期。

4

1 回答 1

1

对不起,我应该再等一会儿再问,我想通了!

我改变了,

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

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

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

于 2012-12-04T17:21:49.460 回答