背景
坦白说:过去在 Eclipse 里使用 Graphical Editor Framework(GEF)创建图形化编辑器 既慢又痛苦。这个过程包括理解复杂的框架和大量的冗余代码。但也说明 GEF 是创建图形化编辑器的最佳框架,因为它与模型无关。另一方面,与模型无关本身也有一些问题。
GMF 杂谈
GMF 的运行时组件是 IBM® 为使用 Eclipse Foundation 开发的,它以前还受 IBM Rational® 建模产品的支持。
GEF 是 Model-View-Controller(MVC)机制的精髓,它允许将您自己的模型引入表中。在使用 GEF 的早期,大多数人还使用自定义模型(考虑传统 Java 对象 [Plain Old Java™ Object, POJO])。您会发现自定义模型带来的问题是需要自己编写通用代码来支持模型,如序列化及侦听模型更改的功能。
在 GEF 中使用模型的下一个逻辑步骤是要使用 Eclipse Modeling Framework(EMF),EMF 提供了以各种形式将模型序列化的工具和侦听对模型默认值的更改的功能。
想要了解 EMF 的更多信息?
如果您觉得缺乏 Eclipse Modeling Framework(EMF)方面的基础知识,或想要强化关于 EMF 的一般知识,建议您看书或者 developerWorks 中的一系列介绍性文章,这些都是非常好的参考资料。有关这些参考资料和其他 EMF 参考资料,请参阅 参考资料。
但是,将 EMF 模型与 GEF 框架整合在一起有一定的技术难度(如不同的命令堆栈),导致 EMF 模型并没有很快被基于 GEF 的编辑器接受。最终,GMF 项目在这种逆境中应运而生,并希望能够引入一种快速生成图形化编辑器的方法。通过类似的方法,EMF 生成适用于 EMF 模型的基本编辑器。
创建 EMF 模型
创建模型的第一步就是定义 EMF 模型的协作对象。我写这篇文章的目的只是说明定义模型的过程,而不是深入讲解 EMF 提供的模型处理工具的用法。本例中将要使用的模型是一个简单的图形化模型。我将通过一张图来帮助我说明模型的外观。
图 1. 可视的图形化模型
如您所见,使用模型是帮助我们理解各部分之间关系的一种简单方法。这个模型由图形、连接和图形化图表组成。
EMF 支持通过多种方法定义模型。为简单起见,我决定使用加注的 Java 技术。下面的代码清单说明了如何使用 EMF 定义模型。第一个模型对象是一个有名称属性、源连接和目标连接(Connection
类型)的图形。请注意,这是一个抽象的 EMF 类。
清单 1. Shape.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | /** * @model abstract="true" */ public interface Shape { /** * @model */ String getName(); /** * @model type="com.ibm.model.shapes.model.Connection" containment="true" */ List getSourceConnections(); /** * @model type="com.ibm.model.shapes.model.Connection" */ List getTargetConnections(); } |
接下来定义囊括所有图形的列表的图形化图表。
清单 2. ShapesDiagram.java
1 2 3 4 5 6 7 8 9 | /** * @model */ public interface ShapesDiagram { /** * @model type="com.ibm.model.shapes.model.Shape" containment="true" */ List getShapes(); } |
接下来定义一些特殊的图形使模型更加生动。
清单 3. RectangularShape.java
1 2 3 4 | /** * @model */ public interface RectangularShape extends Shape {} |
清单 4. EllipticalShape.java
1 2 3 4 | /** * @model */ public interface EllipticalShape extends Shape {} |
最后,再添上连接就可以了,这样就能将各种图形真正连接在一起。
清单 5. Connection.java
1 2 3 4 5 6 7 8 9 10 | /** * @model */ public interface Connection { /** @model */ Shape getSource(); /** @model */ Shape getTarget(); } |
使用 Java 编程语言定义了模型后,请单击 File > New > Eclipse Modeling Framework > EMF Model(参见图 2)定义一个新的 EMF genmodel。注意:如果还没有 EMF 项目,就先创建一个。
图 2. EMF 加注的 Java importer
生成 EMF 模型
如果在生成 EMF 模型遇到问题,请参阅名为 "Generating an EMF Model" 的教程,它可以帮助您入门。请参阅 参考资料。
创建了 EMF genmodel 后,请在文件上单击鼠标右键,并确保生成 Model 和 Edit 组件(您只需选择 Generate All 就可以轻松地完成)。
创建 GMF 模型
GMF 需要您先创建一组模型,然后生成图形化编辑器。图 3 显示了创建这些模型所涉及的过程。我们需要使用的第一个模型是图形化定义,它定义了编辑器生成后的视觉效果。接下来是工具定义,它包括与编辑器面板、菜单等相关的事务。最后,还需要一个模型就是映射定义,相信您猜得到,它用于定义业务逻辑(EMF 图形化模型)与可视化模型(图形化和工具定义)之间的映射。
图 3. GMF 概览(来自 GMF 维基)
GMF 有个叫 GMF 指示板(Window > Show View > Other > GMF Dashboard)的实用程序非常好。它可以帮助您用一种简单的方法完成图形化编辑器生成过程。在这个阶段,您必须选定域模型和域 genmodel。
图 4. GMF 指示板
GMF 图形化定义模型
GMF 备忘单
GMF 有一个优秀的备忘单,它可以帮助您完成用 GMF 生成编辑器的创建过程。建议将此备忘单与 GMF 指示板结合使用。请通过菜单项 Help > Cheat Sheets... 访问备忘单。
需要创建的第一个模型是图形化定义模型(在指示板的 Graphical Def Model 下单击创建超级链接)。确保选择 Canvas 为模型对象。这个模型很容易创建:
- 创建图表中显示的图。方法是在编辑器中创建一个新的 Figure Gallery 条目,然后创建各种图。
- 创建图表中显示的节点(矩形和椭圆形)。
- 在图表中创建连接。
- 确保每个节点都与图库中创建的图相匹配。
注意:如果您在执行此任务时遇到问题,您可以下载一个样例插件,此插件为您准备好了所有模型。
图 5. GMF 图解模型
GMF 工具定义模型
这个步骤需要定义工具定义模型,使用此模型可以定义图形化编辑器的信息类面板和菜单。要定义工具定义模型,请打开 GMF 指示板,然后单击 Create。我们的简单模型只需定义一个面板和一些创建工具来辅助创建模型(参见图 6)。
图 6. GMF 工具模型
GMF 映射定义模型
所有工作都从映射定义模型 开始。在此模型中,我们将可视化(图形)模型映射到业务逻辑(域模型)中。GMF 有一组有序向导可以帮助您创建映射定义。请通过 File > New > Graphical Modeling Framework > Guide GMFMap Creation 调用这组向导。第一步要选择所有 GMF 模型(参见图 7)。
图 7. GMFMap 向导 1
接下来,向导将智能地提示我们选择要使用哪个模型元素作为图表根元素。在我们举的例子中,此模型元素为 ShapesDiagram。
图 8. GMFMap 向导 2
最后,GMF 会像变魔术一样算出哪些模型元素必须映射到哪些可视化元素上。
图 9. GMFMap 向导 3
自定义 GMF 映射
可以使用基本编辑器编辑 GMF 映射定义文件来添加更多高级自定义功能。要勇敢地去尝试!
必须注意的是:这些向导可能会随着 GMF 的发展而改变。据说使用 GMF 自身提供的图形化编辑器就可以帮助创建映射定义文件(和其他 GMF 模型)。
生成 GMF 编辑器
整个过程的最后一步也是最有趣的一步是生成图形化编辑器。这需要您先通过映射定义模型创建一个 GMFGen 模型。然后,在映射定义文件上单击鼠标右键并选择 Create generator model...。这样,一个包含使用图形化编辑器所需的全部代码的新项目就生成了。要使用图形化编辑器,请启动一个新的 Eclipse 运行时工作台,然后转到 File > New > Examples > Model Diagram(参见图 10)。
图 10. 模型向导
模型文件创建后,您就应当能够使用生成的编辑器了(参见图 11)。很不错,是吧?
图 11. 图形编辑器
自定义 GMFGen 模型
通过映射定义文件获得的 GMFGen 模型是可以根据需要加以修改的。例如,GMFGen 模型的属性就可以使用属性视图进行编辑。GMFGen 模型还有可以控制生成代码的命名规则、生成的编辑器是否支持打印功能及很多其他自定义操作的属性。试试这些选项,然后根据您的需求对其进行自定义。
GMF 特点
必须注意的是:我们构造并生成的编辑器仅用到了 GMF 功能的一小部分。您可以做很多改动来利用框架的高级功能。
例如,GMF 支持验证。这句话的含义是:如果我们要限定图形化模型,只许与每个模型元素有一个连接会怎样?只允许相似的元素相互连接,还是对可用于图形的名称类型进行控制?GMF 完全能够支持这些类型的验证,甚至其他验证。对于验证,GMF 利用了 Eclipse Modeling Framework Technology(EMFT)来支持涉及使用 Java 代码和对象约束语言(Object Constraint Language,OCL)来定义验证器的情况。GMF 将给未通过验证的文件安插错误标记,这类似于 Eclipse 对未编译的 Java 文件的处理方法。要查看关于 GMF 支持内容的更多信息,请参阅 参考资料。
结束语
我的目的有两个:一是展示支持模型驱动开发的 Eclipse Callisto 发行版中令人兴奋的新的一面;二是让您了解它有多棒,只需 15 分钟就能在 Eclipse 中生成图形化编辑器。
原文链接: https://www.ibm.com/developerworks/cn/opensource/os-ecl-gmf/#artrelatedtopics