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

How to ensure that my key bindings have priority over other definitions

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

上下文切换在每个 'Execution' 视图中完成。

@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");
        }
    });

}

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

但是,如果已经从另一个插件分配了键绑定,则该绑定具有优先权。例如。我想使用 Ctrl+F8 停止但是当按下它时我得到 'Next perspective' 动作,即 workbench默认。

绑定定义是

   <extension
         point="org.eclipse.ui.bindings">
      <scheme
            id="atfscheme"
            name="atfscheme"
            parentId="org.eclipse.ui.defaultAcceleratorConfiguration">
      </scheme>
      <key
            commandId="com.xxx.atf.model.ui.commands.ExecKey.Start"
            contextId="AtfExecutionContext"
            schemeId="atfscheme"
            sequence="M1+M2+F5">
<!-- F5 does not work but Ctrl-Shift-F5 does -->
      </key>
   </extension>
   <extension
         point="org.eclipse.ui.contexts">
      <context
            id="AtfExecutionContext"
            name="AtfExecutionContext"
            parentId="org.eclipse.debug.ui.debugging">
<!-- have tried various parentid values... -->
      </context>
   </extension>

似乎只有以前未定义的加速器起作用。当我的上下文已设置时,我必须做什么才能覆盖现有定义并激活我的定义?

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

无需在部分激活/停用时激活/停用上下文。单独的上下文服务将自动处理。

因此在 createPartControl 中激活:

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

token = contextService.activateContext("AtfExecutionContext");

并在部分关闭时停用。

您还定义了一个新的键绑定方案 - 必须单独激活,这不是您想要的。只需删除它并使用 org.eclipse.ui.defaultAcceleratorConfiguration 作为 schemeId