在RCP里,Viewer可以拥有自己的右键弹出菜单,Eclipse提供了2种方式控制弹出菜单,一种是编码实现,另一种是通过扩展点org.eclipse.ui.popupMenus实现。
不管是哪种方式实现,都必须先在Viewer中添加右键菜单(MenuManager),一般在Viewer的createPartControl(Composite parent)中,加入如下代码:
public void createPartControl(Composite parent) { viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL); viewer.setContentProvider(new ViewContentProvider()); viewer.setLabelProvider(new ViewLabelProvider()); viewer.setInput(getViewSite()); createContextMenu(); } private void createContextMenu() { MenuManager menuManager = new MenuManager(); menuManager.setRemoveAllWhenShown(true); menuManager.addMenuListener(new IMenuListener() { public void menuAboutToShow(IMenuManager manager) { fillContextMenu(manager); } }); Menu menu = menuManager.createContextMenu(viewer.getControl()); viewer.getControl().setMenu(menu); getSite().setSelectionProvider(viewer); getSite().registerContextMenu(menuManager, viewer); }
使用编码的方式添加菜单项就要使用fillContextMenu()方法了。
protected void fillContextMenu(IMenuManager menu) { menu.add(ActionFactory.QUIT.create(getSite().getWorkbenchWindow())); menu.add(new Separator()); menu.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS)); menu.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS + "-end")); menu.add(ActionFactory.ABOUT.create(getSite().getWorkbenchWindow())); }
这里添加了2个Eclipse自带的Exit和About菜单项。
通过org.eclipse.ui.popupMenus方式添加菜单项,相对比较灵活一些:
<extension point="org.eclipse.ui.popupMenus"> <viewerContribution id="org.salever.rcp.viewaction.demo.viewerContribution1" targetID="org.salever.rcp.viewaction.demo.view"> <menu id="org.salever.rcp.viewaction.demo.menu1" label="New Submenu" path="additions"> <separator name="group1"> </separator> </menu> <action class="org.salever.rcp.viewaction.demo.popup.actions.NewAction" id="org.salever.rcp.viewaction.demo.newAction" label="New Action" menubarPath="org.salever.rcp.viewaction.demo.menu1/group1"> </action> </viewerContribution> </extension>
这里org.salever.rcp.viewaction.demo.popup.actions.NewAction必须实现IViewActionDelegate。
记住,如果仅仅扩展org.eclipse.ui.popupMenus是看不见菜单的,必须在Viewer中添加并注册ContextMenu。
有一篇blog讲得比较详细,引用一下:(来自IBM DeveloperWorks)
http://www.ibm.com/developerworks/cn/opensource/os-cn-ecl-menuext/index.html