为何能够为其它的WorkbenchPart贡献右键菜单?

在前面两篇博文中,已经言及,为视图和编辑器贡献右键菜单。
根据见样学样法则。我们去看看这些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);
  
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值