前边有至少两篇文章讲了添加右击菜单,一种是算是纯粹的用代码添加,另外一种是借助扩展点。借助扩展点的方法虽然比较简单,但是不够灵活,比如你想让某一菜单项在满足一定条件时才显示,或者想构造动态的菜单,那么就必须使用代码添加的方法了,并在构造菜单时做一个判断,满足条件才把这个菜单加上去。
现在看看我们的菜单,会发现总是有一些系统默认项,看上去不大清爽,如下图:
其实到现在只有两个菜单项是我们想要的:Delete From Model以及Change Image,其他的显示在那显得很多余,也很不美观。
GMF中菜单项的管理是在DiagramEditorContextMenuProvider类,我们在这个类中添加以下代码:
// 过滤不需要的上下文菜单
public IContributionItem[] getItems() {
IContributionItem[] items = super.getItems();
filterSystemPopMenu(items);
return items;
}
这个方法先获得所有的右击菜单项,然后使用filterSystemPopMenu(items);方法过滤菜单之后返回过滤之后的菜单项。
filterSystemPopMenu(items);代码如下:
// 过滤菜单项
void filterSystemPopMenu(IContributionItem[] items) {
for (int i = 0; i < items.length; i++) {
String itemId = items[i].getId();
if (itemId != null&& itemId.equalsIgnoreCase(ActionIds.ACTION_DELETE_FROM_MODEL)) {
items[i].setVisible(true);
} else if (itemId != null&& itemId.equalsIgnoreCase("org.eclipse.myTest.shapes.diagram.edit.actions.ChangeImageAction")){
items[i].setVisible(true);
} else {
items[i].setVisible(false);
}
}
}
把buildContextMenu方法中的run()函数改成如下:
public void run() {
menu.removeAll();
menu.add(deleteAction);
}
代码完成,运行截图如下:
要注意的是,设置了过滤菜单,以后每添加一个菜单都要在filterSystemPopMenu(items);方法中加一个else if语句,使得新的增加的菜单显示。
来源:oschina
链接:https://my.oschina.net/u/164134/blog/35167