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