Eclipse插件開發_學習_02_GEF入門實例


一、前言

這一節,我們將會創建一個GEF入門實例

 

 

二、新建RCP項目

1. New 一個 Plug-in Project

 

 

2.輸入項目名

項目名:com.ray.gef.helloworld

 

 3.Content頁

勾選下面三處

 

說明:

1處:生成一個Activator,用於管理插件的生命周期

3處:是否想要創建一個RCP程序,選擇是

 

4.模板

選擇最小的模板

 

5.添加依賴

到這一步,項目已經創建好了,不過我們還需要引入GEF相關依賴

 

打開 plugin.xml ,選擇 Dependencies,添加如下GEF依賴

 

6.修改工程目錄結構

將目錄修改成如下結構:

 

 

三、創建Editor

1.添加editor擴展

(1)雙擊plugin.xml,在extensions頁中,點擊Add...,

 

(2)搜索 editors,選擇 org.eclipse.ui.editors  擴展點,finish

 

 

 

 (3) 在新添加的 org.eclipse.ui.editors  擴展點上右鍵 -> New -> editor,出現下圖

 

 

 (4)填寫擴展節點的詳情

id        :  com.ray.gef.helloworld.view.editor.DiagramEditor

name  :  Diagram Editor

icon    :   icons/gar.ico

class  :   com.ray.gef.helloworld.view.editor.DiagramEditor

default : false

 

 

 

 (5) 如下圖,點擊class ,會出現一個創建class的對話框。修改集成的基類為:org.eclipse.gef.ui.parts.GraphicalEditor,

然后點擊finish。

 

 

 

 

即可創建Editor

 

 2.修改 DiagramEditor  類

 添加 Editor_ID,記得與plugin.xml中設置的Editor ID一致。為了避免出現問題,我們所有地方的ID,均設置成全類名的形式。

package com.ray.gef.helloworld.view.editor;

import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.gef.DefaultEditDomain;
import org.eclipse.gef.ui.parts.GraphicalEditor;

public class DiagramEditor extends GraphicalEditor {
    public static final String EDITOR_ID = "com.ray.gef.helloworld.view.editor.DiagramEditor";
    
    public DiagramEditor() {
          setEditDomain(new DefaultEditDomain(this));
    }

    @Override
    protected void initializeGraphicalViewer() {
        // TODO Auto-generated method stub

    }

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

    }

}
View Code

 

 

四、創建Action

現在編輯器editor已經創建好了,我們得想辦法讓editor顯示出來。

下面我們將創建一個菜單,點擊菜單按鈕將會創建一個空白的Editor頁面。

1.創建常量類 IImageConstant

package com.ray.gef.helloworld.constant;

public interface IImageConstant {

    public static final String EDITORTITLE = "icons/example.gif";

    public static final String NEWHELLOMODEL = "icons/newModel.gif";

    public static final String NEWCONNECTION = "icons/newConnection.gif";

    public static final String ARROWCONNECTION = "icons/arrowConnection.gif";

}
View Code

 

2.創建編輯器輸入 DiagramEditorInput 

package com.ray.gef.helloworld.view.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;
    }

    public IPath getPath() {
        return path;
    }

    public boolean exists() {
        return path.toFile().exists();
    }

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

    public String getName() {
        return path.toString();
    }

    public IPersistableElement getPersistable() {
        return null;
    }

    public String getToolTipText() {
        return path.toString();
    }

    public Object getAdapter(Class adapter) {
        // TODO Auto-generated method stub
        return null;
    }

    //add by Bin Wu
    public int hashCode() {
        return path.hashCode();
    }
    
    
    
}
View Code

 

3.創建action  DiagramAction

package com.ray.gef.helloworld.action;


import org.eclipse.core.runtime.Path;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.ISelectionListener;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.actions.ActionFactory.IWorkbenchAction;
import org.eclipse.ui.plugin.AbstractUIPlugin;

import com.ray.gef.helloworld.app.Application;
import com.ray.gef.helloworld.constant.IImageConstant;
import com.ray.gef.helloworld.view.editor.DiagramEditor;
import com.ray.gef.helloworld.view.editor.input.DiagramEditorInput;

public class DiagramAction extends Action implements ISelectionListener,
        IWorkbenchAction {

    private final IWorkbenchWindow window;
    public final static String ID = "com.ray.gef.helloworld.action.DiagramAction";
    private IStructuredSelection selection;

    public DiagramAction(IWorkbenchWindow window) {
        this.window = window;
        setId(ID);
        setText("&Diagram");
        setToolTipText("Draw the GEF diagram.");
        setImageDescriptor(AbstractUIPlugin.imageDescriptorFromPlugin(
                Application.PLUGIN_ID, IImageConstant.EDITORTITLE));
        window.getSelectionService().addSelectionListener(this);
    }

    public void dispose() {
        window.getSelectionService().removeSelectionListener(this);
    }

    public void selectionChanged(IWorkbenchPart part, ISelection selection) {
        // TODO Auto-generated method stub
        
    }

    public void run() {
        String path = openFileDialog();
        if (path != null) {
            IEditorInput input = new DiagramEditorInput(new Path(path));
            IWorkbenchPage page = window.getActivePage();
            try {
                page.openEditor(input,DiagramEditor.EDITOR_ID,true);
            } catch (PartInitException e) {
                // handle error
            }
        }
    }

    private String openFileDialog() {
        FileDialog dialog = new FileDialog(window.getShell(), SWT.OPEN);
        dialog.setText("??");
        dialog.setFilterExtensions(new String[] { ".diagram" });
        return dialog.open();
    }
}
View Code

 

4.Application.java

在Application.java中加入插件ID

package com.ray.gef.helloworld.app;

import org.eclipse.equinox.app.IApplication;
import org.eclipse.equinox.app.IApplicationContext;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.PlatformUI;

/**
 * This class controls all aspects of the application's execution
 */
public class Application implements IApplication {

    public static final String PLUGIN_ID = "com.ray.gef.helloworld";
    
    @Override
    public Object start(IApplicationContext context) throws Exception {
        Display display = PlatformUI.createDisplay();
        try {
            int returnCode = PlatformUI.createAndRunWorkbench(display, new ApplicationWorkbenchAdvisor());
            if (returnCode == PlatformUI.RETURN_RESTART)
                return IApplication.EXIT_RESTART;
            else
                return IApplication.EXIT_OK;
        } finally {
            display.dispose();
        }
        
    }

    @Override
    public void stop() {
        if (!PlatformUI.isWorkbenchRunning())
            return;
        final IWorkbench workbench = PlatformUI.getWorkbench();
        final Display display = workbench.getDisplay();
        display.syncExec(new Runnable() {
            public void run() {
                if (!display.isDisposed())
                    workbench.close();
            }
        });
    }
}
View Code

 

5.ApplicationActionBarAdvisor

在 ApplicationActionBarAdvisor.java  中添加Action,並生成菜單

package com.ray.gef.helloworld.app;

import org.eclipse.jface.action.ICoolBarManager;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.action.ToolBarManager;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.actions.ActionFactory;
import org.eclipse.ui.actions.ActionFactory.IWorkbenchAction;
import org.eclipse.ui.application.ActionBarAdvisor;
import org.eclipse.ui.application.IActionBarConfigurer;

import com.ray.gef.helloworld.action.DiagramAction;


/**
 * An action bar advisor is responsible for creating, adding, and disposing of
 * the actions added to a workbench window. Each window will be populated with
 * new actions.
 */
public class ApplicationActionBarAdvisor extends ActionBarAdvisor {

    // Actions - important to allocate these only in makeActions, and then use
    // them
    // in the fill methods. This ensures that the actions aren't recreated
    // when fillActionBars is called with FILL_PROXY.

    private IWorkbenchAction exitAction;
    private IWorkbenchAction aboutAction;
    private DiagramAction diagramAction;

    public ApplicationActionBarAdvisor(IActionBarConfigurer configurer) {
        super(configurer);
    }

    protected void makeActions(IWorkbenchWindow window) {
        exitAction = ActionFactory.QUIT.create(window);
        register(exitAction);
        
        aboutAction = ActionFactory.ABOUT.create(window);
        register(aboutAction);
        
        diagramAction = new DiagramAction(window);
        register(diagramAction);
    }

    protected void fillMenuBar(IMenuManager menuBar) {
        MenuManager fileMenu = new MenuManager("&File", "File");
        fileMenu.add(diagramAction);
        fileMenu.add(new Separator());
        fileMenu.add(exitAction);
        
        MenuManager helpMenu = new MenuManager("&Help", "help");
        helpMenu.add(aboutAction);
        
        
        menuBar.add(fileMenu);
        menuBar.add(helpMenu);
    }

    protected void fillCoolBar(ICoolBarManager coolBar) {
        IToolBarManager toolbar = new ToolBarManager(coolBar.getStyle());
        coolBar.add(toolbar);
    }

}
View Code

 

 

6. ApplicationWorkbenchWindowAdvisor

在ApplicationWorkbenchWindowAdvisor 中修改創建的 ActionBarAdvisor 為其自子類 ApplicationActionBarAdvisor

package com.ray.gef.helloworld.app;

import org.eclipse.swt.graphics.Point;
import org.eclipse.ui.application.ActionBarAdvisor;
import org.eclipse.ui.application.IActionBarConfigurer;
import org.eclipse.ui.application.IWorkbenchWindowConfigurer;
import org.eclipse.ui.application.WorkbenchWindowAdvisor;

public class ApplicationWorkbenchWindowAdvisor extends WorkbenchWindowAdvisor {

    public ApplicationWorkbenchWindowAdvisor(IWorkbenchWindowConfigurer configurer) {
        super(configurer);
    }
    
    @Override
    public ActionBarAdvisor createActionBarAdvisor(IActionBarConfigurer configurer) { 
        return new ApplicationActionBarAdvisor(configurer);
    }
    
    @Override
    public void preWindowOpen() {
        IWorkbenchWindowConfigurer configurer = getWindowConfigurer();
        configurer.setInitialSize(new Point(400, 300));
        configurer.setShowCoolBar(false);
        configurer.setShowStatusLine(false);
        configurer.setTitle("Hello RCP"); //$NON-NLS-1$
    }
}
View Code

 

7.Perspective

加入 代表此透視圖的常量 PERSPECTIVE_ID,並設置顯示編輯器區域

package gef.tutorial.step;

import org.eclipse.ui.IPageLayout;
import org.eclipse.ui.IPerspectiveFactory;

public class Perspective implements IPerspectiveFactory {
    public static final String PERSPECTIVE_ID = "gef.tutorial.step.perspective";
    
    @Override
    public void createInitialLayout(IPageLayout layout) {
        layout.setEditorAreaVisible(true);
        layout.setFixed(true);
        
    }

}
View Code

 

8.ApplicationWorkbenchAdvisor

設置要一開始要打開的透視圖

package gef.tutorial.step;

import org.eclipse.ui.application.IWorkbenchWindowConfigurer;
import org.eclipse.ui.application.WorkbenchAdvisor;
import org.eclipse.ui.application.WorkbenchWindowAdvisor;

public class ApplicationWorkbenchAdvisor extends WorkbenchAdvisor {

    

    @Override
    public WorkbenchWindowAdvisor createWorkbenchWindowAdvisor(
            IWorkbenchWindowConfigurer configurer) {
        return new ApplicationWorkbenchWindowAdvisor(configurer);
    }
    
    @Override
    public String getInitialWindowPerspectiveId() {
        return Perspective.PERSPECTIVE_ID;
    }

}
View Code

 

9.運行插件

這時我們點擊plugin.xml 的OverView頁中的 launch an Eclipse application 來運行插件,發現有兩個菜單。

點擊File子菜單Diagram,將彈出一個文件對話框,就是讓你選擇新建的文件。

然后Finish,將打開DiagramEditor 。

 

 

 

 

 

五、為Editor添加內容

下面我們將為這個Editor (View)添加內容。首先創建一個模型

 

1.創建model

HelloModel

package com.ray.gef.helloworld.model;

public class HelloModel {
    private String text = "Hello World";

    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }


}
View Code

 

2.創建控制器

創建一個連接視圖和模型的控制器

(1)EditorPart

HelloEditorPart

package com.ray.gef.helloworld.part;

import org.eclipse.draw2d.ColorConstants;
import org.eclipse.draw2d.CompoundBorder;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.Label;
import org.eclipse.draw2d.LineBorder;
import org.eclipse.draw2d.MarginBorder;
import org.eclipse.gef.editparts.AbstractGraphicalEditPart;

import com.ray.gef.helloworld.model.HelloModel;



public class HelloEditorPart extends AbstractGraphicalEditPart {

    @Override
    protected IFigure createFigure() {
        HelloModel model = (HelloModel)getModel();

        Label label = new Label();
        label.setText(model.getText());

        label.setBorder(new CompoundBorder(new LineBorder(), new MarginBorder(3)));

        //設置背景顏色
        label.setBackgroundColor(ColorConstants.orange);

        label.setOpaque(true);

        return label;
    }

    @Override
    protected void createEditPolicies() {
        // TODO Auto-generated method stub

    }

}
View Code

 

(2) EditorPartFactory

連接模型與控制器

PartFactory

package com.ray.gef.helloworld.part;


import org.eclipse.gef.EditPart;
import org.eclipse.gef.EditPartFactory;

import com.ray.gef.helloworld.model.HelloModel;


public class PartFactory implements EditPartFactory {

    //------------------------------------------------------------------------
    // Abstract methods from EditPartFactory

    public EditPart createEditPart(EditPart context, Object model) {

        //get EditPart for model element
        EditPart part = getPartForElement(model);
        //store model element in EditPart
        part.setModel(model); 
        return part;
    }

    /**
     * Maps an object to an EditPart. 
     * @throws RuntimeException if no match was found (programming error)
     */
    private EditPart getPartForElement(Object modelElement) {
        //根據模型類創建其控制器
        if (modelElement instanceof HelloModel)
            return new HelloEditorPart();


        throw new RuntimeException(
                "Can't create part for model element: "
                        + ((modelElement != null) ? modelElement.getClass().getName() : "null"));
    }

}
View Code

 

3.創建視圖View

在 DiagramEditor 中創建view,我們這里創建一個 GraphicalViewer,

DiagramEditor

package com.ray.gef.helloworld.view.editor;

import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.gef.DefaultEditDomain;
import org.eclipse.gef.GraphicalViewer;
import org.eclipse.gef.ui.parts.GraphicalEditor;

import com.ray.gef.helloworld.model.HelloModel;
import com.ray.gef.helloworld.part.PartFactory;

public class DiagramEditor extends GraphicalEditor {
    public static final String EDITOR_ID = "com.ray.gef.helloworld.view.editor.DiagramEditor";
    GraphicalViewer viewer;
    
    public DiagramEditor() {
          setEditDomain(new DefaultEditDomain(this));
    }

    @Override
    protected void initializeGraphicalViewer() {
        // TODO Auto-generated method stub
        viewer.setContents(new HelloModel());
    }

    @Override
    protected void configureGraphicalViewer(){
        
        super.configureGraphicalViewer();
        viewer = getGraphicalViewer();
        viewer.setEditPartFactory(new PartFactory());
        
        
    }
    @Override
    public void doSave(IProgressMonitor monitor) {
        // TODO Auto-generated method stub

    }
}
View Code

 

4.運行項目

這時我們運行項目,點擊File->diagrame,設置新文件名稱,Finish,會出現下圖。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM