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