nighty
折騰的年華
posts - 37, comments - 143, trackbacks - 0, articles - 0
導航
BlogJava
首頁
新隨筆
聯系
聚合
管理
<
2008年8月
>
日
一
二
三
四
五
六
27
28
29
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
6
常用鏈接
我的隨筆
我的評論
我的參與
最新評論
留言簿
(7)
給我留言
查看公開留言
查看私人留言
隨筆分類
Eclipse(7)
Flex(2)
Java(6)
Struts2(2)
SWT/JFace(1)
信息安全(1)
心得(5)
操作系統(3)
數據庫(3)
服務器部署(5)
測試(2)
系統集成(2)
軟件架構(2)
隨筆檔案
2013年4月 (2)
2013年3月 (1)
2012年4月 (1)
2011年10月 (1)
2011年8月 (1)
2011年5月 (3)
2011年4月 (1)
2011年3月 (2)
2011年2月 (1)
2011年1月 (1)
2010年11月 (1)
2009年11月 (1)
2009年10月 (1)
2009年8月 (1)
2009年7月 (1)
2008年8月 (2)
2008年7月 (2)
2008年6月 (2)
2008年5月 (4)
2008年4月 (1)
2008年1月 (1)
2007年11月 (1)
2007年10月 (2)
2007年8月 (2)
文章分類
測試
搜索
最新評論
1.?re: 關于commons dbutils組件的一個小缺陷分析
dbutils中連傳入到的參數都不區分大小寫??
--starhe
2.?re: B/S,C/S架構混合使用[未登錄]
評論內容較長,點擊標題查看
--eagle
3.?re: B/S,C/S架構混合使用[未登錄]
補充一下:用的語言是java,開發環境是eclipse
--eagle
4.?re: B/S,C/S架構混合使用
評論內容較長,點擊標題查看
--Unbotrusive
5.?re: struts2中重定向中文參數亂碼梳理[未登錄]
有用啊
--tony
閱讀排行榜
1.?ubuntu安裝Java開發環境(38192)
2.?Eclipse3.3安裝中文語言包(13945)
3.?B/S,C/S架構混合使用(13767)
4.?Http狀態碼思維導圖(13766)
5.?添加完整的Eclipse RCP幫助系統(8938)
評論排行榜
1.?B/S,C/S架構混合使用(25)
2.?無奈只能放棄iBatis(24)
3.?Eclipse3.3安裝中文語言包(13)
4.?httpclient3.1使用小結(8)
5.?JDBC連接DB2的一些總結(8)
RssOwl2源碼閱讀 -- ActionSet
Posted on 2008-08-21 11:29
寒武紀
閱讀(1799)
評論(0)
編輯
收藏
所屬分類:
Eclipse
ActionSet是Eclipse RCP里面一非常重要的概念,因為菜單、工具欄、上下文菜單、狀態欄很多操作都是共享的,所以Action就是用來處理重復出現的東西。至于Eclipse里面定義ActionSet有非常多的技巧,可能無法一一列舉,而且使用方法也多種多樣。下面介紹的是RssOwl2項目的ui源代碼部分的一小塊。
1. 菜單的插入點 -- GroupMarker和Separator的使用
ApplicationActionBarAdvisor類是定義全局所有Action插入點和入口,查看fillMenuBar(IMenuManager)方法,為了簡化,以其中的輔助方法createFileMenu(IMenuManager)為例,講述一下實現菜單“文件”的內容,先看一下菜單的結構
像Close,Import...之類的非常簡單,看一下它是如何實現New這個子菜單的。首先看一下它的源代碼如何定義插入點
/**/
/*
Menu: File
*/
private
void
createFileMenu(IMenuManager menuBar)
{
MenuManager fileMenu
=
new
MenuManager(
"
&File
"
, IWorkbenchActionConstants.M_FILE);
menuBar.add(fileMenu);
fileMenu.add(
new
GroupMarker(IWorkbenchActionConstants.FILE_START));
fileMenu.add(
new
GroupMarker(IWorkbenchActionConstants.NEW_EXT));
fileMenu.add(
new
Separator());
fileMenu.add(getAction(ActionFactory.CLOSE.getId()));
fileMenu.add(getAction(ActionFactory.CLOSE_ALL.getId()));
fileMenu.add(
new
GroupMarker(IWorkbenchActionConstants.CLOSE_EXT));
fileMenu.add(
new
Separator());
fileMenu.add(getAction(ActionFactory.SAVE_AS.getId()));
fileMenu.add(
new
GroupMarker(IWorkbenchActionConstants.SAVE_EXT));
fileMenu.add(
new
Separator());
fileMenu.add(getAction(ActionFactory.PRINT.getId()));
fileMenu.add(
new
Separator());
fileMenu.add(
new
GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS));
fileMenu.add(fReopenEditors);
//
TODO Consider moving into a "Go" Menu!
fileMenu.add(
new
Separator());
fileMenu.add(
new
GroupMarker(IWorkbenchActionConstants.FILE_END));
fileMenu.add(
new
Separator());
fileMenu.add(getAction(ActionFactory.QUIT.getId()));
}
其中有一行fileMenu.add(new GroupMarker(IWorkbenchActionConstants.NEW_EXT)); 這里是定義一個GroupMarker作為組標記,把子菜單New容納進來。這個NEW_EXT的值是:new.ext
現在跳回到plugin.xml去看一下它的ActionSet定義,結構如下:
,點擊New(menu),它的path值為:file/new.ext,這個路徑就是在createFileMenu方法定義的路徑,第一個是“File”本身的ID。也就是把子菜單New(menu)插入到指定的那個GroupMarker,ID為new.ext。然后定義了三個ID分別為bookmark,newsbin,searchmark,的groupmarker和一個folder的separator,這個三ID分別就對應上面actionSet定義的三個action,以其中的Bookmark(action)為例,它的menubarPath為:file/new_sub/bookmark,代表插入到"File"主菜單中定義的new_sub子菜單中,new_sub是New(menu)的ID。因為folder是定義為separator,所以它會有一條分隔線。這只是RssOwl的定義方法,其實以前自己做開發的時候是沒有這樣定義的,而且把子菜單New也寫在方法fillMenuBar中的,菜單把ID都寫在里面,ActionSet的配置就沒有子菜單出現了,但是這樣定義看起來就比較亂。采用這種寫法感覺比較簡潔。
2. Action的實現
仍以bookmark為例,它的實現類是NewBookMarkAction,實現了IWorkbenchWindowActionDelegate, IObjectActionDelegate二個接口,第一個是ActionSet指定實現接口,第二個是對象操作菜單要求實現的接口(但事實發現沒有再定義它的配置,可能是internal版本的原因),也就是說這個Action是多功能,它將會出現在主菜單,工具欄,和局部的右鍵菜單上。主菜單和工具欄的位置都在ActionSet配置定義了,看看它的右鍵菜單實現是在哪里的,這個右鍵是在視圖Bookmarks定義的,那么跳轉到org.rssowl.ui.internal.views.explorer.BookMarkExplorer類去看看。里面有一個hookContextualMenu()方法,就是定義它的右鍵菜單的,看一下代碼實現:
private
void
hookContextualMenu()
{
MenuManager manager
=
new
MenuManager();
/**/
/*
New Menu
*/
MenuManager newMenu
=
new
MenuManager(
"
New
"
);
manager.add(newMenu);
/**/
/*
New BookMark
*/
newMenu.add(
new
Action(
"
Bookmark
"
)
{
@Override
public
void
run()
{
IStructuredSelection selection
=
(IStructuredSelection) fViewer.getSelection();
IFolder parent
=
getParent(selection);
IMark position
=
(IMark) ((selection.getFirstElement()
instanceof
IMark)
?
selection.getFirstElement() :
null
);
new
NewBookMarkAction(fViewSite.getShell(), parent, position).run(
null
);
}
@Override
public
ImageDescriptor getImageDescriptor()
{
return
OwlUI.BOOKMARK;
}
}
);
//
其它定義
}
原來實現也很簡單,只是往MenuManager里面添加一個Action而已,而且run方法就是直接調用定義好的NewBookMarkAction的run方法,但是把選中對象做為參數傳進去,因為這個new是涉及當前上下文選擇對象的。
3. 下拉類型的工具按鈕定義
非常常見的Dropdown類型的工具欄按鈕可以把功能類型的按鈕歸為一類,做成一個下拉菜單形式,有默認的按下功能,也有可以選擇其它類似功能的下三角形式,樣子如下:
這個dropdown的Action是定義在ActionSet配置里的。style是pulldown類型的,所以實現類NewTypeDropdownAction實現了IWorkbenchWindowPulldownDelegate接口,它的run方法就是定義默認點擊不做選擇時的事情,這個下拉菜單是實現getMenu(Control parent)方法而來,它定義了如何生成這個菜單,這就用到了最原始的SWT中的MenuItem了,并且為它們添加SelectionListener,方法實現,不用說都知道了,又是New一個先前定義好的NewBookMarkAction類,然后又是調用它的run方法。所以總結一下,Action的重用不一定是這個類的重用,關鍵是它的run方法的重用,在不同的場景下它的外在表現形式可能會多種多樣,但是它的run內容是一致的。像添加這種添加的run大部分時候都是彈出一個對話框,而對話框大都又是Winzard類型的,因為Winzard可以共享放到dialog里面。所以這種復用的思想在Eclipse里面隨處可見。
歸結一下,其實這些技巧都是次要的,因為做GUI一個比較痛苦的事情就是經常要寫很多重復類似的代碼,抽取的不好,可能就變得不倫不類了。怎么利用它的這種思想,把復用的代碼都抽取在一起,而閱讀起來又比較輕松才是關鍵。
知道的就這些,先介紹到這里,下次再談談其它新的發現。
剛進場的時候戲就落幕
新用戶注冊
刷新評論列表
只有注冊用戶
登錄
后才能發表評論。
網站導航:
博客園
IT新聞
Chat2DB
C++博客
博問
管理
相關文章:
MyEclipse 9.0 安裝freemarker編輯器
RssOwl2源碼閱讀 -- ActionSet
學習RssOwl2中的添加隱藏工具欄和狀態欄的功能
Eclipse3.3安裝中文語言包
保存你的RCP視圖狀態
添加完整的Eclipse RCP幫助系統
一個ActionDelegate代理多個Action
Powered by:
BlogJava
Copyright © 寒武紀
主站蜘蛛池模板:
亚洲国产福利精品一区二区
|
久久久无码精品亚洲日韩蜜臀浪潮
|
亚洲综合AV在线在线播放
|
男男gay做爽爽的视频免费
|
免费大香伊蕉在人线国产
|
亚洲五月激情综合图片区
|
暖暖在线视频免费视频
|
国产一区二区免费视频
|
99人中文字幕亚洲区
|
xxxxx免费视频
|
亚洲美女免费视频
|
亚洲AV无码专区在线厂
|
亚洲毛片免费观看
|
91精品国产免费久久国语蜜臀
|
亚洲色图在线观看
|
在线免费视频一区
|
免费国产污网站在线观看
|
亚洲精品在线不卡
|
亚洲精品无码高潮喷水在线
|
色片在线免费观看
|
久久久久亚洲AV成人无码网站
|
国产va免费观看
|
亚洲第一成年网站大全亚洲
|
老湿机一区午夜精品免费福利
|
亚洲一区二区三区免费视频
|
国产jizzjizz免费视频
|
日韩在线一区二区三区免费视频
|
亚洲精品无码AV中文字幕电影网站
|
一区二区三区在线免费
|
亚洲国产精品国自产电影
|
很黄很色很刺激的视频免费
|
亚洲1区2区3区精华液
|
亚洲一区二区高清
|
中文字幕在线免费观看
|
亚洲成av人在线观看网站
|
在线免费中文字幕
|
亚洲综合一区国产精品
|
亚洲日韩国产成网在线观看
|
免费无码又爽又刺激高潮视频
|
亚洲AV无码成人精品区在线观看
|
免费国产a国产片高清
|