如何在 Eclipse 中扩展 IDocumentListener 以创建插件?

How to extend IDocumentListener in eclipse for creating plugin?

我正在尝试创建一个插件来监视文档中的更改。

我有兴趣在文档更改时在文本编辑器中添加标记。

我观察到对于 class - IDocumentListener 方法 documentChanged 每当有变化时都会被调用。

但是,我无法将其实现为插件,因为该接口没有扩展点。

你能帮我扩展 IDocumentListener 吗?

查看现有的开源插件以了解它如何执行类似任务很有启发意义。我们以Bracketeer为例。

起点是实现 org.eclipse.core.runtime.Plugin 的 class。对于具有 UI 的插件,实现提供附加功能的 org.eclipse.ui.plugin.AbstractUIPlugin 很有用。这个 class 通常称为 "activator",实际上在 Bracketeer 中它被称为 Activator. It's registered as the plugin's activator class in the MANIFEST.MF 文件,使用如下一行:

Bundle-Activator: com.chookapp.org.bracketeer.Activator

Activator class 覆盖 Plugin.start(),插件加载时将由运行时调用。覆盖的 start() 方法设置了一个 部分监听器 .

部分侦听器是实现 IPartListener2 接口的 class。在 Bracketeer 中,它被称为 PartListener。在设置时,它调用 PlatformUI.getWorkbench() 来获取 IWorkbench,并调用 IWorkbench.getWorkbenchWindows() 来获取当前打开的列表 windows(在插件启动时)。然后它通过 IWorkbenchWindow.getPartService().addPartListener().

向每个 window 注册自己

此外,为了处理插件加载后新打开的windows,PartListener还实现了IWindowListener,并通过[将自己注册为window监听器=26=]。这允许 PartListener 通过覆盖 IWindowListener.windowOpened() 来处理新的 windows 打开,并将自己注册为新 windows.

的部分侦听器

作为部分监听器,PartListener 覆盖 IPartListener2.partActivated()partOpened() 以处理 workbench 部分(包括 编辑器 )正在打开或激活。在这些方法中,它检查该部分是否是 IEditorPart;如果是这样,它将获取编辑器部分的 document(参见 PartListener.getPartDocument()),这是一个 IDocument.

最后,有了 IDocument,它可以通过 IDocument.addDocumentListener(IDocumentListener).

注册它想要的任何 IDocumentListener

(我忽略了一些细节,例如为插件启动时已经打开的每个 workbench 部分手动调用 partActivated()。请参阅 Bracketeer 代码完整的细节。)

所有这些都是 public API,其中 none 需要实现任何扩展点。