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");
相关推荐
曹牧1 小时前
Spring Boot:如何测试Java Controller中的POST请求?
java·开发语言
爬山算法2 小时前
Hibernate(90)如何在故障注入测试中使用Hibernate?
java·后端·hibernate
kfyty7252 小时前
集成 spring-ai 2.x 实践中遇到的一些问题及解决方案
java·人工智能·spring-ai
猫头虎2 小时前
如何排查并解决项目启动时报错Error encountered while processing: java.io.IOException: closed 的问题
java·开发语言·jvm·spring boot·python·开源·maven
李少兄2 小时前
在 IntelliJ IDEA 中修改 Git 远程仓库地址
java·git·intellij-idea
忆~遂愿3 小时前
ops-cv 算子库深度解析:面向视觉任务的硬件优化与数据布局(NCHW/NHWC)策略
java·大数据·linux·人工智能
小韩学长yyds3 小时前
Java序列化避坑指南:明确这4种场景,再也不盲目实现Serializable
java·序列化
仟濹3 小时前
【Java基础】多态 | 打卡day2
java·开发语言
Re.不晚3 小时前
JAVA进阶之路——无奖问答挑战2
java·开发语言
Ro Jace4 小时前
计算机专业基础教材
java·开发语言