GEF Programmer‘s Guide 中文版(概述)

决定翻译一点东西了,感觉GEF官方自带的User Guide还是挺不错了,尝试着翻译一下,工作量还真不小。

 

大纲

·         概述 - "big picture" 的介绍

·         何时使用GEF – GEF Eclipse 平台的使用

·         EditParts – GEF 的主要构成部分

·         图形界面 如何为你的模型创建图形界面

·         编辑和编辑策略 给图形界面添加编辑操作支持

·         EditPart 生命周期 了解一些有趣的事件

·         工具和绘图板

·         交互 – GEF 支持的用户交互和响应

概述

Draw2D 侧重于高效的绘制和布局图形,而 GEF 插件则在 Draw2D 之上添加了编辑操作。它的目的在于:

1.     使用 draw2d 的图形使图形化的显示模型更加便利

2.     支持与鼠标、键盘或者工作台的交互

3.     提供与上面相关的常用的组件

下图显示了 GEF 的高层结构。 GEF 可以被大概定义为图中中间的区域,它提供了应用模型与视图之间的桥梁,同时还包括一些能将事件 (Event) 转换为请求 (Request) 的工具 (Tool) 和操作 (Action) 。请求 (Request) 和命令 (Command) 用于进行交互指令封装,它们对模型有效。


MVC(M :模型 V :视图 C :控制器 ) 三层架构设计中,控制器 (Controller) 往往是视图 (View) 和模型 (Model) 之间唯一的中介,它负责控制视图显示,处理 UI 事件并将它们作用于模型。在 GEF 中它们扮演的角色如下:

模型 (Model)

模型可以是任何持久化的数据,所有的模型都可以用在 GEF 中,但是它们必须有某种通知机制。尽管技术上不要求这样,但是模型和命令 (Command) 经常密切相关。命令完成对模型的修改,同时它还可以支持用户的重做 (Redo) 和撤销 (Undo) 操作。一般来说,命令只作用于模型本身。

视图 (View)Figures/TreeItems

视图对用户来说是可视化的,在 GEF 中图形 (Figure) 和树节点 (TreeItem) 都可以作为视图元素。

控制器 (Controller)EditPart

通常会为每一个可视化的模型对象分配一个控制器。在 GEF 中它们称之为“ EditPart ”。 EditPart 是模型和视图之间的桥梁,它也负责响应用户编辑操作,一种叫做 EditPolicy 的助手将辅助它完成绝大部分的编辑任务。

Viewers

EditPart EditPartViewer 上显示视图。 GEF 中有两种视图,一种视图使用 GraphicalViewer 显示模型图形而另一种则以 TreeViewer 来显示树形节点。 GEF Viewer JFace 的类似,它们使用 SWT 控件。 Viewer 提供选择功能,在 Viewer 中选中的就是 EditPart

何时使用 GEF

Workbench 中,任何可以使用 SWT 控件的地方都可以使用 GEF 。它可以用在编辑器、视图、向导中等。最常用的是在 EditorPart 中,有时候也用在编辑器的大纲视图中。

GEF 需要 Eclipse 富客户端平台 (RCP) 支持,同时需要 org.eclipse.ui.views 插件来提供属性页功能。

EditPart 介绍

EditPart 关联着视图和模型,同时它也有自己的组织结构——父子关系。 EditPart 可以有子 EditPart ,它们之间的关系与对应模型之间的关系一样。比如某个示例图模型包含一些节点模型,对应的就有示例图 EditPart 就包含一些节点 EditPart ,作为它的子 EditPart

EditPart 之间的父子关系会持续到图形 (Figure) 中,父图形将包含子图形。在某些情况下,父 EditPart 对应的视图由几个的 Figure 组成,这些 Figure 都是容器面板,每个面板都有自己子 Figure 。这样你就会得到一组具有并行结构图形了。


连接 (Connection) 不同于简单的树形图形结构,它们代表了两个对象之间的关联关系。 Draw2D 的连接图形用在 view 中。连接存放在模型中,但是对应的 EditPart 则由源端点和目的端点模型对应的 EditPart 管理。连接的图形也做了特殊处理,它们被放置在一个特殊的 Layer —— ConnectionLayer 上, ConnectionLayer 位于主 Layer(PrimaryLayer) 之上,以保证连接与端点图形之间的逻辑性正确,以及相互之间不干扰。

GEf 提供 2 EditPart 的实现: GraphicalEditPart TreeEditPart GraphicalEditPart 使用 Figure 作为视图,它同样支持连接。 TreeEditPart 使用 SWT TreeItem 作为视图,以显示树形结构的大纲。

EditPart 的作用如下:

·         创建和维护视图 (Figure 或者 TreeItem)

·         创建和维护子 EditPart

·         创建和维护连接 EditPart

·         支持模型编辑

维护视图和其他的 EditPart 意味着 EditPart 必须知道模型的变更信息以便做出相应的操作,通常的做法是将 EditPart 作为一个监听器,监听关联模型对象。当它收到更新通知时, EditPart 按照变更的内容更新视图或者自身结构。

EditPart 这个名称也意味着它必须支持模型的编辑。这里我们首先关注的是构建一个可视化的显示模型的程序的步骤。

为模型创建图形界面 (GraphicalViewer )

一旦你拥有了模型 (Model) 以及对应的显示图形 (Figure) ,接下来就是将这些组件组合起来。这意味着我们需要创建一个 EditParta ,然后用它关联模型和视图图形。 GEF 自带的 EditPart 是抽象类,在你的应用程序中必须要扩展它们。首先我们创建应用程序的基础。

GEF 提供类 ScrollingGraphicalViewer ,它使用 Draw2D FigureCanvas 。大部分的程序将使用这个类,除非因为我们不需要滚动条。下一步我们将决定根 (Root)EditPart 。每一个 EditPart Viewer 都需要一个 Root EditPart ,它不对应任何已有的模型。 Root EditPart Viewer 中的其他 EditPart 提供一个统一的上下文环境。 GEF 提供了两种可选的 Root EditPart

a)      ScalableRootEditPart 提供标准的 Layer 集合,并支持缩放功能。

b)      ScalableFreeformRootEditPart ScalableRootEditPart 相似,区别是它的 Layer 集合中的每一个 Layer 都符合 Freeform 接口,意味着它们可以向负方向扩展,比如向左或向上。它非常灵活,也是最常用的 Root EditPart

现在 Viewer Root EditPart 已经准备好了,接下来我们需要为 Viewer 提供填充模型 (Content) 。填充模型指的是 Viewer 显示的模型,一般的我们先初始化它为所有模型的父模型,然后再依次添加子模型。 这时候 EditPartFactory 出现了,它负责将模型和对应的 EditPart 联系起来。 EditPartFactory 需要在 Root EditPart 里设置。当模型创建以后, EditPartFactory 负责为其创建对应的 EditPart EditPart 的父子关系在这个时候也就产生了,随着 EditPartFactory 的不断被调用,所有的 EditPart 将被创建完毕。


实现填充模型 (Content) EditPart

下面我们尝试实现填充模型的 EditPart ,同时记得要在 EditPartFactory 里将模型和它的 EditPart 对应起来。 EditPart Figure 作为其他图形的背景,通常情况下它甚至不用绘制,但记得给它指定一个布局管理器 (LayoutManager) Figure 的初始化在 EditPart createFigure() 方法中,你需要重写这个方法。如果使用 FreeForm 格式的 Root EditPart ,那么 Figure 就可以简单的指定为 FreeformLayer ,同时布局管理器也相应位 FreeformLayout 。下面是一个可选的 createFigure()

protected IFigure createFigure() {

       Figure f = new FreeformLayer();

       f.setBorder(new MarginBorder(3));

       f.setLayoutManager(new FreeformLayout());    

       return f;

}

在初始化的过程中, Root EditPart 在自身创建完毕以后,将开始创建子 EditPart 。这时候会调用 getModelChildren() 方法来获得子模型,所以这个方法需要重写,并返回模型的子模型列表。然后根据设置的 EditPartFactory ,模型和对应的 EditPart 就都被创建出来了。

实现子模型的 EditPart

子模型也可以称之为节点 (node) ,通常它们需要显示一些信息。它们对应的 Figure 就比填充模型对应的 Figure 复杂多了,有时候 Draw2D 默认提供的一些 Figure( 基本形状、 Label ) 就可以满足要求,但更多的时候你需要自己实现 Figure 。在 Viewer 初始化的时候,每一个 EditPart 都会调用自身的 refreshVisuals() 方法。这个方法负责处理模型属性到图形界面显示的映射, EditPart 一般都需要重写这个方法,在某些复杂的场景下,这个函数有可能被拆分为几个子函数,分别实现一些功能。在我们开始对模型进行监听的时候,这些函数可能会被再次调用。

任何时候,父模型都记得重写它的 EditPart 中的 getModelChildren() 方法。

添加连接 (Connection) EditPart

Connection 用于连接不同的对象,那么 ConnectionEditPart 则负责连接两个 EditPart 。在 GEF 中如果一个 EditPart 对应的模型可以作为连接的源端点或者目的端点,那么它就属于 NodeEditPart ConnectionEidtPart 在创建完毕以后,将委托给它的 Source Targer EditPart 维护,此时 Source Targer EditPart 都必须重写 getModelSourceConnections() getModelTargetConnections() 方法,以便 GEF 知道模型之间的连接关系。在 EditPart 创建完毕后, GEF 将检测它是否存在连接,若存在,通过 EditPartFactory 来创建对应的 ConnectionEditPart ,然后 ConnectionEditPart createFigure() 负责将 Connection Figure 显示在界面上。

Connection Figure 必须为 Draw2D org.eclipse.draw2d.Connection ConnectionEdtiPart 则需要为 Figure 指定 Source Targert 锚点 (Anchor) ,方法 getSourceConnectionAnchor() 等负责设定锚点。锚点必须为 NodeEditPart

ConnectionEditPart 也属于 EditPart ,它无非是为了提供连接功能而添加一些新的方法、属性,本质上它还是一个 EdiPart ,对应的模型也可以有属性,也可以在属性页里显示。同时它自身还可以作为连接的端点活着拥有子模型。

总结

至此我们都在讨论如何图形化地显示模型。 GEF AbstractGraphicalEditPart 类是非常重要的,通常用户只需要扩展它,根据模型重写以下几个方法:

a)     createFigure() 负责创建视图 (Figure) ,注意它并不对模型的状态进行映射,映射操作发生在 refreshVisuals()

b)    refreshVisuals() 映射模型与视图,比如模型里设置的位置信息,需要通知视图显示出来,可以通过重写这个方法实现。负责的模型属性映射可能需要将此方法拆分为多个子方法共同完成。

c)     getModelChildren() 指定模型的子模型,必须重写,否则子模型无法初始化 .

d)    getModelSource/TargetConnections() 指定模型对应的连接,注意此处连接指的是 ConnectionEditPart. .

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值