在前面两篇博文中,已经言及,为视图和编辑器贡献右键菜单。
根据见样学样法则。我们去看看这些WorkbenchPart内部作了什么。
比如,我们在自己的视图或编辑器中这样做。
MenuManager menuMgr = new MenuManager("#popupMenu", "popupMenu"); //$NON-NLS-1$ //$NON-NLS-2$
menuMgr.setRemoveAllWhenShown(true);
menuMgr.addMenuListener(new IMenuListener() {
public void menuAboutToShow(IMenuManager menuManager)
{
menuManager.add(new Separator("top")); //$NON-NLS-1$
menuManager.add(closePositionAction);
menuManager.add(newTransactionAction);
menuManager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
menuManager.add(new Separator("bottom")); //$NON-NLS-1$
}
});
tree.setMenu(menuMgr.createContextMenu(tree));
getSite().registerContextMenu(menuMgr, getSite().getSelectionProvider());
具体说一下registerContextMenu方法,它一共有2个重载实现:
1. public void registerContextMenu(MenuManager menuManager, ISelectionProvider selectionProvider);
2. public void registerContextMenu(String menuId, MenuManager menuManager,ISelectionProvider selectionProvider);
通过阅读IWorkbenchPartSite的源代码及其子类实现,其最终实现均是调用第2个方法,第一个方法的id以视图或编辑器的id作为id。
menuID就是org.eclipse.ui.popupMenus下的viewerContribution需要填充的targetID。
必须为每个已注册的菜单提供菜单标识。为获得各部件的一致性,所有部件都应该采用如下策略:
●如果目标Part只具有一个上下文菜单,则应该使用与Part相同的标识来进行注册。通过
调用registerContextMenu(MenuManager,ISelectionProver)可以容易完成此任务。在viewerContribution贡献中的targetID可以填充为当前Part的ID
●如果目标Part具有多个上下文菜单,则应该为每个菜单都定义一个唯一标识,将Part的id作为每个
标识的前缀,通过调用registerContextMenu(String,MenuManager,ISelectionProvider)在运行时注册每个菜单。
之所以能够为其它的WorkbenchPart贡献右键菜单,就是因为在PartSite中注册过了这些menu。
eg: getSite().registerContextMenu(menuMgr, viewer);
根据见样学样法则。我们去看看这些WorkbenchPart内部作了什么。
比如,我们在自己的视图或编辑器中这样做。
MenuManager menuMgr = new MenuManager("#popupMenu", "popupMenu"); //$NON-NLS-1$ //$NON-NLS-2$
menuMgr.setRemoveAllWhenShown(true);
menuMgr.addMenuListener(new IMenuListener() {
public void menuAboutToShow(IMenuManager menuManager)
{
menuManager.add(new Separator("top")); //$NON-NLS-1$
menuManager.add(closePositionAction);
menuManager.add(newTransactionAction);
menuManager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
menuManager.add(new Separator("bottom")); //$NON-NLS-1$
}
});
tree.setMenu(menuMgr.createContextMenu(tree));
getSite().registerContextMenu(menuMgr, getSite().getSelectionProvider());
具体说一下registerContextMenu方法,它一共有2个重载实现:
1. public void registerContextMenu(MenuManager menuManager, ISelectionProvider selectionProvider);
2. public void registerContextMenu(String menuId, MenuManager menuManager,ISelectionProvider selectionProvider);
通过阅读IWorkbenchPartSite的源代码及其子类实现,其最终实现均是调用第2个方法,第一个方法的id以视图或编辑器的id作为id。
menuID就是org.eclipse.ui.popupMenus下的viewerContribution需要填充的targetID。
必须为每个已注册的菜单提供菜单标识。为获得各部件的一致性,所有部件都应该采用如下策略:
●如果目标Part只具有一个上下文菜单,则应该使用与Part相同的标识来进行注册。通过
调用registerContextMenu(MenuManager,ISelectionProver)可以容易完成此任务。在viewerContribution贡献中的targetID可以填充为当前Part的ID
●如果目标Part具有多个上下文菜单,则应该为每个菜单都定义一个唯一标识,将Part的id作为每个
标识的前缀,通过调用registerContextMenu(String,MenuManager,ISelectionProvider)在运行时注册每个菜单。
之所以能够为其它的WorkbenchPart贡献右键菜单,就是因为在PartSite中注册过了这些menu。
eg: getSite().registerContextMenu(menuMgr, viewer);