版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、深入理解查找(Search)功能及其擴(kuò)展點查找功能是Eclipse中一個非常重要的特性,它提供了豐富的查找結(jié)果,人性化的結(jié)果展示,以及方便的定位,并可以查看查找歷史記錄(用戶可以配置歷史記錄的個數(shù))和使用上一次的條件重新運行查找功能。Eclipse3.4插件開發(fā)版本提供了四種查找功能,包括文件查找,任務(wù)查找,Java查找和插件查找,IBMRSA(RationalSoftwareArchitect)更是提供了多達(dá)八種的查找功能,因此,如何擴(kuò)展Eclipse的查找功能,并實現(xiàn)特定于我們自己插件的查找功能,是插件開發(fā)者需要掌握的重要技能,本文將首先概要介紹Eclipse的查找功能;然后詳細(xì)說明如何進(jìn)
2、行擴(kuò)展查找功能,包括需要使用的擴(kuò)展點和涉及到的接口和函數(shù);最后以一個實例的形式引導(dǎo)讀者深入理解Eclipse的查找功能。引言查找功能是計算機(jī)語言開發(fā)環(huán)境/平臺的一個非常重要的特性。Eclipse也不例外,它提供了豐富的查找功能(用戶可以輸入正則表達(dá)式或任意字符串,指定查找范圍和匹配選項等等),并且提供了簡單易用的接口方便開發(fā)人員擴(kuò)展。Eclipse的查找功能是基于MVC設(shè)計模式架構(gòu)的,因此如果讀者先前對MVC模式了解的話,有助于讀者理解Eclipse的查找框架。在Eclipse的開發(fā)平臺中,通過快捷鍵CTRL+H或者Search菜單可以激活其查找功能,如圖1為Eclipse3.4插件開發(fā)版本按
3、下快捷鍵時彈出的查找對話框(SearchDialog)。圖1.Eclipse3.4版本的查找對話框如圖2為IBMRSA7.5.2版本按下快捷鍵時彈出的查找對話框,提供了多大八種查找功能。圖2.IBMRSA7.5.2版本的查找對話框總體而言,Eclipse中的查找功能由三部分組成:查找對話框、查找頁面和查找結(jié)果集視圖;下面分別就這三部分進(jìn)行具體描述。查找對話框是Eclipse查找功能的入口,Eclipse中所有的查找功能都可以在該對話框中找到,如圖1和圖2顯示了Eclipse和IBMRSA中的查找對話框。查找對話框中包含了當(dāng)前Eclipse開發(fā)平臺提供的所有查找頁面,如果用戶頁面覺得頁面太多,可
4、以通過Customize”按鈕定制,只顯示使用頻率較高的查找頁面,隱藏其它頁面。雖然我們不能對這些頁面排序,然而,Eclipse提供了相應(yīng)的擴(kuò)展點(Extensionpoint)讓開發(fā)人員定制其查找頁面的位置(通過tabPosition屬性可以指定,下一節(jié)會進(jìn)行詳細(xì)介紹)。查找頁面是查找功能的入口,提供了查找模式和條件等內(nèi)容的輸入界面GUI。在Eclipse中,為了保持查找功能的一致性,當(dāng)我們的插件需要提供查找功能,通常會為其創(chuàng)建一個查找頁面,并放在查找對話框里面。每一個查找功能對應(yīng)有一個查找頁面,用于接收用戶進(jìn)行查找的內(nèi)容,范圍等輸入條件。如圖3為ClearCase插件的查找頁面。圖3.Ec
5、lipse中ClearCase的查找頁面作為一個完整的查找框架,還需要提供一個顯示查找到結(jié)果集的界面。在Eclipse中,這個界面叫做查找結(jié)果集視圖,它提供了豐富的工具欄和菜單,諸如上/下一個匹配項、重新查找、展開和收縮結(jié)果集等操作,并且可以根據(jù)查找結(jié)果的類型用相應(yīng)的編輯器打開。Eclipse中,所有的查找功能共用一個視圖,該視圖提供兩種顯示方式:表格(TableViewer)和樹狀結(jié)構(gòu)(TreeViewer)。查找結(jié)果視圖的標(biāo)題為Search”,如圖4所示為作者使用Eclipse自帶的文件查找搜索“*”的結(jié)果集視圖。圖4.Eclipse中顯示查找結(jié)果的視圖+回頁首Eclipse查找功能的擴(kuò)展
6、點由上一節(jié)我們可知,Eclipse的查找功能主要是由三部分組成:查找對話框、查找頁面和查找結(jié)果集視圖,至此,我們對Eclipse的查找功能有了感觀的認(rèn)識,本小節(jié)將從Eclipse提供的擴(kuò)展點,函數(shù),接口和類等方面詳細(xì)說明Eclipse的查找功能。查找對話框/查找頁面的擴(kuò)展點如果我們想要插入一個查找頁面到查找對話框中,那么需要添加擴(kuò)展點org.eclipse.search.searchPages。該擴(kuò)展點允許其他插件為特定的查找功能注冊屬于自己的查找頁面。下面說明需要注意的擴(kuò)展點的一些屬性:id-查找頁面的唯一標(biāo)志。label-顯示在查找對話框中頁面的標(biāo)題。class-創(chuàng)建查找頁面顯示的cont
7、rol的類,該類通常繼承抽象類org.eclipse.jface.dialogs.DialogPage,并且實現(xiàn)接口org.eclipse.search.ui.ISearchPage。sizeHint-暗示該查找頁面激活時的大小,其輸入格式為width,height,如50,60。tabPosition-整形數(shù)字,表示該查找頁面在查找對話框中顯示的位置,查找對話框中包含一個TabFolder,TabFolder包含了若干個頁面,如果該元素沒有指定,那么Eclipse將按照這些頁面標(biāo)題的字母順序進(jìn)行排列。數(shù)字越小,其對應(yīng)的頁面越靠前。enabled-如果該屬性沒有指定或者為false,那么當(dāng)用戶
8、通過CTRL+H,或者search菜單激活查找對話框時,該頁面不會自動顯示,用戶可以通過“Customize按鈕手動顯示該頁面。canSearchEnclosingProjects和showScopeSection-如果這兩個屬性都設(shè)置為true,那么Eclipse會自動添加一個Scope到你的查找頁面的最下面,如圖5所示為File查找的Scope域,不需要用戶單獨創(chuàng)建該區(qū)域。圖5.文件查找頁面的Scope區(qū)域為了更好地說明如何使用該擴(kuò)展點,舉一個例子說明,如下為org.eclipse.search插件中的文件查找頁面實現(xiàn)的擴(kuò)展點代碼,位于plugin.xml文件中。extensionpoin
9、t=org.eclipse.search.searchPages查找結(jié)果視圖(SearchResultView)的擴(kuò)展點對org.eclipse.search.searchPages擴(kuò)展后,當(dāng)我們按下查找(Search)按鈕后,Eclipse的查找框架會激活查找結(jié)果集視圖,那么如何讓我們自己設(shè)計的界面顯示在查找結(jié)果集視圖中呢?答案很明顯,通過添加org.eclipse.search.seacrhResultViewPages擴(kuò)展點,填充相應(yīng)的擴(kuò)展點屬性,便可以激活我們自己設(shè)計的界面,并用該界面顯示查找到的匹配結(jié)果集。下面講解擴(kuò)展點seacrhResultViewPages中比較重要的一些屬性。
10、searchResultClass-用于表示查找結(jié)果集的類,需要實現(xiàn)接口ISearchResult,由于實現(xiàn)該接口需要實現(xiàn)較多的方法,因此Eclipse提供了一個抽象類,用于表示文本查找的結(jié)果集,該抽象類(類名為AbstractTextSearchResult)實現(xiàn)了ISearchResult的大部分接口,如果我們實現(xiàn)的查找功能是文本查找,那么就可以繼承該類,同時實現(xiàn)少量的方法即可,該類需要和類AbstractTextSearchViewPage同時使用class-用于顯示查找結(jié)果的頁面類,需要實現(xiàn)接口org.eclipse.search.ui.ISearchResultPage,由于實現(xiàn)該接
11、口需要實現(xiàn)較多的方法,因此Eclipse提供一個抽象類(類名為AbstractTextSearchViewPage)實現(xiàn)了該接口,該類主要用于顯示文本查找的結(jié)果集。如果我們實現(xiàn)的查找功能是文本查找,那么只需繼承該類并實現(xiàn)少量的方法即可。AbstractTextSearchViewPage和AbstractTextSearchResult通常一起使用,當(dāng)然還需要用到Match類和MatchEvent等類,下小節(jié)將會詳細(xì)說明。為了更好地說明如何使用該擴(kuò)展點,舉一個例子說明,如下為org.eclipse.search插件中的文件查找結(jié)果集視圖實現(xiàn)的擴(kuò)展點代碼,位于plugin.xml文件中。exte
12、nsionid=FileSearchPagepoint=org.eclipse.search.searchResultviewPagesEclipse主菜單的查找(Search)菜單中加入你的菜單項對一些重要的查找功能,我們希望提供多種途徑激活這些功能。如添加一個菜單項到查找(Search)主菜單中,如圖6所示為文件查找的菜單項。圖6.Eclipse自帶文件查找的菜單那么如何添加我們自己的菜單項到Eclipse的查找主菜單中呢?答案是:添加org.eclipse.ui.actionSets擴(kuò)展點,然后創(chuàng)建一個action,并且action的menuBarPath設(shè)置為org.eclipse.s
13、earch.menu/dialogGroup。為了更好地說明如何使用該擴(kuò)展點,舉一個例子說明,如下為創(chuàng)建一個”AmSearch”菜單項到Search主菜單中實現(xiàn)的擴(kuò)展點代碼,位于plugin.xml文件中。相關(guān)的函數(shù)、接口和類對查找結(jié)果集排序通常我們以表格(TableViewer)和樹狀結(jié)構(gòu)(TreeViewer)顯示匹配的結(jié)果集,因此,自然涉及到對結(jié)果集排序的問題。在Eclipse3.0版本之前,如果需要對查找結(jié)果集視圖中的TableViewer或TreeViewer進(jìn)行排序,則需要使用擴(kuò)展點org.eclipse.search.searchResultSorters。但是,3.0以后的版本
14、不需要添加該擴(kuò)展點,可以直接寫代碼對TableViewer或TreeViewer排序,只需繼承org.eclipse.jface.viewers.ViewerSorter。下面給出了一個簡單的排序類代碼。如果想讓下面代碼工作,則需要設(shè)置該類為TableViewer的Sorter,通過調(diào)用函數(shù)setSorter方法實現(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針對文本查找,除了提供前面講
16、到的AbstractTextSearchViewPage和AbstractTextSearchResult類外,還提供了配套的類Match,MatchEvent和RemoveAllEvent(均繼承類SearchResultEvent),從而實現(xiàn)文本查找功能。如果我們也需要開發(fā)基于文本查找的功能,那么完全可以繼承或使用這些類,否則,為了與Eclipse的查找框架保持一致和加強(qiáng)我們插件的可擴(kuò)展性,建議大家也創(chuàng)建類似的類,并實現(xiàn)相應(yīng)的功能。下面分別就這些類進(jìn)行說明。org.eclipse.search.ui.text.Match類該類用于表示查找過程中匹配的對象,是Eclipse為文本查找定義的M
17、atch類,該類包含匹配的元素(文件或資源等等),查找字符串在該元素中的起始偏移量(offset)和匹配長度,如果我們的查找功能是基于文本的,那么可以繼承該類,否則,我們可以自己定義Match類(不用繼承該類)。org.eclipse.search.ui.SearchResultEvent類該類保存了提供給事件(Event)接收者需要的對象,例如,如果該事件為增加一個Match類對象,那么通過這個事件可以獲取該對象?;谖谋静檎业膬蓚€時間MatchEvent和RemoveAllEvent均繼承該類,其中MatchEvent類用于增加或刪除Match對象,RemoveAllEvent為刪除所有M
18、atch對象。因此,我們在開發(fā)查找功能時需要繼承該類SearchResultEvent,提供我們的查找功能與該事件相關(guān)的對象,由org.eclipse.search.ui.ISearchResult激活該事件。一般而言,繼承類會提供事件的類型(如增加,刪除匹配項等),匹配的結(jié)果集(如包含Match的集合(Collection),可以參考MatchEvent和RemoveAllEvent類。org.eclipse.search.ui.ISearchResult接口該接口用于表示查找結(jié)果集。前面講到的org.eclipse.search.searchPages擴(kuò)展點的屬性searchResultC
19、lass對應(yīng)的類需要實現(xiàn)該接口。Eclipse提供的表示文本查找結(jié)果集的抽象類org.eclipse.search.ui.text.AbstractTextSearchResult實現(xiàn)了該接口。如果我們實現(xiàn)基于文本查找的功能,那么可以繼承該類,實現(xiàn)少量的方法即可。一般而言,在實現(xiàn)該接口的繼承類中會描述匹配結(jié)果集的結(jié)構(gòu),例如,包括了Match集合和org.eclipse.search.ui.lSearchResultListener(下面將會講至U)集合等。org.eclipse.search.ui.ISearchResultListener接口該接口表示查找結(jié)果集發(fā)生變化的事件接口。當(dāng)結(jié)果集發(fā)
20、生變化時,通知事件監(jiān)聽者(這里為查找結(jié)果集視圖)作出相應(yīng)的行為。該接口中提供了一個方法searchResultChanged,其參數(shù)為SearchResultEvent。就實現(xiàn)而言,我們可以讓查找結(jié)果集視圖實現(xiàn)該接口,并調(diào)用模型(Model,我們這里表現(xiàn)為ISearchResult)中的方法注冊/注銷該事件(繼承方式),另外,我們也可以在查找結(jié)果集視圖的構(gòu)造函數(shù)中定義匿名類,實現(xiàn)該接口中的方法,同時調(diào)用模型中的方法注冊/注銷該匿名類事件(組合方式)。從大部分的實現(xiàn)方法來看,我們會使用后者(組合方式),因為該接口中只有一個方法,并且使用匿名類也更加靈活。Eclipse針對文本查找的結(jié)果集視圖抽象
21、類org.eclipse.search.ui.text.AbstractTextSearchViewPage也是采用匿名類的方式。org.eclipse.search.ui.NewSearchUI類該類提供了訪問Eclipse查找GUI的入口方法,它采用Facade設(shè)計模式。下面就該類中的一些重要函數(shù)進(jìn)行說明。調(diào)用下面這個方法表示在當(dāng)前的Page里激活查找結(jié)果集視圖(searchresultview)。activateSearchResultview()調(diào)用下面這個方法表示發(fā)送cance命令到后臺運行的query。cancelQuery(lSearchQueryquery)調(diào)用下面這個方法表示
22、獲取當(dāng)前的查找結(jié)果集視圖。getSearchResultview()調(diào)用下面這個方法表示打開查找對話框,并激活由pageId指定的查找頁。openSearchDialog(lworkbenchwindowwindow,Stringpageld)調(diào)用下面這些方法表示運行指定的query,可以在前臺或者后臺運行,此時Eclipse會啟動一個job運行。runQueryInBackground(ISearchQueryquery)runQueryInBackground(ISearchQueryquery,ISearchResultViewPartview)runQueryInForeground(
23、IRunnableContextcontext,ISearchQueryquery)runQueryInForeground(IRunnableContextcontext,ISearchQueryquery,iSearchResultviewPartview)十回頁首編程實踐通過前兩節(jié)的講述,相信大家對Eclipse的查找框架已經(jīng)很清楚了,下面將給出一個例子說明如何使用這些擴(kuò)展點,如何實現(xiàn)接口和繼承類,如何讓我們的查找功能在Eclipse的查找框架下工作。首先,如圖7給出了Eclipse查找框架的流程,本文將按照這個流程圖中的步驟及其各個步驟涉及到的方法,接口和類,給出它們的代碼框架,讀者想
24、要讓其運行,必須實現(xiàn)相應(yīng)的方法,接口和類。圖7.Eclipse查找框架的流程N用門輸人或茹樣杳找采件(SearchPayciftSi:1!)CTRI.-H.SeareliMenuN用門輸人或茹樣杳找采件(SearchPayciftSi:1!)CTRI.-H.SeareliMenu査找Joh虻炭cSloping)Jl;Jj.tlIjSearchButton/Enterf構(gòu)ifiQuery.Jf啟動Job執(zhí)fli.Query)JfilISearchResultLidtener,姑黒童發(fā)生變化逐個冑找卩L甩的汀果集構(gòu)造Match.并播人到結(jié)果集LSearchResiiLc)ifii活杏找結(jié)果集視圖I
25、senrctiRjraulrPage)-i1:址ISeauhRcsiultListeoer,甘實現(xiàn)searchJesuIrfhangedfj宓ISearcliResnltFafiefcUJr5il査找納果集發(fā)生為化,激沽TdbeViewer/TreeViewerIJLabeIProviJer,呈示唱九的匹配蛇果集開始階段(彈出查找對話框)當(dāng)用戶按下Ctrl+H鍵,或者通過Eclipse的Search菜單選擇相應(yīng)的查找項(如果我們定義了自己的Action在Search菜單中),Eclipse將會彈出查找對話框。如果只需要Crtl+H激活查找對話框,那么添加searchPages擴(kuò)展點,并填寫相應(yīng)
26、的屬性,而不需要其他額外的代碼,在查找對話框中就會有我們的查找頁(還記得前面講的searchPages擴(kuò)展點的enable屬性嗎,如果該屬性設(shè)為true,那么擴(kuò)展的查找頁將會出現(xiàn)在對話框中,否則將被隱藏,需要通過“Customize”按鈕激活)。如果需要在search菜單中定義自己的菜單,那么首先添加actionSets擴(kuò)展點,如下所示。然后再事件處理中通過NewSearchUI提供的openSearchDialog函數(shù)打開對話框,此時需要提供查找頁的ID,這里我們定義為ESearchPage,后面將會講到。publicclassESearchHandlerimplementsiworkben
27、chwindowActionDelegateprivateIWorkbenchWindowfwindow;publicvoidinit(IWorkbenchWindowwindow)fWindow=window;publicvoidrun(IActionaction)if(fwindow=null|fwindow.getActivePage()=null)Activator.beepO;return;NewSearchUI.openSearchDialog(fwindow,ESearchPage.ID);用戶輸入(查找頁面)所有查找功能的輸入都是在查找頁面進(jìn)行的,因此,我們需要使用search
28、Pages擴(kuò)展點,提供自己的查找頁面,從而在該頁面內(nèi)定制我們的GUI(如何擺放Widget,如何布局等等)。以下是擴(kuò)展點的實現(xiàn)。下面分析ESearchPage的代碼,該類繼承DialogPage,并且實現(xiàn)ISearchPage接口。該類中,我們需要重載createControl方法,用于創(chuàng)建Widgets,布局我們的查找頁面。通常,我們需要把當(dāng)前用戶的輸入和選擇保存到DialogSetting中,如果查找頁面需要輸入文本,那么我們可以定制歷史輸入的個數(shù),該值通常為20(Eclipse文件查找)。需要注意:在createControl方法中,我們必須調(diào)用方法setControl來設(shè)置查找頁面的上
29、層控件,否則的話,查找頁面會創(chuàng)建失?。ê竺鏁o出失敗的原因)。下面給出了該類的一些關(guān)鍵代碼為參考之用。publicclassESearchPageextendsDialogPageimplementsISearchPageprivateISearchPageContainerfcontainer;/定義頁面需要的controlpublicESearchPage()OverridepublicvoidcreateControl(Compositeparent)/創(chuàng)建顯示在查找頁面的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方法,那么查找頁面的widgets將會創(chuàng)建失敗,為什么呢?如果你單步跟蹤調(diào)試,會發(fā)現(xiàn)類ernal.ui.SearchDialog中包含調(diào)用我們創(chuàng)建的查找頁面代碼,如下所示,從代碼中可以看出,如果沒有調(diào)用setControl方法,那么page.getControl()將返回Null值,故創(chuàng)建失敗,Eclipse將提示Thecreationofthepage.failed.錯誤信息。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;查找入口(啟動Job)當(dāng)我們點擊查找對話框中Search按鈕,這時候會調(diào)用ESearchPage類中的performAction()方法。該方法將啟動Job執(zhí)行Query(實現(xiàn)了ISearchQuery的類),我們可以選擇在前臺還是后臺運行(具體方法,可以參考上一節(jié)中NewSearchUI提供的靜態(tài)方法)。一般而言,performAction方法首先調(diào)用函數(shù)activateSearchResultView()激活查找結(jié)
34、果視圖,然后調(diào)用函數(shù)runQueryInBackground()運行指定的Query。上面講到,在運行Query之前,通常會調(diào)用方法NewSearchUI.activateSearchResultView()激活查找結(jié)果視圖(需要使用searchResultPages擴(kuò)展點),此時僅僅是當(dāng)前查找功能的結(jié)果集界面顯示。查找結(jié)果視圖繼承Page類,并實現(xiàn)ISearchResultPage接口,下面分析該類中的一些關(guān)鍵代碼。通常我們會在構(gòu)造函數(shù)中定義ISearchResultListener,并提供相應(yīng)的監(jiān)聽方法。在setInput方法中,需要根據(jù)當(dāng)前顯示在查找結(jié)果視圖中的匹配結(jié)果集合和新的匹配結(jié)果
35、集合狀態(tài)和值,注冊或注銷該事件。所有的匹配結(jié)果集合均通過調(diào)用查找結(jié)果集視圖中TableViewer的內(nèi)容提供者(ContentProvider)逐個插入到TableViewer中。getLabel()用于顯示在TableViewer/TreeViewer上面的一個label的內(nèi)容,通常用于顯示查找到多少個匹配項。下面給出了部分關(guān)鍵代碼,讀者可以參考AbstractTextSearchViewPage類中的一些實現(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查找框架會啟動一個Job運行我們定義的Query,該類是Eclipse查找框架中最主要的一個類之一,它定義了如何進(jìn)行查找,同時把查找匹配項添加到ISearchResult,并且以友好的用戶體驗方式即progressMonitor顯示目前查找的進(jìn)度。該類提供了很多方法,例如,是否可以重新運行,是否可以在后臺運行及顯示進(jìn)度的對話框的標(biāo)題等等,下面給出類ESearchQuery的部分關(guān)鍵代碼的實現(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/表明查找開始monitor.beginTask(taskname,totalCount);/在指定的范圍逐個查找結(jié)果集,如果找到,添加到ISearchResult/其流程大致如下For()找到匹配項構(gòu)造一個Match調(diào)用ISearchResult的函數(shù)添加該MatchMonitor.
42、work(1)catch(RuntimeExceptione)finallyif(monitor!=null)monitor.done();從上面的描述可知,在類ESearchQuery會調(diào)用ESearchResult類中的方法添加查找的匹配項,接下來將講解查找結(jié)果類ESearchResult。EsearchResult類實現(xiàn)ISearchResult接口,用于保存查找到的匹配項。該類除了要實現(xiàn)最重要的兩個方法,添加和刪除ISearchResultListener方法外,同時需要定義添加匹配的結(jié)果集,刪除結(jié)果集等方法。下面給出該類中的一些關(guān)鍵代碼,其中添加匹配的結(jié)果集的方法addMatch,添
43、加傳入的匹配項到匹配結(jié)果集合中,同時通知ISearchResultListener事件的監(jiān)聽者。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類包含了匹配項的集合,一般我們會定義一個用于保存匹配對象的類,如Eclipse中為文本查找的匹配項提供了Match類,該類定義了匹配項的偏移量,長度,匹配的對象等等,如果我們的匹配項具有這些特征,那么可以繼承該類,否則新建一個Match類即可。下面是一個簡單的匹配類的實現(xiàn)EMatch類。publicclassEMatchEDataObjectfMatchElement;publicStringgetName()returnfMatchElement.getName();publicEMatch(EDataObjectmatchElement)fMat
46、chElement=matchElement;同時,在查找到匹配項,需要通知事件的監(jiān)聽者當(dāng)前事件的類型(通常有三種:增加了匹配項,刪除匹配項和清空匹配項),Eclipse查找框架提供了SearchResultEvent基類,文本查找定義了兩個類:MatchEvent(包含增加和刪除匹配項類型事件),RemoveAllEvent(清空匹配項事件)。通常在我們開始查找之前,發(fā)送清空匹配項類型事件,讓查找結(jié)果集視圖清空上一次的匹配項,然后再查找的過程,如果查找到匹配項,則發(fā)送增加匹配項事件,使查找結(jié)果集視圖把該匹配項添加到界面上(TableViewer或TreeViewer)。這里不給出查找結(jié)果集事
47、件的關(guān)鍵代碼,因為MatchEvent和RemoveAllEvent的源碼已經(jīng)很清晰,讀者可以參考這兩個類的實現(xiàn)。顯示查找結(jié)果集前面在講激活查找結(jié)果集視圖的時候,已經(jīng)說明在Eclipse的查找框架內(nèi),并不是通過TableViewer的setInput方法把匹配的結(jié)果集顯示在Search視圖中,而是通過TableViewer的add方法把匹配項添加到查找結(jié)果集視圖中。具體而言,Eclipse查找框架會啟動一個UIJob定時地把查找到的匹配項添加到Search視圖中,這樣可以增強(qiáng)用戶體驗。以AbstractTextSearchViewPage中的UpdateUIJob為例,其間隔時間為500毫秒。
48、通過調(diào)用runBatchedUpdates方法把當(dā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ù)會調(diào)用elementsChanged函數(shù)觸發(fā)TableViewer調(diào)用add方法,把相應(yīng)的匹配項添加到TableViewer中,然后清除從需要更新的匹配項集合中刪除,如下為其關(guān)鍵代碼。privatesynchronizedvoidrunBatchedUpdates()elementsChanged(fBatchedUpdates.toArray();fBatchedU
51、pdates.clear();updateBusyLabel();前面講到,runBatchedUpdates方法會將當(dāng)前查找到的匹配項添加到Search視圖中,那么如何獲取當(dāng)前查找到的匹配項呢?這就需要借助ISearchResultListener,即當(dāng)前查找到的匹配項通過我們定義的事件監(jiān)聽函數(shù)獲取,如下為定義查找結(jié)果集發(fā)生變化的類及其監(jiān)聽函數(shù)handleSearchResultChanged中的關(guān)鍵代碼。我們注意到,MatchEvent中包含事件的類型和當(dāng)前查找到的匹配項,如果當(dāng)前事件為REMOVED_ALL類型,那么從查找結(jié)果視圖中清除所有的匹配項。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();由于增加/刪除匹配項設(shè)計GUI操作,因此我們需要啟動UIJob運行,因此,runBatchedUpdates函數(shù)調(diào)用postUpdate函數(shù)啟動Job,把匹配項顯示到查找結(jié)果視圖上。如下為postUpdate的一些關(guān)鍵代碼。fBatchedUpdates);privatesynchronizedvoidpostUpdate(Matchmatches)fBatchedUpdates);evaluateChangedElements(matches,scheduleUlUpdate();普回頁首總結(jié)至此為止,已經(jīng)把Eclipse查找框架的流程及涉及到的類進(jìn)行了詳細(xì)的說明,相信讀者
54、已經(jīng)有清晰的認(rèn)識了,但是,由于Eclipse中的所有查找功能都共用一個視圖,導(dǎo)致這些查找功能不能同時使用,而且,有時候我們可能需要定義自己的查找結(jié)果集視圖,那么Eclipse查找框架中的有些類就不能使用了,如ISearchQuery,此時,我們不能再給其查找框架了,但是,這個框架的思想我們可以借鑒,讀者有興趣的話,可以開發(fā)類似于Eclipse的查找框架,但是使用的是我們自己定義的查找結(jié)果集視圖。下面給出如何使用自己的查找結(jié)果集視圖顯示匹配項的關(guān)鍵代碼,其大致思想是新建一個Job,在Job運行時進(jìn)行查找,并把查找的匹配項保存起來,待Job運行結(jié)束后,激活我們自定義的查找結(jié)果集視圖,最后把結(jié)果集填
55、充到該視圖中。提示:Eclipse查找功能是一個非常典型的MVC模式,設(shè)計我們自己的查找框架(SearchFramework)時,完全可以參考該模式,簡潔方便。publicclassSearchJobextendsJobprotectedStringfJobName;protectedStringfTaskName;protectedIStatusrun(IProgressMonitormonitor)/查找代碼,保存查找到的匹配項protectedvoidperformJobDone()/啟動UI線程,激活查找結(jié)果視圖,并填充匹配項到視圖中publicSearchJob(Stringname)super(name);fJobName=name;this.a
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 燈具供應(yīng)協(xié)議
- 英文版設(shè)備采購合同
- 家居家具選購合同
- 質(zhì)量保證書質(zhì)量領(lǐng)先服務(wù)至上
- 聘用合同補(bǔ)充協(xié)議樣本
- 服務(wù)推廣合作合同書
- 招標(biāo)前期物業(yè)服務(wù)合同
- 專業(yè)會議服務(wù)合同范本
- 分包式清潔勞務(wù)分包合同
- 技術(shù)服務(wù)合同的技術(shù)合同權(quán)益保護(hù)措施
- 滁州鑫龍化工有限公司新建30000噸-年危險廢物綜合利用項目環(huán)境影響報告書
- 不同品系種豬的性能比較
- 人工鼻的護(hù)理
- GB/T 16552-2010珠寶玉石名稱
- 中國合唱歌曲精選100首
- GB/T 12668.2-2002調(diào)速電氣傳動系統(tǒng)第2部分:一般要求低壓交流變頻電氣傳動系統(tǒng)額定值的規(guī)定
- 2023年試驗員試題及答案
- 新外研版高二英語選擇性必修二unit6 PlanB life on Mars 課件
- 靜物攝影課件
- 口腔黏膜-2010唇舌疾病
- 《理論力學(xué)》期末考試試題及答案
評論
0/150
提交評論