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

你。 提交于 2019-12-10 17:53:15

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

现在看看我们的菜单,会发现总是有一些系统默认项,看上去不大清爽,如下图:

其实到现在只有两个菜单项是我们想要的: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语句,使得新的增加的菜单显示。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!