由於工作的需要,最近開始研究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開始說起, 當然不能講得很深入,因為我自己也是略知皮毛而已。
說實話,我對寫這個系列不太有信心,因為自己也是剛入門而已。但要是等到幾個月後再 寫,很多心得怕是講不出來了。所以還是那句話,有什麼寫錯的請指正,並且歡迎交流。