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

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.lryc.cn/news/2394814.html

相关文章:

  • iOS 集成网易云信IM
  • Parasoft C++Test软件单元测试_实例讲解(对多次调用的函数打桩)
  • azure web app创建分步指南系列之二
  • 题海拾贝:P8598 [蓝桥杯 2013 省 AB] 错误票据
  • MySQL 8.0:解析
  • Python量化交易12——Tushare全面获取各种经济金融数据
  • 封装一个小程序选择器(可多选、单选、搜索)
  • Dest建筑能耗模拟仿真功能简介
  • 【Hot 100】121. 买卖股票的最佳时机
  • 【机器学习基础】机器学习入门核心算法:XGBoost 和 LightGBM
  • Linux | Shell脚本的常用命令
  • 跑步的强度等级分类
  • 【JUC】深入解析 JUC 并发编程:单例模式、懒汉模式、饿汉模式、及懒汉模式线程安全问题解析和使用 volatile 解决内存可见性问题与指令重排序问题
  • 2025年全国青少年信息素养大赛复赛C++算法创意实践挑战赛真题模拟强化训练(试卷3:共计6题带解析)
  • Mongodb | 基于Springboot开发综合社交网络应用的项目案例(中英)
  • 飞腾D2000与FPGA结合的主板
  • 百度量子蜘蛛3.0横空出世,搜索引擎迎来“量子跃迁“级革命
  • GitHub开源|AI顶会论文中文翻译PDF合集(gpt-translated-pdf-zh)
  • JSR 303(即 Bean Validation)是一个通过​​注解在 Java Bean 上定义和执行验证规则​​的规范
  • 5G 网络中的双向认证机制解析
  • DAY07:Vue Router深度解析与多页面博客系统实战
  • Drawio编辑器二次开发
  • 1.测试过程之需求分析和测试计划
  • 第三十七天打卡
  • Qt 窗口标志(Window Flags)详解:控制窗口样式与行为
  • ABP VNext + CRDT 打造实时协同编辑
  • 微信小程序真机调试时如何实现与本地开发环境服务器交互
  • Linux: network: dpdk, VF, ip link set down 对VF不生效
  • [春秋云镜] CVE-2023-23752 writeup
  • Java集合操作常见错误与最佳实践