GMF Tutorial中文版

GMF Tutorial中文版

 

译者薛笛( 2007-8-11

黑龙江大学信息技术研究所

 

前言:本文源自Eclipse网站GMF子项目的同名实例文档。虽然本文绝大部分是原文的翻译,但是我仍然更愿意称其为“编译”而非“翻译”。原因是在读这个系列文档的同时,我也在学习GMF相关技术,而学习就会有些心得或想法以及时间操作中遇到的问题,所以本文的内容就不会仅局限于原文中所包含的内容。我会尽量将其中语焉不详或不够具体的部分加以细化,但也会对于某些我觉得冗长的部分也会予以简化,这种非完全“字字对译”的方法或许只能体现我的主观意愿,但我相信也不会离题太远。我记得有位著名的翻译家也说过,翻译其实也是一种再创作,如何将作者的本意用自己熟悉的语言表述出来是“字字对译”所不能达到的。再说原汁原味也未必适合我们中国人的习惯,要想吃原味大餐最好还是看原文。这个系列的教程一共有4个,也不知道我有没有时间翻译完,随遇而安吧,呵呵。

原文前言

本文旨在介绍图形化的模型框架[Graphical Modeling Framework (GMF)],该框架是一个Eclipse建模项目的子项目,其目标是为Eclipse建模框架[Eclipse Modeling Framework (EMF)]和图形化编辑框架[Graphical Editing Framework (GEF)]提供一个统一的桥梁。

在本文中,我们将开发一个称为mindmap的应用程序。本文所描述的有关GMF所提供的功能都是基于 2.0M 4版本的。随着GMF的不断演化,本文也会及时地更新内容以便可以覆盖GMF提供的最新功能。我们已经将例子工程的源码及其相关的内容打包,有需要的话可以到http://www.eclipse.org/gmf/tutorial/mindmap_tutorial_1.zip下载该示例工程。

GMF的系统需求

Eclipse3.3启动设置:我家的“老爷机”配置如下:P41.5/ 256M 内存/ 40G 硬盘。由于运行本文的例子需要以及网上的朋友都赞3.3版的内存使用率比以前有很大提高并且不容易出现在3.2版中不明不白死掉的状况,于是到官网下了一个,但只要一运行就会出现如下的对话框,然后Eclipse就自动终止:

忙活了好一阵之后发现,只要将eclipse.ini文件中的XX:MaxPermSizeXmx改小一点就可以了,例如以我的机器来说只要设置成XX:MaxPermSize=80Xmx=512Eclipse即可正常启动。如果你用过3.2版的话,可以看到在那个版本中启动参数没有XX:MaxPermSize,并且-Xms-Xmx分别是 40M 256M ,可见3.3版对内存的要求还是提高了。当然,如果你的机器有NG内存的话,自然不会有任何烦恼,直接掠过这段就好J

1.   GMF简介

目前,联合使用EMFGEF来构建基于Eclipse的图形化应用程序已经越来越普遍。下面的许多参考资料都给出了如何将这两个框架整合使用的方法,其中的一些方法甚至需要深入到GMF工程内部。在进入GMF工程之前,让我们首先了解一下GMF是如何通过一个通用的方式来使用EMFGEF来完成既定任务的。另一篇关于GMF runtime部分的文章可以在这里找到:http://www.eclipse.org/articles/Article-Introducing-GMF/article.html

GMF工程使用术语“toolsmith”来指代那些使用GMF来构建插件的开发者,而“user”通常指那些利用这些插件并同时也是开发者的人。在一个可用的透视图中,GMF以内部方式构建出来的“模型”的数量和种类应该在很大程度上是隐藏的。然而,大多数toolsmith都对台面之下正在发生什么感兴趣(注:好奇心重是天性,呵呵),所以在本文中我们将对每一个模型都给出一个详细的描述。

下图展示了在进行基于GMF应用开发时所需要使用的主要构件和模型。GMF的核心是一个概念模型(concept of a graphical definition model)。该模型包含了那些将会出现在基于GEFruntime中,且与图形元素相关联的各种信息,而这些信息是与那些提供描述和编辑功能的领域模型(domain model)没有直接关联的。工具定义模型(tooling definition model)是一个可选组件,它可以用来设计palette(注:就是我们用VE时常常会看到的选择组件用的面板)以及其他实用组件(菜单,工具栏,等等)。

我们希望图形化或工具组件的定义可以在面对不同的领域时仍然能正常工作。例如,UML的类图有很多counterpart,而所有这些conterpart的基本外观和结构都是十分相似的。GMF的一个目标就是允许一个图形化定义可以被很多领域复用。通过使用一个独立的映射模型来将图形定义和工具定义连接到所选择的领域模型,GMF漂亮的完成了这一目标。

一旦定义了合适的映射,GMF就会提供一个生成器模型(generator model)来帮助用户确定在生成阶段(generation phase)需要定义的各种实现细节。一个基于生成器模型编辑器插件将会作为这一过程的产生品,并将导致最终的模型[final model]的产生。最终模型也称为图形运行时[diagram runtime](或“符号”)模型。当一个用户工作在一个图形上时,该runtime将会把符号和领域模型桥接起来,并同时提供持久化和序列化功能(注:以上提到的这几种模型都有实物对应,现在先不必细究)。这个runtime的一个很重要的方面是它提供了一个基于服务的方法来使用EMFGEF,并且能通过non-generated式的应用程序来进行调整。

在了解了GMF的一些基本概念之后,接下来我们要将GMF应用到一个某一特殊领域的图形化编辑层的开发当中去。首先,你可能会需要安装GMF及其相关组件。

2.   GMF组件的安装

本文所用的GMF版本为GMF( 2.0M 4),请注意在build页上标明的GMF运行的先决条件,必须在将这些组件安装完之后才能安装GMF。安装方式很简单,或通过其下载页面,或通过更新管理器进行。

由于要安装的组件种类繁多,而且缺一不可,而且组件之间的安装也有一定的顺序,所以不推荐自己费时费力地一个一个到Eclipse的下载页面寻找。本文推荐的方法是利用Eclipse的更新管理器到Europa的更新站点进行自动升级,又轻松又安全。具体方法是,点击“Help->Updates->Find and Install….”,然后选“Serach for new features for install->Europa Discovery Site”。然后从“Models and Model Develop”列表中选择Graphical Modeling FrameworkEuropa Edition),然后点击“select Required”按钮来选择GMF所需要的相关组件。很简单吧?

但其实还有更简单的方法,在GMF的下载页面的中第一个连接是:Consolidated requirements zip,也就是说,开发人员已经把包打好了,该放的东西也放进去了,于是我们解压缩就可以直接用了。比起用上面的方法访问那个超慢的更新网站,这个方法显然更加方便。

除了上面所说的那个例子之外,各位还可以下载一个名为TaiPan的例子,它是使用最新版本的GMF构建而成,专门用来展示GMF最新功能的例子。所以,即便本文过时了,你也可以通过下载这个例子来获取最新的知识。不过这个例子需要使用CVS--速度超级慢,下载要有耐心才行。

2.1. TaiPan的下载与运行

如果你急切地想要看看GMF到底有什么值得你关注的地方,你就应该通过CVS下载Taipan示例工程到你的工作空间。否则的话,请直接阅读下一部分。

通过CVS下载资源之前,首先需要建立一个CVS Repository Location,具体方法是点击new->other,在CVS目录窗格下选择“CVS Repository Location”就会看到如下图的界面。

按照如下图所示的内容进行填写,完成后访问:/HEAD/org.eclipse.gmf/examples,并选择org.eclipse.gmf.examples.taipan.*模块(这里面好东西不少,希望多学一些的可以多下载些例子),右键点击并选择check out就可以下载了。如果你没有使用最新版本的GMF的先决组件,你总是可以通过检查与你正在使用的版本相对应的日期来下载对应版本的Taipan示例工程。很重要的一点是你必须使GMF SDK的版本与Taipan示例工程的版本保持一致才行。为了做到这一点,在校验完毕之后,你可以右键单击该工程,并选择“Team | Switch to Another Branch or Version...”,然后选择“Select the tag from the following list”并使用底部的“add Date…”按钮来输入GMF 2.0M 4 release的日期(03 January 2007)。最后点击Finish

切换到插件开发透视图,并打开org.eclipse.gmf.examples.taipan工程下的model文件夹。查看每一个可用模型,特别是taipan.gmfgraphtaipan.gmfmap模型以及他们的元素属性。你会发现有很多rcp版本的Taipan例子可供学习。

在本文中,我们将会按顺序查看每一个模型,但仅仅是验证一下你的配置,你需要在一个运行时工作空间(runtime workspace)里自己运行这个例子(建立一个EclipseApplication运行配置,并简单的接收默认值即可)。在一个独立的工作空间中,建立一个空的工程和一个新的“TaiPan Diagram”(在一个新的运行时工作空间中,点击new机会发现建立TaiPan Diagram的选项),给他起个名字然后点击Finish。生成的图标编辑器会为你打开这个新生成的图形。学习时我们特别需要注意以下部分:

·   工具选项板和overview[tool palette and overview]

·   布局和选择工具[layout and selection tools]

·   图形图像的输出[diagram image export (svg, bmp, jpeg, gif) ]

·   层叠的属性视图[tabbed properties view]

·   选中元素的字体和颜色选项[font and color options for selected element]

·   连接路由和风格选项[link routing and style options]

·   弹出栏和连接柄[pop-up bars and connection handles]

·   短笺和几何图形[notes and geometric shapes]

·   即时缩放和布局[animated zoom and layout]

建立一个命名为TaiPanApplication新的启动配置,并在插件选项板中仅选择Taipan *.rcp插件及其依赖插件,然后以一个独立RCP图形编辑器的方式来运行Taipan

以上是本文的一个概览,在下面的部分我会带领大家深入查看上面在谈到mindmap模型层所提及的每一个模型的细节。(编译者注:对于Taipan工程,如果有时间的话,我会在下一篇文章中详细介绍)

2.2. 一个新的工程

在我们开始新的工程之前,你需要先定制一下你的工作空间(或至少定制一下你的GMF工程)的编译器为JDK1.5编译器。具体位置在Window->Preference->Java->Compiler选项,然后选择支持JDK1.5的编译器。

一个典型的GMF的使用场景(usage scenarios)包括为mindmap应用程序产生一个图形层,最终补充进一个可供选择的、用于展示临时信息的视图(例如甘特图)。本节将会展示GMF在这方面的能力,并将随着工程的成熟而不断演化。如果你更喜欢使用那些包含了完整解决方案的工程的话,你可以通过用上面的方法通过查阅org.eclipse.gmf/examples模块来获取完整的工程。

GMF自带了一个“Tutorial Cheat Sheet”,你可以通过“Help | Cheat Sheets”来让它“显形”(主意,如果你已经将GMF安装到一个不含SDK的平台上,例如,使用Europa的更新管理器升级得到的GMF,你将需要从Window | Show View… | Other菜单打开Cheat Sheets的视图,然后从视图菜单中打开GMF Tutorial Cheat Sheet)。如果你打开了这个cheat sheet并遵照其提示的每一个步骤,你就能独立完成本文第一个阶段的大部分内容,并同时能获得一些以后需要的技能和知识。现在就试着建立你的新project吧。

作为可选项,你可以建立一个“New GMF Project”(使用Ctrl+N快捷键探出的窗口里找到“Graphical Modeling Framework”)作为学习的起点。将其命名为“org.eclipse.gmf.examples.mindmap”,并在工程根目录下建立一个名为“model”的新文件夹。

3.   领域模型的定义(Domain Model Definition

虽然看起来以领域模型作为起点是必须的,但在GMF中却不是这样,因为图形的定义是与领域相分离的。然而和大多数教程一样,本文也将从领域模型开始,然后通过使用下一节要讲解的、由向导生成的领域模型来转入到我们的图形定义当中。在原文所给出的连接中,我们可以找到一个属于mindmapecore类型的基本领域模型。此外,你还可以使用mindmap模型的XSD版(在这种情况下,你可能需要安装EMFXSD feature)。将这个文件复制到你的工程根目录下的‘model’文件夹,如果你愿意,可以随意进行一些你想要进行的测试或检查。作为标准EMF生成的编辑器的补充,GMF也提供了一个图形化的编辑器。并将其打包在SDK中。如果想用这个编辑器对mindmap.ecore(或任何 *.ecore模型)进行渲染(render),只需要简单地右键单击ecore文件,并在右键菜单中选择“Initialize ecore_diagram diagram file”即可。

接下来,使用New->Eclipse Modeling Framework > EMF Model wizard,从mindmap.ecore文件创建一个新的mindmap.genmodel。你也许会想要把genmodel的“base package”属性从“Mindmap”改成org.eclipse.emf.examples,以便使你所生成的包名与工程名保持一致。

通过右键单击生成器模型(generator model)的根所弹出的菜单,我们就可以生成模型并编辑代码了。虽然创建一个编辑器或进行测试不是必需的步骤,但是我建议各位还是实际操作一下。至此,我们已经为创建一个图形和有关mindmap应用程序的映射的定义(mapping definitions)作好了准备。

4.   图形的定义(Graphical Definition

图形定义模型被用来定义形状,节点,链接(link)等等这些将会显示在你的图形理的元素。接着cheat sheet的下一步,我们将要创建一个新的图形定义模型。Cheat cheet将会启动一个简单的图形定义模型向导,我们同样也可以在“新建”对话框的GMF文件夹下找到它。在你的org.eclipse.gmf.example.mindmap工程下的‘model’文件夹中,选择mindmap.gmfgraph模型,在向导的下一页使用‘Browse’来定位你的mindmap.ecore文件。选择我们的Map类作为图形元素(diagram element)。

如下图所示,在向导的最后一页,为我们的Topic类选择一个元素,链接和标签选项的最小集合。稍后,你可以亲自验证一下这个向导并观察一下它的输出。现在,我们已经获得了启动应用程序所需模型的最小集合。点击finish来结束该向导。

提示:GMF中包含了很多以复用为目的的图形库。通过使用“load resource1…”并输入“platform:/plugin/org.eclipse.gmf.graphdef/models/basic.gmfgraph”作为资源URL,你就可以将这些图形库载入到你的*.gmfgraph模型(或*.gmfmap模型)中。其他可用的资源包括classDiagram.gmfgraphstateDiagram.gmfgraph

5.   工具定义(Tooling Definition

正如前面所描述的那样,工具定义模型被用来定义工具板,创建工具(creation tools),动作(actions)等等。Cheat sheet将会通过一个非常简单的过程来引导你掌握我们的这个简单的工具定义模型。事实上,这两个过程是十分类似的,因为mindmap领域模型是由其可能用到的工具所载入并检查的。我们将会简单地选择和图形定义模型相同的选项,为Topic名字的标签保存一个tool,然后为我们的Topic元素启动一个简单的palette

通过提供给我们的模型,我们可以看到在一个Palette中存在着一个顶层“工具注册表(Tool Registry)”元素。Palette包含一个带有创建工具元素(Creation Tool element)的工具组,这些创建工具元素是专门为Topic节点和那些用向导定义的subtopic元素的链接而设立的。我们将会在未来对他们进行一些小改动,但是现在,我们将接受默认值并且将注意力转移到映射定义。你可以浏览一下这个模型并实地查看一下它们的各个属性来熟悉一下工具定义。

6.   映射定义(Mapping Definition

映射定义模型让我们可以将我们目前所遇到的3个模型:领域模型,图形定义模型以及工具定义模型绑定在一起。在GMF的开发过程中,这是一个关键的模型。它将会被用来作为一个转换(transfomation)步骤的输入,这个转换步骤将会产生最终的模型生成模型(generation model)。

继续看我们的Cheat Sheet,遵循启动映射模型生成向导的指示,我们依然选择model文件来保存mindmap.gmfmap文件,并依次载入每一个预选择(preselectedmindmap.ecoremindmap.gmfmap以及mindmap.gmftool模型。在下一页,选择“Map”作为图形的根元素,接受那个根据已选择的工具模型生成的mindmapPalette,然后接受所选择的mindmap图形面板(canvas)。最后,令该向导的最后一页和下图保持一致。注意,你可以通过对话框中的“change…”按钮为某些已选定的节点或链接调整其属性值。


我们需要手动完成建立一个从图形定义到我们的TopicNameLabel的标签映射的工作。其结果应该看起来如上图所示。在属性视图中察看TopicNode节点映射的映射值,以便确定它就是我们所希望的那个值。

在进行下一步之前,让我们先描述一下映射。先来看标签映射(Label Mapping),正如我们在领域模型中的Topic元素上讨论并映射到“EAttribute name”特性一样,它是一种直接映射,带有一组图形标签属性。

现在来看节点映射,我们看到我们的图形节点被映射到我们的图形定义的ToicNode上,与此同时,该图形节点的相应的领域标签元素被映射到我们的Topic类上。Topic创建工具也在这个映射中被指定。

在节点映射之上你会发现一个顶级结点引用。其包含特性被设置成我们的映射类的“EReference rootTopics”特性。因此,一旦新的Topic节点被加入到图表中,我们的领域Topic的实例也会被加入到我们的映射类的rootTopics所包含的引用中去。节点标签将会显示Topic的“name”属性的内容。

映射类被深被Canvas所描述。选择Canvas Mapping元素,连同在我们的工具定义中的工具板的映射来查看其定义。最后,如果你选择了链接映射,你就会注意到北TopicSubtopicsLink所描述的连接(connections而不是links)被映射到Topic类的“EReferece subtoptics”特性上去了,并且使用TopicSubtopics创建工具来创建的。

提示:在这个阶段,当定义映射时,也就是在GMF作出更完善的映射和确认之前,选择合适的元素是很重要的。如果要确认你选的那个元素是否合适的话,可以在一个文本编辑器中打开映射定义(*.gmfmap)文件,仔细察看一下。

 

 

7.   代码生成(Code Generation

本文所涉及的最后一个模型,同时也是目前我们还不需要了解的很深入的模型,就是GMF的生成器模型(generator model)。如果你对其结构感兴趣的话,可以参看下图(建议去看原图)。

到现在为止,最小图形元素与影射已经被定义完成,接下来我们就可以生成所需的代码来测试我们到目前为止的工作情况了。为了测试需要,我们会首先建立一个与EMFgenmodel相类似的生成器模型(*.gmfgen)以便于为代码生成设置对应的属性。为了做到这一点,如下所示,请右键单击影射文件,选择“Create generator model…”。操作成功之后,保留缺省命名“mindmap.gmfgen”。

现在,我们就可以检查生成器模型来深入了解它到底包含了哪些内容。目前我们将会保留所有的缺省值,右键单击mindmap.gmfgen文件并选择“Generate diagram code”来让代码生成过程执行起来。如果一切顺利的话,我们将会看到一个“Code generation completed successully”信息对话框。这时你会注意到新的org.eclipse.gmf.examples.mindmap.diagram插件已经出现在你的工作空间中。

有了以上的铺垫,我们所用到的模型就可以被直接地编辑和理解。发生在从映射模型创建生成器模型(*.gmfgen)过程中的转换包含了一些我们需要仔细理解的很关键的逻辑。然而,现在并不是理解这一细节的最佳时机,如果你感兴趣的话可以到http://wiki.eclipse.org/GMF_GenModel获得一些更为详尽的信息。

8.   运行图表(Running the Diagram

请回忆runtime使用它自己的“符号模型[motation model]”来为你的图表显示并保存图形组件。如果你对细节感兴趣的话可以参看上图的内容。

现在,我们已经生成了我们的图表所需的插件,然我们启动一个新的runtime工作空间并测试这个图表。一个新的Eclipse应用程序runtime配置的缺省设置就OK了,但同时你可以动手做一些调整以便执行一个仅包含你生成的插件和他们在运行期所依赖的org.eclipse.platform.ide中的一些插件的最小配置集合。

建立一个空的工程,并调用New…对话框。在“Examples”下你会发现你的新的Mindmap Diagram。创建一个新的图表并浏览器功能,当你添加并保存图表元素的时候仔细察看一下领域模型实力的创建过程。当然,我们在我们的这个图表定义仅提供了对于简单Topic元素和subtopic链接来说足够用的信息。

提示:如果你想要在你的元素上显示一个图标,可以在mindmap.gmfgraph模型中,将位于你的“图表标签 TopicNameLabel”元素上的“Element Icon”属性进行相应的设置为true即可。

9.   总结

正如你所看到的那样,使用GMF学习为你的领域模型建立图形编辑器是一个不错的选择。我们已经看到了如何为选定的领域生成一个可以提供类似于一个基于EMF/GEF编辑器的绝大部分基本功能的图形定义和一个映射定义。在未来,GMF将会不断发展,并包含更多高级功能,所以你需要经常查看本文的最新版本以及相应的工程源码。在此期间,如果你已经错过了某些提供在GMF某些方面更为详细的信息的页面的话,现在就是回头去看的最佳时机。此外,敬请期待GMF Tutorial Part2 中文版。最后,想要本文PDF版的朋友,请点击完左面的广告之后再留言J,留下Email即可。

9 .1. References

 

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 12
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值