前些天換了新電腦,本人一直處於興奮中,基本是"不務正業"的狀態。快過年了,雖然沒什麼動力幹活,但我玩遊戲技術比較差,魔獸3打電腦一家還很費勁,乾脆寫寫文章就當是休息吧!
由於工作的需要,最近開始研究GEF(Graphical Editor Framework)這個架構,它可以用來給使用者提供圖形化編輯模型的功能,從而提升使用者體驗,典型的應用形化的流程設計器、UML類圖編輯器等等。其實一年多來我們做的項目都是和它有關的,只是之前我具體負責的事情和它沒什麼關係。那時也看過黃老大寫的代碼,EMF和GEF混在一起特別暈,沒能堅持看下去。這次自己要動手做了,正好趁此機會把它搞明白,感覺GEF做出來的東西給人很專業的感覺,功能也很強大,應該挺有前途的。此外,GEF裡用到了很多傳統模式,最突出的如大量應用Command模式,方便的實現Undo/Redo功能等等,通過學習GEF,等於演練了這些模式,比只是看看書寫幾個類那種學習方式的效果好很多。
現在網上關於GEF的文章和教程還不是很多(比起一年前還是增加了幾篇),基本上都是eclipse.org上的那些,其中少數幾篇有中文版,中文的原創就屬於鳳毛麟角了,市場上似乎也沒有這方面的成書。GEF SDK裡內建的文檔則比較抽象,不適合入門。我覺得最好的入門方法是結合具體的例子,一邊看代碼,一邊對照文檔,然後自己再動手做一做。當然這個例子要簡單點才好,像GEF的那個logic的例子就太複雜了,即使是flow(運行介面見)我覺得也有點大;另外例子要比較規範的,否則學成錯誤的路子以後還要花時間改就不值得了。
用GEF編寫的流程編輯器
GEF的結構決定了GEF應用程式的複雜性,即使最最簡單的GEF程式也包含五六個包和十幾個類,剛開始接觸時有點暈是很正常的。我找到一個還不錯的例子,當然它很簡單了,如果你現在就想自己試試GEF,可以點這裡下載一個zip包(若已無法下載請用這個連結),展開後是六個項目(pt1,pt2,…,pt6),每一個是在前面一個的基礎上增加一些功能得到的,pt1是最簡單的一個,這樣你就可以看到那些典型的功能(例如DirectEdit、Palette等等)在GEF裡應該怎樣實現了。關於這個例子的更多資訊請看作者blog上的說明:
“Back in March, I talked a little about my initial attempts writing an Eclipse Graphical Editor Framework (GEF) application. I wanted, then, to write a tutorial that essentially walked the reader through the various stages of the development of my first application. I even suggested some kind of versioned literate programming approach to writing the tutorial and the code at the same time.
I haven't had time since then to make any progress, but I did get the GEF application to the stage where I had put together a snapshot at each of six milestones. A few people have written to me over the last six months asking the status of my tutorial and I've sent them my six snapshots as a starting point.
It makes sense for me to just to offer them here.
You can download a ZIP file with the six snapshots at http://jtauber.com/2004/gef/gef.zip.
Hopefully they are still useful, even without a surrounding tutorial.”
需要注意一點,這個例子應該是在Eclipse 2.1裡寫的,所以如果你想在Eclipse 3裡運行這個例子,要修改plugin.xml裡的dependencies為:
<import plugin="org.eclipse.core.resources"/> <import plugin="org.eclipse.gef"/><import plugin="org.eclipse.ui"/> <import plugin="org.eclipse.core.runtime"/> <import plugin="org.eclipse.core.runtime.compatibility"/> <import plugin="org.eclipse.ui.views"/>
再修改一下DiagramCreationWizard這個類finish()方法裡page.openEditor(newFile);這句改為page.openEditor(new FileEditorInput(newFile),"com.jtauber.river.editor");,還有一些warning不太影響,可以不用管。
或者如果你不是特別著急的話,留意我這個半新手寫的GEF入門系列文章,說不定能引起你更多的共鳴,也是一個辦法吧。
GEF的學習周期是比較長的,學之前應該有這個心理準備。特別是如果你沒有開發過Eclipse外掛程式,那麼最好先花時間熟悉一下Eclipse的外掛程式體繫結構,這方面的文章還是很多的,也不是很難,基本上會開發簡單的Editor就可以了,因為GEF應用程式一般都是在Editor裡進行圖形編輯的。另外,絕大多數GEF應用程式都是基於Draw2D的,可以說GEF離不開Draw2D,而後者有些概念很難搞明白,加上其文檔比GEF更少,所以我會從Draw2D開始說起,當然不能講得很深入,因為我自己也是略知皮毛而已。
說實話,我對寫這個系列不太有信心,因為自己也是剛入門而已。但要是等到幾個月後再寫,很多心得怕是講不出來了。所以還是那句話,有什麼寫錯的請指正,並且歡迎交流。