我正在使用E4 RCP应用程序,并且有一个上下文菜单,其中的菜单项是否可见取决于选择。我发现这样做的方法是使用plugin.xml中定义的核心表达式,如下所示:

<extension
     point="org.eclipse.core.expressions.definitions">
     <definition
        id="com.foo.bar.test.core.expression">
      <with variable="org.eclipse.ui.selection">
        <iterate ifEmpty="false">
            <or>
          <instanceof value="com.foo.bar.Class1">
          </instanceof>
          <instanceof value="com.foo.bar.Class2">
          </instanceof>
            </or>
        </iterate>
      </with>
  </definition>

这可以工作,并且如果所选项目是Class1或Class2的实例,则显示菜单项。

这一切似乎都是一种极其讨厌的做事方式!当其中许多添加时,它将成为维护和调试的噩梦。

任何人都可以演示一种不太像XML的方式吗? Java中的纯编程方法会很棒!

最佳答案

例如,核心表达式不适用于工具栏项目。您可以在命令处理程序中使用以下变通办法:

public class SomeHandler {
    protected MToolItem toolItem;

    @CanExecute
    @Inject
    public boolean canExecute(@Named(IServiceConstants.ACTIVE_SELECTION) @Optional ISelection selection)
    {
        boolean canExecute = ...
        setToolItemVisible(canExecute);
        ...
    }

    private void setToolItemVisible(final boolean visible) {
        if (toolItem != null) {
            Display.getDefault().asyncExec(new Runnable() {
                @Override
                public void run() {
                    toolItem.setVisible(visible);
                }
            });
        }
    }
}

由EModelService检索toolItem的位置

10-06 12:47