建立了模型和顯示模型圖形之後,下一步就是把它們聯系起來,也就是建立關聯模型和圖形的editpart。GEF提供的實作是抽象的,你必須進行擴充。但是,首先我們應該建立其基礎。
GEF提供了ScrollingGraphicalViewer 類(一種對GraphicalViewer的實作),它使用Draw2d Figure Canvas ,大多數應用使用viewer,除非由于一些原因,不需要滾動條。下一步确定使用那一個root editpart,每一個editpart viewer需要一個叫做根的特殊editpart,這個editpart不對應任何模型,它的功能是建立顯示元件(viewer),并為所有應用的“真正的”editpart提供一個統一的上下文(context),有兩種可以使用的實作:
- ScalableRootEditPart - 提供一組标準的圖層(layer)并支援縮放
- ScalableFreeformRootEditPart - 和上面的相似,但是所有的圖層遵守自由形狀(freeform)接口,這是一個靈活和常用的root editpart。
現在我們有了一個viewer和它的root editpart,是以下面我們為viewer設定一些内容(contents)。contents是指使viewer顯示可視化圖形的基礎模型。viewer的EditPartFactory 負責維護contents和構造合适edipart,并設定為root editpart。它的圖形加入在底層圖層上,這時contents editpart将會重新使用EditPartFactory構造它的子editpart,然後子editpart繼續建立它們自己的子editpart或連接配接connection,等等,直到所有的editpart和它們的視圖都被建立
實作 Contents EditPart
是以首先要實作的是contents editpart,還需要實作一個工廠factory,識别主模型對象并建立控制器editpart,這個editpart的模型為其他的圖形提供基礎背景,通常它甚至不需要繪制圖形,但是仍然需要選擇布局管理器(layout manager)和root editpart上的圖形類型。通過覆寫createFigure() 控制需要繪制的圖形。如果使用一個freeform的root editpart,contents figure必須實作freeform API,可以使用FreeformLayer 。布局管理器通常為XYLayout 或者FreeformLayout ,這根據使用root editpart是否是freeform的。
在初始化期間,contents editpart 将會根據調用它的getModelChildren() 方法傳回的清單值建立它的子editpart,editpart 應該覆寫這個方法傳回一個模型對象清單,這些模型對象的editpart将會被建立。預設下,editpart會到EditpartFactory中建立每一個子editpart。
實作子EditParts
圖表包含的子圖形一般稱為節點,通常顯示對使用者有用的資料,這些圖形或者是一個預設的圖形,或者是一個定做的圖形,或者是一個複合圖形。在重多的視圖viewer中,每一個editpart都會調用自己的refreshVisuals() 方法,這個方法負責在視圖中反映模型的屬性。在複雜的情況下,這個方法可以被分解為幾個更小的工具方法。最後,當我們監聽模型的變化時,這個方法或它的工具方法可以再被調用。
如果圖表中的一個子圖形是一個擁有子圖形的圖形,需要象圖表的根editpart(diagram editpart )一樣覆寫getModelChildren() 這個方法。
加入Connection Editpart
Connection Editpart是一種在圖表中連接配接兩個editpart的特殊的editpart,如果一個editpart是一個連接配接的source或者target,則可以稱為節點,source和target節點通過一種共享的方式建立和管理連接配接,每一個節點editpart必須重寫 getModelSourceConnections() 和 getModelTargetConnections() 方法,傳回模型對象關聯的連接配接,然後GEF檢查連接配接editpart是否被建立(被在另一端的其他節點),如果沒有,則請求工廠factroy建立這個connection editpart。source節點負責建立連接配接圖形并加入圖示(diagram)。
connection editpart 的圖形必須是一個Draw2d Connetion 。connection editpart通過把source和target節點轉換成NodeEditpart 設定圖形的錨點(anchor)。source和target必須傳回合适的錨點或者具有僞固定位置的錨點。
有時,連接配接象其他圖形一樣,在模型中具有必須可視化的屬性,甚至具有子連接配接,或者是連接配接到其他連接配接的節點。
總結
到這裡,我們已經解釋了可視化模型的過程,這需要繼承AbstractGraphicalEditPart 類,覆寫基于模型的一些方法,下面列出了這些方法:
- createFigure() - 這個方法建立editpart的視圖或圖形,這個方法不需要在反映圖形中反映模型的狀态,這在refreshVisuals()方法中實作
- refreshVisuals() - 這個方法在視圖中反映模型的屬性,複雜的控制器可以把這個方法分解成結各小的helper方法。
- getModelChildren() - 調用這個方法,判斷一個模型是否有子模型,并建立對應的子控制器editpart。
- getModelSource/TargetConnections() - 和子模型類似,不過這裡傳回的模型元素是連接配接,這些連接配接的editpart是source或者target。