如何确保我的键绑定优先于其他定义

时间:2018-09-05 06:32:27

标签: eclipse keyboard-shortcuts rcp

我正在开发RCP应用程序。该应用程序具有执行模式,在该模式下,我想启用各种按键绑定来控制“开始”,“停止”,“继续”,“重复”等。绑定将使用“ ExecutionContext”启用,该“ ExecutionContext”在任何相关视图被激活时设置。

上下文切换是在每个“执行”视图中完成的。

$scope.GetNavigationMenu = function GetNavigationMenu() {
        var modules = ["Dashboard", "Requirements", "Deviation Report", "Schedule", "Permission"];
        Promise.all(modules.map(Module => httpService.get(serviceBase + rightsPermissionUrl, { Module })))
          .then((list) => {
              // do stuff with `list` array
              $scope.navigationMenu = list;
          });
    }

我可以通过控制台消息看到正在设置我的上下文并且某些键绑定按预期工作。

但是,如果已经从另一个插件分配了键绑定,则该绑定具有优先权。例如。我想使用 Ctrl + F8 停止,但是当按下该按钮时,我将获得“下一个透视图”操作,这是工作台默认设置。

绑定定义为

@Override
public final void createPartControl(Composite parent)
{
    addPartListener();

    ...
}

private void addPartListener()
{
    this.getViewSite().getPage().addPartListener(new IPartListener2()
    {
        IContextActivation token = null;

        @Override
        public void partDeactivated(IWorkbenchPartReference partRef)
        {
            if (token != null)
            {
                System.out.println("End exec context");
                IContextService contextService = (IContextService) PlatformUI.getWorkbench().getService(
                        IContextService.class);
                contextService.deactivateContext(token);
                token = null;
            }
        }

        @Override
        public void partActivated(IWorkbenchPartReference partRef)
        {
            System.out.println("Set exec context");
            IContextService contextService = (IContextService) PlatformUI.getWorkbench().getService(
                    IContextService.class);
            token = contextService.activateContext("AtfExecutionContext");
        }
    });

}

似乎只有以前未定义的加速器起作用。设置上下文后,我该怎么做才能覆盖现有定义并激活我的?

1 个答案:

答案 0 :(得分:1)

每个部分都有单独的上下文服务,您必须使用正确的上下文服务。

在零件激活/停用时,不必激活/停用上下文。单独的上下文服务将自动处理该问题。

因此,请在createPartControl中激活:

IContextService contextService = getSite().getService(IContextService.class);

token = contextService.activateContext("AtfExecutionContext");

并在零件关闭时停用。

您还正在定义一个新的密钥绑定方案-必须单独激活它,而不是这里想要的。只需将其删除,然后将org.eclipse.ui.defaultAcceleratorConfiguration用作schemeId