|
使用 XML:创建项目 |
|
|
|
|
|
|||
|
|
|||
|
|
将新向导添加到 Eclipse 中 Benoit Marchal(bmarchal@pineapplesoft.com) 本文继续讨论 Eclipse 与 XM 的集成,Eclipse 是 IBM 的开放源码项目,用于构建针对 Java 开发人员的可扩展集成开发环境(IDE);而 XM 是 Benoît Marchal 的简单内容管理解决方案。在这篇专栏文章中,Benoît 添加了初始化新项目的向导。在此期间,他把自己辛苦得来的有关 Eclipse 平台的发现与大家分享。 如果您从一开始就一直学习本项目,那么就会了解我非常热衷于 Eclipse。就像 Emacs 迷告诉您的那样,好的开发环境必须是可扩展并且是可配置的。Eclipse 是在综合考虑了这两方面之后推出的,但是与其享有盛誉的“前辈”Emacs 不同的是,Eclipse 还提供了新式的用户界面。 SWT 的可移植性 SWT 受到的大多数批评都集中在可移植性方面。由于 SWT 不属于 JDK(Java 开发工具箱),因此它在某些平台上可能无法使用。幸运的是,Eclipse 团队似乎承诺要将 SWT 移植到尽量多的平台上,因此实际上这已不成问题了。 我很想测试 SWT 的可移植性,因此当出现了 Macintosh 构建时,我立刻下载了它。尽管 Mac 移植仍然处于开发过程中,但它还是相当稳定的。但是我印象最深的是 SWT 及其绘制本机 Aqua 控件的能力。 关于文档 开发过程通常要反复试验 - 编写修改代码直到它能做出点有意义的事情。遗憾的是,通常我认为自己了解了某些东西,转而开始新任务,结果才发现自己错了!直至最后,我才相信自己真的懂了。我所面临的问题单独来看没有一个是极为困难的,但这些问题合并在一起却成了难题了。随着越来越多文章的发表,(缺乏)文档的问题最终会不存在。
XM 插件的发展
清楚了这些缺点,所以我决定在不久的将来 XM 插件应该包括 New Project 向导并且包括在项目构建期间调用 XM 的能力。这两个特性通过扩展点(extension point)来实现(请参考参考资料中的“Use Eclipse to build a user interface for XM”一文以获取有关扩展点的更多详细信息)。新向导的扩展点是 org.eclipse.ui.newWizards,它使用接口 org.eclipse.ui.INewPlugin。构建器的扩展点是 org.eclipse.core.resources.builders,它使用接口 org.eclipse.core.resources.IncrementalProjectBuilder。 新建项目向导 文件和项目目录 用户可用的项目列表组成了工作空间(workspace)。缺省情况下项目存储在 eclipse/workspace 目录中,但是用户可以在任何地方创建项目。 用户通过导航器(navigator)面板和项目交互,如图 1 所示。此外,插件可以提供专门的导航器。图 1 是一个通用导航器,它列出了项目中的资源(文件)。 图 1. Eclipse 导航器 要创建新项目,您需要一个新目录和几个由 Eclipse 管理的配置文件。注:只在工作空间中创建一个新目录还不够 - Eclipse 无法将其识别为项目。 项目性质 性质(nature) 是项目类型的标识。例如,Java 项目具有 Java 性质。Eclipse 使用项目性质来控制与用户的交互。性质可以启用或禁用菜单项,因此具有 Java 性质的项目在菜单中含有特定于 Java 的项。 一个项目可以有多个性质。例如,插件项目既是 Java 项目(毕竟,插件是用 Java 语言编写的)又是插件项目。实际上,它具有这两种菜单项。 和其它 Eclipse 标识一样,性质标识从域名的倒序开始,这和包名没什么不同。例如,Java 性质标识是 org.eclipse.jdt.core.javanature。注意别把该标识和类/包名搞混了。请参考参考资料一节中的“Use Eclipse to build a user interface for XM”以获取有关标识的更多详细信息。 由于了解了这一点,所以我意识到正是项目的性质使空的 .xmp 文件(在前一篇专栏文章中做过介绍)变得多余了。如果我为 XM 项目定义特定性质,那么就有可能将 Integrating XM and Eclipse 中所介绍的 Run XM 菜单项与那些项目进行关联。 我将 org.ananas.xm.eclipse.xmnature 定义为 XM 的项目性质。清单 1 说明我是如何更改清单文件(plugin.xml)以反映这一点的。 清单 1. 新扩展点
如果将清单 1 和早先发布的代码作个比较,您会看到下列变化:
新建 XM 项目向导 Eclipse 向导 当用户在菜单中选择 New Project 时,就会显示如图 2 所示的向导。用户选择要创建的项目类型。尽管 XM 出现在列表中,但是 XM 插件还没有装入。该列表是根据清单文件(plugin.xml)填充的。 图 2. 新建项目向导 然而,在如图 3 所示的下一屏中,插件已经被装入并且控制了屏幕。这个转变对于用户来说是非常平滑的:向导没有任何闪动或更改。实际上,除非用户编写了插件,否则他可能永远都不会意识到已经装入了新插件。 图 3. 已装入了插件 为完成这一透明集成,Eclipse 将向导分成三组对象:
XM 实现 往往在清单文件中将 NewXMProjectWizard 注册为扩展点。清单 2 是来自清单文件的有关摘录。请注意它为向导声明了类别。该类别组合了几个 XM 向导。 清单 2. 向导扩展点
wizard 是向导中的新标记,但是它与前一篇专栏文章中所介绍的 view 非常相似,因此熟悉它应该很容易。唯一的新东西是 project 属性:设置成 true 时,它会把向导添加到新项目列表中。若没有这个属性,则向导列入“Other”类别。 装入插件后,容器调用 init()。NewXMProjectWizard 需要进行少量的初始化工作。首先它调用 setNeedsProgressMonitor() 来请求进度条。创建项目时,它让进度条逐渐变满,如清单 3 所示。 清单 3. init() 方法
接下来,容器调用如清单 4 所示的 addPages()。该方法注册向导页面。NewXMProjectWizard 只需一个提示输入项目名和位置的页面。Eclipse 用类 WizardNewProjectCreationPage 方便地提供了这样一个页面(您可以在图 2 中看到该页面)。 清单 4. addPages() 方法
向导为其所注册的每个页面都调用 addPage()。在本案例中,只有一个页面。 用户单击
Finish 清单 5. performFinish() 方法
创建项目会更改工作空间,因为它添加了目录和文件。在整个更改过程中,向导都会与工作空间保持同步。最简便的解决方案就是用 WorkspaceModifyOperation 的子代执行项目创建。 更改工作空间的代码必须从 execute() 方法进行调用。在清单 5 中,它只调用 createProject()。execute() 将 IProgressMonitor 作为参数。如果项目创建要花一些时间,那么向导会通过该参数报告其进度。容器用它来更新进度条。 IProgressMonitor 中最有用的方法是:
项目创建和进度的长度是用工作单元进行报告的。定义单元所表示的内容则由您来决定。例如,处理文件时,每个单元就可以是一个文件。 要执行线程,请调用容器中的 run() 方法。该容器使自己的进度条与 IProgressMonitor 保持同步。 项目创建 要创建新项目,请遵循以下这些步骤: 1. 检索作为 IWorkspaceRoot 的实例的工作空间根。Eclipse 提供了一个便捷的插件(ResourcesPlugin),通过该插件您可以访问包括工作空间在内的资源。再强调一次,这些是 Eclipse 资源,比如文件和目录。 2. 在 IWorkspaceRoot 上调用 getProject()(我个人认为该方法本应被称为 newProject(),因为它创建了项目)。 3. 用 newProjectDescription() 方法创建一个空的项目描述。项目描述包含了有关项目的特定类型的信息,包括它在文件系统上的位置。 4. 如果用户选择缺省位置(位于工作空间目录下),请转到下一步。否则,请在描述对象上设置位置。出于一些原因,如果您将项目位置显式地设置成它的缺省值,那么项目创建就会失败。 5. 注册项目性质(如果有的话)。这是一组字符串标识。 6. 注册项目构建器(或编译器)。虽然我将在下一篇文章中才对此进行讨论,但是 XM 现在就可以用作构建器。 7. 用 create() 方法创建项目。 8. 最后,打开新创建的项目。 一旦您创建并打开该项目,您就可以设置它的特性。它们用 Eclipse 特性进行存储。正如您在清单 6 中所看到的那样,向导为 XM 构建器设置了一些特性。您应当熟悉那些特性,因为它们与“Integrating XM and Eclipse”中所介绍的 .xmp 文件一样。 除了上述之外,向导用缺省目录(通常是 src、rules 和 publish)、样本 XML 文档和简单的样式表填充该项目。这就为用户提供了方便。 计划中 本文演示了 Eclipse 给予作为插件开发人员的您以极大的自由来控制用户的操作过程。因此,您的插件几乎可以扩展用户界面的任何方面。
|