工具 (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) 。模板將在下面的創建一節中講述。
繪圖板提供幾種顯示模式,比如只顯示圖標。你也可以提供一個自定義的模式,允許用戶自己修改或創建繪圖板內容。