l 概念
GEF是eclipse的图形编辑框架,利用此框架可以实现非常强大的图形化编辑功能。
l MVC模式
MVC模式是"Model-View-Controller"的缩写,中文翻译为"模式-视图-控制器"。MVC应用程序总是由这三个部分组成。Event(事件)导致Controller改变Model或View,或者同时改变两者。只要Controller改变了Models的数据或者属性,所有依赖的View都会自动更新。类似的,只要Controller改变了View,View会从潜在的Model中获取数据来刷新自己。
l 如何体现MVC
模型:GEF没有特定的模型。它的模型可以是xml文件、java对象或者EMF模型,但是模型必须有一种消息机制在自身属性发生变化时通知给GEF。
视图:大多数GEF都采用Draw2D做视图层。
控制器:GEF的控制器是所谓的EditPart对象,更确切的说是一组EditPart对象共同组成了GEF的控制器部分,每一个模型对象都对应一个EditPart对象。用户的编辑操作被装换为一系列的请求Request,有很多类似的请求,这些种类在GEF里被称为角色Role,GEF里有图形化和非图形化这两大类角色。角色是通过编辑策略EditPolicy来实现的,EditPolicy的主要功能是根据请求创建命令Command,而命令直接操作模型对象。
l GEF过程
这段英文很好的阐述了GEF的工作过程,理解这段话对理解GEF有很重要的作用。
When the user causes an event, a Tool object sends a Request to the selected EditPart. This EditPart uses a List of EditPolicys to create a Command that updates the Model class. When the Model changes, it fires a PropertyChangeEvent. After receiving this event, the EditPart modifies the component’s Figure (View) by invoking one of its refresh() methods.
当用户进行了一项操作时,GEF有一个工具对象会发送一个相应的请求给用户操作的EditPart,EditPart从其注册的一系列的EditPolicy中找到操作对应的Model的Command,并执行该Command对Model进行操作,Model会在其操作完成时发出一个PropertyChangeEvent,EditPart接收到这个Event后通过调用Figure的refresh()方法将Model的更改显式出来。
l GEF项目的包
很多人发现一个简单的GEF项目都有很多包,而GEF本身的过程又比较复杂,所以觉得GEF是很复杂难懂的东西,其实不然。
一个GEF项目主要有以下主要的包:
包名 | 内容 | 必有 | 备注 |
model | 模型定义 | 否 | Model可能在别的项目里面已经定义好了 |
figure | 视图模型定义 | 是 |
|
part | EditPart定义 | 是 |
|
policy | EditPolicy定义 | 否 | 可以绕过不用 |
command | 修改模型属性的command | 是 |
|
action | 编辑器的右键菜单功能 | 否 | 可以不扩展编辑器右键内容 |
l 疑问
1.OutlinePage像鸡肋
在对JBPM的流程设计的改造过程中发现:如果要修改Model的属性,可以直接让Model实现IPropertySource接口,然后在properties视图中对模型属性进行修改,基本可以绕开OutlinePage。如果模型属性层次比较复杂,并且模型下面还有子模型的时候,使用OutlinePage可以使模型的层次很清晰。
2.为什么要通过EditPolicy注册Model的Command而不直接就在EditPart上注册Command?
GEF说这种方式可以实现Command和EditPolicy的各种组合实现灵活的操作。个人认为如果Model和Command不是很多很复杂的话可以自己设计一个简单点的机制绕开EditPolicy层。