【问题标题】:How to disable or enable a MMenu (not MMenuItem) in an Eclipse E4 application如何在 Eclipse E4 应用程序中禁用或启用 MMenu(不是 MMenuItem)
【发布时间】:2018-09-14 08:54:31
【问题描述】:

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

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

【问题讨论】:

    标签: java eclipse swt eclipse-rcp e4


    【解决方案1】:

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

    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"child,将其链接到一个带有"@Evaluate" 表达式注解的方法的类,以决定显示/隐藏动态菜单,例如如果菜单为空...

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

    【讨论】:

      【解决方案2】:

      如果我明白的话。您希望整个动态菜单贡献项被禁用/灰显。我认为@titou10 的答案将切换动态菜单贡献中每个项目的启用/禁用,但不会切换该父项目本身。我希望有人找到更好的答案。我正在尝试使用

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

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

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

      【讨论】:

      • falon89,您的问题是另一个问题,您应该创建一个新问题。完成后,我会在那里回答
      • titou10,谢谢我在这里提出了一个新问题:stackoverflow.com/questions/55032850/…
      猜你喜欢
      • 2014-01-09
      • 2017-04-15
      • 1970-01-01
      • 2011-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-16
      相关资源
      最近更新 更多