如何实施eclipse行号状态行贡献项目?

时间:2011-11-04 14:57:26

标签: java eclipse-rcp statusline

我需要更新状态行编辑器特定的信息。我已经有了自己的实现,但是我想看看eclipse贡献项是如何实现的,它显示了状态行中的行号/列位置。任何人都可以指出我,我在哪里可以找到源代码?

提前致谢, AlexG。

3 个答案:

答案 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();
}