如何在 Eclipse E4 应用程序中禁用或启用 MMenu(不是 MMenuItem)
How to disable or enable a MMenu (not MMenuItem) in an Eclipse E4 application
我有一个带有 MMenu 的 Eclipse E4 应用程序(在应用程序的主菜单和不同部分的弹出菜单中),它包含在运行时由动态菜单贡献提供的项目。
我想要实现的是禁用菜单元素,如果菜单贡献不提供任何项目。类似于@CanExecute 用于命令或直接菜单项的处理程序 类。
您是否使用最新版本的 eclipse 并且有 Application.e4xmi
文件?
如果是这样,对于您的 "Dynamic Menu Contribution"
,添加一个指向 class 的 "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"
子项,link它到一个class,使用一个用"@Evaluate"
表达式注释的方法来决定show/hide动态菜单,例如,如果菜单是空的...
@Evaluate
public boolean showXXX(...) {
return true/false; -> display/hide the whole menu
}
如果我明白了。您需要整个动态菜单贡献项 disabled/grayed-out。我认为 @titou10 的回答将为动态菜单贡献中的每个项目切换 enable/disable,但不会为该父项目本身切换。我希望有人能找到更好的答案。我正在尝试使用
查找和禁用菜单项
MenuImpl menu = (MenuImpl) modelService.find("menuID", application.getChildren().get(0).getMainMenu());
menu.setEnabled(checkMenuEnabled());
但这似乎对我不起作用。另一个选项是清除所有动态菜单项,这样当您滚动到该父菜单项时不会发生任何事情,因为它没有任何项目。
items.clear();
if (checkMenuEnabled()) {
Fillthemenu();
}
我有一个带有 MMenu 的 Eclipse E4 应用程序(在应用程序的主菜单和不同部分的弹出菜单中),它包含在运行时由动态菜单贡献提供的项目。
我想要实现的是禁用菜单元素,如果菜单贡献不提供任何项目。类似于@CanExecute 用于命令或直接菜单项的处理程序 类。
您是否使用最新版本的 eclipse 并且有 Application.e4xmi
文件?
如果是这样,对于您的 "Dynamic Menu Contribution"
,添加一个指向 class 的 "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"
子项,link它到一个class,使用一个用"@Evaluate"
表达式注释的方法来决定show/hide动态菜单,例如,如果菜单是空的...
@Evaluate
public boolean showXXX(...) {
return true/false; -> display/hide the whole menu
}
如果我明白了。您需要整个动态菜单贡献项 disabled/grayed-out。我认为 @titou10 的回答将为动态菜单贡献中的每个项目切换 enable/disable,但不会为该父项目本身切换。我希望有人能找到更好的答案。我正在尝试使用
查找和禁用菜单项 MenuImpl menu = (MenuImpl) modelService.find("menuID", application.getChildren().get(0).getMainMenu());
menu.setEnabled(checkMenuEnabled());
但这似乎对我不起作用。另一个选项是清除所有动态菜单项,这样当您滚动到该父菜单项时不会发生任何事情,因为它没有任何项目。
items.clear();
if (checkMenuEnabled()) {
Fillthemenu();
}