文档章节

GMF之Shapes实例Part6:给结点添加图片并实现保存

双子座
 双子座
发布于 2011/10/06 19:00
字数 658
阅读 505
收藏 0

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

1、给AbstractShape模型添加属性ID:修改工程org.eclipse.myTest.shapes下的models下的shapes.ecore_diagram,这样它所对应的shapes.ecore文件也会改变,为AbstractShape添加属性ID,类型是EString,具体操作参考GMF之Shapes实例Part1。

2、保存shapes.ecore_diagram,删除shapes.genmodel,重新创建一个shapes.genmodel,类似GMF之Shapes实例Part1中,别忘了设置Base Package为org.eclipse.myTest,然后重新生成Model Code、Edit Code和Editor Code,参考GMF之Shapes实例Part1。

3、在工程org.eclipse.myTest.shapes下的org.eclipse.myTest.shapes.util下新建一个类,用于产生一个全局唯一的ID:

package org.eclipse.myTest.shapes.util;

import java.util.UUID;

public class GUID {
    /**
     *  功能:产生一个全局唯一的ID
     */
    public static final String GenerateGUID() {
        UUID uuid = UUID.randomUUID();
        return uuid.toString();
    }
}

4、在工程org.eclipse.myTest.shapes中的org.eclipse.myTest.shapes.impl包中的AbstractShapeImpl类中修改其构造函数为:

/**
 * <!-- begin-user-doc -->
 * <!-- end-user-doc -->
 * @generated NOT 构造函数,设置ID
 */
protected AbstractShapeImpl() {
    super();
    this.setID(GUID.GenerateGUID());
}

5、在ReserveShape1EditPart中添加属性runtimePath和ID,类型都是String:

/**
 * @generated NOT
 */
private String runtimePath;
private String ID;

 6、修改ReserveShape1EditPart的构造函数:

/**
 * @generated NOT
 */
public ReserveShape1EditPart(View view) {
    super(view);
    runtimePath = Platform.getInstanceLocation().getURL().getPath();
    // 设置图片存放的目录为runtimePath\images,如果这个目录不存在则要创建它
    runtimePath += "images/";
    // 判断文件夹是否存在,不存在创建
    File file = new File(runtimePath);
    if (!file.isDirectory()) {
        file.mkdir();
    }
    //获得ID
    ID=((ReserveShape1)((View) this.getModel()).getElement()).getID();
    //判断目录下是否有ID.jpg文件,如果有的话就调用changeImageData
    file=new File(runtimePath+ID+".jpg");
    if(file.exists()){
        changeImageData();
    }
}

7、在ReserveShape1EditPart中新建一个方法changeImageData():

/**
 * 功能:根据ID创建OrgImageData
 */
public void changeImageData() {
    OrgImageData = new ImageData(runtimePath + ID + ".jpg");
}

8、修改ChangeImageAction中doRun函数中if中的代码,添加复制图片的操作如下:

if (selEditPart instanceof ReserveShape1EditPart) {
    ReserveShape1EditPart editPart = (ReserveShape1EditPart) selEditPart;
    // 获得模型(此处未用到)
    ReserveShape1 model = (ReserveShape1) editPart
            .resolveSemanticElement();
    //将选择的图片拷贝到指定目录下
    String runtimePath = Platform.getInstanceLocation().getURL().getPath();
    runtimePath += "images/";
    runtimePath+=model.getID();
    runtimePath+=".jpg";
    try {
        FileOption.copyFile(imagePath, runtimePath);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        return ;
    }
    // 获得领域模型
    TransactionalEditingDomain domain = editPart.getEditingDomain();
    // 创建命令
    ChangeImageCommand command = new ChangeImageCommand(domain, editPart);
    // 执行命令
    domain.getCommandStack().execute(command);
}

9、修改ChangeImageAction子类ChangeImageCommand的构造函数,并去掉成员变量imagePath:

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

修改其doExecute方法:

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

好了,至此大功告成!

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

© 著作权归作者所有

双子座
粉丝 540
博文 78
码字总数 61009
作品 0
南京
程序员
私信 提问
GMF中设置Base Package

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

lovewbo
2012/03/27
141
2
GMF之Shapes实例Part4:为结点Node设置右击菜单并更换图片

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

双子座
2011/09/08
637
1
GMF之Shapes实例Part1:创建一个GMF项目

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

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

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

双子座
2011/10/06
598
0
GMF之Shapes实例Part3:为结点Node设置图片或颜色

1、把要用到的图片放在org.eclipse.myTest.shapes.diagram工程下的icons/custom文件夹下,我用的是ReserveShapeFigure.jpg,然后刷新这个工程。 2、我想要设置图片的元素是ReserveShape1,打...

双子座
2011/08/24
544
0

没有更多内容

加载失败,请刷新页面

加载更多

计算机实现原理专题--二进制减法器(二)

在计算机实现原理专题--二进制减法器(一)中说明了基本原理,现准备说明如何来实现。 首先第一步255-b运算相当于对b进行按位取反,因此可将8个非门组成如下图的形式: 由于每次做减法时,我...

FAT_mt
昨天
6
0
好程序员大数据学习路线分享函数+map映射+元祖

好程序员大数据学习路线分享函数+map映射+元祖,大数据各个平台上的语言实现 hadoop 由java实现,2003年至今,三大块:数据处理,数据存储,数据计算 存储: hbase --> 数据成表 处理: hive --> 数...

好程序员官方
昨天
7
0
tabel 中含有复选框的列 数据理解

1、el-ui中实现某一列为复选框 实现多选非常简单: 手动添加一个el-table-column,设type属性为selction即可; 2、@selection-change事件:选项发生勾选状态变化时触发该事件 <el-table @sel...

everthing
昨天
6
0
【技术分享】TestFlight测试的流程文档

上架基本需求资料 1、苹果开发者账号(如还没账号先申请-苹果开发者账号申请教程) 2、开发好的APP 通过本篇教程,可以学习到ios证书申请和打包ipa上传到appstoreconnect.apple.com进行TestF...

qtb999
昨天
10
0
再见 Spring Boot 1.X,Spring Boot 2.X 走向舞台中心

2019年8月6日,Spring 官方在其博客宣布,Spring Boot 1.x 停止维护,Spring Boot 1.x 生命周期正式结束。 其实早在2018年7月30号,Spring 官方就已经在博客进行过预告,Spring Boot 1.X 将维...

Java技术剑
昨天
18
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部