GMF中的EMF的Edit模块

来源:互联网 发布:摇钱树软件 编辑:程序博客网 时间:2024/06/08 05:43

GMF中的EMFEdit模块

前言:

在我们生成GMF项目时通常要依赖EMF首先生成.Edit项目,在这个项目中我们通常都会生成1ItemProviderAdapterFactory类和一组 ItemProviderAdapter的子类,前者的主要作用是生成后者,后者是和核心模型的接口一一对应的,他们在命名时都省略了Adapter这个单词,决定了不同类型的对象如何被显示以及他们如何响应用户的操作,.edit的核心代码。

 

(图1:包结构)

 

一.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)

每个XXXItemProvidergetPropertyDescriptors()方法返回在属性视图里显示的属性列表,列表里的每个元素是一个 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)

 

GMFEMF的模型驱动机制:

模型发生改变时,与被修改的对象相关联的XXXItemProvidernotifyChanged()方法被调用,事件立即被通知给 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())和在实现ContentProvidergetChildren()都会用到这个方法。代码实例如下:

 

    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

由于这方面代码本人也是首次涉及,如有纰漏还请各位指教,我们一起交流。