本书的第二章介绍了EMF产生的Model部分的代码,你可以使用EMF Edit
Framework来为model构建功能强大的视图和编辑器。在EMF为你生成的编辑器里,可以编辑(复制,粘贴,拖拽等)、显示model,还可以无
限的redo/undo。如果这个编辑器不能完全满足你的需求,你可以在此基础上做一些修改,肯定比从头开始写节约时间。
Eclipse通过JFace中的一些Viewer来显示结构化的数据,这些Viewer不直接从model中获取要显示的数据,而是通过
ContentProvider和LabelProvider来取得要显示的内容、文本以及图标等信息。不同的Viewer需要不同的
ContentProvider和LabelProvider:
Viewer
|
ContentProvider
|
LabelProvider
|
ListViewer
|
IStructureContentProvider
|
ILabelProvider
|
TreeViewer
|
ITreeContentProvider
|
ILabelProvider
|
TableViewer
|
IStructureContentProvider
|
ITableLabelProvider
|
其中ILabelProvider有getText(Object)和getImage(Object)两个方
法,ITableLabelProvider有getColumnText(Object,
int)和getColumnImage(Object,int)两个方法,它们之间没有继承关系。IStructureContentProvider
有getElements(Object)方法,返回一个Object数组,而ITreeContentProvider是其子类,另有自己的方法
getChildren(Object),getParent(Object)和hasChildren(Objecct)三个方法。
EMF Edit是把Eclipse UI Framework(JFace)和EMF
Framework连接起来的桥梁,包括两部分,其中org.eclipse.emf.edit是与UI无关的部
分,org.eclipse.emf.edit.ui是与UI有关的部分。前一部分主要包括ItemProvider和Commmand。
1.Item Providers
item
provider,这个名字来源于它为模型中各个可编辑的"items"(对象)"provides"功能。它通常是EMF
Adapters,但是也可以不是。They are used to adapt model objects so the model
object can provide all of the interfaces that it needs to be viewed and
edited.
item provider主要有四个功能:作为content和label provider;
为EMF对象提供property source; 担当Command Factory; 将EMF模型的变化通知发送给Viewer。每个item
provider可以实现上述全部功能或者部分功能,通常情况下,item provider通过继承EMF Edit的基类ItemProviderAdapter
来实现全部的功能。下面分别介绍这四个功能各自需要哪些方法的支持:
(1)Content and label item providers
EMF.Edit分别通过AdapterFactoryContentProvider和AdapterFactcoryLabelProvider来提
供content provider和label provider的功能,这两个类的构造函数都需要一个adapter
factory(EMF生成的edit部分代码中的**ItemProviderAdapterFactory,负责为特定的类型创建或者定位
adapter),它们的很多方法都通过分发到相应的Item Provider来实现。比如getChildren()的实现如下:
<!---->
public
boolean
hasChildren(Object object)
{
//
Get the adapter from the factory.
ITreeItemContentProvider treeItemContentProvider
=
(ITreeItemContentProvider)adapterFactory.adapt(object, ITreeItemContentProviderClass);
//
Either delegate the call or return nothing.
return
treeItemContentProvider
!=
null
&&
treeItemContentProvider.hasChildren(object);
}
EMF.Edit为模型中的每个类生成一个**ItemProvider类,负责为UI的显示提供具体的实现。每个类在默认情况下都实现了5个接口,其中
的三个IStructuredItemContentProvider(为ListViewer和TableViewer提供
contentProvider),
ITreeItemContentProvider(为TreeViewer提供
contentProvider),IItemLabelProvider(为TreeViewer和ListViewer提供
labelProvider)是支持这一功能的.
如果我们要用TableViewer显示订单(模型中对应PurchaseOrder类),那么应该修改
PurchaseOrderItemProvider,使它实现ITableItemLabelProvider,同时实现方法
getColumnText和getColumnImage。还要在为该模型生成的POItemProviderAdapterFactory类的构造函
数中添加对ITableItemLabelProvider的支持:
<!---->...
supportedTypes.add(ITableItemLabelProvider.
class
);
(2)Item Property Source
当打开PropertySheet时,AdapterFactoryContentProvider还是通过adapterFactory找到相应的实现
了IItemPropertySource接口的item
Provider。EMF.Edit中的PropertySource类实现了这一接口,因此
AdapterFactoryContentProvider返回PropertySource的一个新创建的实例(作为被选中的item
provider的wrapper)给PropertySheet,PropertySource把很多方法的实现分发给了
itemPropertySource。其代码如下:
<!---->public
IPropertySource getPropertySource(Object object)
{
if
(object
instanceof
IPropertySource)
{
return
(IPropertySource)object;
}
else
{
IItemPropertySource itemPropertySource
=
(IItemPropertySource)
(object
instanceof
EObject
&&
((EObject)object).eClass()
==
null
?
null
:
adapterFactory.adapt(object, IItemPropertySourceClass));
return
itemPropertySource
!=
null
?
createPropertySource(object, itemPropertySource) :
null
;
}
}
protected
IPropertySource createPropertySource(Object object, IItemPropertySource itemPropertySource)
{
return
new
PropertySource(object, itemPropertySource);
}
自动生成的**ItemProvider实现的5个接口中的IItemPropertySource就是支持这一功能的, 其中getPropertyDescriptors()方法返回的列表决定了PropertySheet中显示的内容列表。
(3)Command Factory
EMF.Edit提供了修改EMF对象(可以undo)的整套机制,并且提供了一些通用的命令。自动生成的**ItemProvider实现的5个接口中
还没提到的IEditingDomainItemProvider就是支持这一功能的。EMF.Edit的Command
Framework需要EditngDomain接口,其中类AdapterFactoryEditingDomain如同前面提到的
AdapterFactoryContentProvider和AdapterFactoryLabelProvider,它负责把相应的方法(比如
getChildren(),getParent()等)分发给实现了IEditingDomainItemProvider的Item
Provider。
(4)Change Notification
当**ItemProvider所adapt的对象状态发生变化时,**ItemProvider会收到Notification,其
NotifyChanged()会被调用。ItemProvider作为Observer负责过滤不相关的事件,然后把相关的事件传递给模型的
central change
notifier,通常是实现了IChangeNotifier接口的**ItemProviderAdapterFactory。
当我们在PropertySheet中修改Item(订单项,在模型中对应Item类)的名字时,首先ItemPropertyDescriptor的
setPropertyValue()方法被调用,它会通过SetCommand修改名字或者直接调用Item的eSet(),总之这两种方法都会调用到
ItemImpl的setName()方法,该方法中判断是否需要发送通知,如果需要,则向所有监听item对象的adapter发送通知(即调用它们的
notifyChanged()方法),这些adapter包括ItemItemProvide,它的notifyChanged()方法调用
POItemProviderAdapterFactory(IChangeNotifier类型)的fireNotifyChanged()方法,然后
再调用所有注册的listener的fireNotifyChanged()。这些listener可能是PropertySheet,Outline视
图中的TreeViewer等,收到通知后,更新视图以反映model的变化。当有事件发生需要通知JFace的Viewer时,真正的listener
并不是viewer本身,而是它的content provider。
EMF.Edit的另一部分重要内容Command Framework留到下一部分介绍。
分享到:
相关推荐
### EMF自学笔记知识点详述 #### 一、EMF框架概述 EMF(Eclipse Modeling Framework)是Eclipse项目中的一个子项目,它提供了一套用于构建模型驱动的开发工具和应用程序的框架。EMF的主要目标是简化元数据驱动应用...
### EMF Eclipse Modeling Framework 第二版 #### 一、概述 《EMF Eclipse Modeling Framework》第二版是由 Dave Steinberg、Frank Budinsky、Marcelo Paternostro 和 Ed Merks 四位专家编写的权威指南。本书是...
3. **持久性**:EMF支持将模型对象序列化为XML文件,使得模型数据可以在不同时间点保存和恢复,同时也方便了跨系统数据交换。 4. **图形用户界面(GUI)编辑器**:EMF提供了一个框架,可以快速构建基于模型的图形...
3. **EMF的使用场景** - **软件建模**:EMF广泛应用于UML(统一建模语言)和其他业务流程建模,帮助开发者以模型为中心进行系统设计。 - **数据交换**:通过XML或其他格式,EMF可以实现不同系统间的数据交换和集成...
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
**微软EMF文件格式详解.pdf**:这份文档很可能是微软官方或第三方专家提供的关于EMF格式的详细指南。通常,它会涵盖EMF的基本结构、记录类型、图形操作、颜色管理、图元定义等内容。通过阅读这份文档,读者可以了解...
3. **EclipseModelingFramework.doc**:介绍了Eclipse建模框架的总体架构和主要功能,可能是对EMF的入门教程。 4. **JaMoPP中文文档.doc**:提供了JaMoPP的中文指南,帮助用户理解和使用JaMoPP进行模型驱动的开发。 ...
svg2emf 自动从code.google.com/p/svg2emf导出 使用蜡染和FreeHEP VectorGraphics库将SVG(可缩放矢量图形)文件转换为EMF(增强型元文件)文件 public void testConvert() throws IOException { String svgUrl = ...
imdb2emf:创建 EMF 模型或 TGraphs 的 IMDb 解析器这个小工具从 IMDb 文件创建一个 EMF 模型(或 )。用法您可以克隆这个存储库并安装 Leiningen 来解析 IMDb 文件,也可以下载一个没有依赖项的预编译 JAR。用法:...
3. **打印**:EMF文件设计用于打印目的,因为它们可以精确地控制打印质量和细节。将EMF文件发送到打印机涉及将文件中的图形指令翻译成打印机语言,例如PCL或PostScript。这通常通过打印机驱动程序完成,该驱动程序...
3. **运行和测试**:编译并运行这个Java程序,确保它正确地将EMF转换为PNG。你可以在Eclipse中直接运行,或者创建一个批处理脚本来调用Java可执行文件。 转换过程中可能会遇到的问题包括兼容性问题、文件路径问题、...
3. **转换步骤**: - **加载EMF**:首先需要使用Image.FromFile()方法加载EMF文件到内存中,创建一个Image对象。 - **创建Bitmap对象**:然后,创建一个新的Bitmap对象,设置它的大小为EMF图像的尺寸。 - **创建...
3. **Guice** 是一个轻量级依赖注入框架,用于简化Java应用的构造和管理。 4. **Gson** 是一个将Java对象转换为JSON字符串,反之亦然的库,非常适用于数据序列化和反序列化。 5. **GWTORM** 和 **GWTJSONRPC** 可能...
3. **对象表**:记录了所有使用的绘图对象,如笔、刷子等,以及它们的属性设置。 #### 四、EMF格式的应用场景 由于EMF格式的优良特性,它在多个领域得到了广泛应用: - **桌面出版系统**:EMF格式非常适合用于桌面...
3. **视图 (View)**: - 视图层通过`EditPart`来呈现模型。`EditPart`可以包含其他`EditPart`以形成层次化的视图。 - 使用`Draw2D`工具包进行实际的图形绘制。 ### 实现步骤 1. **创建包**: - 在项目中创建三个...
3. **EMF-Edit**: "EMF-edit功能解析.doc" 详细阐述了 EMF-Edit,它是 EMF 集成的一部分,提供了构建图形编辑器的基础。EMF-Edit 允许开发者快速创建与 Ecore 模型相关的图形界面,以直观地操纵和展示模型数据。 4....