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