Eclipse 插件开发 5 编辑器
Eclipse 插件开发 5 编辑器
- 1 编辑器描述
- 2 自定义编辑器
- 2.1 注册插件(plugin.xml)
- 2.2 继承 EditorPart
- 2.3 实现 IEditorInput
- 2.4 打开编辑器
1 编辑器描述
Eclipse 的 UI 基于 Workbench(工作台)模型,Editor Area 是 Workbench 的核心区域之一,用于显示各类“编辑器”界面。
编辑器区域与其他 UI 区域的关系
区域 | 描述 |
---|---|
Editor Area | 中心区域,用于显示 EditorPart (编辑器) |
View(视图) | 比如 Project Explorer、Outline、Console,围绕编辑器区域分布 |
Perspective | 一组 View + Editor 的布局配置 |
Part | 包括 ViewPart 和 EditorPart |
WorkbenchPage | 表示当前工作台页面,管理所有 View 和 Editor 的容器 |
编辑器(EditorPart)的特点
特点 | 描述 |
---|---|
生命周期管理 | Eclipse 管理打开、关闭、激活等 |
文件编辑能力 | 比如 Java、XML、Text 文件都是用 EditorPart 打开的 |
可嵌入 UI 组件 | 可以自定义控件(Composite、Label、Canvas、Table 等) |
可响应拖放 | 可以注册 DropTarget 监听器 |
对比项 | ViewPart | EditorPart |
---|---|---|
所在区域 | 边栏区域 | 中心编辑器区域 |
关闭方式 | 可以一直打开 | 可关闭和切换 |
适合用途 | 项目结构、资源浏览器 | 资源编辑、图形设计 |
典型示例 | Project Explorer, Console | Java 编辑器、文本编辑器 |
2 自定义编辑器
2.1 注册插件(plugin.xml)
<extension point="org.eclipse.ui.editors"><editorid="com.xu.editor"name="CustEditor"class="com.xu.CustEditorPart"extensions="myext"default="true"/>
</extension>
2.2 继承 EditorPart
package com.xu.test;import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorSite;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.part.EditorPart;public class CustEditorPart extends EditorPart {private Composite composite;@Overridepublic void doSave(IProgressMonitor arg0) {// TODO Auto-generated method stub }@Overridepublic void doSaveAs() {// TODO Auto-generated method stub}@Overridepublic void init(IEditorSite arg0, IEditorInput arg1) throws PartInitException {setSite(arg0);setInput(arg1);}@Overridepublic boolean isDirty() {// TODO Auto-generated method stubreturn false;}@Overridepublic boolean isSaveAsAllowed() {// TODO Auto-generated method stubreturn false;}@Overridepublic void createPartControl(Composite composite) {this.composite = composite;composite.setLayout(new FillLayout(SWT.HORIZONTAL));Text text = new Text(composite, SWT.BORDER);text.setText("开始");}@Overridepublic void setFocus() {composite.setFocus();}}
2.3 实现 IEditorInput
防止打开多个编辑器
package com.xu.test;import java.util.Objects;import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IPersistableElement;public class CustEditorInput implements IEditorInput {private final String id;public CustEditorInput(String id) {this.id = id;}public String getId() {return id;}@Overridepublic boolean exists() {return true;}@Overridepublic ImageDescriptor getImageDescriptor() {return null;}@Overridepublic String getName() {return id;}@Overridepublic IPersistableElement getPersistable() {return null;}@Overridepublic String getToolTipText() {return id;}@Overridepublic <T> T getAdapter(Class<T> adapter) {return null;}@Overridepublic boolean equals(Object obj) {if (this == obj)return true;if (obj instanceof CustEditorInput) {return Objects.equals(this.id, ((CustEditorInput) obj).id);}return false;}@Overridepublic int hashCode() {return Objects.hash(id);}}
2.4 打开编辑器
IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
page.openEditor(new CustEditorInput("11111"), "com.xu.editor");