`
liugang594
  • 浏览: 978813 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

GEF中增加ContextMenu的支持

    博客分类:
  • GEF
阅读更多

 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项可以被显示出来!

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics