我们知道在Eclipse中有一个org.eclipse.ui.popupMenus扩展点,可以对现在的视图或对象的右键菜单进行扩展。
如果我们定义了一个View,并且里面有一个Viewer,那么我们怎么让自己的Viewer上的对象也能获取对该对象的扩展菜单呢?这里就做一个简单的介绍。
一、显示菜单
首先,我们要让这个Viewer支持右键菜单,如下:
MenuManager menus = new MenuManager();
Menu menu = menus.createContextMenu(viewer.getTree());
viewer.getTree().setMenu(menu);
要使得一个viewer的右键菜单可以扩展,我们需要注册这个菜单。如下:
getSite().registerContextMenu(menus, viewer);
这样就完了。假如我们树上的结点模型为FileModel,那么,如果有以下扩展定义:
<extension point="org.eclipse.ui.popupMenus"> <objectContribution adaptable="true" id="com.tibco.cdc.liugang.viewer.objectContribution1" nameFilter="*.*" objectClass="com.tibco.cdc.liugang.viewer.models.FileModel"> <action class="com.tibco.cdc.liugang.viewer.actions.PrintName" enablesFor="1" icon="icons/sample.gif" id="com.tibco.cdc.liugang.viewer.action1" label="Print" menubarPath="additions" style="push"/> </objectContribution> </extension>
那么,当我们在树节点上点右键时,可以看到有一个名为"print"的菜单出现。
二、定义菜单位置
通常,我们定义一个菜单扩展的时候,都会给出一个menubarPath,例如经常使用的"additions"。有menu中,我们可以预先定义一些menubarPath,用于控制菜单项的顺序/位置。例如:
String MB_ADDITIONS = "additions";
menus.add(new Separator(MB_ADDITIONS));
三、注意事项
有一些事项需要注意。如果我们给MenuManager增加了IMenuListener事件,并且在它的menuAboutToShow方法里有添加菜单的操作,那么我们需要在定义MenuManager的时候进行以下调用:
menus.setRemoveAllWhenShown(true);
否则,会出现重复菜单。
如果一些初始菜单是直接定义的,那就不需要调用这个方法,以免把已有的菜单移除了。
基于以上原则,请不要在多处定义初始菜单,例如,请不要如下定义:
menus.add(action1);
menus.addMenuListener(new IMenuListener(){
public void menuAboutToShow(IMenuManager manager) {
menus.add(action2);
}
});
要么就全在menuAboutToShow方法内定义,并调用menus.setRemoveAllWhenShown(true);否则全在该方法外定义并且不设置menus.setRemoveAllWhenShown(true);