快速业务通道

EMF介绍系列(七、.Edit初步) - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-17

EMF介绍系列(七、.Edit初步)

时间:2011-04-30 博客园 bjzhanghao

EMF除了生成模型部分的接口和实现类(不妨称作“核心模型”)以外,还生成一个名称 以.Edit结尾的项目,包含一些与核心模型和编辑器关系都十分紧密的代码。这部分代码经过 了精心设计,可重用的程度是相当的高。它们不仅在EMF生成的编辑器项目里大量被用到,我 们自己在扩展编辑器的时候也应该充分利用。

在线商店的例子里,com.my.shop.edit项目里包含一个ItemProviderAdapterFactory类和 一组 ItemProviderAdapter的子类,后者是和核心模型的接口一一对应的,例如核心模型的 Shop、Category和Product分别对应 ShopItemProvider、CategoryItemProvider和 ProductItemProvider。这篇帖子主要介绍一下这些 ItemProvider,而关于 ItemProviderAdapterFactory的内容将在以后的帖子里专门介绍,其实顾名思义, ItemProviderAdapterFactory的作用主要就是生成ItemProvider。事实上在构造EMF应用程序 时,我们经常要修改 ItemProvider里的代码,而ItemProviderAdapterFactory则很少改动。

EMF介绍系列(七、.Edit初步) - 编程入门网

图1 EMF生成的.Edit项目

注意:.Edit项目里ItemProviderAdapter的子类名称里省略了Adapter这个单词,例如 CategoryItemProvider而非CategoryItemProviderAdapter,你心里应该清楚它是一个 Adapter,因为它确实实现了Adapter接口。EMF里另外专门有一个ItemProvider类是为非 Adapter类型准备的,在这篇里说的 ItemProvider不是指它,而是指XXXItemProvider,也就 是ItemProviderAdapter的子类。

注意:EMF里的Adapter接口和Eclipse Runtime的IAdaptable接口虽然名称相似,但并不 是同一个概念(关于IAdaptable请参见前面的翻译帖子), EMF里的Adapter等同于监听器( Listener、Observer)的作用,它监听的对象是EMF的Notifier,在一个Notifier 上可以注 册多个Adapter。另一方面,ItemProviderAdapterFactory则很像IAdaptable,它们都能够起 到动态转换类型的作用,只不过前者一般只用于Notifier到Adapter的转换,后者则没有什么 限制,此外转换方法的名称也不同,前者是adapt(),后者为 getAdapter()。

从图1中不难看出,ItemProvider构成了.Edit项目的主要部分,这些ItemProvider具有以 下几个作用。

一、实现了JFace中ContentProvider和LabelProvider的功能

JFace查看器(Viewer)是对swt中控件的一种包装,例如TableViewer是对Table的包装, TreeViewer是对Tree的包装,等等,通过这种方式可以将控件与显示在控件中的数据在一定 程度上分离,从而方便数据显示的更新。相当多的Eclipse应用程序都是通过JFace查看器显 示数据的,与查看器关联的ContentProvider和LabelProvider分别控制查看器中显示的哪些 数据以及每条数据的显示方式。

以TreeViewer的ContentProvider为例,在JFace里应该实现ITreeContentProvider接口, 这个接口定义了getParent()、hasChildren()和getChildren()这三个方法;在EMF里有 ITreeItemContentProvider接口与之对应,这个接口同样具有这三个方法,.Edit部分的每个 ItemProvider都实现了这个接口,因为EMF已经完全知道我们的模型结构,所以这三个方法在 ItemProviderAdapter类里已经实现好了。不过 ITreeItemContentProvider毕竟不能直接交 给JFace的TreeViewer来使用,所以EMF提供了一个 AdapterFactoryContentProvider来做适 配工作,你可以在编辑器的代码里看到如何使用它。

LabelProvider也是类似的,它主要控制显示的文字和图标。EMF生成的ItemProvider缺省 没有实现 ITableItemLabelProvider,所以如果要使用TableViewer,要修改代码以实现 ITableItemLabelProvider接口和额外的方法,具体请参考在线商店例子中的 Pro

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号