GEF中增加ContextMenu的支持

 GEF中,增加对EditPart的右键菜单的支持是很普遍的一个需求。

 

这里就简单介绍一下增加右键菜单的方法。

 

首先需要了解的就是要支持右键菜单,就需要有一个用来管理和显示菜单的MenuManager对象加到图元对象上去,类似于JFace中对MenuManager的支持。

 

GEF中有一个类:ContextMenuProvider,就是用来实现对ContextMenu的支持。所以我们需要实现一个ContextMenuProvider的子类用于定义所有在Menu上的Action。例如:

 

public class ElementsContextMenuProvider extends ContextMenuProvider {

	private ActionRegistry actionRegistry;
	
	public ElementsContextMenuProvider(EditPartViewer viewer,ActionRegistry registry) {
		super(viewer);
		this.actionRegistry = registry;
	}

	@Override
	public void buildContextMenu(IMenuManager menu) {
		menu.add(actionRegistry.getAction(ActionFactory.REDO.getId()));
		menu.add(actionRegistry.getAction(ActionFactory.UNDO.getId()));
	}

}

 

 

有了这个类以后,就是把这个类设置到Viewer上去,在configureGraphicalViewer()可以如下做:

 

		ElementsContextMenuProvider contextMenu = new ElementsContextMenuProvider(
				viewer, getActionRegistry());
		viewer.setContextMenu(contextMenu);

 

 

这样所有在buildContextMenu()方法里添加的Action就会在Menu里显示出来。

 

除此之类。我们也可以利用org.eclipse.ui.popupMenus扩展点来定义扩展的Action。要想使用扩展的PopupMenu,则需要注册Menu,如下:

 

		ElementsContextMenuProvider contextMenu = new ElementsContextMenuProvider(
				viewer, getActionRegistry());
		viewer.setContextMenu(contextMenu);
		getSite().registerContextMenu(contextMenu, viewer);

 

 

然后我们就可以针对不同类型的EditPart对象定义PopupMenu扩展。不过需要注意提:有可能把不相关的PopupMenu项加进来了!

 

最简单,可以定义一些过滤规则,然后在最后显示Item之前把它们过滤掉,例如,可以重写getItems()方法,如下:

 

	@Override
	public IContributionItem[] getItems() {
		IContributionItem[] items = super.getItems();
		List<IContributionItem> remains = new ArrayList<IContributionItem>();
		for(IContributionItem i:items){
			if(isAllowed(i)){
				remains.add(i);
			}
		}
		return remains.toArray(new IContributionItem[0]);
	}
	
	private boolean isAllowed(IContributionItem itemToAdd) {
		String id = itemToAdd.getId();
		if(id==null){
			return false;
		}
		if (!id.startsWith("com.tibco.cdc.liugang")
						&& !id.equals(ActionFactory.REDO.getId()) && !id
						.equals(ActionFactory.UNDO.getId())) {
			return false;
		}
		return true;
	}

 

 

这样只有以我的包前为前缀的item和redo、undo项可以被显示出来!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值