在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);
- }
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()));
-
- }
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>
<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