Eclipse 插件開發(fā) -- 深入理解菜單(Menu)功能及其擴展點.docx_第1頁
Eclipse 插件開發(fā) -- 深入理解菜單(Menu)功能及其擴展點.docx_第2頁
Eclipse 插件開發(fā) -- 深入理解菜單(Menu)功能及其擴展點.docx_第3頁
Eclipse 插件開發(fā) -- 深入理解菜單(Menu)功能及其擴展點.docx_第4頁
Eclipse 插件開發(fā) -- 深入理解菜單(Menu)功能及其擴展點.docx_第5頁
已閱讀5頁,還剩14頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

引言Eclipse 具有豐富的菜單功能,給開發(fā)人員提供了很好的用戶體驗??傮w而言,Eclipse 菜單種類包括視圖 / 編輯器菜單,主菜單(Main Menu),視圖 / 編輯器菜單(ViewPart/EditorPart Menu)和上下文菜單(Context Menu)。插件開發(fā)人員通過靈活應用這些菜單,可以給用戶提供很好的體驗。由于視圖和編輯器菜單功能類似,因此本文重點講述視圖菜單(視圖下拉菜單及其工具欄菜單),除此之外,還將講述主菜單和上下文菜單。如圖 1 所示為 Project Explorer 視圖的菜單,包括視圖下拉菜單和工具欄菜單(折疊樹節(jié)點)。通常而言,出現(xiàn)在視圖工具欄的菜單都會出現(xiàn)在視圖的下拉菜單,也就是說,比較常用的視圖菜單放在視圖的工具欄。圖 1. Project Explorer 視圖的菜單如圖 2 所示為 Project Explorer 視圖中的上下文菜單,只有當我們右鍵點擊時才會出現(xiàn)。通常而言,出現(xiàn)頻率較高的菜單項才會出現(xiàn)在菜單中。上下文菜單具有很強的靈活項,它可以隨著我們點擊的對象不同,彈出的菜單也會有相應的變化。圖 2. Project Explorer 視圖中的上下文菜單如圖 3 所示為 Eclipse 的主菜單,包括最上面的主菜單項(不可移動)及其下面的工具欄菜單(可以移動,并且 Eclipse 提供了顯示 / 不顯示這些菜單的功能),Eclipse 并不建議我們?yōu)槊恳粋€插件都添加新的主菜單,這樣容易造成冗余,而且不方便用戶操作。通常,我們可以把菜單項添加到 Eclipse 已有的菜單,如插件的查找功能可以添加一個查找菜單項到 Eclipse 的 Search 主菜單上。圖 3. Eclipse 的主菜單前面講到 Eclipse 的各種菜單,那么,如何在開發(fā)插件或 RCP 應用程序的時候添加這些菜單?本文下面的篇幅將詳細介紹如何擴展 Eclipse 的菜單功能,使讀者深入了解 Eclipse 的菜單功能,并能夠開發(fā)具有這些菜單的應用程序。因此,必須掌握三方面的內容:菜單種類,菜單的擴展點,菜單控制(顯示 / 隱藏或啟用 / 禁用菜單項)。下面從概念上介紹這三方面內容,下一小節(jié)將會進行詳細介紹。菜單種類正如前面所講到的,Eclipse 的菜單包括視圖菜單,主菜單及上下文菜單三個種類。菜單項的擴展點Eclipse 提供了兩種擴展點供用戶添加菜單項到相應的位置。這兩種擴展點為 mands(本文簡稱為 Commands 方式)和 org.eclipse.ui.actionSets(本文簡稱為 Actions 方式)。Actions 方式為界面上不同區(qū)域的表現(xiàn)方式提供了相應的擴展點,并且沒有分離其界面表現(xiàn)和內在實現(xiàn)。恰恰相反,Commands 方式通過三步有效的達到界面表現(xiàn)和內部實現(xiàn)的分離:首先,通過 mands 擴展點創(chuàng)建命令和類別(Category),并且可以把某些命令放在一個類別(Category)中;然后,通過 org.eclipse.ui.menus 指定命令出現(xiàn)在界面的哪個區(qū)域(視圖菜單 / 主菜單 / 上下文菜單);最后通過 org.eclipse.ui.handlers 指定命令的實現(xiàn)。因此,Eclipse 推薦新開發(fā)的插件使用 Commands 來創(chuàng)建您的界面菜單。當然,由于 Actions 在現(xiàn)有的插件中用得比較多,如果我們需要擴展或基于之前的插件開發(fā),也需要對其進行了解。除此之外,針對上下文菜單,雖然 Commands 和 Actions 方式均可以創(chuàng)建上下文菜單,但是 Eclipse 還提供了另外一種創(chuàng)建上下文菜單的擴展點 org.eclipse.ui.popupMenus(本文簡稱為 popupMenus 方式),本文將就這三種擴展點做詳細的介紹。菜單控制菜單控制是一個非常常見的功能,例如,隨著選定的內容或當前窗口的不同,菜單中的菜單項會有相應的變化(顯示 / 隱藏或啟用 / 禁用菜單項),因此,如何控制菜單是插件開發(fā)人員必須掌握的知識。Eclipse 為菜單控制提供了兩種方法,一種是通過擴展點;另一種是通過 API 的方式編寫程序控制?;仨撌譋clipse 菜單功能及其擴展點至此,我們對 Eclipse 菜單有了感觀的認識。由上一節(jié)我們可知,要深入理解 Eclipse 菜單功能,我們需要從三個方面去掌握:菜單種類,菜單的擴展點和菜單控制。下面將進行詳細講述。菜單種類針對各種菜單,Eclipse 提供了相應的擴展點,因此,開發(fā)人員可以通過這些擴展點把菜單放到界面的不同區(qū)域,詳細內容請參考 2.2 小節(jié)。菜單的擴展點視圖菜單的擴展點采用 Commands 方式創(chuàng)建視圖菜單,需要引入 org.eclipse.ui.menus 擴展點;而 Actions 方式需要引入 org.eclipse.ui.actionSets.1、視圖菜單(Commands 方式):MenuContribution locationURI = “Scheme:id?argument-list”其中,Scheme 為該菜單項出現(xiàn)的區(qū)域,menu 為視圖的下拉菜單,toolbar 為視圖的工具欄菜單;id 為菜單區(qū)域 ID;argument-list 為該菜單項出現(xiàn)在指定菜單的位置。例如:在 ProbelmView 的下拉菜單加一個菜單項,其 MenuContribution 的 locationURI 應為:menu:org.eclipse.ui.views.ProblemView?after=additions;在 ProblemView 的工具欄菜單中加入一個菜單項,其 locationURI 應為:toolbar:org.eclipse.ui.views.ProblemView?after=additions。2、視圖菜單(Actions 方式):采用 Actions 方式創(chuàng)建菜單,需要引入 org.eclipse.ui.actionSets 擴展點,并通過設定 action 的 menubarPath 指定下拉菜單 / 菜單項出現(xiàn)的位置;通過設定 action 的 toolbarPath 設定工具欄菜單 / 菜單項出現(xiàn)的位置。例如,添加一個下拉菜單項到 Problems 視圖中,其 menubarPath 應為:org.eclipse.ui.views.ProblemView/additions主菜單的擴展點1、主菜單(Commands 方式)通過 Commands 方式把菜單項添加到主菜單及其工具欄上,和視圖菜單一樣,也是通過擴展點 org.eclipse.ui.menus 實現(xiàn),需要設定其 menuContribution 的 locationURI。例如,添加一個菜單(菜單可以包含若干個菜單項)到主菜單一欄中,其 locationURI 為:menu:org.eclipse.ui.main.menu?after=additions添加一個菜單到工具欄之中,其 locationURI 為:toolbar:org.eclipse.ui.main.toolbar?after=additions當然,我們也可以把菜單項添加到已經(jīng)存在的菜單當中,例如添加一個菜單項到 Eclipse 的 Search 主菜單當中,其 locationURI 為:menu:org.eclipse.search.menu?dialogGroup2、主菜單(Actions 方式)通過 Actions 方式把菜單項添加到主菜單及其工具欄上,和視圖菜單一樣,也是通過擴展點 org.eclipse.ui.actionSets 實現(xiàn),需要設定 action 的 menubarPath 和 toolbarPath 實現(xiàn)。例如,添加一個菜單項到 Eclipse 的 Search 主菜單中,其 menubarPath 應為:org.eclipse.search.menu/dialogGroup注意:如果采用上述方式添加一個菜單項到 Search 主菜單,當我們運行時并沒有出現(xiàn)添加的菜單項,這時候需要換一個 workspace,其原因是 Eclipse 緩存了與其相關的某些信息在 workspace 當中。上下文菜單的擴展點上下文菜單除了通過 Commands 和 Actions 方式添加,還可以使用擴展點 org.eclipse.ui.popupMenus 方式添加,下面分別進行介紹。1、上下文菜單(Commands 方式)Commands 方式與添加視圖菜單和主菜單的方式一樣,通過設定其 menuContribution 的 locationURI 來實現(xiàn)。例如,添加一個上下文菜單到 Problems 視圖中,其 locationURI 為:popup:org.eclipse.ui.views.ProblemView?after=additions。如果我們想讓某個上下文菜單項出現(xiàn)在任何區(qū)域,則可以使用下面的 locationURI:popup:org.eclipse.ui.popup.any?after=additions2、上下文菜單(Actions 方式)Actions 方式?jīng)]有直接提供擴展點添加上下文菜單,但是我們可以通過編程的方式實現(xiàn),如下代碼清單 1 為 TreeViewer 添加上下文菜單,通過 IMenuManager 的 add 方法添加 actions。清單 1. 通過 Actions 方式編程實現(xiàn)添加上下文菜單 private void hookContextMenu() IMenuManager fMenuMgr = new MenuManager(“#PopupMenu”); fMenuMgr.setRemoveAllWhenShown(true); / 添加 Actions fMenuMgr.add(action ) fMenuMgr.createContextMenu(treeViewer.getControl(); treeViewer.getControl().setMenu(fMenu); getSite().registerContextMenu(fMenuMgr, treeViewer); 3、上下文菜單(popupMenus 方式)通過 popupMenus 擴展點實現(xiàn)上下文菜單,需要設定 objectContribution 的 objectClass 屬性把上下文菜單添加到相應的區(qū)域。例如,如果我們想當用戶點擊 Eclipse 中的資源時,彈出的上下文菜單包括某個菜單項,我們可以設定 objectClass 屬性為:org.eclipse.core.resources.IResource通過 Commands 方式創(chuàng)建菜單項通過 Commands 方式創(chuàng)建菜單項,首先需要創(chuàng)建 Command,通過擴展點 mands,然后我們可以把這個 Command 放到任何區(qū)域,上一小節(jié)已經(jīng)講到,通過 org.eclipse.ui.menus 擴展點確定菜單創(chuàng)建的區(qū)域,最后通過擴展點 org.eclipse.ui.handlers 定義這個 command 的具體行為。在創(chuàng)建 Command 時,我們可以先創(chuàng)建一個 Category,并把相關的一些命令放到這個 Category 中,這樣有利于管理。代碼清單 2 創(chuàng)建一個 Command(“Show in Glossary Explorer”),并放到一個 Category 中,然后把該 Command 放到 BGSearchResultView 視圖的上下文菜單中,最后通過擴展 org.eclipse.ui.handlers 定義該 Command 的實現(xiàn)類。清單 2. 通過 Commands 方式添加菜單項 通過 Actions 方式創(chuàng)建菜單項正如前面講到,Actions 方式?jīng)]有分離界面的表現(xiàn)和內部實現(xiàn),因此,所有這些均通過 action 來完成。如下代碼清單 3 為添加一個 Search 菜單項到 Eclipse 的 Search 主菜單(通過 action 的 menubarPath 指定)中,其中 class 對應的值為該 Action 的實現(xiàn)類,該類需要實現(xiàn)接口 IWorkbenchWindowActionDelegate。清單 3. 通過 Actions 方式添加菜單項 通過 popupMenus 方式創(chuàng)建菜單項popupMenus 方式創(chuàng)建上下文菜單項也是通過 action 來實現(xiàn),下面例子為添加一個菜單項到用戶右擊 IGraphicalEditPart 對象時彈出的上下文菜單,通過 menubarPath 指定該 Action 出現(xiàn)的區(qū)域,通過 class 指定該 action 的實現(xiàn)類,該類需要實現(xiàn)接口 IObjectActionDelegate。清單 4. 通過 popupMenus 方式添加菜單項 菜單控制視圖菜單的控制主要包括啟用 / 禁用,顯示 / 隱藏菜單。通過 Command 方式創(chuàng)建的菜單,可以通過 mands 的 visibleWhen 屬性控制菜單的隱藏和顯示,通過 org.eclipse.ui.handlers 的 activewhen 或 enabledWhen 控制菜單的啟用或禁用。通過 Actions 方式創(chuàng)建的菜單,可以通過 action 的 enablement 屬性控制菜單的啟用 / 禁用。通過 popupMenus 方式創(chuàng)建的菜單,可以通過 objectContribution 的 visibility 和 enablement 來設置該 objectContribution 下的 action 的顯示 / 隱藏和啟用 / 禁用,我們也可以設置 action 的 enablement 來控制該菜單的啟用 / 禁用。這里不詳細講述 enablement,visibleWhen 和 enabledWhen 的參數(shù)及如何設置,讀者可以參考第三節(jié)的例子和本文的參考文獻。回頁首編程實踐本文將結合前兩節(jié)講到的知識,以例子的形式說明如何創(chuàng)建并且控制菜單。首先創(chuàng)建一個視圖(Menu Example),然后分別通過 Commands,Actions 和 popupMenus 方式創(chuàng)建若干個菜單,并添加相應的菜單控制點。創(chuàng)建 Menu Example 視圖擴展 org.eclipse.views 創(chuàng)建“Menu Example”視圖,如下代碼清單 5 為創(chuàng)建視圖的 xml 代碼。清單 5. 擴展 org.eclipse.ui.views 創(chuàng)建視圖 創(chuàng)建 Commands采用 Command 方式創(chuàng)建“Menu Example”主菜單(包含 AngryCommand 和 JokeCommand 兩個菜單項),并且基于這兩個菜單項創(chuàng)建了 Menu Example 視圖的下拉菜單和工具欄菜單,及其 TreeViewer 的上下文菜單。如下代碼清單 6 為擴展 mands 創(chuàng)建 Menu Example 命令和類別,并且包含兩個命令:Joke Command 和 Angry Command。清單 6. 擴展 mands 創(chuàng)建命令 關聯(lián) Commands 到主菜單如下代碼清單 7 為擴展 org.eclipse.ui.menus,并基于前面創(chuàng)建的 Comands,添加一個主菜單 Menu Example,并且包含 Joke Command 和 Angry Command 菜單項。清單 7. 創(chuàng)建 Menu Example 主菜單 關聯(lián) Commands 到視圖菜單如下代碼清單 8 為擴展 org.eclipse.ui.menus,并基于 Commands 方式創(chuàng)建 Menu Example 視圖的下拉菜單,工具欄菜單和上下文菜單,通過 locationURI 來設定。Joke Command 即為下拉菜單也是工具欄菜單,只有當我們選擇了 TreeViewer 中的節(jié)點時該菜單項才是可見的,參考下面的 visibleWhen-with-iterate-or-instanceof。清單 8. 通過 Commands 方式創(chuàng)建視圖菜單 Commands 的實現(xiàn)類如下代碼清單 9 所示擴展 org.eclipse.ui.handlers 為 Joke Command 和 Angry Command 創(chuàng)建事件處理類,其中 Joke Command 通過 enabledWhen 屬性控制該菜單項是否啟用,當我們同時選擇了兩個對象時 Joke Command 處于啟用狀態(tài),否則為禁用。清單 9. 擴展 org.eclipse.ui.handlers 為 Commands 創(chuàng)建實現(xiàn)類 創(chuàng)建 Action 并關聯(lián)到 Eclipse 的 Search 主菜單采用 Actions 方式在 Eclipse 的主菜單 Search 中添加創(chuàng)建菜單項 SmileAction。擴展 org.eclipse.ui.actionSets 在 Eclipse 的主菜單 Search 中添加一個菜單項 Smile Action。如下代碼清單 10 所示創(chuàng)建該 action 并添加到 search 主菜單,只有當我們選擇至少一個對象時(設置 enablesFor 屬性為“+”),該菜單項才處于啟用狀態(tài)。清單 10. 通過 Actions 方式創(chuàng)建菜單項 pupupMenus 方式創(chuàng)建 Action 并關聯(lián)到 IResource 資源的上下文菜單擴展 org.eclipse.ui.popupMenus 創(chuàng)建菜單“Menu Example”,該菜單包含一個菜單項 HelloAction。當我們在 Eclipse 任何區(qū)域右擊 org.eclipse.core.resources.IResource 資源時彈出的上下文菜單中會出現(xiàn)“Menu Example”菜單。如下代碼清單 11 為創(chuàng)建該上下文菜單的 xml 代碼。清單 11. popupMenus 方式創(chuàng)建上下文菜單 pupupMenus 方式創(chuàng)建 Action 并關聯(lián)到 IResource 資源的上下文菜單擴展 org.eclipse.ui.popupMenus 創(chuàng)建菜單項 GreetAction 和 CryAction,當我們右擊 Menu Example 視圖中的 TreeViewer 節(jié)點時彈出。如下代碼清單 12 所示擴展 org.eclipse.ui.popupMenus 為 Menu Example 視圖創(chuàng)建 GreetAction 和 CryAction 上下文菜單項。使用 visiblity 的 objectState 屬性控制菜單項的可見狀態(tài),使用該屬性要求其選擇的對象實現(xiàn)了 org.eclipse.ui.IActionFilter 接口,具體可參見 Person 類的實現(xiàn)。清單 12. 擴展 org.eclipse.ui.popupMenus 創(chuàng)建菜單 Menu Example 視圖的代碼實現(xiàn)類如下代碼清單 13 所示為 Menu Example 視圖的代碼,該視圖中有一個 TreeViewer,并通過函數(shù) hookContextMenu 把上下文菜單關聯(lián)到 TreeViewer。其中函數(shù) viewMenuAction 用于更新菜單的狀態(tài),它首先獲取視圖菜單,然后調用 IMenuManager 的 update 方法更新對應菜單項的狀態(tài),從而達到控制菜單的目的。清單 13. Menu Example 視圖代碼 public class MenuExplorer extends ViewPart private TreeViewer treeViewer; private MenuManager fMenuMgr; private Menu fMenu; private static MenuExplorer fInstance = null; public MenuExplorer() fInstance = this; public static MenuExplorer getInstance() return fInstance; public void createPartControl(Composite parent) treeViewer = new TreeViewer (parent, SWT.MULTI); treeViewer.setLabelProvider(new PersonListLabelProvider(); treeViewer.setContentProvider(new PersonTreeContentProvider(); treeViewer.setInput(Person.example(); this.getSite().setSelectionProvider(treeViewer); hookContextMenu(); fInstance = this; public void setVi

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論