我有一个MMenu一个Eclipse E4应用程序(在应用程序的主菜单,在不同部位的弹出菜单),它包含由动态菜单的贡献在运行时提供的项目。
我想实现的是禁用菜单元素,如果菜单贡献不提供任何资料。 像@CanExecute用于处理类的命令或直接菜单项。
我有一个MMenu一个Eclipse E4应用程序(在应用程序的主菜单,在不同部位的弹出菜单),它包含由动态菜单的贡献在运行时提供的项目。
我想实现的是禁用菜单元素,如果菜单贡献不提供任何资料。 像@CanExecute用于处理类的命令或直接菜单项。
您是否使用了最新版本的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
}
如果我的理解。 你想整个动态菜单项的贡献禁用/灰色。 我觉得@ titou10的答案将切换启用/禁用对动态菜单贡献每个项目,但不是父项目本身。 我希望有人找到一个更好的答案。 我与发现实验和用禁用的菜单项
MenuImpl menu = (MenuImpl) modelService.find("menuID", application.getChildren().get(0).getMainMenu());
menu.setEnabled(checkMenuEnabled());
但是,这似乎并没有为我工作。 另一种选择是清除所有的动态菜单项,以便当您滚动在该父菜单项,因为它不会有任何项目没有任何反应。
items.clear();
if (checkMenuEnabled()) {
Fillthemenu();
}