【问题标题】:Eclipse e4 RCP: Core Expressions - Something less XML-hell?Eclipse e4 RCP:核心表达式 - 少一些 XML 地狱?
【发布时间】:2014-06-27 09:19:45
【问题描述】:

我正在开发一个 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 中的纯编程方法会很棒!

【问题讨论】:

  • 您可以使用属性测试器(org.eclipse.core.expressions.propertyTesters 扩展点),但它不是注入的,因此很难访问一些东西。

标签: java eclipse plugins rcp e4


【解决方案1】:

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

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

toolItem 被 EModelService 检索到

【讨论】:

  • 谢谢,这帮助很大!我唯一需要改变的是 toolItem.setVisible() 必须在 asyncExec 之外调用。这可能是因为您的示例用于工具栏项,而我的示例用于弹出菜单项。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-25
  • 2016-10-15
  • 1970-01-01
  • 2023-03-14
  • 1970-01-01
相关资源
最近更新 更多