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 } }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_顯示一個空白編輯器