如何在Eclipse E4应用程序中禁用或启用MMenu(而不是MMenuItem)

时间:2018-04-04 17:29:46

标签: java eclipse swt eclipse-rcp e4

我有一个带有MMenu的Eclipse E4应用程序(在应用程序的主菜单和不同部分的弹出菜单中),其中包含动态菜单贡献在运行时提供的项目。

我想要实现的是禁用菜单元素,如果菜单贡献没有提供任何项目。像@CanExecute这样的命令或直接菜单项的处理程序类。

2 个答案:

答案 0 :(得分:2)

您是否使用最新版本的eclipse并且有Application.e4xmi个文件? 如果是这样,对于"Dynamic Menu Contribution",添加一个"Dynamic Menu Contribution"条目,该条目指向一个带有"@AboutToShow"注释方法的类,该方法将动态构建菜单条目并为每个项目定义一个hanlder

public class XXX {
   @Inject private EModelService modelService;
   @AboutToShow 
   public void aboutToShow(List<MMenuElement> items, ...) {

      // insert your logic here to add an entry or not...
      // maybe with a loop of some sort...
      MDirectMenuItem dynamicItem = modelService.createModelElement(MDirectMenuItem.class);
      dynamicItem.setLabel(<;abel>);
      dynamicItem.setIconURI(<icon>);
      dynamicItem.setContributorURI("platform:/plugin/<your plugin name>");
      dynamicItem.setContributionURI("bundleclass://<your plugin name>/<class handler>");
      dynamicItem.getTransientData().put(<name>, <value>); // To pass parameters to the handler

      items.add(dynamicItem);
  }

}

public class <class handler> {
   @Execute
   public void execute(MMenuItem menuItem, ...) {
      String param = (<Type>) menuItem.getTransientData().get(<name>); // Get parameter back
      // Put your logic here linked to the menu entry
   }
}

添加一个"Imperative Expression"子项,将其链接到一个带有"@Evaluate"表达式注释方法的类,以决定显示/隐藏动态菜单,例如菜单是否为空......

@Evaluate
public boolean showXXX(...) {
   return true/false; -> display/hide the whole menu
}

答案 1 :(得分:0)

如果我理解。您希望整个“动态菜单贡献”项被禁用/显示为灰色。我认为@ titou10的答案将切换动态菜单贡献中每个项目的启用/禁用,而不是父项本身。我希望有人能找到更好的答案。我正在尝试使用

查找和禁用菜单项
    MenuImpl menu = (MenuImpl) modelService.find("menuID", application.getChildren().get(0).getMainMenu());
    menu.setEnabled(checkMenuEnabled());

但这似乎对我不起作用。另一个选项是清除所有动态菜单项,以便在滚动到该父菜单项时不会发生任何事情,因为它将没有任何项。

    items.clear();
    if (checkMenuEnabled()) {
        Fillthemenu();
    }