工作流设计器之GEF


第 2 章 GEF

2.1. 组成结构

GEF起步于Workbench中的EditorPart部分,它的顶级元素是Editor,直接继承于EditorPart。实际中我们会直接操作Editor,通过WorkbenchPage的openEditor()方法,将我们的Editor放入WorkbenchPage中。

0102-01.png

GEF组成结构

图 2.1. GEF组成结构


Gef的中心是Editor,它负责维护EditDomain,Factory以及GraphicalViewer。

EditDomain负责维护图形(Figure),数据(Model)与控制器(EditPart)之间的对应关系,并提供命令堆栈(CommandStack)以支持命令模式。所有的图形(Figure),数据(Model)与控制器(EditPart)都会在EditDomain中保留对应管理,以供图形设计过程中进行快速的查找以及对应的操作。

提示

EditDomain中这部分对象维护关系的功能还未完全实现,需要进一步重审。

ModelFactory负责根据对应的type生成Model。

EditPartFactory负责根据对应的Model生成EditPart,用于添加Model时生成对应的EditPart。

这两个factory提供给用户统一定义Model和EditPart的入口点,实际使用时可以直接设置到Editor中,供GEF的其他部件调用。

提示

ModelFactory中和EditPartFactory中实际上还是有一些重复的部分,实际开发中根据type配置两次,根据type创建Model和EditPart两份对象,目前没有设计FigureFactory,而是在EditPart中实现对应的createFigure()方法,在其中创建对应的figure。这部分设计需要重审,是否将factory合并。

Editor提供唯一的GraphicalViewer,GraphicalViewer会与唯一的RootEditPart相关联,将所有的图形数据与Editor进行关联。

提示

GraphicalViewer只是为了将Editor与MVC部分分离的桥梁,本身并没有实际功能。目前两者内部的沟通机制还不是十分明确,需要进一步整理。

RootEditPart本身不对应任何数据模型,但是它提供的getContents()与setContents()方法,用于设维护当前应用中最顶级数据模型所定义的EditPart,其他EditPart都会以这个顶级EditPart为根节点向下延展成一棵树形结构。

RootEditPart提供的GraphicalViewport负责对Gef中所有的图形进行渲染,Viewport中包含了多个layer,在实际运行时会将各自的figure放入对应的layer。

RootEditPart只是用来表示树形根节点的特殊控制器,因此它不会与实际图形数据相关联,它对应的Model始终是空值。RootEditPart可以为其他EditPart提供与GraphicalViewer交流的渠道。这样的好处是EditPart不需要与GraphicalViewer直接关联,从结构层次上更加轻便。

2.2. 执行顺序

对Editor的初始化是从EditorPart中定义的init()方法开始的。


初始化0102-02.png

图 2.2. 初始化


初始化过程中主要经历两大部分过程。

首先创建GraphicalViewer,RootEditPart,GraphicalViewport从而完成GEF的基础结构,这时Gef的基础构件已经准备完毕,可以随时为上层MVC建筑提供服务。

然后通过GraphicalViewer的setContents()方法,使用EditorInput中的数据构建顶级的数据模型(Model)和控制器(EditPart)。需要注意的是,这里的顶级EditPart并不是RootEditPart,因为RootEditPart是包含任何实际的图形数据的,而setContents()对应的EditPart才是实际意义上的最上层图形,以XML为例,这里的setContents()设置的就是XML的根节点。在使用setContents()构建的EditPart也会维护实际数据,并最终用于图形的渲染。在图形设计过程中,所有使用到的图形都要以子节点的形式关联到这个EditPart中。我们在进行导入导出操作时,也要以getContents()和setContents()为入口。

提示

setContents()方法可以接受两种类型的参数,一种类型是Model,这时setContents()会通过EditPartFactory,为Model创建对应的EditPart,将EditPart与Model关联,并将EditPart设置给RootEditPart的setContents()方法。一种类型是string。这时setContents()会先调用ModelFactory的createModel()方法创建对应的Model,然后再为Model创建EditPart,并完成相关设置。

在对Editor进行初始化之后就可以对图形进行渲染了。渲染过程以Editor中的init()为起点,依次渲染GraphicalViewer,RootEditPart,GraphicalViewport。


渲染0102-03.png

图 2.3. 渲染


GraphicalViewport的主要作用是生成多个图层(Layer),之后每个图层中会放置对应的图形(Figure)。

Gef.gef.support.DefaultRootEditPart的render()方法中调用了getContents().refresh(),这就会让顶级EditPart自动扫描包含的所有子Model,并为子Model创建关联对应的EditPart,并刷新这些EditPart对应的Figure,从而实现刷新所有图形的效果。

这个过程中会检测是否有的数据模型(Model)还没有与EditPart进行关联,如果发现了这种数据模型(Model),就会调用EditPartFactory的createEditPart()创建对应的控制器(EditPart),并创建图形(Figure),而后将创建的图形(Figure)加入GraphicalViewport中的对应layer中。


上一篇 下一篇

评论



分享