Question

I'm working on an E4 RCP application, and have a context menu which has menu items visible or not depending on the selection. The way I've found to do this is with core expressions defined in the plugin.xml like so:

<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>

This works, and the menu item is displayed if the selected item is an instance of Class1 or Class2.

This all seems like an extremely nasty way to do things! When many of these are added, its going to be a maintenance and debugging nightmare.

Can anyone demonstrate a less XML-ish way of doing this? Pure programmatic methods in Java would be great!

Was it helpful?

Solution

Core expressions are not working for toolbar items, for example. You can use the following workaround in command handlers:

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

where toolItem is retrieved by EModelService

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top