好好工作,好好生活
八進制寫的關(guān)于GEF以及EMF的文章,對我當時的工作幫助很大。
我最初看的是他的關(guān)于GEF的文章,但是我的工作需要將GEF與EMF結(jié)合,本文使用的例子就是根據(jù)八進制的Blog中gefpractice改編而成。
一 定義模型
自從EMF出現(xiàn)以后,出現(xiàn)了一種新的說法:模型驅(qū)動的軟件開發(fā)(例如Marlin),經(jīng)過這段時間的研究開發(fā),發(fā)現(xiàn)使用GEF與EMF確實是這樣,一旦模型定義好了,這個項目就基本定型了。
Ok,廢話留著以后慢慢說,進入正題先。
首先,定義模型。在gefpractice這個例子中,模型很簡單,只有三類元素:Diagram、Node和Connection。他們之間的關(guān)系,用EMF的模型文件(ecore)定義出來就是這樣的:在做模型定義的時候,需要注意他們之間的包含關(guān)系。打開Properties視圖,有一個
Containment屬性需要格外注意,因為它將決定該接點是一個屬性還是一個子節(jié)點。以上圖為例,這個屬性設(shè)置為true,那么xml文件的格式是
<Diagram>
<Node/>
</Diagram>
假如是false,那么就是
<Diagram nodes=”//node.0”/>
<Node />
由于有這個問題,在定義Node的時候就一定要注意sourceConnections和targetConnections的這個屬性,一個是true,另一個是false。(自己想想,為什么呢?^-^)
當然模型的定義并不是只有這種方式,只要你將邏輯表述對了,這個模型就沒有問題。
二 創(chuàng)建工程
用這個模型創(chuàng)建一個EMF Project。操作過程是New -> Project -> EMF Project -> 工程名稱是eclipse.my.gefpractice -> 選擇Ecore Model -> 選擇定義好的nodeemf.ecore并load -> 其他的按照默認選擇。這樣,你的工作區(qū)就創(chuàng)建了這個工程。
這個新建的工程有個model文件夾,里面有nodeemf.ecore和nodeemf.genmodel兩個文件。用當前默認的編輯器打開nodeemf.genmodel文件,更改根節(jié)點(Nodeemf)的子節(jié)點(nodeemf)的屬性(從屬性視圖中改)
接著,右鍵選擇上圖中的根節(jié)點,選擇Generate Model Code。這樣,模型的代碼就全部生成了。
三 事件監(jiān)聽
一般,完全使用GEF的情況下,模型的監(jiān)聽是通過模型實現(xiàn)PropertySource來實現(xiàn)的。詳細的請參看八進制的相關(guān)文章。但是本文中使用EMF來定義模型,那么原則上就不修改生成的代碼。那么,這里利用Adapter來給模型“安裝”屬性。
這里給出一段示例代碼
四 編輯器
編輯器的其他重要組成部分,如Command,policy根原來的基本上沒區(qū)別,這里就不再敘述了。
五 其他
本例中不能從左邊的Explorer視圖中打開這個編輯器,而是用了Open Action和New Action。原因是本插件項目打包后可以加載到Rcp項目中。
六 本例的運行結(jié)果
除了上圖中的問題外,還有一些小bug,呵呵,我比較懶,基本不用它,所以就沒有改(Eclipse的懶加載法則)。這是我的一個面試考題,做這個例子,共用了1.5天。
七 源碼
點擊下載
八 環(huán)境
JDK1.4
Eclipse 3.1
GEF
EMF
Powered by: BlogJava Copyright © hopeshared