我一直在研究它,它涉及很多,而且我不确定我是否有完整的图片,但是万一这对某人有帮助…
将编辑器与对StatusLine(以及菜单和工具栏)的贡献绑定在一起的声明方式是通过IEditorActionBarContributor类。在plugin.xml中为编辑器类型声明该类-
通常为每个编辑器类型创建一个实例(相同编辑器类型的多个运行实例将共享一个
IEditorActionBarContributor实例,并
doSetActiveEditor()在激活时调用其方法),并将其处置当该类型的最后一个运行的编辑器关闭时。
让我们以一个示例为例,Eclipse中的默认文本编辑器如何更新状态行中的“插入/覆盖”信息(来自Eclipse 3.7)
默认的文本编辑器在
org.eclipse.ui.editors的中被声明为
plugin.xml(已剪裁一些行)为:
<extension point="org.eclipse.ui.editors"> <editor name="%Editors.DefaultTextEditor" contributorClass="org.eclipse.ui.editors.text.TextEditorActionContributor" id="org.eclipse.ui.DefaultTextEditor"> </editor> </extension>
TextEditorActionContributor是关键。我们感兴趣的是在父类BasicTextEditorActionContributor中实现的;它(静态)定义了4个状态字段(
STATUS_FIELD_DEFS),并在内部将
fStatusFields每个statusField(例如规范)的固定映射()存储到StatusLineContributionItem对象。当从Eclipse
UI调用时,它在方法的状态行(基本上是标题)中注册4个字段,
contributeToStatusLine(IStatusLineManagerstatusLineManager)并且每次激活编辑器时,它将传递给
doSetActiveEditor(IEditorPartpart)-完整的
StatusLineContributionItems
集,并准备了相应的actionHandlers。编辑者理解所有这一切,因为它实现了
ITextEditorExtension.setStatusField()。
对于
AbstractTextEditor,它具有(内部类)类型的私有字段,该私有字段
ToggleOverwriteModeAction调用
toggleOverwriteMode()->handleInsertModeChanged()->updateStatusField("InputMode")编辑器将查看是否
statusField具有该类别的 存储,如果是,它将进行调用
IStatusField.setText("Insert" /"Overwrite") ,这将导致状态行消息的更新。这是一个示例,但我想它提供了一个大致的思路:的实例
EditorActionContributor,绑定到编辑器类型,保留要更新的StatusLineContributionItem的列表,并且当相应状态更改时,编辑器必须写入此列表的对象。
。这样,编辑器便与状态行分离(它不知道是否/如何在UI中显示状态更改)。



