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 查看效果

相关推荐
Flittly10 小时前
【AgentScope Java新手村系列】(16)从RAG到多路检索
java·spring boot·spring
小兔崽子去哪了10 小时前
Java 生成二维码解决方案
java·后端
人活一口气14 小时前
从JVM调优到MCP协议:Java全栈技术体系深度总结与企业级架构实践
java·spring boot
NE_STOP16 小时前
Vibe Coding -- 完整项目案例实操
java
荣码16 小时前
GraphRAG:普通RAG只能回答"点"的问题,我踩了4个坑才搞懂
java·python
SimonKing16 小时前
Google第三方授权登录
java·后端·程序员
明月光81816 小时前
从一行 @Builder 说起:重新拾起 Java 的 Lombok、注解与 Builder 模式
java
考虑考虑1 天前
Mybatis实现批量插入
java·后端·mybatis
咖啡八杯1 天前
GoF设计模式——中介者模式
java·后端·spring·设计模式
青石路1 天前
记一次多JDK版本问题的排查,一坑套一坑,差点没爬上来
java