在前面
![](/icons/8905de.gif)
帖子已经提到
![](/icons/8905dou.gif)
GEF(Graphical Editor Framework)是
![](/icons/8905yi.gif)
个图形化编辑框架
![](/icons/8905dou.gif)
它允许开发人员以图形化
![](/icons/8905de.gif)
方式展示和编辑模型
![](/icons/8905dou.gif)
从而提升用户体验
![](/icons/8905dou2.gif)
这样
![](/icons/8905de.gif)
应用
![](/icons/8905chengxu.gif)
有很多
![](/icons/8905dou.gif)
例如:UML类图编辑器、图形化XML编辑器、界面设计工具以及图形化数据库结构设计工具等等
![](/icons/8905dou2.gif)
归结
![](/icons/8905yi.gif)
下
![](/icons/8905dou.gif)
可以发现它们在图形化编辑方面具有以下共同的处:
提供
![](/icons/8905yi.gif)
个编辑区域和
![](/icons/8905yi.gif)
个工具条
![](/icons/8905dou.gif)
用户在工具条里选择需要
![](/icons/8905de.gif)
工具
![](/icons/8905dou.gif)
以拖动或单击
![](/icons/8905de.gif)
方式将节点或连接放置在编辑区域;
节点可以包含子节点;
用户能够查看和修改某个节点或连接
![](/icons/8905de.gif)
大部分属性;
连接端点锚定在节点上;
提供上下文菜单和键盘命令;
提供图形
![](/icons/8905de.gif)
缩放功能;
提供
![](/icons/8905yi.gif)
个大纲视图
![](/icons/8905dou.gif)
显示编辑区域
![](/icons/8905de.gif)
缩略图
![](/icons/8905dou.gif)
或是树状模型结构;
支持撤消/重做功能;
等等
![](http://www.crazycoder.cn/WebFiles/20091/d2d9c77a-8286-48ba-bb2b-b435d6cc67df.g<img src='/icons/8905if.gif' />)
图3 EditPart对象
用户
![](/icons/8905de.gif)
编辑操作被转换为
![](/icons/8905yi.gif)
系列请求(Request)
![](/icons/8905dou.gif)
有很多种类
![](/icons/8905de.gif)
请求
![](/icons/8905dou.gif)
这些种类在GEF里被称为角色(Role)
![](/icons/8905dou.gif)
GEF里有图形化和非图形化这两大类角色
![](/icons/8905dou.gif)
前者比如Layout Role对应和布局有关
![](/icons/8905de.gif)
![](/icons/8905de.gif)
操作
![](/icons/8905dou.gif)
后者比如Connection Role对应和连接有关
![](/icons/8905de.gif)
操作等等
![](/icons/8905dou2.gif)
角色这个概念是通过编辑策略(EditPolicy)来实现
![](/icons/8905de.gif)
![](/icons/8905dou.gif)
EditPolicy
![](/icons/8905de.gif)
主要功能是根据请求创建相应
![](/icons/8905de.gif)
命令(Command)
![](/icons/8905dou.gif)
而后者会直接操作模型对象
![](/icons/8905dou2.gif)
对每
![](/icons/8905yi.gif)
个EditPart
![](/icons/8905dou.gif)
你都可以"安装"
![](/icons/8905yi.gif)
些EditPolicy
![](/icons/8905dou.gif)
用户对这个EditPart
![](/icons/8905de.gif)
特定操作会被交给已安装
![](/icons/8905de.gif)
对应EditPolicy处理
![](/icons/8905dou2.gif)
这样做
![](/icons/8905de.gif)
直接好处是可以在区别EditPart的间共享
![](/icons/8905yi.gif)
些重复操作
![](/icons/8905dou2.gif)
在GEF SDK提供
![](/icons/8905de.gif)
帮助文档(GEF开发指南)里有
![](/icons/8905yi.gif)
份详细
![](/icons/8905de.gif)
EditPolicy、Role和Request类型列表
![](/icons/8905dou.gif)
这里就不赘述了
![](/icons/8905dou2.gif)
视图:前面说过
![](/icons/8905dou.gif)
GEF
![](/icons/8905de.gif)
视图可以有很多种
![](/icons/8905dou.gif)
GEF目前提供了图形(GraphicalViewer)和树状(TreeViewer)这两种
![](/icons/8905dou.gif)
前者利用Draw2D图形(IFigure)作为表现方式
![](/icons/8905dou.gif)
多用于编辑区域
![](/icons/8905dou.gif)
后者则多用于实现大纲展示
![](/icons/8905dou2.gif)
视图
![](/icons/8905de.gif)
任务同样繁重
![](/icons/8905dou.gif)
除了模型
![](/icons/8905de.gif)
显示功能以外
![](/icons/8905dou.gif)
还要提供编辑功能、回显(Feedback)、工具提示(ToolTip)等等
GEF使用EditPartViewer作为视图
![](/icons/8905dou.gif)
它
![](/icons/8905de.gif)
作用和JFace中
![](/icons/8905de.gif)
Viewer十分类似
![](/icons/8905dou.gif)
而EditPart就相当于是它
![](/icons/8905de.gif)
ContentProvider和LabelProvider
![](/icons/8905dou.gif)
通过
![](/icons/8905set.gif)
Contents
![](/icons/8905kh.gif)
思路方法来指定
![](/icons/8905dou2.gif)
我们经常使用
![](/icons/8905de.gif)
Editor是
![](/icons/8905yi.gif)
个GraphicalEditorWithPalette(GEF提供
![](/icons/8905de.gif)
Editor
![](/icons/8905dou.gif)
是EditorPart
![](/icons/8905de.gif)
子类
![](/icons/8905dou.gif)
具有图形化编辑区域和
![](/icons/8905yi.gif)
个工具条)
![](/icons/8905dou.gif)
这个Editor使用GraphicalEditViewer和PaletteViewer这两个视图类
![](/icons/8905dou.gif)
PaletteViewer也是GraphicalEditViewer
![](/icons/8905de.gif)
子类
![](/icons/8905dou2.gif)
开发人员要在configureGraphicalViewer
![](/icons/8905kh.gif)
和initializeGraphicalViewer
![](/icons/8905kh.gif)
这两个思路方法里对EditPartViewer进行定制
![](/icons/8905dou.gif)
包括指定它
![](/icons/8905de.gif)
contents和EditPartFactory等等
![](/icons/8905dou2.gif)
EditPartViewer同时也是ISelectionProvider
![](/icons/8905dou.gif)
这样当用户在编辑区域做选择操作时
![](/icons/8905dou.gif)
注册
![](/icons/8905de.gif)
SelectionChangeListener就可以收到选择事件
![](/icons/8905dou2.gif)
EditPartViewer会维护各个EditPart
![](/icons/8905de.gif)
选中状态
![](/icons/8905dou.gif)
如果没有被选中
![](/icons/8905de.gif)
EditPart
![](/icons/8905dou.gif)
则缺省选中
![](/icons/8905de.gif)
是作为contents
![](/icons/8905de.gif)
EditPart
![](/icons/8905dou2.gif)
初步了解了GEF
![](/icons/8905de.gif)
MVC实现方式
![](/icons/8905dou.gif)
让我们看看典型
![](/icons/8905de.gif)
GEF应用
![](/icons/8905chengxu.gif)
是什么样子
![](/icons/8905de.gif)
![](/icons/8905dou2.gif)
大部分GEF应用
![](/icons/8905chengxu.gif)
都实现为Eclipse
![](/icons/8905de.gif)
Editor
![](/icons/8905dou.gif)
也就是说整个编辑区域是放置在
![](/icons/8905yi.gif)
个Editor里
![](/icons/8905de.gif)
![](/icons/8905dou2.gif)
所以典型
![](/icons/8905de.gif)
GEF应用
![](/icons/8905chengxu.gif)
具有
![](/icons/8905yi.gif)
个图形编辑区域包含在
![](/icons/8905yi.gif)
个Editor(例如GraphicalEditorWithPalette)里
![](/icons/8905dou.gif)
可能有
![](/icons/8905yi.gif)
个大纲视图和
![](/icons/8905yi.gif)
个属性页
![](/icons/8905dou.gif)
![](/icons/8905yi.gif)
个用于创建EditPart例子
![](/icons/8905de.gif)
EditPartFactory
![](/icons/8905dou.gif)
![](/icons/8905yi.gif)
些表示业务
![](/icons/8905de.gif)
模型对象
![](/icons/8905dou.gif)
和模型对象对应
![](/icons/8905de.gif)
![](/icons/8905yi.gif)
些EditPart
![](/icons/8905dou.gif)
每个EditPart对应
![](/icons/8905yi.gif)
个IFigure
![](/icons/8905de.gif)
子类对象显示给用户
![](/icons/8905dou.gif)
![](/icons/8905yi.gif)
些EditPolicy对象
![](/icons/8905dou.gif)
以及
![](/icons/8905yi.gif)
些Command对象
![](/icons/8905dou2.gif)
GEF应用
![](/icons/8905chengxu.gif)
![](/icons/8905de.gif)
工作方式如下: EditPartViewer接受用户
![](/icons/8905de.gif)
操作
![](/icons/8905dou.gif)
例如节点
![](/icons/8905de.gif)
选择、新增或删除等等
![](/icons/8905dou.gif)
每个节点都对应
![](/icons/8905yi.gif)
个EditPart对象
![](/icons/8905dou.gif)
这个对象有
![](/icons/8905yi.gif)
组按操作Role分开
![](/icons/8905de.gif)
EditPolicy
![](/icons/8905dou.gif)
每个EditPolicy会对应
![](/icons/8905yi.gif)
些Command对象
![](/icons/8905dou.gif)
Command最终对模型进行直接修改
![](/icons/8905dou2.gif)
用户
![](/icons/8905de.gif)
操作转换为Request分配给适当
![](/icons/8905de.gif)
EditPolicy
![](/icons/8905dou.gif)
由后者创建适当
![](/icons/8905de.gif)
Command来修改模型
![](/icons/8905dou.gif)
这些Command会保留在EditDo
![](/icons/8905main.gif)
(专门用于维护EditPartViewer、Command等信息
![](/icons/8905de.gif)
对象
![](/icons/8905dou.gif)
![](/icons/8905yi.gif)
般每个Editor对应唯
![](/icons/8905yi.gif)
![](/icons/8905yi.gif)
个该对象)
![](/icons/8905de.gif)
命令堆栈里
![](/icons/8905dou.gif)
用于实现撤消/重做功能
![](/icons/8905dou2.gif)
以上介绍了GEF中
![](/icons/8905yi.gif)
些比较重要
![](/icons/8905de.gif)
概念
![](/icons/8905dou.gif)
不知道看过的后你是否对它有了
![](/icons/8905yi.gif)
个大概
![](/icons/8905de.gif)
印象
![](/icons/8905dou2.gif)
如果没有也没关系
![](/icons/8905dou.gif)
![](/icons/8905yinwei.gif)
在后面
![](/icons/8905de.gif)
帖子里将会有结合例子
![](/icons/8905de.gif)
讲解
![](/icons/8905dou.gif)
我们使用
![](/icons/8905de.gif)
例子就是序言里提到
![](/icons/8905de.gif)
第 6个项目