编辑器是一个工作台部件,它允许用户编辑对象(通常是文件)。编辑器的运行方式类似于文件系统编辑工具,只不过它们紧密集成到平台工作台用户界面中。编辑器总是与输入对象 (IEditorInput)相关联。可以将输入对象看作是正在编辑的文档或文件。在用户保存在编辑器中所作的更改之前,不会落实这些更改。
只能打开一个编辑器以供工作台页面中的任何特定编辑器输入使用。例如,如果用户正在工作台中编辑 readme.txt,则在同一透视图中再次打开它时将激活同一编辑器。(可以在不同的工作台窗口或透视图中对同一文件打开另一编辑器)。但是,与视图不同,在一个工作台页面中,可以对不同输入多次打开同一编辑器类型(例如,文本编辑器)。
插件使用工作台扩展点 org.eclipse.ui.editors 来将编辑器添加到工作台中。添加编辑器的插件必须在它们的 plugin.xml 文件中注册编辑器扩展以及编辑器的配置信息。某些编辑器信息(例如,实现类以及要在工作台菜单和标签中使用的名称和图标)类似于视图信息。另外,编辑器扩展指定编辑器理解的文件类型的文件扩展名或文件名模式。编辑器还可以定义 contributorClass 类,当编辑器活动时,该类将操作添加到工作台菜单和工具栏中。
编辑器的接口是在 IEditorPart 中定义的,但是插件可以选择扩展 EditorPart 类而不是根据暂存区来实现 IEditorPart。
注意:还可以配置编辑器扩展以启动外部程序或调用预先存在的 java 代码。在此讨论中,我们将重点放在实际上与工作台紧密集成,并使用 IEditorPart 实现的编辑器。
自述文件工具提供了定制编辑器,主要目的是将它自己的内容大纲窗口页面添加到工作台大纲视图。
编辑器扩展的配置定义为如下所示:
<extension point = "org.eclipse.ui.editors"> <editor id = "org.eclipse.ui.examples.readmetool.ReadmeEditor" name="%Editors.ReadmeEditor" icon="icons/obj16/editor.png" class="org.eclipse.ui.examples.readmetool.ReadmeEditor" extensions="readme" contributorClass="org.eclipse.ui.examples.readmetool.ReadmeEditorActionBarContributor"> </editor> </extension>
我们看到了 id、name、icon 和 class 的熟悉配置标记。extensions 属性描述编辑器可以理解的文件类型。(如果需要再具体一些,您还可以指定 filenames。)class 实现编辑器,并且 contributorClass 负责提供与编辑器相关的操作。让我们更详细地了解添加程序。
添加程序类将与编辑器相关的操作添加至工作台菜单和工具栏。它必须实现 IEditorActionBarContributor 接口。添加程序与编辑器本身是分开的,原因是任何给定工作台页面都可以具有同一类型的多个编辑器。单个添加程序是由特定类型的所有编辑器共享的,而不是让一个编辑器的每个实例创建操作和图像。
在 ReadmeEditorActionBarContributor 中,我们提供了三个操作:“Editor Action1”、“Editor Action2”和“Editor Action3”。这些操作都是在构造函数中设置的。
public ReadmeEditorActionBarContributor() { ... action1 = new EditorAction(MessageUtil.getString("Editor_Action1")); action1.setToolTipText(MessageUtil.getString("Readme_Editor_Action1")); action1.setDisabledImageDescriptor(ReadmeImages.EDITOR_ACTION1_IMAGE_DISABLE); action1.setImageDescriptor(ReadmeImages.EDITOR_ACTION1_IMAGE_ENABLE); ... action2 = new RetargetAction(IReadmeConstants.RETARGET2, MessageUtil.getString("Editor_Action2")); action2.setToolTipText(MessageUtil.getString("Readme_Editor_Action2")); action2.setDisabledImageDescriptor(ReadmeImages.EDITOR_ACTION2_IMAGE_DISABLE); action2.setImageDescriptor(ReadmeImages.EDITOR_ACTION2_IMAGE_ENABLE); ... action3 = new LabelRetargetAction(IReadmeConstants.LABELRETARGET3, MessageUtil.getString("Editor_Action3")); action3.setDisabledImageDescriptor(ReadmeImages.EDITOR_ACTION3_IMAGE_DISABLE); action3.setImageDescriptor(ReadmeImages.EDITOR_ACTION3_IMAGE_ENABLE); ... }
操作的名称和图标是在代码中而不是在 plugin.xml 中设置的。(在了解可重定目标的操作之前,我们将忽略操作类之间的不同。)
注意操作信息与我们在视图操作的标记中看到的 viewActions 信息的相似性。这些操作是用代码设置的,原因是我们需要管理同一编辑器的不同实例之间的操作的共享。在构造函数中创建操作时,它们独立于编辑器的任何特定实例。
当编辑器活动,并且它的操作需要安装在工作台菜单和工具栏中时,将把 setActiveEditor 消息发送至添加程序。添加程序将编辑器操作与特定编辑器相连接。
public void setActiveEditor(IEditorPart editor) { ... action1.setActiveEditor(editor); ... }
正如您所看到的,当自述文件编辑器活动时,操作就会显示在工作台菜单和工具栏中。
仅当编辑器活动时,才会显示这些菜单项和工具栏项。可以象菜单和工具栏路径中描述的那样来指定菜单项和工具栏项的位置。
自述文件编辑器本身 ReadmeEditor 并不是很复杂。它扩展 TextEditor 类,因此,当编辑自述文件时,它可以为大纲视图添加定制的内容大纲窗口页面。它不会更改文本编辑器中的任何行为。
编辑器通常具有相应的内容大纲窗口,这些大纲图提供编辑器的内容的结构化视图,并帮助用户浏览编辑器的内容。有关更多的详细信息,请参阅内容大纲窗口。
我们将在文本编辑器和平台文本中查看文本编辑器的实现。