好好工作,好好生活
前面的那篇文章:emf&gef之一example.my.gefpractice講述的是如何將emf與gef結(jié)合起來使用。
在實(shí)際的項(xiàng)目開發(fā)中模型的是根據(jù)需求來定的,可以說模型事實(shí)上是業(yè)務(wù)邏輯。聲明這一點(diǎn)是為了說明本文研究內(nèi)容的必要性。
前面的文章中使用的模型定義,包含x,y,w,h(他們確定了編輯器的一個(gè)矩形區(qū)域,這個(gè)矩形區(qū)域用來顯示模型的圖像),除此之外還包含了一個(gè)connection對(duì)象,每個(gè)node有inputs和outputs。
簡單的說,前文中的模型是從編輯器的角度來定義模型的。
假如從業(yè)務(wù)的角度來看,模型之間的關(guān)系是什么樣的呢?
假如從業(yè)務(wù)上來看,node之間只有一個(gè)next關(guān)系,來表明先后順序。
一 定義模型
根據(jù)上面的分析,從新定義模型,如下圖所示:
第一篇文章中定義的模型,編輯器內(nèi)容序列化為xml文件格式為:
那么本文中的格式為
二 創(chuàng)建工程
與前面的文章一樣,利用這個(gè)ecore文件創(chuàng)建EMF Project,并根據(jù)生成的genmodel文件生成模型代碼。
三 事件監(jiān)聽
也與前面的文章一樣,對(duì)每個(gè)模型創(chuàng)建一個(gè)對(duì)應(yīng)的PropertySource文件,在EditPart中將PropertySource安裝給模型,并在EditPart中監(jiān)聽模型更改事件,做相應(yīng)處理。
四 編輯器
對(duì)模型而言,Connection對(duì)象是可有可無的,但是對(duì)編輯器而言,沒有了Connection對(duì)象,如何創(chuàng)建連線對(duì)象呢?
所以我們需要寫Connection對(duì)象,這個(gè)對(duì)象只在GEF框架下使用,用來描述兩個(gè)節(jié)點(diǎn)間的next關(guān)系,不寫入xml文件。
Connection.java
有了 Connection對(duì)象,并不代表就能正確使用它。
首先,在Node的EditPart中定義兩個(gè)變量以及相應(yīng)的get方法
NodesEditPart.java
接著在ConnectionCreateCommand中,在執(zhí)行這個(gè)命令的時(shí)候,給node的next屬性賦值:
以上僅完成了創(chuàng)建一個(gè)Connection,完成了給Node的next賦值。保存編輯器內(nèi)容,可以查看一下結(jié)果。
假如重新打開剛剛保存的文件,發(fā)現(xiàn)問題了嗎?連線對(duì)象消失了。
為什么呢?看看NodesEditPartFactory#createEditPart你會(huì)有收獲的。
EMF將xml文件反序列化為了一個(gè)數(shù)據(jù)結(jié)構(gòu),很明顯,這個(gè)數(shù)據(jù)結(jié)構(gòu)中沒有Connection對(duì)象。GEF將按照這個(gè)數(shù)據(jù)結(jié)構(gòu)提供的模型來初始化編輯器內(nèi)容,那么當(dāng)然會(huì)丟失連線。
解決方法:創(chuàng)建一個(gè)TargetAddConnectionTable,它用來保存未完成的連線。
NodesEditPartFactory.java
TargetAddConnectionTable.java
再試試打開xml文件,應(yīng)該出現(xiàn)連線了。
這里需要說明的是,由于本例比較簡單,TargetAddConnectionTable沒有出現(xiàn)太大問題。在實(shí)際應(yīng)用中發(fā)現(xiàn)TergetAddConnectionTable有不足,也做過了更正。筆者在此不再修改代碼。假如讀者有興趣,可以測(cè)測(cè)問題是什么,問題產(chǎn)生的原因以及如何解決。
五 其他
本例依然采用兩個(gè)action來打開編輯器。
本例的運(yùn)行結(jié)果與前面的例子是一樣的,因?yàn)閺木庉嬈鞯慕嵌葋砜矗瑳]有變化。
六 源碼
點(diǎn)擊下載
七 運(yùn)行環(huán)境
JDK1.4
Eclipse 3.1
GEF
EMF
Powered by: BlogJava Copyright © hopeshared