通过本文,了解如何使用 EMF.Edit 和 Common Navigator Framework (CNF) 创建基于树形查看器的模型导航插件。构建一个 Eclipse 插件,使用户能够操作和浏览基于 Eclipse Modeling Framework (EMF) 的模型的内容。文中对开发插件提供了分步指导,实现了可通过 EMF 编辑框架提取模型内容的适当结构,并在基于 CNF 的视图部件显示内容。
通常,EMF 项目资源 — 如 EMF Ecore 模型 — 作为查看器中的单个对象进行显示(见 图 1 的左侧)。这种显示方法的限制是,我们在研究模型时必须要打开相应的编辑器。这一问题在依赖域模型进行开发时显得尤为突出。有一种解决方法是,构建自定义的视图,使我们能够访问所需的域模型内容。我们可以从头开始构建此插件,也可以使用现有的框架减轻开发负担。下面将分别对创建此类插件的过程进行概要以及详细的介绍。在本文最后,我们将拥有一个查看器插件,用于浏览 Ecore 模型(见图 1 右侧)。
图 1. 导航器的类型
我们已经了解了此 ModelNavigator 的用途,但在开始开发之前,需要对即将使用到的 Eclipse 组件有一个基本的了解。我们的任务是,构建一个树形的查看器用以显示模型的层次结构。树形查看器的详细信息不在本文的讨论范围之内;请参阅 参考资料 了解更多细节。一个需要注意的重要方面是,树形查看器通过称为内容提供程序的适配器访问模型对象,并使用标签提供程序确定显示对象的方式。下面的章节详细介绍了如何访问内容和标签提供程序的数据,以及如何显示模型导航器。
EMF.Edit 框架通常用于为 EMF 模型构建编辑器。为构建这些编辑器,框架提供了命令的代码生成功能和一些其他类,用于提供对模型的程序化访问。此框架所公开的另外一组功能 — 也是对我们而言最重要的一组功能 — 是它提供的一些类,使用这些类可以方便地在查看器中显示 EMF 模型。框架提供这种访问的方式是使用通用内容和标签提供程序,它们使用了适配器为特定类型的 EMF 对象显示模型。这些类有 AdapterFactoryContentProvider
和 AdapterFactoryLabelProvider
类,这些类通过委托了解如何浏览 EMF 模型的项目提供程序适配器,为 EMF 对象提供查看器的对象、标签和图像。此方案在图 2 中进行了阐释。这种方案对我们的项目极其有用,因为它让我们不必去了解如何调整模型以适应视图。我们只需委托这些通用提供程序就可以了。
图 2. 从 Eclipse 帮助改编的 EMF.Edit
框架包含了用于各种 EMF 模型类型的项目提供程序。但是,并非大多数人都希望为每种模型类型构建单独的导航器。我们希望从同一个导航器中访问所有的模型内容。此时就出现了组合适配器工厂。它让我们能够显示来自多个 EMF 模型的对象,具体做法是,提供一个可从多个模型中适配对象集合的适配器工厂。
ComposedAdapterFactory
类是另一个 EMF.Edit 便利类,用作其他适配器工厂的通用接口。我们即将了解到,这个类的优势在于,导航器只需将我们所需要的模型类型的项目提供程序作为组合适配器工厂的一部分包括进来。然后,组合适配器工厂直接将实现委托给这些其他的提供程序。例如,我们可以让导航器显示生成器模型、Ecore 模型、UML 模型等。当查看器试图显示这些模型时,内容和标签提供程序将直接委托给适配器工厂,后者接着委托给适当的项目提供程序,从而使我们的开发更加轻松,并扩展 ModelNavigator 以支持多个域模型。
|
我们已经拥有了在 ModelNavigator 中访问模型内容的整个框架,现在所需的另一个组件就是放置导航器的实际的查看器。您可以扩展视图插件并实现自己的以树形视图显示所需内容的视图部件。但是,现有的框架就可以将各个域中的内容组合到一个视图中,使用户能够在查看器中操作和浏览编辑器模型。这种框架在 Eclipse V3.2 中作为 CNF org.eclipse.ui.navigator
引入,并允许开发者为一个导航器贡献内容、标签、动作、过滤器,以及其他功能。这就提供了一种集成导航的查看器的方式,并提供了统一的用户体验。
CNF 支持用于所有编辑器模型集成程序的查看器,支持非资源驱动的模型内容,并允许用户选择希望在集成的查看器中显示的内容。org.eclipse.ui.navigator.resources
插件就是使用此框架的一个示例,它使用 Project Explorer 视图的形式。 它为 IResource
模型提供了声明性的查看器扩展。此框架为我们提供了构建查看器的最快速方法,它处理了查看器实现的细节,并且只需要我们实现模型的内容和标签提供程序。它还为将插件扩展至其他模型内容提供了空间,以及在查看器中使用更高级的框架功能(例如,分类器、过滤器、拖放等。)。
现在可以开始查看这些组件的运作,并开始创建模型导航插件。
|
创建 ModelNavigator 分为两个步骤进行。首先,我们将设置插件的基本结构并定义其行为。然后扩展这个简单的插件以显示 EMF 模型内容。
创建 ModelNavigator 的第一步是创建插件项目。为此,我们使用了新的项目向导:File > New > Project,选择 Plug-in Project,然后单击 Next。
我们将插件项目命名为 ModelNavigator
,设置其 ID 为 com.ibm.navigator.example.modelnavigator
,激活程序为 com.ibm.navigator.example.modelnavigator.ModelNavigatorPlugin
,然后单击 Finish。
图 3. 创建插件项目
现在开始开发插件。第一步是创建放置导航器的视图。为此,我们对插件进行必要的扩展以创建视图