2024年3月16日发(作者:)

ValueEngineering

·181·

基于GEF的图形编辑器技术研究

TechniquesforGEF-basedGraphicalEditor

陆军

LuJun

;杨德仁

YangDeren

;王勇

WangYong

(①宁夏电信实业公司,银川750000;②宁夏医科大学理学院,银川750000)

(①NingxiaTelecomEnterpriseCo.,Yinchuan750000,China;②ScienceCollegeofNingxiaMedicalUniversity,Yinchuan750000,China)

摘要:

GEF可用于模型开发图形化表示和编辑环境。本文分析了GEF与MVC映射机制,研究了GEF设计模式,探讨了其关键技术和事件

流,介绍了一种基于GEF的图形编辑器。本研究有助于实施基于GEF的编辑器。

Abstract:GEFframeworkcanbeusedpaper,themapping

technologiesandeventstreamswere

dyishelpfultoimplementGEF-basededitor.

关键词:

GEF;映射机制;设计模式;关键技术;事件流

Keywords:GEF;mappingmechanism;designpatterns;keytechnology;eventstreams

中图分类号:

TP31

文献标识码:

A

文章编号:

1006-4311(2011)03-0181-02

0

引言

编辑器、EditPolicies和用户定义的控制器(侦听器)。通常选择

GEF是流行的开源框架,可为模型提供图形化表示和编辑环GraphicalEditPart为控制器。

境。可用于创建状态图、类图、GUI软件和流程图等应用

[1]

。EditPart了解模型和视图。模型侦听器要注册在EditPart.

1GEF

抽象机制与设计模式

()中,而注销则要在vate()中实现。若检测到activate

模型发生了变化,则要相应地更新视图。Editpart#isActive返回控制

1.1MVC体系结构

MVC是一种通用的Web应用体系结构。模型(Model)代表数

器的当前状态。

据,是持有业务数据的对象,是用户要实施的或在遗留系统中已经

GEF利用MVC的优势体现在每个Figure都有其EditPart,

存在的。模型必须拥有某种通告机制。视图(View)负责在界面上呈

EditPart通过EditPolicy修改模型。

GEF提倡MVC的1:1映射,但也能实现一个模型对多个控制

现数据,定义了在屏幕上的显示,用户要能用鼠标和键盘修改视图。

此时需要额外责任以保持控制器和模型同步。模型和视图分别实施,相互没有依赖,这有利于重用。视图是模器,

(Controller)实施

1.3GEF的几种常用设计模型

型状态的函数,是模型的图形化表示。通过控制器

模型和视图之间的唯一关联。控制器定义了在视图改变时模型的响

GEF通过使用设计模式实现其灵活性和扩展性。GEF最常用的

[1-2]

应机制、在模型改变时视图的响应机制,负责处理用户输入并根据设计模式是命令、工厂、观察者、职责链和状态

模型刷新视图。通过定义控制器和视图之间的接口,视图更新方便。命令:用来封装修改模型的指令,是GEF修改模型的机制。通

用户在图形界面上操作触发对模型的修改,模型变化触发了视图更过继承抽象类Command,提供Redo/Undo功能。该类具有execute

新。()、undo()和redo()和canExecute()方法。用canExecute()方法得到

1.2GEF与MVC的映射

反馈以确认操作是否许可。

GEF框架基于MVC结构解除用户界面、行为和表示之间的耦

工厂:工厂方法模式用于创建Figure、抽象工厂模式用于创建

GEF包的palette工具为用提供编辑能力、请求

EditPart。

合。包括如下组件:

(Request)/命令(command)提供基于Redo/Undo方式的编辑机制;观察者:是一种对象行为模式,监听模型和视图的控制器就是

Draw2d包提供绘制图形功能。

典型的观察者。

模型由用户定义,可用Java对象表示,也可用Eclipse建模框架职责链:用来决定处理请求(Request)的编辑策略(EditPolicy)

(EMF)构造。

。通过将Request传递给多个对象,并给这些对象处理请求的机会,

GEF的图形表示经由Draw2D框架完成,即把用Draw2d创建

从而将请求的发送者和接受者解除耦合。多个编辑策略可以收到请

的Figures映射到MVC的视图。视图要用类2d.求和返回命令。这些命令是以链方式组织的。

Figure的createFigure()方法创建。Figure用于在GraphicalViewer中

状态:对于键盘、鼠标输入,GEF编辑器通过选择工具来选择行

TreeItems用于在大纲TreeViewer中显示信息。显示图形,为。允许GraphicalEditor在内部状态发生改变时修改编辑器的行

图形编辑功能基于GEF包,实施e中的为。用户切换工具可以改变编辑器的状态。

Ifigure接口。2GEF

的关键技术与事件流

MVC的控制器映射到GEF的EditParts,用以显示模型的图形2.1GEF关键技术

Draw2D是基于eclipse的SWT的标准2D绘图框架,是一个轻

———————————————————————

寄生于某个重量级控件中,其目的只在于显示对象,

作者简介:

陆军(1971-),男,徐州人,硕士学历,工程师,研究方向:软件工程;

量级图形系统,

),男,同心人,博士,教授,研究方向:软件工程、人工

而不储存和管理任何数据。GUI由Draw2dFigures树定义,可用

杨德仁(1964-

(child)把figure添加在父节点下,也可用

智能;王勇(1988-),男,同心人,本科生。

ServerPages:大多数搜索引擎能检索.asp页面,若URL中不含问号。

XQASP提供的一个产品能自动地用“/”代替URL中的问号。

2

结束语

在实际中以上六种链接优化应综合、合理使用,以提高网站的

尤其是建立反向链接要谨慎。随着互联网的发展,搜索引擎调排名。

整算法的频率越来越快,垃圾页面可以钻营的空间自然也就越来越

少。基于这种考虑,那种号称能迅速让网站获得成百上千链接的自

动处理方案应该被淘汰,这类链接来自链接养殖场(linkfarm),这是

所有搜索引擎打击的对象。

参考文献:

[1]杨帆.SEO攻略———搜索引擎优化策略与实战案例详解[M].北京:人

民邮电出版社,2009.

人民邮电出版[2]吴泽欣.SEO教程:搜索引擎优化入门与进阶[M].北京:

社,2009.

·182·

价值工程

(child)从父节点删除子节点。Figure类实施Ifigure接口,该接口可

⑤在从EditPart获取到命令后,活动通过命令栈

用于在需要figures属性的情形。(CommandStack)执行命令,命令栈是实施Redo/Undo功能的机制,

EditPartViewer,在SWT控件上为每个模型安装一个视图。模型

参考CompoundCommand类;

可有多个视图,每个视图都有其EditParts和Draw2dFigures。

⑥命令栈执行命令(execute),同于修改模型,进而更新视图。

EditParts组织成树型结构,其根是RootEditPart。

被GraphicalViewer安装在控件之上的Draw2d使用

EditPartFactory,定义EditPart与具体模型的相关性。EventDispatcher,后者把得到的事件传递给Draw2d。若该事件被

命令栈(CommandStack),实施Redo/Undo功能,每个编辑域都

Draw2d消费,则该过程结束(事件类中有检测事件是否被消费的方

()执行。有其命令栈。命令通过命令栈调用execute法),否则,被转送给编辑域,进而被转发给活动工具。

工具面板(Palette),用PaletteViewer为用户展现的工具。用户可

3

一种基于

GEF

的图形编辑器

(ActiveTool)。由EditPartViewers为

GEF开发的软件可作为Eclipse的插件。要开发脱离Eclipse平

使用PaletteViewer选择活动工具

编辑域(EditDomain)派遣的事件都被转发给活动工具。台的独立软件运行,可实施为RichClientPlatform(RCP)。图形编辑

编辑策略,对模型的行为被重构为编辑策略。编辑策略为器构造实例如图2所示。

EditParts带来了编辑功能。编辑策略定义了要用EditPart完成的工

作。对一控制器可有多个行为,每个编辑策略被赋予一角色(Role)。

编辑策略可动态安装和删除。GEF内部通信通过转发给编辑策略的

请求实现。

请求与响应,把用户操作视同为请求。在调用语境下理解请求。

语境由活动工具(由用户从工具面板中选择)决定。用户使用工具产

生请求。把该请求移交给选中的editpart,后者则返回一个命令。这

可通过对编辑策略实施责任链实现,编辑策略确定能否处理请求,

若不能则传递给下个编辑策略。其声明顺序即为请求被传递的顺

序。有能力的编辑策略随即创建命令。该命令被返回给那个启动请

求的工具。命令的执行引起对模型的修改(响应)。获得此效果的另

一机制是用程序创建请求并传递给Editparts,产生的命令随后在命

令栈中执行。

2.2GEF事件流

如图1所示,GEF事件流如下:

①用户通过鼠标和键盘与编辑器交互,点击相关可视化控件,

产生事件;

②SWT控件捕获到键盘或者鼠标的事件,在传递到

EditPartViewer处理后,继续将事件传递给EditDomain处理,然后转

发给PaletteViewer中的活动工具。参考SWT的Canvas接口(SWT

Events)、GraphicalViewer和IFigure接口(实现类为

GraphicalViewerImpl,Figure)、Draw2D的LightWeightSystem,Events、

图形编辑器实施步骤是,首先,创建模型XXXModel;其次,创建

EditDomain类以及SelectionTool,SelectEditPartTracker类(其超类

模型对应的控制器XXXEditPart;第三,创建EditPartFactory,在其中

为TargetingTool类);

连接模型和控制器;第四,在编辑器中创建GraphicalViewer并显示

③活动工具注释该事件序以构造请求,GEF用请求说明对模型

图形。

要执行的操作,参考SelectionRequest类;

图形编辑器实例具体实施过程如下。把GEF建立在RCP上,代

④活动工具把请求提交给编辑策略,EditParts把请求转发给编

码src包有包,其中有如下类:Application、

辑策略,比编辑策略用于为请求构建命令并做出反馈响应,参考

Perspective、ApplicationActionBarAdvisor、ApplicalicationWorkbenchA

AbstractEditPart的performRequest()方法,AbstractGraphicalEditPart

dvisor、ApplicationWorkbenchWindowAdvisor和Acrivator。

类;

在代码包src中增加如下程序:放置视图相关类的al.

包、放置模型相关类的包、放置控制器

相关类的rts包、放置种命令相关类的gef.

放置策略相关类的ds包、

包、放置编辑器相关类的s包、放置图标静态变

量相关类的包。

这种编辑器的各模块的角色定义良好:模型存储业务数据,视

图展现数据,控制器实施前两者的绑定逻辑,有利于编写清晰的代

码。

4

结语

GEF可用于编辑任何模型,包括用EclipseModelingFramework

(EMF)构造的模型。GraphicalModelingFramework(GMF)为使用或

扩展基于EMF模型的GEF提供了简易的基础设施。

参考文献:

[1]EclipseProject[EB/OL]./gef/.

[2]邵兵,石立川,王晗.GEF框架中的设计模式[EB/OL].IBM

/developerworks/cn/opensource.