文档章节

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

没有更多内容

加载失败,请刷新页面

加载更多

最简单的获取相机拍照的图片

  import android.content.Intent;import android.graphics.Bitmap;import android.os.Bundle;import android.os.Environment;import android.provider.MediaStore;import andr......

MrLins
55分钟前
4
0
说好不哭!数据可视化深度干货,前端开发下一个涨薪点在这里~

随着互联网在各行各业的影响不断深入,数据规模越来越大,各企业也越来越重视数据的价值。作为一家专业的数据智能公司,个推从消息推送服务起家,经过多年的持续耕耘,积累沉淀了海量数据,在...

个推
57分钟前
8
0
第三方支付-返回与回调注意事项

不管是支付宝,微信,还是其它第三方支付,第四方支付,支付机构服务商只要涉及到钱的交易都要进行如下校验,全部成功了才视为成功订单 1.http请求是否成功 2.校验商户号 3.校验订单号及状态...

Shingfi
今天
4
0
简述Java内存分配和回收策略以及Minor GC 和 Major GC(Full GC)

内存分配: 1. 栈区:栈可分为Java虚拟机和本地方法栈 2. 堆区:堆被所有线程共享,在虚拟机启动时创建,是唯一的目的是存放对象实例,是gc的主要区域。通常可分为两个区块年轻代和年老代。更...

DustinChan
今天
6
0
Excel插入批注:可在批注插入文字、形状、图片

1.批注一直显示:审阅选项卡-------->勾选显示批注选项: 2.插入批注快捷键:Shift+F2 组合键 3.在批注中插入图片:鼠标右键点击批注框的小圆点【重点不可以在批注文本框内点击】----->调出批...

东方墨天
今天
6
1

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部