文档章节

GMF之Shapes实例Part5:使用扩展点为指定类型结点添加右击菜单并改变图片

双子座
 双子座
发布于 2011/10/06 15:33
字数 529
阅读 600
收藏 1

在Part4中我们为节点添加了右击菜单,但是使用这种方式会给所有节点都添加菜单。如果我们只想给某种类型的结点添加菜单,就要使用扩展点方式了。

1、首先新建一个Action:在工程org.eclipse.myTest.shapes.diagram中的Actions包中新建一个类ChangeImageAction,并使它继承AbstractActionDelegate类并实现接口IObjectActionDelegate,在这个Action中首先选择图片,然后再给指定结点改变图片,其完整代码如下:

package org.eclipse.myTest.shapes.diagram.edit.actions;

import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.emf.transaction.RecordingCommand;
import org.eclipse.emf.transaction.TransactionalEditingDomain;
import org.eclipse.gmf.runtime.common.ui.action.AbstractActionDelegate;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.myTest.shapes.ReserveShape1;
import org.eclipse.myTest.shapes.diagram.edit.parts.ReserveShape1EditPart;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.ui.IObjectActionDelegate;
import org.eclipse.ui.PlatformUI;

public class ChangeImageAction extends AbstractActionDelegate implements
        IObjectActionDelegate {

    @Override
    protected void doRun(IProgressMonitor progressMonitor) {
        // 打开文件对话框,找到要使用的图片
        FileDialog fileDlg = new FileDialog(PlatformUI.getWorkbench()
                .getDisplay().getActiveShell());
        String imagePath = fileDlg.open();
        if(imagePath==null)return ;
        // 获得所选择的IStructuredSelection
        IStructuredSelection selection = getStructuredSelection();
        Object selEditPart = selection.getFirstElement();
        // 如果选中的是ReserveShape1EditPart类型的EditPart
        if (selEditPart instanceof ReserveShape1EditPart) {
            ReserveShape1EditPart editPart = (ReserveShape1EditPart) selEditPart;
            // 获得模型(此处未用到)
            ReserveShape1 model = (ReserveShape1) editPart
                    .resolveSemanticElement();
            // 获得领域模型
            TransactionalEditingDomain domain = editPart.getEditingDomain();
            // 创建命令
            ChangeImageCommand command = new ChangeImageCommand(domain,
                    editPart, imagePath);
            // 执行命令
            domain.getCommandStack().execute(command);

        }
    }

    // 改变图片到指定结点的命令
    public class ChangeImageCommand extends RecordingCommand {
        private ReserveShape1EditPart editPart = null;
        private String imagePath = "";

        public ChangeImageCommand(
                TransactionalEditingDomain transactionalEditingDomain,
                ReserveShape1EditPart editPart, String imagePath) {
            super(transactionalEditingDomain);
            this.editPart = editPart;
            this.imagePath = imagePath;
        }

        @Override
        protected void doExecute() {
            editPart.changeImageData(imagePath);
            editPart.getPrimaryShape().repaint();
        }
    }
}

 2、打开工程org.eclipse.myTest.shapes.diagram下的MANIFEST.MF文件,选择Extentions,在All Extentions中添加扩展点:

在上图点击Add,找到org.eclipse.ui.popupMenus并添加。

3、右击org.eclipse.ui.popupMenus添加objectContribution,并在右边设置其ID为org.eclipse.myTest.shapes.diagram.ReserveShape1EditPart,objectClass选择我们想要操作的EditPart,这里是org.eclipse.myTest.shapes.diagram.edit.parts.ReserveShape1EditPart。

4、右击上边添加的objectContribution,添加action,在右边设置其ID与class都是org.eclipse.myTest.shapes.diagram.edit.actions.ChangeImageAction,其中class就是选择执行这个菜单项时的Action。

label设置为Change Image,并设置这个菜单的小图标(事先已经在工程org.eclipse.myTest.shapes.diagram下的icons\custom目录下添加了小图标文件ChangeImageAction.png)。完成后如下:

5、在ReserveShape1EditPart中添加方法:

/**
 * 修改OrgImageData
 */
public void changeImageData(String imagePath) {
    OrgImageData = new ImageData(imagePath);
}

6、运行截图:

 代码下载:http://www.oschina.net/code/snippet_164134_6488

© 著作权归作者所有

双子座
粉丝 540
博文 78
码字总数 61009
作品 0
南京
程序员
私信 提问
GMF之Shapes实例Part4:为结点Node设置右击菜单并更换图片

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

双子座
2011/09/08
637
1
GMF之Shapes实例Part6:给结点添加图片并实现保存

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

双子座
2011/10/06
505
0
GMF之Shapes实例Part7:过滤右击菜单

前边有至少两篇文章讲了添加右击菜单,一种是算是纯粹的用代码添加,另外一种是借助扩展点。借助扩展点的方法虽然比较简单,但是不够灵活,比如你想让某一菜单项在满足一定条件时才显示,或者...

双子座
2011/11/14
512
0
GMF之Shapes实例Part1:创建一个GMF项目

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

双子座
2011/08/24
1K
13
GMF 教程 Mindmap 5

这一部分主要实现的是: 使用扩展的Plug-in为我们的Diagram添加一个自定义动作 Creating a Customization Plug-in 尽管可以给生成的代码添加备注@generated NOT来避免下次重新生成代码时覆盖...

双子座
2013/03/17
579
0

没有更多内容

加载失败,请刷新页面

加载更多

在Linux下使用linuxdeployqt发布Qt程序

目录 一、简介 二、安装linuxdeployqt 三、配置 qt 的环境变量 四、打包应用程序 五、编写linux桌面图标启动(可选步骤) 六、编写开机脚本 runApp.sh 七、打包成deb包 八、扩展 回到顶部 一...

shzwork
10分钟前
3
0
Linux进程管理

计算机硬件层面之上是操作系统,狭义的操作系统主要指系统内核,内核有以下作用:进程管理、文件系统、网络管理、内存管理、驱动程序、安全功能。内核可以将用户无法操作的底层硬件接口进行抽...

lhdzw
昨天
1
0
Java13的新特性

Java语言特性系列 Java5的新特性 Java6的新特性 Java7的新特性 Java8的新特性 Java9的新特性 Java10的新特性 Java11的新特性 Java12的新特性 Java13的新特性 Java14的新特性 序 本文主要讲述...

go4it
昨天
6
0
IDEA 配置Springboot项目热部署

实现的方式概述 注意以下的热部署方式在IDEA是默认没有打开自动编译的,手动编译需要快捷键(Ctrl+Shift+F9),自动编译的修改配置如下:(注意刷新不要太快,会有1-2秒延迟) File-Settings-C...

小强的进阶之路
昨天
9
0
免费数据分析工具:secsoso

前段时间思考了理想数据分析平台,之后我们根据这个思路开发了spl语言并提供了一个数据分析平台,这个平台主要用在搜索ES,数据库索引中的数据。但后来发现对文件的事后处理也是个非常重要的...

赛克蓝德
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部