1. 菜單的插入點(diǎn) -- GroupMarker和Separator的使用
ApplicationActionBarAdvisor類是定義全局所有Action插入點(diǎn)和入口,查看fillMenuBar(IMenuManager)方法,為了簡化,以其中的輔助方法createFileMenu(IMenuManager)為例,講述一下實(shí)現(xiàn)菜單“文件”的內(nèi)容,先看一下菜單的結(jié)構(gòu)





























現(xiàn)在跳回到plugin.xml去看一下它的ActionSet定義,結(jié)構(gòu)如下:

2. Action的實(shí)現(xiàn)
仍以bookmark為例,它的實(shí)現(xiàn)類是NewBookMarkAction,實(shí)現(xiàn)了IWorkbenchWindowActionDelegate, IObjectActionDelegate二個接口,第一個是ActionSet指定實(shí)現(xiàn)接口,第二個是對象操作菜單要求實(shí)現(xiàn)的接口(但事實(shí)發(fā)現(xiàn)沒有再定義它的配置,可能是internal版本的原因),也就是說這個Action是多功能,它將會出現(xiàn)在主菜單,工具欄,和局部的右鍵菜單上。主菜單和工具欄的位置都在ActionSet配置定義了,看看它的右鍵菜單實(shí)現(xiàn)是在哪里的,這個右鍵是在視圖Bookmarks定義的,那么跳轉(zhuǎn)到org.rssowl.ui.internal.views.explorer.BookMarkExplorer類去看看。里面有一個hookContextualMenu()方法,就是定義它的右鍵菜單的,看一下代碼實(shí)現(xiàn):



























3. 下拉類型的工具按鈕定義
非常常見的Dropdown類型的工具欄按鈕可以把功能類型的按鈕歸為一類,做成一個下拉菜單形式,有默認(rèn)的按下功能,也有可以選擇其它類似功能的下三角形式,樣子如下:
這個dropdown的Action是定義在ActionSet配置里的。style是pulldown類型的,所以實(shí)現(xiàn)類NewTypeDropdownAction實(shí)現(xiàn)了IWorkbenchWindowPulldownDelegate接口,它的run方法就是定義默認(rèn)點(diǎn)擊不做選擇時的事情,這個下拉菜單是實(shí)現(xiàn)getMenu(Control parent)方法而來,它定義了如何生成這個菜單,這就用到了最原始的SWT中的MenuItem了,并且為它們添加SelectionListener,方法實(shí)現(xiàn),不用說都知道了,又是New一個先前定義好的NewBookMarkAction類,然后又是調(diào)用它的run方法。所以總結(jié)一下,Action的重用不一定是這個類的重用,關(guān)鍵是它的run方法的重用,在不同的場景下它的外在表現(xiàn)形式可能會多種多樣,但是它的run內(nèi)容是一致的。像添加這種添加的run大部分時候都是彈出一個對話框,而對話框大都又是Winzard類型的,因為Winzard可以共享放到dialog里面。所以這種復(fù)用的思想在Eclipse里面隨處可見。
歸結(jié)一下,其實(shí)這些技巧都是次要的,因為做GUI一個比較痛苦的事情就是經(jīng)常要寫很多重復(fù)類似的代碼,抽取的不好,可能就變得不倫不類了。怎么利用它的這種思想,把復(fù)用的代碼都抽取在一起,而閱讀起來又比較輕松才是關(guān)鍵。
知道的就這些,先介紹到這里,下次再談?wù)勂渌碌陌l(fā)現(xiàn)。
posted @ 2008-08-21 11:29 寒武紀(jì) 閱讀(1804) | 評論 (0) | 編輯 收藏