用gmf實現業務模型編輯器過去用Graphical Editor Framework(GEF)實現業務模型編輯器既慢又痛苦,光是理解複雜的GEF架構,就要花費很長時間,GEF是個典型的MVC架構,使用者可以自訂模型,只要當模型的屬性發生變化時,通知模型的監聽器就可以了,GEF中模型的監聽器被稱為控制器,它在MVC架構中處於核心地位,是串連模型和視圖的橋樑,它負責將模型的變化反映到視圖上,同時把使用者在視圖上所作的操作反映到模型上,在這過程中還涉及到命令和策略等一些概念,這裡我們就不細說,畢竟不是介紹GEF的。當然我們可以藉助於Eclipse Modeling Framework(EMF)來實現模型,因為用EMF產生的模型,就已經實現了訊息通知機制,省去了自訂模型中很多工作量,如果EMF和GEF真能很好的結合,估計也不會有GMF的產生了,由於EMF和GEF採用不同的命令堆棧,給EMF和GEF要實現無縫結合帶來了很大的技術問題,這個時候GMF就應運而生了(“時勢造英雄”),它解決了GEF和EMF相結合中遇到的技術問題,當然了我並不是說有了Graphical Modeling Framework (GMF),GEF和EMF就沒有用武之地了,深刻理解GEF和EMF對學習GMF有很大的協助。我們還是進入正題吧!這段時間由於工作的原因,對GMF作了一些研究,雖然只是瞭解了一些皮毛,但也想寫出來和大家一起分享,同時也懇請這方面的大蝦們給點意見。下面,我就用GMF實現了一個簡單的業務模型編輯器,以後可以在這基礎上擴充。我們知道GMF是以EMF建模為基礎了,所以需要一個ecore模型,這裡我們的ecore模型是從mdl轉化過來的,我們用Rose設計一個mdl檔案,在此模型中,有IPackage和IClass類(以後可以增加IAttribute,IAssociation類),它們之間是彙總關係。
構造ecore
模型1.開啟Eclipse,在導航器視圖右鍵,New-->Project,,建立一個GMF項目etm;2.mdlàecore,在導航器視圖右鍵,New-->Other,,建立一個EMF Model:etm.genmodel 在Select Model Importer嚮導頁中選擇“Rose class model”,在Rose model Import嚮導頁,選擇我們前面建立的etm.mdl檔案,點擊完成,這樣就產生了ecore模型和genmodel。
產生Model
和Edit Code1. 開啟剛才產生genmodel,在根節點右鍵,點擊Generate Model Code和Generate Model Code(產生的兩個項目會被以後產生的業務模型編輯器項目引用)。
建立其他模型GMF有個非常實用的工具,它可以協助你如何一步步地產生編輯器。1.從Domain Model開始,選擇select,在彈出的對話方塊中,選擇我們前面產生的etm.ecore;2.在Domain Gen Model,選擇select,在彈出的對話方塊中,選擇我們前面產生的etm.genmodel;3.選擇Domain Model上面的Derive,將彈出嚮導對話方塊,這個嚮導對話方塊用來產生Graphical Def Model,熟悉GEF的人就知道,這些Model對應圖形化編輯器中的圖形模型。在這個嚮導對話方塊第一個嚮導頁可以指定產生Graphical Def Model的檔案名稱和存放路徑,這裡我們接受預設值etm.gmfgraph,點“下一步”,在第二個嚮導頁中,可以指定對應的ecore模型,這裡我們接受預設值etm.ecore,點“下一步”,在第三個嚮導頁中,只要指定Diagram Element為IPackage,即指定畫布對應的模型,其它接受預設值,點完成即可。4.選擇Domain Model下面的Derive,將彈出嚮導對話方塊,這個嚮導對話方塊用來產生Graphical Tool Model,熟悉GEF的人就知道,這些Model對應編輯器調色盤中的圖形模型。在這個嚮導對話方塊第一個嚮導頁可以指定產生Graphical Tool Model的檔案名稱和存放路徑,這裡我們接受預設值etm.gmftool,點“下一步”,在第二個嚮導頁中,可以指定對應的ecore模型,這裡我們接受預設值etm.ecore,點“下一步”,在第三個嚮導頁中,只要指定Diagram Element為IPackage,其它接受預設值,點完成即可。5.選擇Domain Model右邊的Combine,將彈出嚮導對話方塊,這個嚮導對話方塊用來產生emt.ecore,etm.gmfgraph,etm.gmftool三者的Mapping Model。在這個嚮導對話方塊第一個嚮導頁可以指定產生GMFMap Model的檔案名稱和存放路徑,這裡我們接受預設值etm.gmfmap,點“下一步”,在第二個嚮導頁中,可以指定對應的ecore模型,gmfgraph模型,gmftool模型,這裡我們接受預設值,點“下一步”,在第三個嚮導頁中,只要指定Diagram Root Element為IPackage,點“下一步”,在第四個嚮導頁中,可以指定節點(Node)和串連弧(Link)對應的類,這裡我們接受預設值,點完成即可。這兒我們還必須修改產生的etm.gmfmap檔案,否則下面的操作就會出錯。給Mapping/Top Node Reference/Node Mapping/Label Mapping的Diagram Label屬性指定一個值,這裡我們指定Diagram Label IElementName,即在節點圖形上顯示節點的name屬性。6選擇Mapping Model右面的Transform,將彈出對話方塊,這裡我們接受預設值etm.gmfgen,點完成,接下來,又彈出彈出對話方塊,點“Yes”即可。7選擇Diagram Gen Model裡面的Generator Diagram Editor,就可以產生圖形化編輯器了。我們重新啟動一個Eclipse 工作台,File/New/Examples/Etm Diagram