我需要更新状态行编辑器特定的信息。我已经有了自己的实现,但是我想看看eclipse贡献项是如何实现的,它显示了状态行中的行号/列位置。任何人都可以指出我,我在哪里可以找到源代码?
提前致谢, AlexG。
答案 0 :(得分:3)
我一直在调查它,它涉及很多,而且我不确定我是否完整了,但是如果这对某人有帮助......
将编辑器与对StatusLine(以及菜单和工具栏)的贡献绑定的声明方式是通过IEditorActionBarContributor类。此类在plugin.xml中为编辑器类型声明 - 通常为每个编辑器类型创建一个实例(同一编辑器类型的多个正在运行的实例将共享IEditorActionBarContributor
实例,并调用其doSetActiveEditor()
激活时的方法),当该类型的最后一个正在运行的编辑器关闭时将被处理。
让我们以Eclipse中的默认文本编辑器如何更新状态行中的“插入/覆盖”信息为例(来自Eclipse 3.7)
默认文本编辑器在org.eclipse.ui.editors
的{{1}}中声明(修剪了一些行):
plugin.xml
<extension point="org.eclipse.ui.editors">
<editor name="%Editors.DefaultTextEditor"
class="org.eclipse.ui.editors.text.TextEditor"
contributorClass="org.eclipse.ui.editors.text.TextEditorActionContributor"
id="org.eclipse.ui.DefaultTextEditor">
</editor>
</extension>
是关键。我们在父类BasicTextEditorActionContributor中实现了什么?它定义(静态地)4个状态字段(TextEditorActionContributor
),并在内部存储每个statusField(规范,比如说)到StatusLineContributionItem对象的固定映射(STATUS_FIELD_DEFS
)。从Eclipse UI调用时,它会在方法fStatusFields
中注册状态行中的4个字段(基本上是标题)。每次激活编辑器时,它都会传递给它-in contributeToStatusLine(IStatusLineManager statusLineManager)
- 使用相应的actionHandlers准备的全套doSetActiveEditor(IEditorPart part)
。编辑器理解这一切,因为它实现了StatusLineContributionItem
。
在ITextEditorExtension.setStatusField()
的情况下,它有一个私有字段(内部类)类型AbstractTextEditor
,它调用
ToggleOverwriteModeAction
编辑器查看是否有toggleOverwriteMode()->handleInsertModeChanged()->updateStatusField("InputMode")
存储此类别,如果是,则会调用statusField
,这将导致更新状态行消息。
这是一个例子,但我想它给出了一般的想法:绑定到编辑器类型的IStatusField.setText("Insert" / "Overwrite")
实例,保留要更新的StatusLineContributionItem列表,编辑器必须写入对象当相应的状态改变时,此列表通过这种方式,编辑器与状态行分离(它不知道状态更改是否/如何在UI中显示)。
答案 1 :(得分:1)
为了了解Eclipse中如何实现某些内容,您还可以使用所谓的 Plug-in spy 。插件间谍包含在插件开发环境(PDE)中。它以 ALT + SHIFT + F1 执行。有关详细信息,请查看此Plug-in development FAQ。
答案 2 :(得分:0)
我不确定你要求的是什么,但这里有IStatusLineManager
的具体实现:org.eclipse.jface.action.StatusLineManager
通常,如果您想访问状态行并且您有编辑器的句柄,则可以执行以下操作(从org.eclipse.jdt.internal.ui.javaeditor.AddImportOnSelectionAction
借用:
private IStatusLineManager getStatusLineManager() {
return fEditor.getEditorSite().getActionBars().getStatusLineManager();
}