在Viewer中注册可扩展的右键菜单

我们知道在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);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值