GEF 一篇不错的文章

来源:互联网 发布:linux如何开启8080端口 编辑:程序博客网 时间:2024/04/27 11:56

1.Draw2D技术

轻量级框架:轻量级框架[LightweightSystem类]把SWT和Draw2D 连接起来,它把鼠标事件和画图事件从SWT 转发给Draw2D的图形上。它是Draw2D的核心类。

LightweightSystem 主要包含三个组成部件:

1.根图形[The root figure]: 根图形是RootFigure类的实例,应用程序的根图形必须建立在它之上。它继承了一些SWT Canvas的图形环境,如颜色,字体等。

2.事件转发器[The event dispatcher]: 事件转发器把SWT事件转换成相应Draw2D事件。它可以跟踪那个图形被聚焦,那个图形是被鼠标点击的目标图形。它还控制tooltip的激活。它为想捕捉鼠标的图形提供支持。

3.更新管理器[The update manager]:更新管理器是负责画和更新Draw2D图形。当一个画的请求被事件转发器从SWT canvas发送到LightweightSystem上时,LightweightSystem调用更新管理器performUpdate()方法。一般管理器维持着一个List列表,该列表包含无效的或需要重画的图形。

图形:[Figure类]是所有在Draw2D用户界面中看到的都是图形。它在一个重量级的窗口中模拟一个重量级图形系统。在不消耗太多系统资源情况下,他们允许你创建一个复杂的图形展示。图形都应该建立在根图形之上。

图形的生命周期中,主要的过程是绘制和验证。

绘制:Draw2D要求图形负责自己的绘制,通过调用paint()完成,其绘制过程是:

1.paintfigure() 图形绘制本身

2.paintclientarea() 绘制该图形的子图形

3.paintborder() 绘制该图形的修饰边框

验证:当图形的大小或位置需要被计算时(如图形的位置发生变化时),Draw2D将使用验证。

1.validate( ) 要求图形的布局管理器重新布局它的子图形。

2.revalidate( ) 首先调用invalidate( )方法(该方法会使该图形及其父链上的图形无效),其次,添加该图形及其父链到更新管理器的无效List上。

2.MVC

GEF的优势是提供了标准的MVC(Model-View-Control)结构。与其他的一些MVC框架相比,GEF的一个主要设计目标是尽量减少模型和视图之间的依赖,好处是可以根据需要选择任意模型和视图的组合,而不必受开发框架的限制。

GEF中MVC框架的实现:

1.控制器[EditParts]:控制器是GEF中的核心元素,相当于MVC框架中的Controler,它们具体控制着模型元素到图形的映射,即把模型与相应得图形对应起来,并实现模型与图形的相互作用。一般应该为每个模型元素创建对应的控制器,因此它们将有和模型元素相对应的类层次结构。

程序员可以继承三种EditPart,分别是

org.eclipse.gef.editparts.AbstractGraphicalEditPart

org.eclipse.gef.editparts.AbstractConnectionEditPart

org.eclipse.gef.editparts.AbstractTreeEditPart

前两个是为了在编辑器[EditorPart]中用到,分别表示图形和图形之间的连线用。最后一个是在大纲[Outline]中用到。

下面我们将关注一下控制器的生命周期:

控制器是在编辑器中通过工厂类创建的,该工厂根据不同的模型元素创建相应的控制器。控制器创建后并不是立刻可见或处在激活状态。当GEF框架得知控制器需要被激活时,控制器将处在激活的状态。如果某个控制器不被需要时(如编辑器被关掉或用户删除控制器对应的模型),控制器将处在不激活的状态。两个方法EditPart#activate和EditPart#deactivate分别对应上述过程。还有一个方法EditPart#isActive,将总是返回控制器的当前状态。

2.模型[Model]:模型保存着业务逻辑,是GEF这中唯一可以持久化的部分。为了能让控制器知道模型的变化,应该把控制器作为事件监听者注册在模型中,当模型发生变化时,就出发相应的事件给控制器,后者负责通知各个视图更新。

3.视图[Figure]:GEF提供了在EclipseWorkbench中使用Viewer,称为EditPartViewer。它的作用和jface中的 Viewer很相,不过这时候它的ContentProvider和LabelProvider是EditPart,通过setContents设置模型对象的根。EditPartViewer可以适配到任何一个SWT控件,因为它要求有createControl方法,接受一个父SWT控件作为适配对象,从而将 GEF生成的Figure对象显示在这个SWT控件上,因此GEF可以使用任何图形包,不过GEF提供了对Draw2D的默认实现。

4.编辑器[EditorPart]:在这里不得不介绍一下编辑器,因为一般都是由编辑器来组装GEF的MVC。GEF的编辑器类是Eclipse编辑器的一个子类。在介绍编辑器之前先介绍几个GEF中的概念:

编辑域[EditDomain] :编辑域是一个起到管理作用的类,它绑定了一个编辑器、若干个查看器和若干个工具。因此它定义了真实的编辑器。编辑域还提供一个命令堆栈,用来保存所有执行过的命令,有两点好处:1.可实现重做和不做的操作2.可查看模型是否被改动。

工具[Tool] :状态对象,根据当前的状态和它所接受的事件来产生相应的请求并传递给控制器。

调色板[palette] :调色板是位于编辑器中的一个特定的查看器[Viewer],工具放在它上面。

编辑器主要实现以下功能 :

1.需要创建EditDomain。

2.通过EditDomain,访问命令堆栈,为编辑器提供参考[如参考命令堆栈,编辑器决定是否允许存储操作]。

3.实现存储功能。

4.装配图形查看器[GraphicalViewer]。

5.装配调色板[palette]。

6.实现大纲[Outline]的挂接等等。

总结:编辑器利用工厂[EditPart Factory]根据模型创建对应的控制器[EditParts]。在控制器中通过它的设置图形方法来把EditPart与图形对应起来,这样模型、控制器和图形就一一对应了。

3.反馈技术

视觉反馈是一个图形化编辑器用户界面重要的组成部分。GEF用很多方法为用户提供反馈。

1.改变光标。当在图形化编辑器上选定目标时,改变光标来显示所选的目标是否支持该工具的操作。

2.区别被选的和被聚焦的部分。一般的,在相同类型的部分中,一个被选择的部分应该和没有被选择的部分明显的区分。这个可以通过在部分外增加一个被选择图形或改变部分的颜色或形状。

3.展示操作柄[handle]:操作柄也是一个图形元素,一般出现在部分的四周,它表示图形可以被移动或是改变大小。

一般反馈技术是由编辑策略[EditPolicy]实现的。具体实现的是EditPolicy的子类GraphicalEditPolicy。GEF提供一个反馈层,所有的反馈都在该层上显示。层本身就是一个图形,只不过对用户来说是透明的。

下面介绍一下支持反馈的EditPolicy :

1.SelectionEditPolicy :一个抽象类,它是提供控制器被选择的反馈基础。即当用户在编辑器上选中图形时,相应的图形给以相应的反应以区分选中的和未选中的。要注意的反馈图形被画在反馈层上[LayerConstants.FEEDBACK_LAYER]。有如下方法包括在该类中:

Protected void showFocus()

Protected abstract void showSelection()

protected void showPrimarySelection()

protected void showFocus()

protected abstract void hideSelection()

这几个方法的英文名字表示了它们的含义,这里就不再一一介绍。

2.SelectionHandlesEditPolicy :这个类继承了SelectionEditPolicy,它提供个带控制点[handle]的选择反馈。子类提供了一个控制点的List,该List将修饰被选择的[控制器对应的]图形。GEF中提供了如下继承SelectionHandlesEditPolicy的子类:

1.BendpointEditPolicy :这个类在实现带弯点的连接时,被连接的控制器调用。

2.ConnectionEndpointEditPolicy :在连接的两端展示控制点。

3.NonResizableEditPolicy :阻止用户改变图形大小,并在被选图形上添加一格简单的黑框和在四个边角处设置四个黑色小方框。如图1所示。用户可以改变图形的位置。

4.ResizableEditPolicy :这个类继承NonResizableEditPolicy,在图形的四周添加八个黑色小方框,用来增加改变图形大小功能。如图2所示。

2.GraphicalNodeEditPolicy :这个类提供关于连接的反馈。当用户建立连接,从一个端点拖向另一个端点,GEF通过该类模拟一个连接。这模拟的连接被画在反馈层,它将连接到控制器提供的锚点[Anchor]。

3.LayoutEditPolicy :这是一个抽象类,它用布局管理器[LayoutManager]来放置它的子控制器图形。该类应该提供反馈,一个新元素放到该类对应的图形中的反馈。注意,这里该类对应的图形应该是一个容器图形,即该图形包含子图形。关键方法如下:

1.showLayoutTargetFeedback :这个方法展示当前的操作将放图形在什么位置的反馈。

2.getSizeOnDropFeedback :展示将新建图形的大小。

4.拖拽技术

在现代的应用程序中,程序要实现的一个最重要功能就是拖拽。该部分将讨论GEF中的拖拽技术。

为了使用户在GEF应用中实现拖拽更加容易,GEF本身提供了一些类和概念。例如,你不需要处理SWT的拖拽源对象[DragSource]和其他低级别的对象。

在GEF中,用户需要实现的就是向编辑查看器[EditPartViewwe]添加拖拽源监听者[TransferDragSourceListener]和拖拽目标监听者[TransferDrogTargetListener]。前者的可以使编辑查看器成为拖拽源,即支持用户从该编辑查看器中往出拽,而后者可以使编辑查看器成为拖拽目标,即支持用户向该编辑查看器里拖。

当在GEF应用中为查看器实现拖拽监听者时,要确保该类继承的父类来自于GEF框架。

拖拽原理:当用户在支持拖拽源的查看器上拽出时,GEF框架产生一个相应的模版对象,该对象将从框架中获得用户想要创建对象的类信息。当用户在支持拖拽目标的查看器上松开鼠标时,拖放结束的事件将产生,TemplateTransferDropTargetListener对象将根据模版对象创建相应的实例。

用户一般需要实现3个类 :

TemplateTransferDropTargetListener :是TransferDrogTargetListener的子类。

TemplateTransferDragSourceListener :是TransferDragSourceListener的子类。

CreationFactory :用来根据Template返回相应的对象。
原创粉丝点击