GMF中的EMF的Edit模块
来源:互联网 发布:摇钱树软件 编辑:程序博客网 时间:2024/06/08 05:43
GMF中的EMF的Edit模块
前言:
在我们生成GMF项目时通常要依赖EMF首先生成.Edit项目,在这个项目中我们通常都会生成1个ItemProviderAdapterFactory类和一组 ItemProviderAdapter的子类,前者的主要作用是生成后者,后者是和核心模型的接口一一对应的,他们在命名时都省略了Adapter这个单词,决定了不同类型的对象如何被显示以及他们如何响应用户的操作,是.edit的核心代码。
一.XXXItemProvider代码分析
<1>
类的声明 |
public class XXXItemProvider |
extends |
ItemProviderAdapter |
implements |
IEditingDomainItemProvider |
IStructuredItemContentProvider |
ITreeItemContentProvider |
IItemLabelProvider IItemPropertySource |
a) 父类ItemProviderAdapter
封装了XXXItemProvider的一些必要实现和通用属性,因为我们预先知道了Ecore模型的结构,所以在 ItemProviderAdapter统一实现了ITreeItemContentProvider借口。
b) ITreeItemContentProvider
实现模型的层次结构
c) IItemLabelProvider
它主要控制显示的文字和图标。
d) IItemPropertySource
实现与属性视图的相关操作。
e) IEditingDomainItemProvider
实现一些有关于Command的操作
f) IStructuredItemContentProvider
该接口为提供提供最终显示数据。
<2> XXXItemProvider主要代码解释
a) //返回在属性视图里显示的属性列表 public List getPropertyDescriptors(Object object) |
每个XXXItemProvider的getPropertyDescriptors()方法返回在属性视图里显示的属性列表,列表里的每个元素是一个 ItemPropertyDescriptor对象,它决定了每个属性的标签、描述、图标以及是否可编辑。EMF为生成的代码会帮我们把模型定义里的每个 属性都显示在属性列表里,如果希望隐藏某些属性,可以通过修改这个方法移除之。
例如我们注释掉下面代码中addXXX PropertyDescriptor(object);,就可以达到属性隐藏的效果。
public List getPropertyDescriptors(Object object) {
if (itemPropertyDescriptors == null) {
super.getPropertyDescriptors(object);
addPrimaryPropertyDescriptor(object);
addTypePropertyDescriptor(object);
addSizePropertyDescriptor(object);
addUniquePropertyDescriptor(object);
}
return itemPropertyDescriptors;
}
b) //返回显示的名称 public String getText(Object object) |
c) //返回显示的图标 public Object getImage(Object object) |
d) //通知ItemProviderAdapterFactory进行更新视图 public void notifyChanged(Notification notification) |
GMF中EMF的模型驱动机制:
模型发生改变时,与被修改的对象相关联的XXXItemProvider的notifyChanged()方法被调用,事件立即被通知给 ItemProviderAdapterFactory,后者是整个模型的事件处理机构,负责事件的分发工作,他可以把携带改变信息Notification对象传递给对应的EditPart中,由EditPart 中的handleNotificationEvent方法负责更新显示视图,也就是模型和显示的同步过程。
e) //定义该模型元素可以创建哪些子元素 protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) |
例如在我们的数据库设计器中,table对象子元素是column,In的连线集合,Out的连线集合。代码类似如下:
protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
super.collectNewChildDescriptors(newChildDescriptors, object);
newChildDescriptors.add
(createChildParameter
(DbdesignerPackage.Literals.TABLE__COLUMNS,
DbdesignerFactory.eINSTANCE.createColumn()));
newChildDescriptors.add
(createChildParameter
(DbdesignerPackage.Literals.TABLE__OUT_LIST,
DbdesignerFactory.eINSTANCE.createFKRelation()));
newChildDescriptors.add
(createChildParameter
(DbdesignerPackage.Literals.TABLE__INPUT_LIST,
DbdesignerFactory.eINSTANCE.createFKRelation()));
}
f) //如果XXXItemProvider对应模型含有子元素 public Collection getChildrenFeatures(Object object) |
在这里是要定义模型所拥有的结构,在创建命令(createCommand())和在实现ContentProvider的getChildren()都会用到这个方法。代码实例如下:
public Collection getChildrenFeatures(Object object) {
if (childrenFeatures == null) {
super.getChildrenFeatures(object); childrenFeatures.add(DbdesignerPackage.Literals.TABLE__COLUMNS);childrenFeatures.add(DbdesignerPackage.Literals.TABLE__OUT_LIST);childrenFeatures.add(DbdesignerPackage.Literals.TABLE__INPUT_LIST);
}
return childrenFeatures;
}
二. 总结
由上面分析可知,Edit部分是EMF乃至GMF事件机制的核心,它负责协调模型与视图的同步,各个视图的显示的Provider以及实现用于支持对模型进行操作的Command Framework。
由于这方面代码本人也是首次涉及,如有纰漏还请各位指教,我们一起交流。
- GMF中的EMF的Edit模块
- Draw2D、GEF、GMF和EMF的解释
- Draw2D、GEF、GMF和EMF的解释
- EMF.edit framework(一)
- EMF.edit framework(二)
- EMF-edit功能解析
- 自己理解的GMF
- Eclipse 中的EMF框架
- GMF
- gmf
- GMF中的org.eclipse.gmf.bridge.trace插件
- 一个GMF的简单例子
- GMF的保存图片代码
- GMF中修改的内容
- EMF
- 解决EMF DanglingHREFException的问题
- GEF,EMF,RCP,Eclipse's plugin的几个问题(2) Propertes View中的Property(Category)排序问题
- gmf 中保存 xml resource 的方法
- python中httplib实现长连接
- C++ 之 模板与泛型编程(二、模板实例化)
- js脚本精粹
- COM入门
- Schema中elementFormDefault详解
- GMF中的EMF的Edit模块
- 一家戏院,网络,客户数据库,一个独自看电影的男生,一个独自看电影的女生,可以组合出什么故事呢?
- 有序全排列生成算法集锦
- 数据库优化
- ASP.NET性能优化整理
- 数据仓库的开发流程
- SSIS如何在包中使用数据源
- 连接oracle的环境问题--怎样修改oracle监听程序的配置
- 使用ibatis实现动态分页查询