`

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

阅读更多

FROM:http://www.cnblogs.com/bjzhanghao/archive/2006/02/02/324909.html

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

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


图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接口和额外的方法,具体请参考在线商店例子中的ProductItemProvider。从 JFace的角度来说,ItemProvider相当于集成了各种查看器的ContentProvider和LabelProvider的代码,是一个通用的“ContentLabelProvider”。因此利用它,开发人员在改变查看器的时候只需要修改很少的代码,而不像传统方式那样每换一个查看器还要写新的ContentProvider和LabelProvider。

二、提供了关联对象的属性表

每个ItemProvider的getPropertyDescriptors()方法返回在属性视图里显示的属性列表,列表里的每个元素是一个 ItemPropertyDescriptor对象,它决定了每个属性的标签、描述、图标以及是否可编辑。EMF为生成的代码会帮我们把模型定义里的每个属性都显示在属性列表里,如果希望隐藏某些属性,可以通过修改这个方法移除之。

以Product为例,ProductItemProvider的getPropertyDescriptors()方法里包含这样六条语句,分别代表产品名称、价格、描述、是否有货、评价以及颜色这六个属性,如果你想让颜色属性在属性列表里消失,只要删除最后一句即可。

java 代码
  1. addNamePropertyDescriptor(object);   
  2. addPricePropertyDescriptor(object);   
  3. addDescriptionPropertyDescriptor(object);   
  4. addAvaiablePropertyDescriptor(object);   
  5. addScorePropertyDescriptor(object);   
  6. addBackgroundPropertyDescriptor(object);  

三、生成编辑模型的各种命令

在ItemProviderAdapter基类里有很多createXXXCommand()方法,如果你用过GEF应该对这些名称不陌生,因为在 EditPolicy里也有类似的方法。我们知道,为了实现Undo/Redo功能,对模型的每个改变都应该使用Command实现,然后把 Command保存在Command栈里,每个Command对象保存Undo/Redo自己的信息。ItemProviderAdapter相当于一个生产这些Command的工厂,用户对模型编辑的请求都将通过它转换为对应的Command,例如用户在属性视图里修改了一个属性的值,当按下回车后,会调用该对象关联的ItemProvider类的createSetCommand()方法生成一个SetCommand对象。

注意:在createCommand()方法里会调用getChildrenFeatures()方法,而在实现ContentProvider的getChildren()时也需要这个方法,因此这个方法的返回结果同时影响ItemProvider的这两项功能。

四、将模型的改变通知到负责显示模型的视图

在一个Eclipse应用程序里经常会有很多个查看器显示模型,无论用户怎样修改模型,要让这些查看器里显示的内容总是当前的模型,最好的办法是让查看器能够响应模型的变化。ItemProvider作为监听器可以很好的完成这个任务。

模型发生改变时,与被修改的对象相关联的ItemProvider的notifyChanged()方法被调用,事件立即被通知给 ItemProviderAdapterFactory,后者是整个模型的事件处理机构,所有的ItemProvider都是通过 ItemProviderAdapterFactory创建并注册为监听器的,因此ItemProviderAdapterFactory可以把事件通过 fireNotifyChanged()通知给所有这些监听器的notifyChanged()方法去消化。图2展示了这个通知过程,此图来自《Eclipse Modeling Framework: A Developer's Guide》第3.2.4节中的图3.10。


图2 ItemProvider的通知流程

最后,ItemProvider还有一个collectNewChildDescriptors()方法,这个方法决定了在编辑器里,模型里对应的那个对象可以创建哪些子元素。例如在线商店模型里,Category对象的子元素是Category和Product,那么用户在编辑器里右键点击一个 Category对象选择“New Child”时,就会出现“Category”和“Product”这两个选项。有些场合我们想隐藏其中一些选项时,就可以修改这里的代码。

参考资料: Eclipse Modeling Framework A Developers Guide,第3.2节、第10.1节。

分享到:
评论

相关推荐

    eclipse的emf插件

    Eclipse的EMF(Eclipse Modeling Framework)插件是一个强大的模型驱动开发工具,它基于Java构建,用于创建、编辑和管理复杂的数据模型。这个插件是Eclipse IDE的一个重要组成部分,特别适合那些需要进行领域特定...

    Eclipse-EMF-GEF资料.rar

    "EMF-Ecore模型概述.doc" 提供了 Ecore 模型的详细介绍,它是 EMF 内建的一种元数据表示,用于定义模型结构。 2. **XMLSchema**: "XMLSchema标准参考手册.chm" 是关于 XML Schema 的详细文档,XML Schema 是一种...

    org.eclipse.emf.ant_2.1.0.jar

    org.eclipse.emf.ant_2.1.0.jarorg.eclipse.emf.ant_2.1.0.jarorg.eclipse.emf.ant_2.1.0.jarorg.eclipse.emf.ant_2.1.0.jar

    org.eclipse.emf.transaction-1.8.0.201405281451.jar

    解决4.7.2版本eclipse不能在线安装activiti插件的问题

    eclipse Activiti 插件 jar包 出错

    org.eclipse.emf.transaction org.eclipse.emf.validation org.eclipse.emf.workspace org.activiti.designer.feature org.eclipse.graphiti.feature org.activiti.designer.eclipse org.activiti.designer.gui org....

    eclipse-emf for activiti 插件 jar包

    org.eclipse.emf.transaction_1.4.0.v20100331-1738.jar org.eclipse.emf.validation_1.7.0.201306111341.jar org.eclipse.emf.workspace_1.5.1.v20120328-0001.jar

    java emf 转jpg源码.zip

    Java EMF 转 JPG 源码是一个用于将增强型元文件(EMF)格式转换为 JPEG 图像格式的程序。EMF 是一种在 Windows 操作系统中广泛使用的矢量图形格式,而 JPG 则是常见的位图图像格式,适用于网络传输和存储。这个源码...

    EMF模型文件对比/比较(emf.compare)

    这篇博客文章(https://winseclone.iteye.com/blog/1797563)可能深入介绍了如何使用EMF.compare来处理和理解模型文件的差异。遗憾的是,由于无法直接访问该链接,我们只能根据提供的标签和压缩包文件来推测一些相关...

    Java组件emf sdo runtime 2.2.0.rar

    Java组件EMF(Eclipse Modeling Framework)和SDO(Service Data Objects)是Java开发中用于数据建模和数据访问的重要工具。EMF是基于模型的软件开发框架,它提供了生成Java代码、运行时库和XML序列化的能力,常用于...

    org.eclipse.emf.validation-1.7.0.201306111341.jar

    Activiti2.0安装所需插件

    JSON的EMF映射插件EMFJSON.zip

    EMFJSON 是一个 JSON 的 EMF 映射插件。 Eclipse Update: http://ghillairet.github.com/emfjson/releases/0.3.2/ 标签:EMFJSON

    EMF Parser (TypeScript) 源码

    FromEMF.js 是 UDOC.js 中的 EMF 文件解析器。 此代码是把 FromEMF.js 用 TypeScript 改写的版本,并且修正了原版代码在解析 EXTTEXTOUTW 时的一个小问题。 原版代码及说明在这里 ...

    EMF文件提取文本,预览,打印

    EMF(Enhanced Metafile)文件是Windows操作系统中使用的一种矢量图形和图元文件格式。这种文件类型被广泛用于存储图形、图像和打印数据,因为它支持复杂的图形操作,如曲线绘制、渐变填充和透明效果。EMF文件是GDI+...

    Emf2Png.zip

    `Emf2Png.zip`这个压缩包文件显然涉及到将EMF(Enhanced Metafile)格式的图像转换为PNG(Portable Network Graphics)格式的过程。EMF是一种矢量图形格式,通常在Windows系统中用于存储图形信息,而PNG是一种广泛...

    电动汽车直流充电桩EMF试验方法研究.pdf

    电动汽车直流充电桩EMF试验方法的研究主要关注的是充电桩在工作过程中产生的电磁场(EMF)对环境及人体健康可能带来的影响。EMF是由于电流变化产生的电磁辐射,直流充电桩在为电动汽车充电时,由于其处理的大电流...

    org.eclipse.emf.validation-1.8.1.202208271102.jar

    org.eclipse.emf.validation_1.8.1.202208271102.jar

    org.eclipse.emf.workspace-1.5.2.202208110935.jar

    org.eclipse.emf.workspace_1.5.2.202208110935.jar

    emf-runtime-2.6.1.7z

    Eclipse 3.6.1(Helios)的插件。emf-runtime-2.6.1.7z。

    eclipse Activiti 流程图创建缺少 emf jar

    requires 'org.eclipse.emf.transaction 1.4.0' but it could not be found 解决办法:将下载解压后的这三个文件拷贝到eclipse的plugin文件夹下即可解决上述问题 org.eclipse.emf.transaction_1.4.0.v201003 31-1738...

    EMF.Eclipse Modeling Framework.2nd.PKU.SEI.SA.part2

    EMF.Eclipse Modeling Framework.2nd.PKU.SEI.SA.part2

Global site tag (gtag.js) - Google Analytics