??????? GEF中的起到關鍵作用的是EditPart,而EditPart中起到關鍵作用的是EditPolicy,現在來描述一下GEF是如何創建一個圖形并顯示顯示出來的。
??????? 首先通過單擊調色板,會調用一個實現org.eclipse.gef.requests.CreationFactory接口的工廠類,這個是我們在注冊相應的ToolEntry時聲明的,通過傳入的參數這個工廠類就知道應該創建一個什么類型的model元素。(注意,這時候因為我們只是純創建了一個模型元素,對于它的父元素,位置信息等等都還不清楚,所以一般我們在設置模型元素的構造函數時需要有個無參數的構造方法(或者有默認參數的構造函數)。)
??????? 當單擊畫布上的某個位置后,相應的信息比如 模型的父元素,位置信息等等都已經可以確定,將這些信息以及新創建的模型元素本身包裝成request傳給相應的EditPart(就是鼠標單擊處所在的圖形元素對應的EditPart)。
??????? 這個EditPart會將這個request傳給相應的EditPolicy(至于怎么傳遞,還不清楚,估計是這樣的,EditPart會傳給注冊在其上的所有EditPolicy,而每個EditPolicy都有個getCommand方法,通過request的type交給相應的getXXXCommand方法。查看了一下源代碼,發現在AbastractEditPart中有個getCommand方法正是將每個EditPolicy中的getCommand方法都調用了一遍)。
???????然后EditPolicy處理相應的request,具體的就是調用getXXXCommad方法得到處理相應request的Command,Command是可以改變模型。上面提到的這種EditPolicy屬于NonGraphical類型,GEF中還包括了一種稱為Graphical類型的EditPolicy,這種EditPolicy不對模型進行處理,只是用來修改圖形顯示(似乎這種說法不正確,它可以更改視圖元素的位置,在業務模型和視圖模型統一的情況下,這種圖形EditPolicy也會更改模型);而NonGraphical的EditPolicy則是不清楚圖形元素的,但它可以對模型進行更改,因此這種EditPolicy在不同view之間是可以通用的。
?????? 當模型發生改變后,注冊再其上的EditPart將會得到相應的通知,此時,通過通知中的property信息,EditPart會refreshVisual或者refreshChildren,從而使視圖發生改變。
??????? 首先通過單擊調色板,會調用一個實現org.eclipse.gef.requests.CreationFactory接口的工廠類,這個是我們在注冊相應的ToolEntry時聲明的,通過傳入的參數這個工廠類就知道應該創建一個什么類型的model元素。(注意,這時候因為我們只是純創建了一個模型元素,對于它的父元素,位置信息等等都還不清楚,所以一般我們在設置模型元素的構造函數時需要有個無參數的構造方法(或者有默認參數的構造函數)。)
??????? 當單擊畫布上的某個位置后,相應的信息比如 模型的父元素,位置信息等等都已經可以確定,將這些信息以及新創建的模型元素本身包裝成request傳給相應的EditPart(就是鼠標單擊處所在的圖形元素對應的EditPart)。
??????? 這個EditPart會將這個request傳給相應的EditPolicy(至于怎么傳遞,還不清楚,估計是這樣的,EditPart會傳給注冊在其上的所有EditPolicy,而每個EditPolicy都有個getCommand方法,通過request的type交給相應的getXXXCommand方法。查看了一下源代碼,發現在AbastractEditPart中有個getCommand方法正是將每個EditPolicy中的getCommand方法都調用了一遍)。
???????然后EditPolicy處理相應的request,具體的就是調用getXXXCommad方法得到處理相應request的Command,Command是可以改變模型。上面提到的這種EditPolicy屬于NonGraphical類型,GEF中還包括了一種稱為Graphical類型的EditPolicy,這種EditPolicy不對模型進行處理,只是用來修改圖形顯示(似乎這種說法不正確,它可以更改視圖元素的位置,在業務模型和視圖模型統一的情況下,這種圖形EditPolicy也會更改模型);而NonGraphical的EditPolicy則是不清楚圖形元素的,但它可以對模型進行更改,因此這種EditPolicy在不同view之間是可以通用的。
?????? 當模型發生改變后,注冊再其上的EditPart將會得到相應的通知,此時,通過通知中的property信息,EditPart會refreshVisual或者refreshChildren,從而使視圖發生改變。