Eclipse 插件开发 5.3 编辑器 监听输入

Eclipse 插件开发 5.3 编辑器监 听输入

  • [1 插件配置](#1 插件配置)
  • [2 添加监听](#2 添加监听)
  • [3 查看效果](#3 查看效果)
java 复制代码
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Click1
Bundle-SymbolicName: com.xu.click1;singleton:=true
Bundle-Version: 1.0.0
Bundle-Activator: com.xu.click1.Activator
Bundle-Vendor: XU
Require-Bundle: org.eclipse.ui,
 org.eclipse.core.runtime,
 org.eclipse.ui.editors,
 org.eclipse.ui.workbench.texteditor,
 org.eclipse.core.resources,
 org.eclipse.text
Bundle-RequiredExecutionEnvironment: JavaSE-24
Automatic-Module-Name: com.xu.click1
Bundle-ActivationPolicy: lazy

org.eclipse.ui.IStartup 是 Eclipse 插件开发中用于在 工作台启动时自动执行代码 的接口。

org.eclipse.ui.IStartup 适用于以下场景:

1、启动时注册监听器(如监听编辑器、视图、资源等)

2、启动时预加载某些资源或服务

3、提前初始化你的插件逻辑

4、注册全局快捷键、UI 元素等

IStartup 注意事项

注意点 说明
UI 操作必须放在 UI 线程中 使用 Display.getDefault().asyncExec(...)
插件必须在 plugin.xml 中注册扩展点 否则 earlyStartup() 不会执行
不要阻塞 earlyStartup() 否则会影响 Eclipse 启动速度

IStartup 常见用途示例

用途 说明
自动附加文档监听器 监听所有打开的 ITextEditor 并获取实时输入
注册资源监听器 监听项目、文件变化
注册窗口、视图、编辑器监听器 管理 UI 生命周期
初始化日志系统、缓存等 提前准备插件运行环境

1 插件配置

java 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<?eclipse version="3.4"?>
<plugin>
    
    <extension point="org.eclipse.ui.startup">
        <startup class="com.xu.click1.StartupListener" />
    </extension>

</plugin>

2 添加监听

java 复制代码
package com.xu.click1;

import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IStartup;

import com.xu.edit.EditUtil;

public class StartupListener implements IStartup {

	@Override
	public void earlyStartup() {
		Display.getDefault().asyncExec(() -> {
			new EditUtil().addEditListener();
		});
	}

}
java 复制代码
package com.xu.edit;

import org.eclipse.jface.text.DocumentEvent;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.IDocumentListener;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IEditorReference;
import org.eclipse.ui.IPartListener2;
import org.eclipse.ui.IPartService;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkbenchPartReference;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.texteditor.IDocumentProvider;
import org.eclipse.ui.texteditor.ITextEditor;

public class EditUtil {

	public void addEditListener() {
		IWorkbench workbench = PlatformUI.getWorkbench();
		oldEditListener(workbench);
		newEditListener(workbench);
	}

	private void oldEditListener(IWorkbench workbench) {
		if (null == workbench) {
			return;
		}

		IWorkbenchWindow window = workbench.getActiveWorkbenchWindow();
		if (null == window) {
			return;
		}

		IWorkbenchPage page = window.getActivePage();
		if (null == page) {
			return;
		}

		for (IEditorReference ref : page.getEditorReferences()) {
			IEditorPart editor = ref.getEditor(true);
			if (null == editor) {
				continue;
			}
			addListener((ITextEditor) editor);
		}
	}

	private void addListener(ITextEditor editor) {
		if (null == editor) {
			return;
		}

		IDocumentProvider provider = editor.getDocumentProvider();
		IDocument document = provider.getDocument(editor.getEditorInput());
		document.addDocumentListener(new IDocumentListener() {

			@Override
			public void documentAboutToBeChanged(DocumentEvent arg0) {
				// TODO Auto-generated method stub
			}

			@Override
			public void documentChanged(DocumentEvent arg0) {
				// TODO Auto-generated method stub
				System.out.println(String.format("%s:%s", arg0.getOffset(), arg0.getText()));
			}

		});
	}

	private void newEditListener(IWorkbench workbench) {
		if (null == workbench) {
			return;
		}

		for (IWorkbenchWindow window : workbench.getWorkbenchWindows()) {
			if (window == null) {
				continue;
			}

			IPartService service = window.getPartService();
			if (null == service) {
				continue;
			}

			service.addPartListener(new IPartListener2() {
				@Override
				public void partOpened(IWorkbenchPartReference partRef) {
					IWorkbenchPart part = partRef.getPart(false);
					if (part instanceof ITextEditor) {
						addListener((ITextEditor) part);
					}
				}
			});
		}
	}

}

3 查看效果

相关推荐
程序员小羊!16 分钟前
12.Java 多线程编程
java·开发语言
xuhaoyu_cpp_java21 分钟前
项目学习(三)代码生成器
java·经验分享·笔记·学习
乐观勇敢坚强的老彭22 分钟前
C++信息学奥赛lesson1
java·开发语言·c++
San813_LDD26 分钟前
[深度学习] 数据序列化格式对比:以日志级别配置为例
xml·java·前端
github_czy31 分钟前
更加优雅的类型检查与传参---mcp源码分析
java·服务器·开发语言
专注_每天进步一点点36 分钟前
IDEA中,Apifox Helper 的 2.0.15-243版本的插件 导出指定的接口,入参的中文名为空,描述为空
java·ide·intellij-idea
兰令水37 分钟前
leecodecode【区间DP+树形DP】【2026.6.10打卡-java版本】
java·算法·leetcode
小刘|1 小时前
Spring WebFlux + AI 流式输出深度解析:Spring AI 与 LangChain4j 效果差异溯源
java·后端·spring
郝亚军1 小时前
如何在vscode上运行python程序
ide·vscode·编辑器
Arvin.Angela1 小时前
VsCode 安装文档
ide·vscode·编辑器