我有一个行动提供。在 fillContextMenu 中,我试图迭代所有可用 IMenuManager.getItems() 方法的菜单项。我无法获得完整的菜单列表。
例如,通过 getItems() 无法使用 Import 和 Export 上下文菜单。
它是否隐藏通过“popupMenus”扩展添加的贡献。
有没有办法遍历与给定菜单管理器关联的所有菜单。
谢谢。
帕尼。
我有一个行动提供。在 fillContextMenu 中,我试图迭代所有可用 IMenuManager.getItems() 方法的菜单项。我无法获得完整的菜单列表。
例如,通过 getItems() 无法使用 Import 和 Export 上下文菜单。
它是否隐藏通过“popupMenus”扩展添加的贡献。
有没有办法遍历与给定菜单管理器关联的所有菜单。
谢谢。
帕尼。
您的问题是,在 IMenuManager 上调用 getItems() 时,它只会返回其子项,而不是添加到根 IMenuManager 的其他 IMenuManager 的子项。如果您想获取所有项目和子 IMenuManager 项目,这里有一个函数可以做到这一点。虽然如果你这样做是为了添加 IContributionItems 你可以简单地使用 .addItem(item itemPath) 它将在内部遍历图表并在正确的位置添加你的贡献。如果要删除现有贡献,您需要首先获取菜单树中的所有贡献项,然后使用要删除的 ContributionItem 实例在 IMenuManager 上调用 remove()。试试这个功能,你会在你的根管理器中看到导入和导出项以及其他子菜单项。希望对您有所帮助,如果您仍然卡住,请回复。
private IContributionItem[] getMenuTreeItems(IMenuManager rootManager) {
List<IContributionItem> items = new ArrayList<IContributionItem>();
addMenuManagerItems(rootManager, items);
return items.toArray(new IContributionItem[items.size()]);
}
private void addMenuManagerItems(IMenuManager manager, List<IContributionItem> items ) {
for (IContributionItem item : manager.getItems()) {
if (item instanceof IMenuManager) {
IMenuManager childManager = (IMenuManager) item;
addMenuManagerItems(childManager, items);
} else {
items.add(item);
}
}
}