前边有至少两篇文章讲了添加右击菜单,一种是算是纯粹的用代码添加,另一种是借助扩展点。借助扩展点的方法虽然比较简单,可是不够灵活,好比你想让某一菜单项在知足必定条件时才显示,或者想构造动态的菜单,那么就必须使用代码添加的方法了,并在构造菜单时作一个判断,知足条件才把这个菜单加上去。eclipse
如今看看咱们的菜单,会发现老是有一些系统默认项,看上去不大清爽,以下图:ide
其实到如今只有两个菜单项是咱们想要的:Delete From Model以及Change Image,其余的显示在那显得不少余,也很不美观。函数
GMF中菜单项的管理是在DiagramEditorContextMenuProvider类,咱们在这个类中添加如下代码:ui
// 过滤不须要的上下文菜单 public IContributionItem[] getItems() { IContributionItem[] items = super.getItems(); filterSystemPopMenu(items); return items; }
这个方法先得到全部的右击菜单项,而后使用filterSystemPopMenu(items);方法过滤菜单以后返回过滤以后的菜单项。code
filterSystemPopMenu(items);代码以下:ip
// 过滤菜单项 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()函数改为以下:rem
public void run() { menu.removeAll(); menu.add(deleteAction); }
代码完成,运行截图以下:get
要注意的是,设置了过滤菜单,之后每添加一个菜单都要在filterSystemPopMenu(items);方法中加一个else if语句,使得新的增长的菜单显示。it