以前做插件用到的ActionSet都只是依葫蘆畫(huà)瓢,沒(méi)有真正理解它,現(xiàn)在開(kāi)始好好學(xué)習(xí)學(xué)習(xí),主要是看"Building Commercial-Quality Plug-ins"寫(xiě)的
Action的組成包括幾個(gè)部分,一個(gè)是在plugin.xml中的聲明,一個(gè)是在Eclipse UI中會(huì)用到的IAction實(shí)例化對(duì)象, 另一個(gè)是封裝在IActionDelegate中的action執(zhí)行代碼. action的實(shí)例化是基于plugin.xml配置文件和IActionDelegate定義的,Eclipse可以先在界面上將action顯示出來(lái),直到用戶點(diǎn)擊了菜單或者工具條按鈕才會(huì)去真正的加載插件,這也就是所謂的Eclipse的延遲加載機(jī)制
IActionDelegate有幾個(gè)子類需要說(shuō)明一下:
IActionDelegate2 如果實(shí)現(xiàn)IActionDelegate需要一些其他的信息,而這些信息在IActionDelegate銷毀時(shí)需要同時(shí)被銷毀時(shí), 它可以提供相關(guān)是生命周期事件方法來(lái)處理
IEditorActionDelegate 是跟editor相關(guān)的
IObjectActionDelegate 是跟上下文菜單相關(guān)的
IViewActionDelegate 是跟view相關(guān)的
IWorkbenchWindowActionDelegate是跟menubar和toolbar相關(guān)的
Actions和Eclipse中的其他東東一樣,也是通過(guò)擴(kuò)展點(diǎn)org.eclipse.ui.actionSets來(lái)添加到Eclipse IDE的各個(gè)地方,actions的外在表現(xiàn)形式主要有menubar, toolbar, context menu這樣幾種
在actionSets的下級(jí)節(jié)點(diǎn)是actionSet, 它有幾個(gè)屬性,id,label都不用說(shuō)了,還有一個(gè)visible屬性,表示在打開(kāi)Eclipse時(shí)是否顯示該action,通常我們可以通過(guò)Window > Customize Perspective...來(lái)設(shè)置action是否可見(jiàn)
在actionSet下可以添加menu節(jié)點(diǎn), 它的id,label屬性不用說(shuō)了,其中的path是用來(lái)指定菜單的顯示位置的,一般設(shè)置為additions
action并不是直接添加到menu上的, 而是跟menu內(nèi)部的group關(guān)聯(lián)的,所以我們必須先在menu下創(chuàng)建group,即新建groupMarker, 其name必須保證在當(dāng)前menu下唯一, menu還有一種叫separator的group, 在separator group處添加的menu item會(huì)在這個(gè)組中的第一個(gè)菜單項(xiàng)上面添加一條水平線.而groupMarker則不會(huì)有線, 當(dāng)其他action要添加到該menu group下時(shí),使用水平線進(jìn)行分組就顯得非常必要
group只是用來(lái)標(biāo)識(shí)menu的位置,即指這個(gè)位置可以添加菜單項(xiàng), 而不是實(shí)際的menu item, 實(shí)際的menu item是action
因?yàn)閙enu會(huì)有層次關(guān)系,所以actionSet中專門(mén)用一個(gè)menu節(jié)點(diǎn)來(lái)表現(xiàn)這種層次關(guān)系, 而toolbar則沒(méi)有這種情況,所以這里沒(méi)有提供toolbar節(jié)點(diǎn)
在actionSet下添加action就是最終我們要toolbar上顯示的按鈕和menubar上的menu item, 這里有幾個(gè)屬性, id和label不用說(shuō)了,menuBarPath是menu要顯示的位置, 比如"com.qualityeclipse.favorites.workbenchMenu/content",這個(gè)值就是actionSet+"/"+group name, toolbarPath 就是toolbar item的顯示位置, 比如"Normal/additions", 還有幾個(gè)屬性不常用到,但是有必要解釋一下
allowLabelUpdate這個(gè)要在retarget屬性為true的時(shí)候有效,還不是很清楚
class 是menu或button要執(zhí)行的動(dòng)作, 如果使用的是pulldown風(fēng)格的action,還需要實(shí)現(xiàn)IWorkbenchWindowPulldownDelegate接口,它的構(gòu)造函數(shù)是無(wú)參數(shù)的,如果要傳遞參數(shù),還需要是要實(shí)現(xiàn)IExecutableExtension 接口, 這個(gè)接口還不是很清楚
definitionId 這個(gè)是用來(lái)指定action對(duì)應(yīng)的command唯一標(biāo)識(shí)符的
enablesFor 是一個(gè)表達(dá)式,用來(lái)表示當(dāng)前action是否可用
retarget 不是很理解
state主要是針對(duì)style屬性為radio和toggle的,表示當(dāng)前action是否被選中
style:默認(rèn)是push,還有radio,表示一組menu中只能有一個(gè)被選中, toggle當(dāng)它是checkbox好了, pulldown說(shuō)明是子菜單項(xiàng)或者是下拉toolbar menu
對(duì)于action所使用的圖標(biāo),我們可以從Eclipse下的plugins\org.eclipse.ui_3.1.2.jar 和 plugins\org.eclipse.jdt.ui_3.1.2.jar得到一些gif的圖片
Eclipse中actionSet以及下級(jí)元素都是有id的,而且他們可以通過(guò)一種path的方式來(lái)進(jìn)行指定,比如com.qualityeclipse.favorites.workbenchMenu/content,如果上一級(jí)節(jié)點(diǎn)是workbench menu bar或者是view content menu的話,那么它的上一級(jí)節(jié)點(diǎn)是不用指定的,只要指定group就好
為了方便其他的插件的action能添加到該插件的actionSet下, 在為插件定義group的時(shí)候, 會(huì)添加一個(gè)為additions的group, additions是eclipse使用的一個(gè)默認(rèn)標(biāo)識(shí)符,用來(lái)表示其他action或menu顯示的位置, 在class中它的對(duì)應(yīng)常量是IWorkbenchActionConstants.MB_ADDITIONS, 比如我們定義了一個(gè)menu,指定其path為additions, 這表示我們的menu將添加到window的左邊,因?yàn)檫@個(gè)就是workbench menubar的additons所在的位置, 如果指定的是window/additions, 那么將作為子菜單項(xiàng)添加到window下
當(dāng)一個(gè)actionSet下定義的action跟另一個(gè)actionSet下定義的menu關(guān)聯(lián)的時(shí)候?qū)l(fā)生Invalid Menu Extension (Path is invalid): some.action.id的異常, 為了避免這種問(wèn)題,menu需要在兩個(gè)actionSet都定義
toolbarPath的指定也跟menuBarPath有同樣的情況, 比如定義為Normal/additions, 這里的Normal指的是workbench toolbar, additions就是action要顯示的group位置
action的class屬性是封裝了執(zhí)行動(dòng)作的類,它實(shí)現(xiàn)了IWorkbenchWindowActionDelegate, 在它里面有幾個(gè)方法需要介紹一下, 一個(gè)是selectionChanged, 用來(lái)動(dòng)態(tài)修改action的state狀態(tài)值, 是否可用,以及action的text屬性等, 比如對(duì)于enableFor屬性來(lái)說(shuō), 它根據(jù)選中對(duì)象的數(shù)量來(lái)判斷action是否可用, 但是通過(guò)selectionChanged可以通過(guò)當(dāng)前選定的對(duì)象的情況來(lái)調(diào)用setEnable()方法從而更精確的控制action是否可用, 有時(shí)候當(dāng)插件還沒(méi)有加載,在調(diào)用action的run方法時(shí)會(huì)加載插件,這時(shí)可能在調(diào)用run()方法之前沒(méi)有調(diào)用selectedChange方法, 因此在run()方面里面需要寫(xiě)一些防護(hù)性代碼,比如空值的判斷之類的, 另外run()是在主UI線程中執(zhí)行的,因此,如果該執(zhí)行耗時(shí)較長(zhǎng),需要將其放到后臺(tái)線程中執(zhí)行.
插件運(yùn)行之后在menubar和toolbar上看到定義的actionSet,可以試試下面的方法:
在Window > Customize Perspective... 下看看是不是actionSet沒(méi)有選中
使用Window > Reset Perspective刷新當(dāng)前視圖
關(guān)閉重新打開(kāi)當(dāng)前視圖
如果還沒(méi)有出來(lái),可以在在run或者debug的設(shè)置中將"Clear workspace data before launching "選中, 然后再啟動(dòng)運(yùn)行
雖然通過(guò)擴(kuò)展點(diǎn)可以非常方便的在Eclipse上添加,但是這個(gè)玩意兒多了也不是什么好事, 可能會(huì)降低用戶體驗(yàn),因此需要進(jìn)行控制, actionSet擴(kuò)展點(diǎn)也有相關(guān)的設(shè)置來(lái)指定是否可見(jiàn), 而且還可以調(diào)用IActionSetDescriptor.setInitiallyVisible() 來(lái)控制頂層菜單是否可見(jiàn), 另一種解決辦法就是在首選項(xiàng)中提供一個(gè)checkbox讓用戶決定是否顯示頂層菜單,其編程實(shí)現(xiàn)就是在代碼中調(diào)用IActionSetDescriptor.setInitiallyVisible()和IWorkbenchPage.hideActionSet()來(lái)進(jìn)行控制
Action的組成包括幾個(gè)部分,一個(gè)是在plugin.xml中的聲明,一個(gè)是在Eclipse UI中會(huì)用到的IAction實(shí)例化對(duì)象, 另一個(gè)是封裝在IActionDelegate中的action執(zhí)行代碼. action的實(shí)例化是基于plugin.xml配置文件和IActionDelegate定義的,Eclipse可以先在界面上將action顯示出來(lái),直到用戶點(diǎn)擊了菜單或者工具條按鈕才會(huì)去真正的加載插件,這也就是所謂的Eclipse的延遲加載機(jī)制
IActionDelegate有幾個(gè)子類需要說(shuō)明一下:
IActionDelegate2 如果實(shí)現(xiàn)IActionDelegate需要一些其他的信息,而這些信息在IActionDelegate銷毀時(shí)需要同時(shí)被銷毀時(shí), 它可以提供相關(guān)是生命周期事件方法來(lái)處理
IEditorActionDelegate 是跟editor相關(guān)的
IObjectActionDelegate 是跟上下文菜單相關(guān)的
IViewActionDelegate 是跟view相關(guān)的
IWorkbenchWindowActionDelegate是跟menubar和toolbar相關(guān)的
Actions和Eclipse中的其他東東一樣,也是通過(guò)擴(kuò)展點(diǎn)org.eclipse.ui.actionSets來(lái)添加到Eclipse IDE的各個(gè)地方,actions的外在表現(xiàn)形式主要有menubar, toolbar, context menu這樣幾種
在actionSets的下級(jí)節(jié)點(diǎn)是actionSet, 它有幾個(gè)屬性,id,label都不用說(shuō)了,還有一個(gè)visible屬性,表示在打開(kāi)Eclipse時(shí)是否顯示該action,通常我們可以通過(guò)Window > Customize Perspective...來(lái)設(shè)置action是否可見(jiàn)
在actionSet下可以添加menu節(jié)點(diǎn), 它的id,label屬性不用說(shuō)了,其中的path是用來(lái)指定菜單的顯示位置的,一般設(shè)置為additions
action并不是直接添加到menu上的, 而是跟menu內(nèi)部的group關(guān)聯(lián)的,所以我們必須先在menu下創(chuàng)建group,即新建groupMarker, 其name必須保證在當(dāng)前menu下唯一, menu還有一種叫separator的group, 在separator group處添加的menu item會(huì)在這個(gè)組中的第一個(gè)菜單項(xiàng)上面添加一條水平線.而groupMarker則不會(huì)有線, 當(dāng)其他action要添加到該menu group下時(shí),使用水平線進(jìn)行分組就顯得非常必要
group只是用來(lái)標(biāo)識(shí)menu的位置,即指這個(gè)位置可以添加菜單項(xiàng), 而不是實(shí)際的menu item, 實(shí)際的menu item是action
因?yàn)閙enu會(huì)有層次關(guān)系,所以actionSet中專門(mén)用一個(gè)menu節(jié)點(diǎn)來(lái)表現(xiàn)這種層次關(guān)系, 而toolbar則沒(méi)有這種情況,所以這里沒(méi)有提供toolbar節(jié)點(diǎn)
在actionSet下添加action就是最終我們要toolbar上顯示的按鈕和menubar上的menu item, 這里有幾個(gè)屬性, id和label不用說(shuō)了,menuBarPath是menu要顯示的位置, 比如"com.qualityeclipse.favorites.workbenchMenu/content",這個(gè)值就是actionSet+"/"+group name, toolbarPath 就是toolbar item的顯示位置, 比如"Normal/additions", 還有幾個(gè)屬性不常用到,但是有必要解釋一下
allowLabelUpdate這個(gè)要在retarget屬性為true的時(shí)候有效,還不是很清楚
class 是menu或button要執(zhí)行的動(dòng)作, 如果使用的是pulldown風(fēng)格的action,還需要實(shí)現(xiàn)IWorkbenchWindowPulldownDelegate接口,它的構(gòu)造函數(shù)是無(wú)參數(shù)的,如果要傳遞參數(shù),還需要是要實(shí)現(xiàn)IExecutableExtension 接口, 這個(gè)接口還不是很清楚
definitionId 這個(gè)是用來(lái)指定action對(duì)應(yīng)的command唯一標(biāo)識(shí)符的
enablesFor 是一個(gè)表達(dá)式,用來(lái)表示當(dāng)前action是否可用
retarget 不是很理解
state主要是針對(duì)style屬性為radio和toggle的,表示當(dāng)前action是否被選中
style:默認(rèn)是push,還有radio,表示一組menu中只能有一個(gè)被選中, toggle當(dāng)它是checkbox好了, pulldown說(shuō)明是子菜單項(xiàng)或者是下拉toolbar menu
對(duì)于action所使用的圖標(biāo),我們可以從Eclipse下的plugins\org.eclipse.ui_3.1.2.jar 和 plugins\org.eclipse.jdt.ui_3.1.2.jar得到一些gif的圖片
Eclipse中actionSet以及下級(jí)元素都是有id的,而且他們可以通過(guò)一種path的方式來(lái)進(jìn)行指定,比如com.qualityeclipse.favorites.workbenchMenu/content,如果上一級(jí)節(jié)點(diǎn)是workbench menu bar或者是view content menu的話,那么它的上一級(jí)節(jié)點(diǎn)是不用指定的,只要指定group就好
為了方便其他的插件的action能添加到該插件的actionSet下, 在為插件定義group的時(shí)候, 會(huì)添加一個(gè)為additions的group, additions是eclipse使用的一個(gè)默認(rèn)標(biāo)識(shí)符,用來(lái)表示其他action或menu顯示的位置, 在class中它的對(duì)應(yīng)常量是IWorkbenchActionConstants.MB_ADDITIONS, 比如我們定義了一個(gè)menu,指定其path為additions, 這表示我們的menu將添加到window的左邊,因?yàn)檫@個(gè)就是workbench menubar的additons所在的位置, 如果指定的是window/additions, 那么將作為子菜單項(xiàng)添加到window下
當(dāng)一個(gè)actionSet下定義的action跟另一個(gè)actionSet下定義的menu關(guān)聯(lián)的時(shí)候?qū)l(fā)生Invalid Menu Extension (Path is invalid): some.action.id的異常, 為了避免這種問(wèn)題,menu需要在兩個(gè)actionSet都定義
toolbarPath的指定也跟menuBarPath有同樣的情況, 比如定義為Normal/additions, 這里的Normal指的是workbench toolbar, additions就是action要顯示的group位置
action的class屬性是封裝了執(zhí)行動(dòng)作的類,它實(shí)現(xiàn)了IWorkbenchWindowActionDelegate, 在它里面有幾個(gè)方法需要介紹一下, 一個(gè)是selectionChanged, 用來(lái)動(dòng)態(tài)修改action的state狀態(tài)值, 是否可用,以及action的text屬性等, 比如對(duì)于enableFor屬性來(lái)說(shuō), 它根據(jù)選中對(duì)象的數(shù)量來(lái)判斷action是否可用, 但是通過(guò)selectionChanged可以通過(guò)當(dāng)前選定的對(duì)象的情況來(lái)調(diào)用setEnable()方法從而更精確的控制action是否可用, 有時(shí)候當(dāng)插件還沒(méi)有加載,在調(diào)用action的run方法時(shí)會(huì)加載插件,這時(shí)可能在調(diào)用run()方法之前沒(méi)有調(diào)用selectedChange方法, 因此在run()方面里面需要寫(xiě)一些防護(hù)性代碼,比如空值的判斷之類的, 另外run()是在主UI線程中執(zhí)行的,因此,如果該執(zhí)行耗時(shí)較長(zhǎng),需要將其放到后臺(tái)線程中執(zhí)行.
插件運(yùn)行之后在menubar和toolbar上看到定義的actionSet,可以試試下面的方法:
在Window > Customize Perspective... 下看看是不是actionSet沒(méi)有選中
使用Window > Reset Perspective刷新當(dāng)前視圖
關(guān)閉重新打開(kāi)當(dāng)前視圖
如果還沒(méi)有出來(lái),可以在在run或者debug的設(shè)置中將"Clear workspace data before launching "選中, 然后再啟動(dòng)運(yùn)行
雖然通過(guò)擴(kuò)展點(diǎn)可以非常方便的在Eclipse上添加,但是這個(gè)玩意兒多了也不是什么好事, 可能會(huì)降低用戶體驗(yàn),因此需要進(jìn)行控制, actionSet擴(kuò)展點(diǎn)也有相關(guān)的設(shè)置來(lái)指定是否可見(jiàn), 而且還可以調(diào)用IActionSetDescriptor.setInitiallyVisible() 來(lái)控制頂層菜單是否可見(jiàn), 另一種解決辦法就是在首選項(xiàng)中提供一個(gè)checkbox讓用戶決定是否顯示頂層菜單,其編程實(shí)現(xiàn)就是在代碼中調(diào)用IActionSetDescriptor.setInitiallyVisible()和IWorkbenchPage.hideActionSet()來(lái)進(jìn)行控制
安徽新華電腦學(xué)校專業(yè)職業(yè)規(guī)劃師為你提供更多幫助【在線咨詢】