源文:http://hi.baidu.com/wyyhzc/blog/item/dbb498196a493e4042a9ad11.html
往eclipse的默認NavigationView中,添加右鍵菜單項是非常容易的,甚至不需要自己寫代碼,只要在plugin.xml中添加擴展項便可以了。
但是這遠遠達不到我們的要求。如果要我們在自己的rcp程序的View中添加右鍵彈出菜單就不是很容易了。現在我介紹一下如何在一個樹視圖中針對不同的TreeObject添加不同的右鍵彈出菜單的方法。
如果不清楚如何構建一個樹,請參考http://www.java2s.com/Code/Java/SWT-JFace-Eclipse/CatalogSWT-JFace-Eclipse.htm,
這里有很多關于eclipse
Tree的實例。簡單將來,Eclipse中創建樹有兩種,一種是使用SWT提供的樹,依照一定的格式給其提供數據,我自己只用這種方法創建一些簡單的、
靜態的樹。另一種方法,針對于RCP程序,可以使用JFace提供的TreeViewer類,非常靈活并且易于擴展。使用TreeViewer需要實現
ITreeContentProvider接口和ITreeLableProvider接口。由于我的時間有限,不能向大家提供具體的實現方法,請原諒。
可以參考以下文章:http://eclipse.org/articles/treeviewer-cg/TreeViewerArticle.htm
在大體了解了如何構造一個樹之后,我們下面就來介紹右鍵彈出菜單context menu的實現方法。
一個TreeViewer 必須繼承ViewPart方法,并且重寫其中的createPartControl(Composite parent)類。
1 public void createPartControl(Composite parent) {
2
3 /* Set the imput data and image model of the tree viewer,
4 * and layout the viewer on the left part of the composite.
5 */
6 viewer = new TreeViewer(parent);
7 viewer.setContentProvider(new ViewContentProvider());
8 viewer.setLabelProvider(new ViewLabelProvider());
9 viewer.setInput(createDummyModel());
10
11 createActions();
12 createMenus();
13 createContextMenu(parent);
14
15 //handles the actions related with treeviewer.
16 makeActions(parent);
17 }
其中,第7到9行為設置TreeViewer的內容提供器、圖像提供器、以及初始化時的輸入數據。第13行為創建右鍵彈出菜單。
1 private void createContextMenu(Composite parent) {
2
3 MenuManager mgr = new MenuManager();
4 mgr.setRemoveAllWhenShown(true);
5 mgr.addMenuListener(new IMenuListener() {
6 public void menuAboutToShow(IMenuManager manager) {
7 fillContextMenu(manager);
8 }
9 });
10 Menu menu = mgr.createContextMenu(viewer.getControl());
11 viewer.getControl().setMenu(menu);
12 getSite().registerContextMenu(mgr, viewer);
13 }
第4行代碼
中,setRemoveAllWhenShown(true)的作用是清空以前顯示的菜單項,當觸發了menu事件時,重新填充
(fillContextMenu),所以如果不把removeAllWhenShow置為true的話,每點一下右鍵你就會看到菜單項多出一倍來。
Menu是swt的控件,而Menumanager是Jface中的控件,不象SWT那樣直接同底層打交道。用MenuManager可以創建出一個
Menu對象。第十行mgr.createContextMenu(viewer.getControl());這里的viewer即為上面的viewer。第十一行,然后我們將樹的setMenu方法將樹控件與Menu控件聯系在一起就好了。
最重要的是第十二行,這是context menu能不能顯示的關鍵。一個視圖中可以有多個context menu, 而每一個context menu都必須注冊給workbench。這需要通過調用org.eclipse.ui.IWorkbenchPartSite.registerContextMenu(MenuManager menuManager, ISelectionProvider selectionProvider)或者(當有多個注冊的context menu時)org.eclipse.ui.IWorkbenchPartSite.registerContextMenu(String
menuId, MenuManager menuManager, ISelectionProvider selectionProvider) 增加的參數menuId用于區分不同的context menu。
接下來,我們有兩種方法來創建右鍵彈出菜單項。第一種,實現fillContextMenu()方法。典型的實現代碼如下:
1 protected void fillContextMenu(IMenuManager manager) {
2
3 manager.add(openAction);
4 manager.add(removeAction);
5 manager.add(addAction);
6 }
這些Action都可由自己定義創建。
另外的方法,可以編輯plugin.xml文件。不需要自己寫任何代碼便可以顯示出自己想要的彈出項。
這次先講到這里,下次介紹另外的一種實現方式。(主要是由于剛創建Blog,不知道如何插入圖片,這么寫太費勁也太枯燥了,相信大家一定不能忍了吧!咱們下次再見
)
posted on 2009-07-27 13:50
Ke 閱讀(2266)
評論(0) 編輯 收藏 所屬分類:
eclipse RCP