前邊有至少兩篇文章講了添加右擊菜單,一種是算是純粹的用代碼添加,另一種是藉助擴展點。藉助擴展點的方法雖然比較簡單,可是不夠靈活,好比你想讓某一菜單項在知足必定條件時才顯示,或者想構造動態的菜單,那麼就必須使用代碼添加的方法了,並在構造菜單時作一個判斷,知足條件才把這個菜單加上去。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