我正在尝试创建一个监视文档更改的插件。
我有兴趣在文档更改时在文本编辑器中添加标记。
我发现,对于班级 - IDocumentListener ,只要有变更,就会调用方法 documentChanged 。
但是,我无法将其实现为插件,因为此接口没有扩展点。
您能否帮我扩展 IDocumentListener ?
答案 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()
来获取IWorkbench
和IWorkbench.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,这些都不需要实现任何扩展点。