GEF入门实例_总结_05_显示一个空白编辑器

一、前言

本文承接上一节:GEF入门实例_总结_04_Eclipse插件启动流程分析

在第三节( GEF入门实例_总结_03_显示菜单和工具栏  ),我们创建了菜单和工具栏。

这一节,我们来实现:点击菜单后,打开一个编辑器。

二、添加扩展

1.选择扩展点

(1)双击plugin.xml,在extensions页中,点击Add...,

(2)搜索 editors,选择 org.eclipse.ui.editors  扩展点,finish

  (3) 在新添加的 org.eclipse.ui.editors  扩展点上右键 -> New -> editor,出现下图

 2.填写editor节点详情

这里我们约束一下命名规范:所有的id均为全类名

id        :  gef.tutorial.step.ui.editor.DiagramEditor

name  :  Diagram Editor

icon    :   icons/gar.ico

class  :   gef.tutorial.step.ui.editor.DiagramEditor

default : false

二、创建Editor类

 1.创建Editor类

如下图,点击class ,会出现一个创建class的对话框。修改继承的基类为:org.eclipse.gef.ui.parts.GraphicalEditorWithFlyoutPalette,

然后点击finish。

即可生成Editor类:

package gef.tutorial.step.ui.editor;

import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.gef.palette.PaletteRoot;
import org.eclipse.gef.ui.parts.GraphicalEditorWithFlyoutPalette;

public class DiagramEditor extends GraphicalEditorWithFlyoutPalette {

    public DiagramEditor() {
        // TODO Auto-generated constructor stub
    }

    @Override
    protected PaletteRoot getPaletteRoot() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public void doSave(IProgressMonitor monitor) {
        // TODO Auto-generated method stub

    }

}

 2.修改Editor类

这里我们添加一个ID,设置一个编辑域

package gef.tutorial.step.ui.editor;

import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.gef.DefaultEditDomain;
import org.eclipse.gef.palette.PaletteRoot;
import org.eclipse.gef.ui.parts.GraphicalEditorWithFlyoutPalette;

public class DiagramEditor extends GraphicalEditorWithFlyoutPalette {

    //1.添加ID,与扩展点ID保持一致,因此为了避免出错,建议ID统一为全类名
    public static final String ID = "gef.tutorial.step.ui.editor.DiagramEditor";
    

    public DiagramEditor() {
        //2.为该编辑器设置编辑域。默认是其本身
        setEditDomain(new DefaultEditDomain(this));
    }

    @Override
    protected PaletteRoot getPaletteRoot() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public void doSave(IProgressMonitor monitor) {
        // TODO Auto-generated method stub

    }

}

3.创建DiagramEditorInput

创建好Editor之后,还需要创建一个编辑器输入

(1)在包 gef.tutorial.step.ui.editor 下新建包 input

(2)在input包下创建编辑器输入类:DiagramEditorInput,扩展自IPathEditorInput接口

package gef.tutorial.step.ui.editor.input;

import org.eclipse.core.runtime.IPath;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.ui.IPathEditorInput;
import org.eclipse.ui.IPersistableElement;

public class DiagramEditorInput implements IPathEditorInput {

    private IPath path;

    public DiagramEditorInput(IPath path) {
        this.path = path;
    }

    @Override
    public boolean exists() {
        // TODO Auto-generated method stub
        return path.toFile().exists();
    }

    @Override
    public ImageDescriptor getImageDescriptor() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public String getName() {
        // TODO Auto-generated method stub
        return path.toString();
    }

    @Override
    public IPersistableElement getPersistable() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public String getToolTipText() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public <T> T getAdapter(Class<T> adapter) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public IPath getPath() {
        // TODO Auto-generated method stub
        return path;
    }

    @Override
    public int hashCode(){
        // TODO Auto-generated method stub
        return path.hashCode();
    }

}

三、显示Editor

 我们现在已经有一个编辑器了,既然需要实现点击菜单后选择文件后打开编辑器,那么就要将点击菜单的action 与 编辑器连接起来。

1.修改 DiagramAction

我们在打开文件对话框并获取到文件保存路径之后,再打开前面创建的编辑器

package gef.tutorial.step.action;


import org.eclipse.core.runtime.Path;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;

import gef.tutorial.step.app.Activator;
import gef.tutorial.step.constant.IImageConstant;
import gef.tutorial.step.ui.editor.DiagramEditor;
import gef.tutorial.step.ui.editor.input.DiagramEditorInput;

/**
 * DiagramAction
 * 
 * @author shirayner
 *
 */
public class DiagramAction extends Action {
    private final IWorkbenchWindow window;
    public final static String ID = "gef.tutorial.step.action.DiagramAction";

    /**
     * 一、在构造方法中设置基本属性
     * 
     * @param window
     */
    public DiagramAction(IWorkbenchWindow window) {
        this.window = window;

        //1.定义该Action的ID.  每一个Action需要一个唯一的ID号
        setId(ID);

        //2.设置该Action的文字。该文字也就是菜单上的文字。"@ALT+D"用来设置该Action的快捷键
        setText("&Diagram@ALT+D");

        //3.设置工具栏的提示文本
        setToolTipText("Draw the GEF diagram.");

        //4.设置该Action的图片。该方法使用 AbstractUIPlugin 抽象类的 imageDescriptorFromPlugin() 方法快捷地获取图像。
        //imageDescriptorFromPlugin()方法需要两个参数:项目ID、图片文件名。
        setImageDescriptor(Activator.imageDescriptorFromPlugin( Activator.PLUGIN_ID, IImageConstant.EDITORTITLE));

    }




    /**
     * 二、在Run方法中设置要执行的动作。
     * 单击菜单、工具栏图标按钮或者按键时会执行Action的run方法
     * 
     */
    @Override
    public void run() {
        //1.打开文本对话框后,获取文件路径
        String path = openFileDialog();
        if (path != null) {
            //弹出一个对话框
            //MessageDialog.openInformation(window.getShell(), "温馨提示", "文件保存路径为:"+path);

            //2.根据文件路径,创建一个编辑器输入
            IEditorInput input = new DiagramEditorInput(new Path(path));

            //3.获取工作台页面
            IWorkbenchPage page = window.getActivePage();

            try{
                //4.根据扩展点ID打开编辑器.
                page.openEditor(input, DiagramEditor.ID,true);

            }catch(Exception e){
                System.err.println(e);
            }

        }

    }


    /** 打开一个文件对话框
     * 
     * @return
     *   String  文件路径
     */
    private String openFileDialog(){
        FileDialog dialog = new FileDialog(window.getShell(),SWT.OPEN);
        dialog.setText("文件保存到");
        dialog.setFilterExtensions(new String[] { ".diagram" });
        return dialog.open();
    }



}

四、运行效果

 (1)运行插件,点击菜单或者工具栏

(2)出现下图文件对话框,选择保存文件的路径,然后点击打开

 (3)出现一个带有调色板的空白编辑器

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Android干货

Android横屏下Fragment界面重叠问题

3145
来自专栏向治洪

Android Remote Views

听名字就可以看出,remote views是一种远程view,感觉有点像远程service,其实remote views是view的一个结构,他可以在其他的进程...

2027
来自专栏移动端开发

Android学习--ListView

这篇文章用于总结自己这两天学到的安卓的ListView和RecyclerView 的笔记,以及从我这个iOS开发者的角度去理解和学习这两个控件,会比较一下他们个...

2309
来自专栏向治洪

HTML中的javascript交互

在Android开发中,越来越多的商业项目使用了Android原生控件与WebView进行混合开发,当然不仅仅就是显示一个WebView那么简单,有时候还需要...

2255
来自专栏分享达人秀

Activity初入门,创建和配置如此简单

Activity是Android应用的重要组成单元之一,也是Android应用最常见的组件之一。前面看到的示例通常都只包含一个Activity或一个Ap...

2165
来自专栏软件开发 -- 分享 互助 成长

WIFI环境下Android手机和电脑通信

前面已经写过一篇java实现最基础的socket网络通信,这篇和之前那篇大同小异,只是将客户端代码移植到手机中,然后获取本机IP的方法略有不同。 先讲一下本篇中...

3925
来自专栏项勇

笔记13 | 练习Volley(二)加载网络图片的三种方法

1354
来自专栏图像识别与深度学习

《Android》Lesson02-第1个Project,Log

19612
来自专栏Android机动车

Retrofit实现带进度下载

Retrofit是目前最主流的网络框架了,它对网络请求几近完美的封装,大大降低了我们开发者的研发难度,缩短了研发周期。最近项目中遇到了下载视频和图片文件的需求(...

1222
来自专栏知识分享

android 之TCP客户端编程

吸取教训!!!本来花了5个小时写完了,没想到,,,因为没点上面的自动保存查看一下,全没了,重新写呗 关于网络通信:每一台电脑都有自己的ip地址,每台电脑上的网络...

3838

扫码关注云+社区

领取腾讯云代金券