EclipsePlugin開(kāi)發(fā)深入理解查找Search功能及其擴(kuò)展點(diǎn)_第1頁(yè)
EclipsePlugin開(kāi)發(fā)深入理解查找Search功能及其擴(kuò)展點(diǎn)_第2頁(yè)
EclipsePlugin開(kāi)發(fā)深入理解查找Search功能及其擴(kuò)展點(diǎn)_第3頁(yè)
EclipsePlugin開(kāi)發(fā)深入理解查找Search功能及其擴(kuò)展點(diǎn)_第4頁(yè)
EclipsePlugin開(kāi)發(fā)深入理解查找Search功能及其擴(kuò)展點(diǎn)_第5頁(yè)
已閱讀5頁(yè),還剩21頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、深入理解查找(Search)功能及其擴(kuò)展點(diǎn)查找功能是Eclipse中一個(gè)非常重要的特性,它提供了豐富的查找結(jié)果,人性化的結(jié)果展示,以及方便的定位,并可以查看查找歷史記錄(用戶可以配置歷史記錄的個(gè)數(shù))和使用上一次的條件重新運(yùn)行查找功能。Eclipse3.4插件開(kāi)發(fā)版本提供了四種查找功能,包括文件查找,任務(wù)查找,Java查找和插件查找,IBMRSA(RationalSoftwareArchitect)更是提供了多達(dá)八種的查找功能,因此,如何擴(kuò)展Eclipse的查找功能,并實(shí)現(xiàn)特定于我們自己插件的查找功能,是插件開(kāi)發(fā)者需要掌握的重要技能,本文將首先概要介紹Eclipse的查找功能;然后詳細(xì)說(shuō)明如何進(jìn)

2、行擴(kuò)展查找功能,包括需要使用的擴(kuò)展點(diǎn)和涉及到的接口和函數(shù);最后以一個(gè)實(shí)例的形式引導(dǎo)讀者深入理解Eclipse的查找功能。引言查找功能是計(jì)算機(jī)語(yǔ)言開(kāi)發(fā)環(huán)境/平臺(tái)的一個(gè)非常重要的特性。Eclipse也不例外,它提供了豐富的查找功能(用戶可以輸入正則表達(dá)式或任意字符串,指定查找范圍和匹配選項(xiàng)等等),并且提供了簡(jiǎn)單易用的接口方便開(kāi)發(fā)人員擴(kuò)展。Eclipse的查找功能是基于MVC設(shè)計(jì)模式架構(gòu)的,因此如果讀者先前對(duì)MVC模式了解的話,有助于讀者理解Eclipse的查找框架。在Eclipse的開(kāi)發(fā)平臺(tái)中,通過(guò)快捷鍵CTRL+H或者Search菜單可以激活其查找功能,如圖1為Eclipse3.4插件開(kāi)發(fā)版本按

3、下快捷鍵時(shí)彈出的查找對(duì)話框(SearchDialog)。圖1.Eclipse3.4版本的查找對(duì)話框如圖2為IBMRSA7.5.2版本按下快捷鍵時(shí)彈出的查找對(duì)話框,提供了多大八種查找功能。圖2.IBMRSA7.5.2版本的查找對(duì)話框總體而言,Eclipse中的查找功能由三部分組成:查找對(duì)話框、查找頁(yè)面和查找結(jié)果集視圖;下面分別就這三部分進(jìn)行具體描述。查找對(duì)話框是Eclipse查找功能的入口,Eclipse中所有的查找功能都可以在該對(duì)話框中找到,如圖1和圖2顯示了Eclipse和IBMRSA中的查找對(duì)話框。查找對(duì)話框中包含了當(dāng)前Eclipse開(kāi)發(fā)平臺(tái)提供的所有查找頁(yè)面,如果用戶頁(yè)面覺(jué)得頁(yè)面太多,可

4、以通過(guò)Customize”按鈕定制,只顯示使用頻率較高的查找頁(yè)面,隱藏其它頁(yè)面。雖然我們不能對(duì)這些頁(yè)面排序,然而,Eclipse提供了相應(yīng)的擴(kuò)展點(diǎn)(Extensionpoint)讓開(kāi)發(fā)人員定制其查找頁(yè)面的位置(通過(guò)tabPosition屬性可以指定,下一節(jié)會(huì)進(jìn)行詳細(xì)介紹)。查找頁(yè)面是查找功能的入口,提供了查找模式和條件等內(nèi)容的輸入界面GUI。在Eclipse中,為了保持查找功能的一致性,當(dāng)我們的插件需要提供查找功能,通常會(huì)為其創(chuàng)建一個(gè)查找頁(yè)面,并放在查找對(duì)話框里面。每一個(gè)查找功能對(duì)應(yīng)有一個(gè)查找頁(yè)面,用于接收用戶進(jìn)行查找的內(nèi)容,范圍等輸入條件。如圖3為ClearCase插件的查找頁(yè)面。圖3.Ec

5、lipse中ClearCase的查找頁(yè)面作為一個(gè)完整的查找框架,還需要提供一個(gè)顯示查找到結(jié)果集的界面。在Eclipse中,這個(gè)界面叫做查找結(jié)果集視圖,它提供了豐富的工具欄和菜單,諸如上/下一個(gè)匹配項(xiàng)、重新查找、展開(kāi)和收縮結(jié)果集等操作,并且可以根據(jù)查找結(jié)果的類型用相應(yīng)的編輯器打開(kāi)。Eclipse中,所有的查找功能共用一個(gè)視圖,該視圖提供兩種顯示方式:表格(TableViewer)和樹(shù)狀結(jié)構(gòu)(TreeViewer)。查找結(jié)果視圖的標(biāo)題為Search”,如圖4所示為作者使用Eclipse自帶的文件查找搜索“*”的結(jié)果集視圖。圖4.Eclipse中顯示查找結(jié)果的視圖+回頁(yè)首Eclipse查找功能的擴(kuò)展

6、點(diǎn)由上一節(jié)我們可知,Eclipse的查找功能主要是由三部分組成:查找對(duì)話框、查找頁(yè)面和查找結(jié)果集視圖,至此,我們對(duì)Eclipse的查找功能有了感觀的認(rèn)識(shí),本小節(jié)將從Eclipse提供的擴(kuò)展點(diǎn),函數(shù),接口和類等方面詳細(xì)說(shuō)明Eclipse的查找功能。查找對(duì)話框/查找頁(yè)面的擴(kuò)展點(diǎn)如果我們想要插入一個(gè)查找頁(yè)面到查找對(duì)話框中,那么需要添加擴(kuò)展點(diǎn)org.eclipse.search.searchPages。該擴(kuò)展點(diǎn)允許其他插件為特定的查找功能注冊(cè)屬于自己的查找頁(yè)面。下面說(shuō)明需要注意的擴(kuò)展點(diǎn)的一些屬性:id-查找頁(yè)面的唯一標(biāo)志。label-顯示在查找對(duì)話框中頁(yè)面的標(biāo)題。class-創(chuàng)建查找頁(yè)面顯示的cont

7、rol的類,該類通常繼承抽象類org.eclipse.jface.dialogs.DialogPage,并且實(shí)現(xiàn)接口org.eclipse.search.ui.ISearchPage。sizeHint-暗示該查找頁(yè)面激活時(shí)的大小,其輸入格式為width,height,如50,60。tabPosition-整形數(shù)字,表示該查找頁(yè)面在查找對(duì)話框中顯示的位置,查找對(duì)話框中包含一個(gè)TabFolder,TabFolder包含了若干個(gè)頁(yè)面,如果該元素沒(méi)有指定,那么Eclipse將按照這些頁(yè)面標(biāo)題的字母順序進(jìn)行排列。數(shù)字越小,其對(duì)應(yīng)的頁(yè)面越靠前。enabled-如果該屬性沒(méi)有指定或者為false,那么當(dāng)用戶

8、通過(guò)CTRL+H,或者search菜單激活查找對(duì)話框時(shí),該頁(yè)面不會(huì)自動(dòng)顯示,用戶可以通過(guò)“Customize按鈕手動(dòng)顯示該頁(yè)面。canSearchEnclosingProjects和showScopeSection-如果這兩個(gè)屬性都設(shè)置為true,那么Eclipse會(huì)自動(dòng)添加一個(gè)Scope到你的查找頁(yè)面的最下面,如圖5所示為File查找的Scope域,不需要用戶單獨(dú)創(chuàng)建該區(qū)域。圖5.文件查找頁(yè)面的Scope區(qū)域?yàn)榱烁玫卣f(shuō)明如何使用該擴(kuò)展點(diǎn),舉一個(gè)例子說(shuō)明,如下為org.eclipse.search插件中的文件查找頁(yè)面實(shí)現(xiàn)的擴(kuò)展點(diǎn)代碼,位于plugin.xml文件中。extensionpoin

9、t=org.eclipse.search.searchPages查找結(jié)果視圖(SearchResultView)的擴(kuò)展點(diǎn)對(duì)org.eclipse.search.searchPages擴(kuò)展后,當(dāng)我們按下查找(Search)按鈕后,Eclipse的查找框架會(huì)激活查找結(jié)果集視圖,那么如何讓我們自己設(shè)計(jì)的界面顯示在查找結(jié)果集視圖中呢?答案很明顯,通過(guò)添加org.eclipse.search.seacrhResultViewPages擴(kuò)展點(diǎn),填充相應(yīng)的擴(kuò)展點(diǎn)屬性,便可以激活我們自己設(shè)計(jì)的界面,并用該界面顯示查找到的匹配結(jié)果集。下面講解擴(kuò)展點(diǎn)seacrhResultViewPages中比較重要的一些屬性。

10、searchResultClass-用于表示查找結(jié)果集的類,需要實(shí)現(xiàn)接口ISearchResult,由于實(shí)現(xiàn)該接口需要實(shí)現(xiàn)較多的方法,因此Eclipse提供了一個(gè)抽象類,用于表示文本查找的結(jié)果集,該抽象類(類名為AbstractTextSearchResult)實(shí)現(xiàn)了ISearchResult的大部分接口,如果我們實(shí)現(xiàn)的查找功能是文本查找,那么就可以繼承該類,同時(shí)實(shí)現(xiàn)少量的方法即可,該類需要和類AbstractTextSearchViewPage同時(shí)使用class-用于顯示查找結(jié)果的頁(yè)面類,需要實(shí)現(xiàn)接口org.eclipse.search.ui.ISearchResultPage,由于實(shí)現(xiàn)該接

11、口需要實(shí)現(xiàn)較多的方法,因此Eclipse提供一個(gè)抽象類(類名為AbstractTextSearchViewPage)實(shí)現(xiàn)了該接口,該類主要用于顯示文本查找的結(jié)果集。如果我們實(shí)現(xiàn)的查找功能是文本查找,那么只需繼承該類并實(shí)現(xiàn)少量的方法即可。AbstractTextSearchViewPage和AbstractTextSearchResult通常一起使用,當(dāng)然還需要用到Match類和MatchEvent等類,下小節(jié)將會(huì)詳細(xì)說(shuō)明。為了更好地說(shuō)明如何使用該擴(kuò)展點(diǎn),舉一個(gè)例子說(shuō)明,如下為org.eclipse.search插件中的文件查找結(jié)果集視圖實(shí)現(xiàn)的擴(kuò)展點(diǎn)代碼,位于plugin.xml文件中。exte

12、nsionid=FileSearchPagepoint=org.eclipse.search.searchResultviewPagesEclipse主菜單的查找(Search)菜單中加入你的菜單項(xiàng)對(duì)一些重要的查找功能,我們希望提供多種途徑激活這些功能。如添加一個(gè)菜單項(xiàng)到查找(Search)主菜單中,如圖6所示為文件查找的菜單項(xiàng)。圖6.Eclipse自帶文件查找的菜單那么如何添加我們自己的菜單項(xiàng)到Eclipse的查找主菜單中呢?答案是:添加org.eclipse.ui.actionSets擴(kuò)展點(diǎn),然后創(chuàng)建一個(gè)action,并且action的menuBarPath設(shè)置為org.eclipse.s

13、earch.menu/dialogGroup。為了更好地說(shuō)明如何使用該擴(kuò)展點(diǎn),舉一個(gè)例子說(shuō)明,如下為創(chuàng)建一個(gè)”AmSearch”菜單項(xiàng)到Search主菜單中實(shí)現(xiàn)的擴(kuò)展點(diǎn)代碼,位于plugin.xml文件中。相關(guān)的函數(shù)、接口和類對(duì)查找結(jié)果集排序通常我們以表格(TableViewer)和樹(shù)狀結(jié)構(gòu)(TreeViewer)顯示匹配的結(jié)果集,因此,自然涉及到對(duì)結(jié)果集排序的問(wèn)題。在Eclipse3.0版本之前,如果需要對(duì)查找結(jié)果集視圖中的TableViewer或TreeViewer進(jìn)行排序,則需要使用擴(kuò)展點(diǎn)org.eclipse.search.searchResultSorters。但是,3.0以后的版本

14、不需要添加該擴(kuò)展點(diǎn),可以直接寫(xiě)代碼對(duì)TableViewer或TreeViewer排序,只需繼承org.eclipse.jface.viewers.ViewerSorter。下面給出了一個(gè)簡(jiǎn)單的排序類代碼。如果想讓下面代碼工作,則需要設(shè)置該類為T(mén)ableViewer的Sorter,通過(guò)調(diào)用函數(shù)setSorter方法實(shí)現(xiàn)。publicclassESearchResultSorterextendsViewerSorterprivateintcolumnIndex=-1privateintdir=SWT.DOWN;publicBGSearchResultSorter(intcolumnIndex,in

15、tdir)super();this.columnIndex=columnIndex;this.dir=dir;publicintcompare(Viewerviewer,Objecte1,Objecte2)intreturnValue=0;If(0=columnIndex)returnValue=StringUtil.getCollator().compare(e1,e2);if(this.dir=SWT.DOWN)returnValue=returnValue*-1;returnreturnValue;Match和SearchResultEvent類Eclipse針對(duì)文本查找,除了提供前面講

16、到的AbstractTextSearchViewPage和AbstractTextSearchResult類外,還提供了配套的類Match,MatchEvent和RemoveAllEvent(均繼承類SearchResultEvent),從而實(shí)現(xiàn)文本查找功能。如果我們也需要開(kāi)發(fā)基于文本查找的功能,那么完全可以繼承或使用這些類,否則,為了與Eclipse的查找框架保持一致和加強(qiáng)我們插件的可擴(kuò)展性,建議大家也創(chuàng)建類似的類,并實(shí)現(xiàn)相應(yīng)的功能。下面分別就這些類進(jìn)行說(shuō)明。org.eclipse.search.ui.text.Match類該類用于表示查找過(guò)程中匹配的對(duì)象,是Eclipse為文本查找定義的M

17、atch類,該類包含匹配的元素(文件或資源等等),查找字符串在該元素中的起始偏移量(offset)和匹配長(zhǎng)度,如果我們的查找功能是基于文本的,那么可以繼承該類,否則,我們可以自己定義Match類(不用繼承該類)。org.eclipse.search.ui.SearchResultEvent類該類保存了提供給事件(Event)接收者需要的對(duì)象,例如,如果該事件為增加一個(gè)Match類對(duì)象,那么通過(guò)這個(gè)事件可以獲取該對(duì)象?;谖谋静檎业膬蓚€(gè)時(shí)間MatchEvent和RemoveAllEvent均繼承該類,其中MatchEvent類用于增加或刪除Match對(duì)象,RemoveAllEvent為刪除所有M

18、atch對(duì)象。因此,我們?cè)陂_(kāi)發(fā)查找功能時(shí)需要繼承該類SearchResultEvent,提供我們的查找功能與該事件相關(guān)的對(duì)象,由org.eclipse.search.ui.ISearchResult激活該事件。一般而言,繼承類會(huì)提供事件的類型(如增加,刪除匹配項(xiàng)等),匹配的結(jié)果集(如包含Match的集合(Collection),可以參考MatchEvent和RemoveAllEvent類。org.eclipse.search.ui.ISearchResult接口該接口用于表示查找結(jié)果集。前面講到的org.eclipse.search.searchPages擴(kuò)展點(diǎn)的屬性searchResultC

19、lass對(duì)應(yīng)的類需要實(shí)現(xiàn)該接口。Eclipse提供的表示文本查找結(jié)果集的抽象類org.eclipse.search.ui.text.AbstractTextSearchResult實(shí)現(xiàn)了該接口。如果我們實(shí)現(xiàn)基于文本查找的功能,那么可以繼承該類,實(shí)現(xiàn)少量的方法即可。一般而言,在實(shí)現(xiàn)該接口的繼承類中會(huì)描述匹配結(jié)果集的結(jié)構(gòu),例如,包括了Match集合和org.eclipse.search.ui.lSearchResultListener(下面將會(huì)講至U)集合等。org.eclipse.search.ui.ISearchResultListener接口該接口表示查找結(jié)果集發(fā)生變化的事件接口。當(dāng)結(jié)果集發(fā)

20、生變化時(shí),通知事件監(jiān)聽(tīng)者(這里為查找結(jié)果集視圖)作出相應(yīng)的行為。該接口中提供了一個(gè)方法searchResultChanged,其參數(shù)為SearchResultEvent。就實(shí)現(xiàn)而言,我們可以讓查找結(jié)果集視圖實(shí)現(xiàn)該接口,并調(diào)用模型(Model,我們這里表現(xiàn)為ISearchResult)中的方法注冊(cè)/注銷該事件(繼承方式),另外,我們也可以在查找結(jié)果集視圖的構(gòu)造函數(shù)中定義匿名類,實(shí)現(xiàn)該接口中的方法,同時(shí)調(diào)用模型中的方法注冊(cè)/注銷該匿名類事件(組合方式)。從大部分的實(shí)現(xiàn)方法來(lái)看,我們會(huì)使用后者(組合方式),因?yàn)樵摻涌谥兄挥幸粋€(gè)方法,并且使用匿名類也更加靈活。Eclipse針對(duì)文本查找的結(jié)果集視圖抽象

21、類org.eclipse.search.ui.text.AbstractTextSearchViewPage也是采用匿名類的方式。org.eclipse.search.ui.NewSearchUI類該類提供了訪問(wèn)Eclipse查找GUI的入口方法,它采用Facade設(shè)計(jì)模式。下面就該類中的一些重要函數(shù)進(jìn)行說(shuō)明。調(diào)用下面這個(gè)方法表示在當(dāng)前的Page里激活查找結(jié)果集視圖(searchresultview)。activateSearchResultview()調(diào)用下面這個(gè)方法表示發(fā)送cance命令到后臺(tái)運(yùn)行的query。cancelQuery(lSearchQueryquery)調(diào)用下面這個(gè)方法表示

22、獲取當(dāng)前的查找結(jié)果集視圖。getSearchResultview()調(diào)用下面這個(gè)方法表示打開(kāi)查找對(duì)話框,并激活由pageId指定的查找頁(yè)。openSearchDialog(lworkbenchwindowwindow,Stringpageld)調(diào)用下面這些方法表示運(yùn)行指定的query,可以在前臺(tái)或者后臺(tái)運(yùn)行,此時(shí)Eclipse會(huì)啟動(dòng)一個(gè)job運(yùn)行。runQueryInBackground(ISearchQueryquery)runQueryInBackground(ISearchQueryquery,ISearchResultViewPartview)runQueryInForeground(

23、IRunnableContextcontext,ISearchQueryquery)runQueryInForeground(IRunnableContextcontext,ISearchQueryquery,iSearchResultviewPartview)十回頁(yè)首編程實(shí)踐通過(guò)前兩節(jié)的講述,相信大家對(duì)Eclipse的查找框架已經(jīng)很清楚了,下面將給出一個(gè)例子說(shuō)明如何使用這些擴(kuò)展點(diǎn),如何實(shí)現(xiàn)接口和繼承類,如何讓我們的查找功能在Eclipse的查找框架下工作。首先,如圖7給出了Eclipse查找框架的流程,本文將按照這個(gè)流程圖中的步驟及其各個(gè)步驟涉及到的方法,接口和類,給出它們的代碼框架,讀者想

24、要讓其運(yùn)行,必須實(shí)現(xiàn)相應(yīng)的方法,接口和類。圖7.Eclipse查找框架的流程N(yùn)用門(mén)輸人或茹樣杳找采件(SearchPayciftSi:1!)CTRI.-H.SeareliMenuN用門(mén)輸人或茹樣杳找采件(SearchPayciftSi:1!)CTRI.-H.SeareliMenu査找Joh虻炭cSloping)Jl;Jj.tlIjSearchButton/Enterf構(gòu)ifiQuery.Jf啟動(dòng)Job執(zhí)fli.Query)JfilISearchResultLidtener,姑黒童發(fā)生變化逐個(gè)冑找卩L甩的汀果集構(gòu)造Match.并播人到結(jié)果集LSearchResiiLc)ifii活杏找結(jié)果集視圖I

25、senrctiRjraulrPage)-i1:址ISeauhRcsiultListeoer,甘實(shí)現(xiàn)searchJesuIrfhangedfj宓ISearcliResnltFafiefcUJr5il査找納果集發(fā)生為化,激沽TdbeViewer/TreeViewerIJLabeIProviJer,呈示唱九的匹配蛇果集開(kāi)始階段(彈出查找對(duì)話框)當(dāng)用戶按下Ctrl+H鍵,或者通過(guò)Eclipse的Search菜單選擇相應(yīng)的查找項(xiàng)(如果我們定義了自己的Action在Search菜單中),Eclipse將會(huì)彈出查找對(duì)話框。如果只需要Crtl+H激活查找對(duì)話框,那么添加searchPages擴(kuò)展點(diǎn),并填寫(xiě)相應(yīng)

26、的屬性,而不需要其他額外的代碼,在查找對(duì)話框中就會(huì)有我們的查找頁(yè)(還記得前面講的searchPages擴(kuò)展點(diǎn)的enable屬性嗎,如果該屬性設(shè)為true,那么擴(kuò)展的查找頁(yè)將會(huì)出現(xiàn)在對(duì)話框中,否則將被隱藏,需要通過(guò)“Customize”按鈕激活)。如果需要在search菜單中定義自己的菜單,那么首先添加actionSets擴(kuò)展點(diǎn),如下所示。然后再事件處理中通過(guò)NewSearchUI提供的openSearchDialog函數(shù)打開(kāi)對(duì)話框,此時(shí)需要提供查找頁(yè)的ID,這里我們定義為ESearchPage,后面將會(huì)講到。publicclassESearchHandlerimplementsiworkben

27、chwindowActionDelegateprivateIWorkbenchWindowfwindow;publicvoidinit(IWorkbenchWindowwindow)fWindow=window;publicvoidrun(IActionaction)if(fwindow=null|fwindow.getActivePage()=null)Activator.beepO;return;NewSearchUI.openSearchDialog(fwindow,ESearchPage.ID);用戶輸入(查找頁(yè)面)所有查找功能的輸入都是在查找頁(yè)面進(jìn)行的,因此,我們需要使用search

28、Pages擴(kuò)展點(diǎn),提供自己的查找頁(yè)面,從而在該頁(yè)面內(nèi)定制我們的GUI(如何擺放Widget,如何布局等等)。以下是擴(kuò)展點(diǎn)的實(shí)現(xiàn)。下面分析ESearchPage的代碼,該類繼承DialogPage,并且實(shí)現(xiàn)ISearchPage接口。該類中,我們需要重載createControl方法,用于創(chuàng)建Widgets,布局我們的查找頁(yè)面。通常,我們需要把當(dāng)前用戶的輸入和選擇保存到DialogSetting中,如果查找頁(yè)面需要輸入文本,那么我們可以定制歷史輸入的個(gè)數(shù),該值通常為20(Eclipse文件查找)。需要注意:在createControl方法中,我們必須調(diào)用方法setControl來(lái)設(shè)置查找頁(yè)面的上

29、層控件,否則的話,查找頁(yè)面會(huì)創(chuàng)建失?。ê竺鏁?huì)給出失敗的原因)。下面給出了該類的一些關(guān)鍵代碼為參考之用。publicclassESearchPageextendsDialogPageimplementsISearchPageprivateISearchPageContainerfcontainer;/定義頁(yè)面需要的controlpublicESearchPage()OverridepublicvoidcreateControl(Compositeparent)/創(chuàng)建顯示在查找頁(yè)面的controlsetControl(parent);publicbooleanperformAction()NewS

30、earchUI.activateSearchResultView();NewSearchUI.runQueryInBackground(getSearchQuery();returntrue;publicISearchQuerygetSearchQuery()returnnewESearchQuery(this.fPattern.getText().trim();protectedISearchPageContainergetContainer()returnthis.fContainer;publicvoidsetContainer(ISearchPageContainercontainer

31、)this.fContainer=container;前面講到,如果不在createControl方法中調(diào)用Setting方法,那么查找頁(yè)面的widgets將會(huì)創(chuàng)建失敗,為什么呢?如果你單步跟蹤調(diào)試,會(huì)發(fā)現(xiàn)類ernal.ui.SearchDialog中包含調(diào)用我們創(chuàng)建的查找頁(yè)面代碼,如下所示,從代碼中可以看出,如果沒(méi)有調(diào)用setControl方法,那么page.getControl()將返回Null值,故創(chuàng)建失敗,Eclipse將提示Thecreationofthepage.failed.錯(cuò)誤信息。privateControlcreatePageControl(Compositeparent,

32、finalSearchPageDescriptordescriptor)ISearchPagepage=descriptor.getPage();if(page=null|page.getControl()=null)Compositecontainer=newComposite(parent,SWT.none);Labellabel=newLabel(container,SWT.wrap);label.setText(Messages.format(SearchMessages.SearchDialog_error_pageCreationFailed,descriptor.getLabel

33、();container.setLayout(newGridLayout();label.setLayoutData(newGridData();returncontainer;查找入口(啟動(dòng)Job)當(dāng)我們點(diǎn)擊查找對(duì)話框中Search按鈕,這時(shí)候會(huì)調(diào)用ESearchPage類中的performAction()方法。該方法將啟動(dòng)Job執(zhí)行Query(實(shí)現(xiàn)了ISearchQuery的類),我們可以選擇在前臺(tái)還是后臺(tái)運(yùn)行(具體方法,可以參考上一節(jié)中NewSearchUI提供的靜態(tài)方法)。一般而言,performAction方法首先調(diào)用函數(shù)activateSearchResultView()激活查找結(jié)

34、果視圖,然后調(diào)用函數(shù)runQueryInBackground()運(yùn)行指定的Query。上面講到,在運(yùn)行Query之前,通常會(huì)調(diào)用方法NewSearchUI.activateSearchResultView()激活查找結(jié)果視圖(需要使用searchResultPages擴(kuò)展點(diǎn)),此時(shí)僅僅是當(dāng)前查找功能的結(jié)果集界面顯示。查找結(jié)果視圖繼承Page類,并實(shí)現(xiàn)ISearchResultPage接口,下面分析該類中的一些關(guān)鍵代碼。通常我們會(huì)在構(gòu)造函數(shù)中定義ISearchResultListener,并提供相應(yīng)的監(jiān)聽(tīng)方法。在setInput方法中,需要根據(jù)當(dāng)前顯示在查找結(jié)果視圖中的匹配結(jié)果集合和新的匹配結(jié)果

35、集合狀態(tài)和值,注冊(cè)或注銷該事件。所有的匹配結(jié)果集合均通過(guò)調(diào)用查找結(jié)果集視圖中TableViewer的內(nèi)容提供者(ContentProvider)逐個(gè)插入到TableViewer中。getLabel()用于顯示在TableViewer/TreeViewer上面的一個(gè)label的內(nèi)容,通常用于顯示查找到多少個(gè)匹配項(xiàng)。下面給出了部分關(guān)鍵代碼,讀者可以參考AbstractTextSearchViewPage類中的一些實(shí)現(xiàn)。publicclassESearchResultPageextendsPageimplementsISearchResultPageprivateTableViewerfTableV

36、iewer;protectedESearchResultfInput;protectedISearchResultViewPartfViewPart;protectedISearchResultListenerfListener;protectedStringfId;publicESearchResultPage()this.fListener=newISearchResultListener()publicvoidsearchResultChanged(SearchResultEvente)ESearchResultPage.this.handleSearchResultChanged(e)

37、;publicvoidcreateControl(Compositeparent)publicStringgetLabel()ESearchResultresult=getInput();if(result=null)return;returnresult.getLabel();publicvoidsetInput(ISearchResultsearch,ObjectuiState)ISearchResultoldSearch=(ISearchResult)this.fTableViewer.getInput();this.fTableViewer.setInput(null);if(oldS

38、earch!=null)oldSearch.removeListener(this.fListener);this.fInput=(ESearchResult)search);if(fInput!=null&fInput.getElements().size()0)search.addListener(this.fListener);this.fTableViewer.setInput(search);if(uiStateinstanceofISelection)this.fTableViewer.setSelection(ISelection)uiState,true);查找(執(zhí)行Query

39、)當(dāng)調(diào)用runQuerylnBackground或runQuerylnForeground方法之后,Eclipse查找框架會(huì)啟動(dòng)一個(gè)Job運(yùn)行我們定義的Query,該類是Eclipse查找框架中最主要的一個(gè)類之一,它定義了如何進(jìn)行查找,同時(shí)把查找匹配項(xiàng)添加到ISearchResult,并且以友好的用戶體驗(yàn)方式即progressMonitor顯示目前查找的進(jìn)度。該類提供了很多方法,例如,是否可以重新運(yùn)行,是否可以在后臺(tái)運(yùn)行及顯示進(jìn)度的對(duì)話框的標(biāo)題等等,下面給出類ESearchQuery的部分關(guān)鍵代碼的實(shí)現(xiàn)。publicclassESearchQueryimplementsiSearchQuery

40、ESearchResultfSearchResult;StringfPattern;publicESearchQuery(Stringpattern)this.fPattern=pattern;this.fSearchResult=ESearchResult.createInstance(this);this.fSearchResult=ESearchResult.createInstance(this);publicbooleancanRerun()returntrue;publicbooleancanRunInBackground()returntrue;publicStringgetLa

41、bel()returnExampleSearch;publicISearchResultgetSearchResult()returnfSearchResult;publicIStatusrun(IProgressMonitormonitor)throwsOperationCanceledExceptiontry/表明查找開(kāi)始monitor.beginTask(taskname,totalCount);/在指定的范圍逐個(gè)查找結(jié)果集,如果找到,添加到ISearchResult/其流程大致如下For()找到匹配項(xiàng)構(gòu)造一個(gè)Match調(diào)用ISearchResult的函數(shù)添加該MatchMonitor.

42、work(1)catch(RuntimeExceptione)finallyif(monitor!=null)monitor.done();從上面的描述可知,在類ESearchQuery會(huì)調(diào)用ESearchResult類中的方法添加查找的匹配項(xiàng),接下來(lái)將講解查找結(jié)果類ESearchResult。EsearchResult類實(shí)現(xiàn)ISearchResult接口,用于保存查找到的匹配項(xiàng)。該類除了要實(shí)現(xiàn)最重要的兩個(gè)方法,添加和刪除ISearchResultListener方法外,同時(shí)需要定義添加匹配的結(jié)果集,刪除結(jié)果集等方法。下面給出該類中的一些關(guān)鍵代碼,其中添加匹配的結(jié)果集的方法addMatch,添

43、加傳入的匹配項(xiàng)到匹配結(jié)果集合中,同時(shí)通知ISearchResultListener事件的監(jiān)聽(tīng)者。publicclassESearchResultimplementsISearchResultprotectedListelements;publicvoidaddMatch(Matchmatch)booleanhasAdded=false;synchronized(elements)hasAdded=doAddMatch(match);if(hasAdded)fireSearchResultEvent(ESearchResultEvent.ADDED,match)protectedvoidfire

44、SearchResultEvent(ESearchEventTypeeventType,EMatchmatch)ESearchResultEventevent=newESearchResultEvent(this,eventType);event.setMatche(match);for(Iteratore=this.searchResultsListeners.iterator();e.hasNext();)ISearchResultListenerlistener=(ISearchResultListener)e.next();listener.searchResultChanged(ev

45、ent);上面講到ESearchResult類包含了匹配項(xiàng)的集合,一般我們會(huì)定義一個(gè)用于保存匹配對(duì)象的類,如Eclipse中為文本查找的匹配項(xiàng)提供了Match類,該類定義了匹配項(xiàng)的偏移量,長(zhǎng)度,匹配的對(duì)象等等,如果我們的匹配項(xiàng)具有這些特征,那么可以繼承該類,否則新建一個(gè)Match類即可。下面是一個(gè)簡(jiǎn)單的匹配類的實(shí)現(xiàn)EMatch類。publicclassEMatchEDataObjectfMatchElement;publicStringgetName()returnfMatchElement.getName();publicEMatch(EDataObjectmatchElement)fMat

46、chElement=matchElement;同時(shí),在查找到匹配項(xiàng),需要通知事件的監(jiān)聽(tīng)者當(dāng)前事件的類型(通常有三種:增加了匹配項(xiàng),刪除匹配項(xiàng)和清空匹配項(xiàng)),Eclipse查找框架提供了SearchResultEvent基類,文本查找定義了兩個(gè)類:MatchEvent(包含增加和刪除匹配項(xiàng)類型事件),RemoveAllEvent(清空匹配項(xiàng)事件)。通常在我們開(kāi)始查找之前,發(fā)送清空匹配項(xiàng)類型事件,讓查找結(jié)果集視圖清空上一次的匹配項(xiàng),然后再查找的過(guò)程,如果查找到匹配項(xiàng),則發(fā)送增加匹配項(xiàng)事件,使查找結(jié)果集視圖把該匹配項(xiàng)添加到界面上(TableViewer或TreeViewer)。這里不給出查找結(jié)果集事

47、件的關(guān)鍵代碼,因?yàn)镸atchEvent和RemoveAllEvent的源碼已經(jīng)很清晰,讀者可以參考這兩個(gè)類的實(shí)現(xiàn)。顯示查找結(jié)果集前面在講激活查找結(jié)果集視圖的時(shí)候,已經(jīng)說(shuō)明在Eclipse的查找框架內(nèi),并不是通過(guò)TableViewer的setInput方法把匹配的結(jié)果集顯示在Search視圖中,而是通過(guò)TableViewer的add方法把匹配項(xiàng)添加到查找結(jié)果集視圖中。具體而言,Eclipse查找框架會(huì)啟動(dòng)一個(gè)UIJob定時(shí)地把查找到的匹配項(xiàng)添加到Search視圖中,這樣可以增強(qiáng)用戶體驗(yàn)。以AbstractTextSearchViewPage中的UpdateUIJob為例,其間隔時(shí)間為500毫秒。

48、通過(guò)調(diào)用runBatchedUpdates方法把當(dāng)前查找到的匹配項(xiàng)添加到Search視圖中,以下是其中的一些關(guān)鍵代碼。privateclassUpdateUIJobextendsUIJobpublicUpdateUIJob()super(updating);/$non-nls-1$setSystem(true);publicIStatusrunInUIThread(IProgressMonitormonitor)Controlcontrol=getControl();if(control=null|control.isDisposed()/disposedthecontrolwhiletheU

49、Iwasposted.returnStatus.OK_STATUS;runBatchedClear();runBatchedUpdates();if(hasMoreUpdates()|isQueryRunning()schedule(500);elsefIsUIUpdateScheduled=false;updateBusyLabel();if(fScheduleEnsureSelection)fScheduleEnsureSelection=false;AbstractSearchResultresult=getInput();if(result!=null&fViewer.getSelec

50、tion().isEmpty()navigateNext(true);fViewPart.updateLabel();returnStatus.OK_STATUS;下面我們分析一下runBatchedUpdates中的代碼,該函數(shù)會(huì)調(diào)用elementsChanged函數(shù)觸發(fā)TableViewer調(diào)用add方法,把相應(yīng)的匹配項(xiàng)添加到TableViewer中,然后清除從需要更新的匹配項(xiàng)集合中刪除,如下為其關(guān)鍵代碼。privatesynchronizedvoidrunBatchedUpdates()elementsChanged(fBatchedUpdates.toArray();fBatchedU

51、pdates.clear();updateBusyLabel();前面講到,runBatchedUpdates方法會(huì)將當(dāng)前查找到的匹配項(xiàng)添加到Search視圖中,那么如何獲取當(dāng)前查找到的匹配項(xiàng)呢?這就需要借助ISearchResultListener,即當(dāng)前查找到的匹配項(xiàng)通過(guò)我們定義的事件監(jiān)聽(tīng)函數(shù)獲取,如下為定義查找結(jié)果集發(fā)生變化的類及其監(jiān)聽(tīng)函數(shù)handleSearchResultChanged中的關(guān)鍵代碼。我們注意到,MatchEvent中包含事件的類型和當(dāng)前查找到的匹配項(xiàng),如果當(dāng)前事件為REMOVED_ALL類型,那么從查找結(jié)果視圖中清除所有的匹配項(xiàng)。fListener=newISearc

52、hResultListener()publicvoidsearchResultChanged(SearchResultEvente)handleSearchResultChanged(e);protectedvoidhandleSearchResultChanged(finalSearchResultEvente)if(einstanceofMatchEvent)MatchEventevent=(MatchEvent)e;if(event.getKind()=MatchEvent.REMOVED_ALL)postClear();elsepostUpdate(MatchEvent)e).getM

53、atches();由于增加/刪除匹配項(xiàng)設(shè)計(jì)GUI操作,因此我們需要啟動(dòng)UIJob運(yùn)行,因此,runBatchedUpdates函數(shù)調(diào)用postUpdate函數(shù)啟動(dòng)Job,把匹配項(xiàng)顯示到查找結(jié)果視圖上。如下為postUpdate的一些關(guān)鍵代碼。fBatchedUpdates);privatesynchronizedvoidpostUpdate(Matchmatches)fBatchedUpdates);evaluateChangedElements(matches,scheduleUlUpdate();普回頁(yè)首總結(jié)至此為止,已經(jīng)把Eclipse查找框架的流程及涉及到的類進(jìn)行了詳細(xì)的說(shuō)明,相信讀者

54、已經(jīng)有清晰的認(rèn)識(shí)了,但是,由于Eclipse中的所有查找功能都共用一個(gè)視圖,導(dǎo)致這些查找功能不能同時(shí)使用,而且,有時(shí)候我們可能需要定義自己的查找結(jié)果集視圖,那么Eclipse查找框架中的有些類就不能使用了,如ISearchQuery,此時(shí),我們不能再給其查找框架了,但是,這個(gè)框架的思想我們可以借鑒,讀者有興趣的話,可以開(kāi)發(fā)類似于Eclipse的查找框架,但是使用的是我們自己定義的查找結(jié)果集視圖。下面給出如何使用自己的查找結(jié)果集視圖顯示匹配項(xiàng)的關(guān)鍵代碼,其大致思想是新建一個(gè)Job,在Job運(yùn)行時(shí)進(jìn)行查找,并把查找的匹配項(xiàng)保存起來(lái),待Job運(yùn)行結(jié)束后,激活我們自定義的查找結(jié)果集視圖,最后把結(jié)果集填

55、充到該視圖中。提示:Eclipse查找功能是一個(gè)非常典型的MVC模式,設(shè)計(jì)我們自己的查找框架(SearchFramework)時(shí),完全可以參考該模式,簡(jiǎn)潔方便。publicclassSearchJobextendsJobprotectedStringfJobName;protectedStringfTaskName;protectedIStatusrun(IProgressMonitormonitor)/查找代碼,保存查找到的匹配項(xiàng)protectedvoidperformJobDone()/啟動(dòng)UI線程,激活查找結(jié)果視圖,并填充匹配項(xiàng)到視圖中publicSearchJob(Stringname)super(name);fJobName=name;this.a

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論