本页主题: 一个emf新手的学习笔记 --EMF 生成的代码阅读笔记(二) 打印 | 加为IE收藏 | 收藏主题 | 上一主题 | 下一主题

jetgeng

状态: 离线
级别: CEC版主
精华: 1
发帖: 199
威望: 31 点
财富: 94 元
在线时间:51(小时)
注册时间:2005-10-27
最后登录:2008-05-16

一个emf新手的学习笔记 --EMF 生成的代码阅读笔记(二)

EMF不光为我们生成了模型类的代码。还为我们提供了一个默认的模型编辑器。要看到这个模型编辑器我们只需要运行一下就可以看到了(用Eclipse Application的方式)。

共有三个部:

1.       编辑器的主体。包括六种呈现方式。

a)       Selection.

b)     Parent.

c)     List.

d)     Tree

e)       Table

f)       Tree With Columns.

2.       Outline部分。

Properties,会根据选择不同的对象而改变显示的内容。关于Jface部分的工作模式我在《Table View 的合作类的模式》一文中有提到,不过需要说明的是,在Jface中的Viewer他们的ContentProvider可能不一样的。

要完成这部分的功能emf的产生代码中分别放到了两个插件里实现了他们分别是edit和editor。

Edit提供了Item 的Provider,他存在的意义就在于把逻辑对象和UI分割开。而Editor通过使用edit提供的Provider实现了一个编辑器的UI和Command部分,他是正真的用户界面部分。

下面我们就先来看看edit中的类。

好了,首先edit中使用的是adapt模型。所以edit中的插件对象会实现所有的viewer,Properties所需要的接口。

Emf为我们实现通用的接口。所以这绝对是一个学习的好机会。

废话不多说了,来看代码把。

首先看声明:

public class FamilyItemProvider
  extends ItemProviderAdapter
  implements  
    IEditingDomainItemProvider,  
    IStructuredItemContentProvider,  
    ITreeItemContentProvider,  
    IItemLabelProvider,  
    IItemPropertySource {
他的继承关系可以用下图来表示:


他们之间的职能以及实现的接口可用下图来描述:

AdapterImpl是为了实现Adapter模式而设定。
ItemProviderAdapter完成一些基本功能。下面就分别从不同的接口来说明
1.    ResourceLocator:该接口是用来进行资源定位的。
2.    IDisposable 是emf框架提供的一种析构接口。
3.    IChangeNotifier 为"Notification and Adapters"模式提供必需的方法。
4.    CreateChildCommand.Helper

最下面的EMF根据我们的模型产生的Provider的了。他实现了5个接口。
1.    IEditingDomainItemProvider
这部分我还清楚,怀疑和command有关。
2.    IStructuredItemContentProvider
该接口为TableViewer,ListViewer,TreeViewer提供服务。
This is the interface needed to populate the top level items in a TreeViewer, the items of a ListViewer, or the rows of a TableViewer.
3.    ITreeItemContentProvider
This is the interface needed to populate subtrees in a TreeViewer
4.    IItemLabelProvider
This is the interface implemented to provide a label text and even a label icon for an item;
it receives delegated calls from ILabelProvider.
5.    IItemPropertySource
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
爱软件,爱eclipse
我的blog:http://www.blogjava.net/JetGeng/
顶端 时间: 2005年12月25日 13:45 | [楼 主]
jetgeng

状态: 离线
级别: CEC版主
精华: 1
发帖: 199
威望: 31 点
财富: 94 元
在线时间:51(小时)
注册时间:2005-10-27
最后登录:2008-05-16

本想把这一篇写的具体一点的.难度有点超出了我的想象.我想现在的好好计划一下他的结构了.大家给点意见吧.谢谢了先.
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
爱软件,爱eclipse
我的blog:http://www.blogjava.net/JetGeng/
顶端 时间: 2005年12月25日 13:49 | 1 楼
reload_cn

头衔:CS高手 CS高手
状态: 离线
级别: CEC总版
精华: 4
发帖: 431
威望: 72 点
财富: 451 元
在线时间:73(小时)
注册时间:2005-09-21
最后登录:2008-11-07

EMF.edit中的那些个Provider,都是自己提供的,按照的是JFace中一些UI元素的Provider来写的,它没有直接去继承那些JFace的接口是考虑到很多情况下,EMF的模型不是针对JFace来做的。

EMF用的adapter应该是很传统的Adapter模式,将所有的接口让一个类实现(废话 :) ),然后针对每一个EMF生成的类,或者说每一个对应的EClass,都相应生成了一个ItemaProviderFactory。这些Provider配置工厂没有去具体实现JFace的接口,还是实现的EMF的接口。

等到在写UI部分的时候,从EMF生成的Editor中可以看出,它又采用了Composite模式,将一些ProviderFactory集合在一起,然后用AdapterFactoryContentProvider包装一下这个CompositeFactory,AdapterFactoryContentProvider才是真正实现JFace ContentProvider接口的类。

当我们打开某个页面的时候,JFace的Viewer调用所对应的接口方法,JFace会调用接口方法,AdapterFactoryContentProvider就会通过传入的对象以及它实现的接口类型和EMF对应的接口类型,取出ItemFactory,再调用相应的方法。

EMF提供的这些edit接口出来,并不是只针对JFace的,我们可以写我们自己的一些实现,然后配置到EMF的接口来做。特别现在在web方面,这个框架那个框架的,其实很多都用到了一些模型绑定的概念(我其实就知道一点JSF,呵呵),我们可以根据实际需要写出我们的自己的Provider来满足业务需求
顶端 时间: 2005年12月26日 16:58 | 2 楼
reload_cn

头衔:CS高手 CS高手
状态: 离线
级别: CEC总版
精华: 4
发帖: 431
威望: 72 点
财富: 451 元
在线时间:73(小时)
注册时间:2005-09-21
最后登录:2008-11-07

最好是能结合一些实际情况来阐述,这样大家比较容易理解~

多废话两句:像这种讲述如何去操作生成EMF代码的文章太多了,我觉得是不是把重点放到一些EMF核心部分的应用上,然后结合一些实际应用呢? 比如如何将EMF生成模型和Hibernate进行结合,如何通过EMF生成模型和EMF.edit 结合一些web框架进行开发 ……

期待楼主的新文章!
[ 此贴被reload_cn在2005年12月26日 17:08重新编辑 ]
顶端 时间: 2005年12月26日 17:03 | 3 楼
jetgeng

状态: 离线
级别: CEC版主
精华: 1
发帖: 199
威望: 31 点
财富: 94 元
在线时间:51(小时)
注册时间:2005-10-27
最后登录:2008-05-16

to:reload_cn
实在太感谢了。
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
爱软件,爱eclipse
我的blog:http://www.blogjava.net/JetGeng/
顶端 时间: 2005年12月26日 17:26 | 4 楼
wwwpig2004

状态: 离线
级别: CEC程序员
精华: 0
发帖: 303
威望: 92 点
财富: 3 元
在线时间:31(小时)
注册时间:2005-09-28
最后登录:2008-08-07

有差距啊!要努力!
顶端 时间: 2005年12月28日 19:20 | 5 楼
iceburnt

状态: 离线
级别: CEC高级程序员
精华: 0
发帖: 15
威望: 11 点
财富: 217 元
在线时间:2(小时)
注册时间:2006-03-04
最后登录:2006-03-17

偶头晕了!!!!
顶端 时间: 2006年03月17日 23:38 | 6 楼
java609

状态: 离线
级别: CEC高级程序员
精华: 0
发帖: 75
威望: 11 点
财富: 282 元
在线时间:28(小时)
注册时间:2006-02-12
最后登录:2006-10-31

我是新手..谢谢大家
顶端 时间: 2006年03月30日 01:27 | 7 楼
bobby

状态: 离线
级别: CEC高级程序员
精华: 0
发帖: 16
威望: 11 点
财富: 218 元
在线时间:9(小时)
注册时间:2006-04-27
最后登录:2006-08-10

一直用GEF自己写,没用过EMF建模。
不过用EMF感觉起来挺方便的
顶端 时间: 2006年05月11日 13:46 | 8 楼
sunquan

状态: 离线
级别: CEC高级程序员
精华: 0
发帖: 5
威望: 1 点
财富: 105 元
在线时间:0(小时)
注册时间:2006-11-29
最后登录:2006-12-30

xuexi
顶端 时间: 2006年11月30日 22:54 | 9 楼
jiandanren

状态: 离线
级别: CEC高级程序员
精华: 0
发帖: 106
威望: 1 点
财富: 189 元
在线时间:0(小时)
注册时间:2006-12-30
最后登录:2008-10-15

可否给一个emf自动生成代码工具的下载地址.谢谢 [p:1]
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
走自己的路,让别人去说!
顶端 时间: 2007年01月30日 14:03 | 10 楼
lkitten

状态: 离线
级别: CEC高级程序员
精华: 0
发帖: 33
威望: 11 点
财富: 233 元
在线时间:0(小时)
注册时间:2005-12-25
最后登录:2008-03-07

保存下了
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
程序员
顶端 时间: 2007年04月04日 13:11 | 11 楼
bss03auv

状态: 离线
级别: CEC程序员
精华: 0
发帖: 6
威望: 1 点
财富: 8 元
在线时间:0(小时)
注册时间:2007-04-28
最后登录:2007-05-04

拜读了jetgeng兄好文!!!!

有没有那位前辈发一些GMF的文章和大家分享一下
顶端 时间: 2007年04月29日 04:27 | 12 楼
syune_1

状态: 离线
级别: CEC程序员
精华: 0
发帖: 18
威望: 1 点
财富: 21 元
在线时间:0(小时)
注册时间:2007-06-24
最后登录:2008-06-01

向高手们学习
顶端 时间: 2007年07月04日 20:49 | 13 楼
中国Eclipse社区 » 图形与模型


辽ICP备05021625号