1. 程式人生 > >GEF入門實例_總結_05_顯示一個空白編輯器

GEF入門實例_總結_05_顯示一個空白編輯器

truct exce category open() www. cfb script extends rac

一、前言

本文承接上一節: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

    }

}
View Code

技術分享圖片

技術分享圖片

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

    }

}
View Code

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();
    }

}
View Code

三、顯示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();
    }



}
View Code

四、運行效果

(1)運行插件,點擊菜單或者工具欄

技術分享圖片

(2)出現下圖文件對話框,選擇保存文件的路徑,然後點擊打開

技術分享圖片

(3)出現一個帶有調色板的空白編輯器

技術分享圖片

GEF入門實例_總結_05_顯示一個空白編輯器