GMF之Shapes实例Part7:过滤右击菜单

前边有至少两篇文章讲了添加右击菜单,一种是算是纯粹的用代码添加,另一种是借助扩展点。借助扩展点的方法虽然比较简单,可是不够灵活,好比你想让某一菜单项在知足必定条件时才显示,或者想构造动态的菜单,那么就必须使用代码添加的方法了,并在构造菜单时作一个判断,知足条件才把这个菜单加上去。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

相关文章
相关标签/搜索