开始 DLTK 项目
为简单起见,本教程将所有 Octave IDE 特性集成到一个简单的插件中。总体来说,就是用多个插件实现一个特性:这些插件分别包含核心类、UI 类、调试类等等。但是本教程的代码只需要一个插件,因此运行 Eclipse 时,单击 File > New > Project,选择 Plug-in Project 选项,然后创建一个新的插件项目。在示例代码中,项目名为 org.dworks.octaveide,并且插件类为 OctavePlugin(但是您可以选择自己喜欢的名称)。
配置 Octave 插件
在创建插件之后,下一步便是将一些扩展添加到 Octave IDE 插件的配置文件中:plugin.xml(需要单击 File > New > File 来创建该文件)。这些扩展告诉 Eclipse 这个插件如何在工作台中工作。首先,plugin.xml 文件需要两个简单的扩展:一个用于识别 Octave 编辑器,另一个用于识别需要编辑的文件的类型。清单 1 给出了第一个扩展,它定义 Octave 编辑器的特征。
清单 1. Octave IDE 编辑器扩展
<extension point="org.eclipse.ui.editors">
<editor
id="org.dworks.octaveide.editor.OctaveEditor"
class="org.dworks.octaveide.editor.OctaveEditor"
contributorClass="org.dworks.octaveide.actions.OctaveActionContributor"
default="true"
icon="icons/oct.gif"
name="%OctaveEditor.name">
<contentTypeBinding
contentTypeId="org.dworks.octaveide.octaveContentType">
</contentTypeBinding>
</editor>
</extension>
|
 |
有关 DLTK 的想法
随着我对 DLTK 的了解不断增加,它也变得越来越奇妙。DLTK 创建者考虑到了各个方面,而本教程仅涉及到一些表面的东西。每次我琢磨 DLTK 是否支持我需要的特性时,它最终都会支持。可见,DLTK 的创建者考虑得很全面。
不过,DLTK 也有一些缺点。它是一个复杂的系统,并且关于它的文档也不多,甚至不存在。源代码中包含一些非常有用的注释,但不是很多。庆幸的是,DLTK 示例(专门针对 Tcl 编辑器)就如何在现实中使用 DLTK 解答了许多容易混淆的问题。
|
|
这个扩展包含几个非常重要的属性。class 属性定义构成编辑器的基类:OctaveEditor。随后您将创建这个类。contributorClass 属性识别为编辑器提供行为的类。default 属性要求 OctaveEditor 应该是相关文件的默认编辑器。name 属性识别将在编辑器中显示的文本。就像在 plugin.properties 文件中定义的一样,OctaveEditor.name 属性对应 “Octave Script Editor”。
这个扩展中最后需要解释的是 contentTypeBinding。Eclipse 包含一个内容类型注册表,用来表示文件格式和命名约定。通过将 contentTypeBinding 元素添加到编辑器的扩展,就可以将编辑器与文件后缀、文件名,甚至文件别名关联起来。但您的 Octave 编辑器只需要关注 *.m 文件,因此 org.eclipse.core.runtime.contentTypes 扩展很简单。清单 2 给出了第二个扩展。
清单 2. Octave IDE ContentType 扩展
<extension point="org.eclipse.core.runtime.contentTypes">
<content-type
id="org.dworks.octaveide.octaveContentType"
base-type="org.eclipse.core.runtime.text"
file-extensions="m"
name="%octaveContentType"
priority="high">
</content-type>
</extension>
|
许多属性都可以用来定制内容类型,但是这个声明将 org.dworks.octaveide.octaveContentType 内容类型识别为基于文本的,并且与文件后缀 .m 相关联。priority 属性要求如果一个文件与多个内容类型相关联,某个类型必须具有很高的优先级。
创建 DLTK 语言工具箱类
使用 DLTK 的最大好处是定制 IDE 的工作方式很简单。这个定制可以通过 DLTK 的语言工具箱接口来实现(IDLTKCoreLanguageToolkit、IDLTKDebugUILanguageToolkit 和 IDLTKUILanguageToolkit 等)。实现这些接口之后,它们就给出配置 IDE 的各个方面的方法,比如解析、颜色使用、用户首选项和解释器的访问。
本教程主要关注 DLTK UI,因此仅需关心 IDLTKUILanguageToolkit。这个接口中的方法执行两项功能之一:它们或者返回处理编辑器配置的类,或者提供在 plugin.xml 中声明的配置对象的 ID。现在列出这些方法中的 7 个。
getEditorId(Object elementID)
- 返回编辑器的 ID
getTextTools()
- 返回
ScriptTextTools 对象,它定制如何在编辑器中显示文本
createSourceViewerConfiguration()
- 返回
ScriptSourceViewerConfiguration 对象,它配置编辑器的源代码查看器的操作
getPreferenceStore()
- 返回
IPreferenceStore 对象,它包含用户设置
getEditorPreferencePages()
- 返回与编辑器设置相关的首选项页面的 ID
getInterpreterPreferencePages()
- 返回与脚本解释器相关的首选项页面的 ID
getIntepreterId()
- 返回脚本解释器的 ID
在示例代码中,OctaveUILanguageToolkit 类使用对象和标识符补充了这些方法。在这个工具箱中,与列出的前两个方法对应的两个对象是 OctaveEditor 和 OctaveTextTools。
创建 Octave 编辑器和 Octave 文本工具
现在编辑器扩展已经配置完成,接下来首先需要做的就是创建 OctaveEditor。由于有了 DLTK,所以不需要编写很多代码:DLTK 的 ScriptEditor 类(OctaveEditor 的超类)帮助您处理大部分编辑器操作。您仅需一些配置方法。在 OctaveEditor 中,最重要的方法是 getTextTools(),它返回一个 ScriptTextTools 对象。
ScriptTextTools 类十分方便。这个中心类访问其他几个提供编辑器特性的类。通过编写 ScriptTextTools 的子类,编辑器能够定制这些特性的执行方式。Octave 编辑器创建一个称为 OctaveTextTools 的子类,它能够访问两个重要的对象:
OctavePartitionScanner
- 读取编辑器文本并决定分区界限
OctaveSourceViewerConfiguration
- 配置
ScriptSourceViewer 及其响应用户生成的事件的方式
这些对象在实现语法着色 时尤为重要 — 即根据文本的语法功能改变代码中文本的颜色。下一个主题将更加详细地解释这个特性。
|