Eclipse 插件开发 5 编辑器
- [1 编辑器描述](#1 编辑器描述)
- [2 自定义编辑器](#2 自定义编辑器)
-
- [2.1 注册插件(plugin.xml)](#2.1 注册插件(plugin.xml))
- [2.2 继承 EditorPart](#2.2 继承 EditorPart)
- [2.3 实现 IEditorInput](#2.3 实现 IEditorInput)
- [2.4 打开编辑器](#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)
xml
<extension point="org.eclipse.ui.editors">
<editor
id="com.xu.editor"
name="CustEditor"
class="com.xu.CustEditorPart"
extensions="myext"
default="true"/>
</extension>
2.2 继承 EditorPart
java
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;
@Override
public void doSave(IProgressMonitor arg0) {
// TODO Auto-generated method stub
}
@Override
public void doSaveAs() {
// TODO Auto-generated method stub
}
@Override
public void init(IEditorSite arg0, IEditorInput arg1) throws PartInitException {
setSite(arg0);
setInput(arg1);
}
@Override
public boolean isDirty() {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean isSaveAsAllowed() {
// TODO Auto-generated method stub
return false;
}
@Override
public void createPartControl(Composite composite) {
this.composite = composite;
composite.setLayout(new FillLayout(SWT.HORIZONTAL));
Text text = new Text(composite, SWT.BORDER);
text.setText("开始");
}
@Override
public void setFocus() {
composite.setFocus();
}
}
2.3 实现 IEditorInput
防止打开多个编辑器
java
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;
}
@Override
public boolean exists() {
return true;
}
@Override
public ImageDescriptor getImageDescriptor() {
return null;
}
@Override
public String getName() {
return id;
}
@Override
public IPersistableElement getPersistable() {
return null;
}
@Override
public String getToolTipText() {
return id;
}
@Override
public <T> T getAdapter(Class<T> adapter) {
return null;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj instanceof CustEditorInput) {
return Objects.equals(this.id, ((CustEditorInput) obj).id);
}
return false;
}
@Override
public int hashCode() {
return Objects.hash(id);
}
}
2.4 打开编辑器
java
IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
page.openEditor(new CustEditorInput("11111"), "com.xu.editor");
