坦白地说,XML解决方案要么太复杂要么过于简单,曾弄得我很失败。因此我从2001年6月起就开始使用一种基于XML但很简单的内容管理与出版解决方案。使用这种被我称为XM(XML Make)插件的目的是提供一种易于开始、但对于实际应用来说功能已足够强大的解决方案。我已将它作为开放源代码在上发布。
这里我将告诉您如何来创建一种面向XML的用户界面。我选择Eclipse这种开放源代码方案来构建自适应编程环境。我所知道的是,用户界面是最要紧的一件事情。由于我是一名软件开发员,因此我曾提供一种功能强大但与简单化目标不相符的命令行界面。
完全从头来构建一种集成开发环境或IDE,需要做大量的工作。但幸运的是,已有两项Java开放源代码计划正在帮助netBeans 及Eclipse。这两项计划都旨在开发一种灵活的Java IDE,且它们都能从巨大的行业支持上受益。所能看到的最大差别是,netBeans基于Swing,而Eclipse则构建在标准小部件工具包(SWT,Standard Widget Toolkit)上。
简单地讲,Eclipse是流行的程序员编辑器Emacs的现代版本。Emacs之所以能流行是因为它已经针对世界上几乎所有的编程语言进行了定制。但Emacs用户界面从来不能适应GUI,这一点则始终是一个遗憾。不过在另一方面,Eclipse希望既能像Emacs一样灵活又能提供一种更为现代的用户界面。
此外,Eclipse还能提供比编辑器更多的东西。这种高度模块化及可扩展的IDE几乎集成了开发者所需的全部工具。它提供“工程向导”(project wizard)、集成式编译器、调试器以及更多。其标准版本与Java定制一起提供,但通过一些具有可移植性的插件,也能支持其它一些像C/C++甚至Cobol这样的语言。(事实上,Eclipse IDE利用插件包含的Java编辑器、编译器、工程向导以及类浏览器等,几乎可创造您看到的一切。我很容易为XM编写类似的插件来使XM IDE成为一个整体。)
更好地理解Eclipse
Eclipse是我曾用过的最雄心勃勃的一种编辑器应用编程接口(API)。
我很松散地将API为两部分:平台API及编辑器API。平台API用来处理该平台应用户请求而加载的插件及Java库(例如当用户打开一个Java类文件时,run-times即开始加载编辑器),或用来向其它插件提供服务,如SWT就是一个插件。
插件可实现大多数编辑器,即你在屏幕显示上看到的大多数东西,这意味着该平台的任何一个方面都能通过插件来定制,且编辑器API本身就是一组插件。对Eclipse而言,插件包含有Java库以及用来描述它的清单。此清单是一种被称为的XML文件.
启动后,平台开始加载所有已安装插件的清单并汇编成一个登记表。但平台不会自动加载插件,直到它们被请求为止(例如当用户编辑一个文件时)。那些已安装但未使用的插件对性能的影响很小。例如,启动时平台会自动加载核心用户界面插件来拉出主窗口,如果用户加载一个Java类文件,则平台随后也只会随后才开始加载Java编辑器插件。
如果插件中的某一个类扩展成为插件抽象类,则当插件被加载或卸载时,run-times会调用其启动及关闭程序。在这一点上,平台可将插件或空闲资源初始化。大多数插件并不需要这种类。
需要提到的一个重要概念是扩展点。请将扩展点看成是一些引起插件加载的事件。插件会将感兴趣的扩展点登记到它的清单中。当事件被启动时(我再一次声明,它们并不是真的事件,但我发现将它们看成为事件对我进行解释有帮助),平台会加载插件并对其进行处理。例如,Java编辑器插件会在Java文件被加载时将扩展点登记到它的清单中。
Eclipse API中有一点给我造成了很多麻烦:即标识符。插件与扩展点都拥有标识符,它们被平台用来管理插件及扩展点。标识符是一种独特的字符串,到目前为止用得还算不错。但由于Eclipse使用与Java软件包一样的准则来构建其标识符,因此混乱开始出现。
例如,编辑器定义一个扩展点。由于Eclipse是以Java写成,因此该扩展点可通过一个称为art的界面来实现。我承认了解哪个是标识符、哪个是界面确实花去了我不少时间。但更使你感到混乱的是,文档中有好几个软件包都是从开始。
为避免出现这种混乱,请记住:标识符是出现在清单中()。随着名字的提示,run-times将利用它们来识别元素。不过,Java类(或者那些名字与标识符相类似的界面)可实现大多数值得去鉴别的概念。
我通过试验学习最好的东西。因此,为更好地了解Eclipse平台,我编写了一个简单的测试插件,实践证明它在译解Eclipse文档方面的价值无法估量。
我创建的视图插件采用Eclipse术语来定义视图。视图就是一种显示某些信息的窗口。在这种情况下,插件在浏览器窗口中显示被选文件的名称。得承认,除作为一种学习练习外,它几乎没有什么用,但它确实应受到一些尊重,因为搜索文档就花去了我好几天的时间。
几乎像Eclipse中的所有其他东西一样,视图可在系统插件中表示。我设计的插件通过扩展点来登记其视图。请注意,正如前面解释的, 是一个标识符,而不是一个Java类。相应的Java界面则为art。
ViewPart类代表IViewPart 界面的一种默认实现。我已经实现了IViewPart,但ViewPart能节省一些编码。
在IviewPart中定义的createPartControl()方法,可用来创建用户界面视图。当窗口出现在屏幕上时,编辑器即可对其进行调用。对于TestView而言,用户界面只是一个标签。
TestView 也能用来实现ISelectionListener界面。这也是一种由Eclipse编辑器来定义的界面,它“倾听”事件选择。当用户选择一个不同文档时,浏览器窗口启动这一事件。而当它中断该事件时,插件将对文件名进行检索并改变其标签。
对这类插件的一些评论则认为:标签,一种SWT小部件,可用来实现文本中的不可编辑部分。编辑器API同时也能用来定义IselectionListener、IworkbenchPart、Iselection及其它“I”界面。
请注意这些界面与扩展点之间的区别,扩展点对何时该加载插件进行控制,相反,IselectionListener及其它界面则在插件加载后才开始发挥作用。
为测试这一插件,可先下载Eclipse 2 或Eclipse 3(我已经用Eclipse 2 及3.0 milestone 2对该插件进行了测试),然后再下载测试插件或对本文介绍的代码进行汇编。请将所有东西都放在Eclipse目录下的plugins子目录中,然后完成以下步骤:
1. 启动Eclipse;
2.从窗口菜单中选择“Show View”(显示察看);
3.选择其它;
4.扩展分类(即我们在清单中定义的分类),然后选择名称(即我们的插件,如清单中所定义)。平台启动一个扩展点,它加载我们的插件并打开一个新的名称窗口。
5.选择进入软件包资源管理器,而视图内容将被更新。
以上是对一种最基本的插件所进行的基本演示,但如果您很好奇,并且希望了解更深的例子,则可从下载完整的XM插件。
87Benoit Marchal是比利时Namur市的一名咨询顾问,他为Pineapplesoft撰稿,同时也是《XML by Example》的作者,他专攻各种XML及Java解决方案。您可从上查到他的相关资料。
作者: Benoit Marchal