工具 (Tools) 和绘图板 ( Palette )
GEF 的工具处理几乎可以所有的事件,在 GEF 中, EditDomain 用来记录当前有效地工具。 应用程序可能会选择使用绘图板 (PaletteViewer) 来显示多种工具,它允许用户在不用的工具集之间切换。
工具如何工作
工具的实现有点像状态机, SWT 的事件 (Event) 驱动状态机工作。根据事件和当前状态,工具将执行特定的处理,这些处理包括:
1. 请示 EditPart 是否显示反馈
2. 从 EditPart 中得到命令
3. 在命令栈 (Command Stack) 中执行命令
4. 更新鼠标光标,比如有时候有手型,有时候则为指针型
工具的激活需要通过 EditDomain ,在一个 EditDomain 中的所有 Viewer 只能拥有同一个工具。 如果使用了绘图板,从绘图板中选择某个工具也会激活它。
选择工具 (The Selection Tool )
选择工具是 GEF 中最基本的工具,一般也是应用程序一开始默认的工具。我们可以委托选择工具来处理任何 EditPart 。它会从 EditPart 获得一种叫做拖拽跟踪者 (DragTacker) 的辅助工具,也会在鼠标进行拖拽时响应。拖拽 (Drag) 是鼠标在按下与松开之间进行的任何操作,这期间会产生很多事件。事件被转发给代理,然后根据拖拽发生的时间和位置来进行不同的处理。例如,点击一个 Handle( 选中图形时图形边框上出现的柄状节点,一般在四个角和边框的中点位置 ) 可能会带来形状大小的修改,或者连接端点的移动。
值得一提的是,选择工具并不选中 EditPart ,所有的鼠标点击都作为拖拽来处理。当选择工具接收到一个针对 EditPart 的鼠标按下事件时,它会请求获得一个拖拽跟踪 (Tracker) 。 EditPart 使用 SelectEditPartTracker 来获取跟踪,它不但跟踪鼠标按下事件,而且还包括鼠标松开之前的所有事件。 Tracker 甚至还处理鼠标的双击事件。
更多选择工具和 Tracker 的信息请参考选择交互一节。
绘图板 ( Palette)
GEF 的 PaletteViewer 使用的是 SWT 控件,它提供了一系列的工具可供用户选择。同时 PaletteVIewer 也可以作为拖拽的源,允许用户直接把对象从绘图板中拖到图形中。绘图板虽然不是必需的,但是使用非常普遍。
我们可以指定绘图板的位置,甚至可以放在编辑器里。 GEF 提供了一个 WorkbenchView 来放置绘图板,同时一个自定义的面板—— FlyoutPaletteComposite 将负责管理 PaletteViewer 的位置,一般地 PaletteViewer 位于主控件的旁边。 在 Logic 示例中,这个面板就是编辑器的主控件,见下图:
PaletteViewer 显示绘图模型,一般以根模型 (PaletteRoot) 开始。 PaletteRoot 使用可以展开合拢的目录抽屉 (Drawer) 或者组 (Group) 来组织各种绘图模型。每个组成员都可以包含绘图元素 (Palette Entry) 。绘图元素或者是一个工具,或者是一个模板 (Template) 。模板将在下面的创建一节中讲述。
绘图板提供几种显示模式,比如只显示图标。你也可以提供一个自定义的模式,允许用户自己修改或创建绘图板内容。