一 GEF简介
GEF Graphical Editing Framework, 是Eclipse提供的图形编辑框架 ,采用MVC 框架模式实现,并使用了事件监听、Command和Policy模式实现控制和操作的功能。模型 对应业务逻辑,实现相应的接口,并添加事件监听器,实现对模型改变事件的监听。控制器 由GEF提供的EditPart实现,安装编辑策略,监听模型的变化,处理模型变化请求,执行相应的Command命令完成相应的操作,绘制图形。视图 部分由Eclipse提供的Draw2d实现,绘制相应的图形。
在MVC(模型-视图-控制器)模型中,控制器通常是视图和模型之间唯一的连接者。控制器负责维护视图、解释UI事件并转化为对模型的操作。
框架在应用的模型和视图之间提供了一种连接,也提供了输入Handler,例如tools和actions,把事件转换位请求Requests,Requests 和 Commands 用来封装交互行为和对模型产生的作用。下面是GEF中各角色的描述:
模型 (Model)
模型可以是任何能够持久化的数据,任何模型都可以用在GEF中。模型必须具有一种通知机制,从非技术角度来讲,模型和命令(command)关系紧密。command作用就是通过一种能够撤销和重做的方式修改模型,通常,command只被用在模型本身。
视图 (View (Figure/Treeitems))
视图是用户能够看到的任何东西,图形和树节点都能够用作视图元素。
控制器 (control (EditPart))
通常每一个可视化模型对象对应一个控制器。这个控制器称为EditPart ,Editpart是模型和视图之间的连接,也负责图形编辑。Editpart包含称为EditPolicy的Helpler工具,它能够处理大量的编辑任务。
显示器 (Viewers)
EditPartViewer 是控制器 editparts显示视图的地方。GEF提供两种Viewer,graphical viewer具备图形功能,tree viewer可以显示本地化(native)树节点。GEF viewer和JFace viewer类似,它们管理SWT控件,viewer也是一个选择提供器(selection provider),选择单元为控制器EditPart。
GEF能够用在任何能够Workbench中使用SWT Control空间的地方,可以是一个editor、view、wizard page 等等。通常在Editpart使用,有时在editor编辑器的大纲页面中使用。GEF要求具备RCP(Eclipse Rich Client)和“view”(org.celipse.ui.views)插件环境,view插件提供了属性页支持。
二 控制器(EditPart)介绍
EditPart把对应的视图和模型关联起来,并且形成它们自己的结构,通常对应模型的结构,例如,一个模型是一个包含节点的图表模型,那么会对一个包含子editpart的editpart。
这种editpart的父子关系在图形里也是一样的。父图形包含子图形。通常是父类editpart的视图是一个包含几种子图形的复杂视图,其中一个图形被设计为面板,其他图形可以加入这个面板里。最终形成了一种三个近似相互对应的独立层次数据结构。
连接是这种简单树状结构的例外。连接表示两个对象之间的连接和关联,视图使用Draw2d的连接图形。连接能够方便地式储存在模型中,但是其edipart被source editpart和target editpart管理。连接图形也比较特殊,它绘制在包含非连接图形的主要图层之上的一个特殊的层。
GEF提供两种editpart实现。Graphical editpart使用figure(Draw2d)作为视图,支持连接,也即这些连接本身就是 Graphical editpart。另一种是tree editpart,使用SWT 树节点作为视图。
editpart的作用包括:
- 创建和维护视图
- 创建和维护子editpart
- 创建和维护连接editpart
- 支持模型编辑
需要指出的是,维护视图和其他editpart意味着模型改变会通知给editpart。通常editpart 在关联的模型中添加监听器,当接收到通知,editpart根据模型的变化更新它的视图和结构。