如何使 Eclipse enabledWhen expression 在非焦点视图中用于选择?

How to make Eclipse enabledWhen expression work for selection in non-focused view?

我有一个连接到菜单贡献和命令的处理程序。菜单贡献向视图添加了一个按钮,我希望根据调试视图中的 selection 启用该按钮。

表达式如下:

<handler
            class="com.example.myhandler"
            commandId=" com.example.mycommand">
         <enabledWhen>
            <with
                  variable="selection">
               <iterate
                     ifEmpty="false">
                  <instanceof
                        value="org.eclipse.cdt.dsf.ui.viewmodel.datamodel.IDMVMContext">
                  </instanceof>
               </iterate>
            </with>
         </enabledWhen>
      </handler>

对于调试视图具有焦点的点,这绝对可以正常工作,这意味着如果我 select 调试视图中的元素,也会启用单独视图中添加的按钮(根据需要)。一旦我单击通过菜单贡献添加按钮的视图,它就会突然被禁用(我猜是因为 selection 是空的,即使它仍然是 selected;但是 Debug 视图有没有重点)。我怎样才能使这项工作使 selection 仍然独立于调试视图的焦点状态?

(您似乎在问一个 DSF 特定问题,它对您的标题所指的 "general" 案例有不同的答案。因此这个答案可能会解决您的问题,但可能不能解决一般情况。)

扩展 DSF-GDB 的完整示例在 org.eclipse.cdt.examples.dsf.gdb 包中的 CDT 源代码库中提供。

该示例定义了一个新命令org.eclipse.cdt.examples.dsf.gdb.command.showVersion:

   <!-- Example showing how to add a custom command with toolbar/menu contributions with DSF.
        The example command id is org.eclipse.cdt.examples.dsf.gdb.command.showVersion.
        In this example, when run it will display the version of GDB that is connected. -->
   <extension point="org.eclipse.ui.commands">
      <command
          categoryId="org.eclipse.cdt.debug.ui.category.debugViewLayout"
          description="Show the GDB Version in a pop-up"
          id="org.eclipse.cdt.examples.dsf.gdb.command.showVersion"
          name="Show GDB Version">
      </command>
   </extension>

它继续展示如何使用 org.eclipse.ui.menus 扩展点将命令添加到菜单。然后将命令绑定到具有 org.eclipse.ui.handlers 扩展点的命令处理程序。

到目前为止,DSF 的行为与 "normal" 命令相同。但是在 DSF 中(使用平台调试提供的 retargettable 命令基础结构),处理程序不是直接是您尝试 运行 的命令,而是 DebugCommandHandler 的子类。

DSF 然后可以绑定该命令,使用 adapters to the concrete command implementation, depending on what the selected debug session in the Debug view is. In the show version case, this is GdbShowVersionHandler (implementation of IDebugCommandHandler)。处理程序有一个 canExecute 可以在需要时连接到后端 (gdb) 以查看当前选择是否适用。 canExecute 接收可以转换为 DSF 上下文的内容 object,如下所示:

private Optional<ICommandControlDMContext> getContext(final IDebugCommandRequest request) {
    if (request.getElements().length != 1 || !(request.getElements()[0] instanceof IDMVMContext)) {
        return Optional.empty();
    }

    final IDMVMContext context = (IDMVMContext) request.getElements()[0];
    ICommandControlDMContext controlDmc = DMContexts.getAncestorOfType(context.getDMContext(),
            ICommandControlDMContext.class);
    if (controlDmc != null)
        return Optional.of(controlDmc);
    return Optional.empty();
}

PS 我将此示例添加到 CDT 以帮助前一段时间的另一个扩展程序。 cdt-dev may be useful too? This was all added initially for this bug, with its associated gerrit 上的对话将添加新命令的所有更改拉到一个地方。