当前位置: 首页 > java >正文

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

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

  • 1 插件配置
  • 2 添加监听
  • 3 查看效果

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 插件配置

<?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 添加监听

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 {@Overridepublic void earlyStartup() {Display.getDefault().asyncExec(() -> {new EditUtil().addEditListener();});}}
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() {@Overridepublic void documentAboutToBeChanged(DocumentEvent arg0) {// TODO Auto-generated method stub}@Overridepublic void documentChanged(DocumentEvent arg0) {// TODO Auto-generated method stubSystem.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() {@Overridepublic void partOpened(IWorkbenchPartReference partRef) {IWorkbenchPart part = partRef.getPart(false);if (part instanceof ITextEditor) {addListener((ITextEditor) part);}}});}}}

3 查看效果

在这里插入图片描述

http://www.xdnf.cn/news/9498.html

相关文章:

  • AI Agent工具全景解析:从Coze到RAGflow,探索智能体自动化未来!
  • Java、Python、PHP 三种语言实现 二进制与十六进制的相互转换
  • 板凳-------Mysql cookbook学习 (八)
  • Java开发经验——阿里巴巴编码规范实践解析4
  • HTML5 视频播放器:从基础到进阶的实现指南
  • TypeScript 索引签名:灵活处理动态属性对象
  • STM32通过KEIL pack包轻松移植LVGL,并学会使用GUI guider
  • CRM系统的数据库结构详细设计
  • 【大模型原理与技术-毛玉仁】第四章 参数高效微调
  • 基本面高股息策略
  • RabbitMQ 与其他 MQ 的对比分析:Kafka/RocketMQ 选型指南(二)
  • c++结构化绑定
  • Python应用while循环猜数字
  • webpack的安装
  • 签约!京东云与契约锁达成战略合作,携手共推全程数智化解决方案
  • 【计算机网络】IPv6和NAT网络地址转换
  • 【Prometheus+Grafana实战:搭建监控系统(含告警配置)】
  • Vue开发系列——Vue中常见实现区别及Vue.js 模板编译原理
  • EC800GCN 华系列 DTU 开发板介绍
  • 基于 Flink+Paimon+Hologres 搭建淘天集团湖仓一体数据链路
  • 家政小程序开发,开启便捷生活新篇章
  • Visual Studio 的下载安装
  • 常用 Linux 命令---服务器开发和运维相关命令
  • JVM内存溢出:诊断处理与预防全攻略
  • 【pycharm】如何连接远程仓库进行版本管理(应用版本)
  • ModbusTcp协议
  • LiveQing 视频点播流媒体 RTMP 推流服务功能:搭建 RTMP 视频流媒体服务详细指南
  • xcode卡死问题,无论打开什么程序xcode总是在转菊花,重启电脑,卸载重装都不行
  • 设计模式之单例模式
  • MySQL MVCC(多版本并发控制)详解