文档章节

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

双子座
 双子座
发布于 2011/11/14 17:01
字数 429
阅读 512
收藏 0

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

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

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

© 著作权归作者所有

双子座
粉丝 540
博文 78
码字总数 61009
作品 0
南京
程序员
私信 提问
GMF之Shapes实例Part1:创建一个GMF项目

接触GEF与GMF有一段时间了,感觉它们的功能还是很强大的,只是我学的比较慢。也许每个人的学习方法不一样,我比较习惯做简单的例子。今天下午也不干活了,写几篇关于GMF入门的博客。以后有时...

双子座
2011/08/24
1K
13
GMF之Shapes实例Part4:为结点Node设置右击菜单并更换图片

在上一篇文章中,我们实现了为结点设置图片,但是我们还不能修改结点的图片,所有相同类型结点的图片是一样的。 本例首先给结点添加右击菜单,然后实现修改结点图片的功能。 1、修改Reserve...

双子座
2011/09/08
637
1
GMF之Shapes实例Part5:使用扩展点为指定类型结点添加右击菜单并改变图片

在Part4中我们为节点添加了右击菜单,但是使用这种方式会给所有节点都添加菜单。如果我们只想给某种类型的结点添加菜单,就要使用扩展点方式了。 1、首先新建一个Action:在工程org.eclipse...

双子座
2011/10/06
600
0
GMF中设置Base Package

你好,我想问你一个问题,你写的GMF之Shapes实例Part6,这个部分里面有: 2. 保存shapes.ecore_diagram,删除shapes.genmodel,重新创建一个shapes.genmodel,类似GMF之Shapes实例Part1中,别...

lovewbo
2012/03/27
142
2
GMF之Shapes实例Part6:给结点添加图片并实现保存

之前给结点设置图片都不能保存,下次打开后还是原来的图片。接下来就是实现永久保存,其实就是给Shape结点所对应的模型元素添加一个属性ID,这个ID的值在创建模型时确定,并且,我们选择图片...

双子座
2011/10/06
505
0

没有更多内容

加载失败,请刷新页面

加载更多

新建作业20191011121223

2.编写一个程序,发出一声警报,然后打印下面的文本: Startled by the sudden sound,Sally shouted,"By the Great Pumpkin,what was that!" #include<stdio.h>int main(){printf("\a");......

电子197朱妍
28分钟前
3
0
家庭作业——苗钰婷

2 编写一个程序,发出一声警报,然后打印下面的文本: Startled by the sudden sound, Sally shouted, "By the Great Pumpkin, what was that! #include<stdio.h>int main(){......

OSC_Okruuv
49分钟前
6
0
经典系统设计面试题解析:如何设计TinyURL(一)

原文链接: https://www.educative.io/courses/grokking-the-system-design-interview/m2ygV4E81AR 编者注:本文以一道经典的系统设计面试题:《如何设计TinyURL》的参考答案和解析为例,帮助...

APEMESH
50分钟前
6
0
2.面向对象设计原则(7条)

开闭原则 开闭原则的含义是:当应用的需求改变时,在不修改软件实体的源代码或者二进制代码的前提下,可以扩展模块的功能,使其满足新的需求。 实现方法 可以通过“抽象约束、封装变化”来实...

Eappo_Geng
52分钟前
10
0
8086汇编基础 debug P命令 一步完成loop循环

    IDE : Masm for Windows 集成实验环境 2015     OS : Windows 10 x64 typesetting : Markdown    blog : my.oschina.net/zhichengjiu    gitee : gitee.com/zhichengjiu   ......

志成就
57分钟前
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部