如何在eclipse中扩展IDocumentListener来创建插件?

时间:2018-04-17 07:38:42

标签: eclipse eclipse-cdt

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

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

我发现,对于班级 - IDocumentListener ,只要有变更,就会调用方法 documentChanged

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

您能否帮我扩展 IDocumentListener

1 个答案:

答案 0 :(得分:0)

查看现有的开源插件以了解它是如何完成类似任务的,这是有益的。我们以Bracketeer为例。

起点是一个实现org.eclipse.core.runtime.Plugin的类。对于具有UI的插件,实现提供附加功能的org.eclipse.ui.plugin.AbstractUIPlugin非常有用。这个类通常被称为"激活器",实际上在Bracketeer中它被称为Activator。它使用如下行代码在MANIFEST.MF文件中注册为插件的激活类:

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

Activator类会覆盖Plugin.start(),当插件加载时,它将被运行时调用。被覆盖的start()方法会设置部分侦听器

部件侦听器是一个实现IPartListener2接口的类。在Bracketeer中,它被称为PartListener。在设置时,它会调用PlatformUI.getWorkbench()来获取IWorkbenchIWorkbench.getWorkbenchWindows()以获取当前打开的窗口列表(在插件启动时)。然后它通过IWorkbenchWindow.getPartService().addPartListener()在每个窗口中注册自己。

此外,为了处理加载插件后打开的新窗口,PartListener还实现IWindowListener,并通过IWorkbench.addWindowListener()将自身注册为窗口侦听器。这允许PartListener通过覆盖IWindowListener.windowOpened()来处理新窗口,并将自身注册为新窗口的部件侦听器。

作为部分听众,PartListener会覆盖IPartListener2.partActivated()partOpened()来处理正在打开或激活的工作台部分(包括编辑器)。在这些方法中,它检查该部分是否为IEditorPart;如果是这样,它会抓住编辑部分的文档(请参阅PartListener.getPartDocument()),这是一个IDocument

最后,拥有IDocument,它可以通过IDocumentListener注册所需的任何IDocument.addDocumentListener(IDocumentListener)

(我有一些细节,例如为插件启动时已经打开的每个工作台部件手动调用partActivated()。请参阅Bracketeer代码详细信息。)

所有这些都是公共API,这些都不需要实现任何扩展点。