Eclipse 插件开发 5 编辑器

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");
相关推荐
pyniu几秒前
Spring Boot租房管理系统
java·spring boot·后端
野生技术架构师13 分钟前
TokenRetryHelper 详解与 Spring Boot 迁移方案
java·spring boot·后端
蚰蜒螟14 分钟前
Redis网络层深度解析:数据如何写回客户端
java·开发语言·bootstrap
廋到被风吹走20 分钟前
【Java】新特性最佳实践:避坑指南与性能优化
java·性能优化
ziyue757521 分钟前
idea不能使用低版本插件问题解决
java·ide·intellij-idea
牛奔32 分钟前
Kubernetes 节点安全维护全流程:从驱逐 Pod 到彻底清理残留
java·安全·云原生·容器·kubernetes
disgare35 分钟前
关于分布式系统 RPC 中高可用功能的实现
java·分布式
温柔的小猪竹39 分钟前
面向对象的六大原则
java
洛小豆42 分钟前
孤儿资源治理:如何优雅处理“上传了但未提交”的冗余文件?
java·后端·面试