首先我們來建立一個基於
GEF
的瀏覽器(而不是編輯器),也就是說,它只能瀏覽一個模型,而不能夠進行編輯。先關注於瀏覽而不是編輯,有助於理解
GEF
的一些核心的概念。
GraphicalViewer
和
createControl
()
方法
在開始之前,最先要弄明白的是,一個
GEF
的圖如何能夠顯示在由
ViewPart
在
createPartControl
(Component parent)
中提供的這個
parent
控制項上。這是通過
GEF
的
GraphicalViewer
(準確的說應該是
EditPartViewer
,
GraphicalViewer
是
EditPartViewer
的子介面,
EditPartViewer
的名字可能更容易理解一些:是為
EditPart
建立一個
Viewer
進行顯示)來進行的。
GraphicalViewer
可以將其自身適配到任何一個
SWT Control
上。它的
createControl
()
方法接受一個
SWT Control
來作
為適配的對象,將
GEF
所產生的
Figure
顯示在這個
SWT Control
之上。(在內部實現上,
GraphicalViewer
使用
Draw2D
的
LightweightSystem
來做這個事情,將
Draw2d
的
Figure
對象繪製在
SWT
的
Control
上)
在弄明白了這一點之後,我們就會知道,實際上是將
GEF
放在
ViewPart
中還是放在
EditorPart
對於
GEF
而言是沒有本質的區別的,甚至將
GEF
放在任何的
SWT Composite
上都是可以的。不過
GEF
架構中提供了對建立
EditorPart
的預設實現。而如果要在
Editor
之外使用
GEF
的話,需要額外的對
GraphicalViewer
做一些設定。
下面的這個圖,給出了
GEF
中的幾個主要關係,下面會有對這個圖的解釋。
setContent
()
GraphicalViewer
的思想,類似於
JFace
中所實現的
Viewer
思想:要顯示一個控制項,需要輸入的是一個模型對象,要顯示的內容根據輸入的模型對象來進行的。因此,
GraphicalViewer
同所有
JFace
Viewer
一樣有一個方法,叫做
setContent
(Object o)
來接受一個模型對象,而對這個模型對象如何進行處理並顯示,就是
GEF
的工作了。
在建立一個
GraphicalViewer
之後,要使
GEF
能夠運轉起來,還需要做如下幾件事情:
1.
設定一個
RootEditPart
:
RootEditPart
的是使整個
GEF
架構運行起來的關鍵之一。
RootEditPart
並不對應於任何的模型對象,它將從
setContents
()
方法中接收到的模型對象進行轉換,並添加到整個的
EditPart
體系中去,具體的添加過程後面會有詳細討論。
2.
設定其
EditPartFactory
:負責從模型到
EditPart
的轉換。一般來說一個模型對象對應於一個
EditPart
。這個類的
3.
設定
EditDomain
:用來接收事件並選擇恰當的事件處理函數進行處理,因為我們尚不需要進行編輯,因此這一個可以暫時略過。
4.
調用
setContents
()
方法
:為其設定要顯示的內容。
由
GraphicalViewer
所顯示的內容,肯定是一個
Draw2d
中的
IFigure
對象。而如何從一個模型對象到一個
Figure
對象呢?這中間的聯絡就是通過
EditPart
來完成的。
GEF
使用的是
MVC
模式,
Model
部分可以使任意的模型對象;
View
部分就是
Draw2d
的
IFigure
對象,聯絡
Model
和
View
的
Controller
,在
GEF
中稱為
EditPart
。簡單的說,
GEF
中的
EditPart
,負責將模型轉換為
IFigure
的顯示,它從模型中讀取資訊,產生
Figure
;另一方面,
EditPart
負責從
View
接收事件,並將這些事件轉化為對模型的修改。在這一部分中,我們暫時只關注於第一個方面:
EditPart
是如何將一個模型轉換為
Figure
以進行顯示的。