




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、深入理解查找(Search)功能及其扩展点查找功能是Eclipse中一个非常重要的特性,它提供了丰富的查找结果,人性化的结果展示,以及方便的定位,并可以查看查找历史记录(用户可以配置历史记录的个数)和使用上一次的条件重新运行查找功能。Eclipse3.4插件开发版本提供了四种查找功能,包括文件查找,任务查找,Java查找和插件查找,IBMRSA(RationalSoftwareArchitect)更是提供了多达八种的查找功能,因此,如何扩展Eclipse的查找功能,并实现特定于我们自己插件的查找功能,是插件开发者需要掌握的重要技能,本文将首先概要介绍Eclipse的查找功能;然后详细说明如何进
2、行扩展查找功能,包括需要使用的扩展点和涉及到的接口和函数;最后以一个实例的形式引导读者深入理解Eclipse的查找功能。引言查找功能是计算机语言开发环境/平台的一个非常重要的特性。Eclipse也不例外,它提供了丰富的查找功能(用户可以输入正则表达式或任意字符串,指定查找范围和匹配选项等等),并且提供了简单易用的接口方便开发人员扩展。Eclipse的查找功能是基于MVC设计模式架构的,因此如果读者先前对MVC模式了解的话,有助于读者理解Eclipse的查找框架。在Eclipse的开发平台中,通过快捷键CTRL+H或者Search菜单可以激活其查找功能,如图1为Eclipse3.4插件开发版本按
3、下快捷键时弹出的查找对话框(SearchDialog)。图1.Eclipse3.4版本的查找对话框如图2为IBMRSA7.5.2版本按下快捷键时弹出的查找对话框,提供了多大八种查找功能。图2.IBMRSA7.5.2版本的查找对话框总体而言,Eclipse中的查找功能由三部分组成:查找对话框、查找页面和查找结果集视图;下面分别就这三部分进行具体描述。查找对话框是Eclipse查找功能的入口,Eclipse中所有的查找功能都可以在该对话框中找到,如图1和图2显示了Eclipse和IBMRSA中的查找对话框。查找对话框中包含了当前Eclipse开发平台提供的所有查找页面,如果用户页面觉得页面太多,可
4、以通过Customize”按钮定制,只显示使用频率较高的查找页面,隐藏其它页面。虽然我们不能对这些页面排序,然而,Eclipse提供了相应的扩展点(Extensionpoint)让开发人员定制其查找页面的位置(通过tabPosition属性可以指定,下一节会进行详细介绍)。查找页面是查找功能的入口,提供了查找模式和条件等内容的输入界面GUI。在Eclipse中,为了保持查找功能的一致性,当我们的插件需要提供查找功能,通常会为其创建一个查找页面,并放在查找对话框里面。每一个查找功能对应有一个查找页面,用于接收用户进行查找的内容,范围等输入条件。如图3为ClearCase插件的查找页面。图3.Ec
5、lipse中ClearCase的查找页面作为一个完整的查找框架,还需要提供一个显示查找到结果集的界面。在Eclipse中,这个界面叫做查找结果集视图,它提供了丰富的工具栏和菜单,诸如上/下一个匹配项、重新查找、展开和收缩结果集等操作,并且可以根据查找结果的类型用相应的编辑器打开。Eclipse中,所有的查找功能共用一个视图,该视图提供两种显示方式:表格(TableViewer)和树状结构(TreeViewer)。查找结果视图的标题为Search”,如图4所示为作者使用Eclipse自带的文件查找搜索“*”的结果集视图。图4.Eclipse中显示查找结果的视图+回页首Eclipse查找功能的扩展
6、点由上一节我们可知,Eclipse的查找功能主要是由三部分组成:查找对话框、查找页面和查找结果集视图,至此,我们对Eclipse的查找功能有了感观的认识,本小节将从Eclipse提供的扩展点,函数,接口和类等方面详细说明Eclipse的查找功能。查找对话框/查找页面的扩展点如果我们想要插入一个查找页面到查找对话框中,那么需要添加扩展点org.eclipse.search.searchPages。该扩展点允许其他插件为特定的查找功能注册属于自己的查找页面。下面说明需要注意的扩展点的一些属性:id-查找页面的唯一标志。label-显示在查找对话框中页面的标题。class-创建查找页面显示的cont
7、rol的类,该类通常继承抽象类org.eclipse.jface.dialogs.DialogPage,并且实现接口org.eclipse.search.ui.ISearchPage。sizeHint-暗示该查找页面激活时的大小,其输入格式为width,height,如50,60。tabPosition-整形数字,表示该查找页面在查找对话框中显示的位置,查找对话框中包含一个TabFolder,TabFolder包含了若干个页面,如果该元素没有指定,那么Eclipse将按照这些页面标题的字母顺序进行排列。数字越小,其对应的页面越靠前。enabled-如果该属性没有指定或者为false,那么当用户
8、通过CTRL+H,或者search菜单激活查找对话框时,该页面不会自动显示,用户可以通过“Customize按钮手动显示该页面。canSearchEnclosingProjects和showScopeSection-如果这两个属性都设置为true,那么Eclipse会自动添加一个Scope到你的查找页面的最下面,如图5所示为File查找的Scope域,不需要用户单独创建该区域。图5.文件查找页面的Scope区域为了更好地说明如何使用该扩展点,举一个例子说明,如下为org.eclipse.search插件中的文件查找页面实现的扩展点代码,位于plugin.xml文件中。extensionpoin
9、t=org.eclipse.search.searchPages查找结果视图(SearchResultView)的扩展点对org.eclipse.search.searchPages扩展后,当我们按下查找(Search)按钮后,Eclipse的查找框架会激活查找结果集视图,那么如何让我们自己设计的界面显示在查找结果集视图中呢?答案很明显,通过添加org.eclipse.search.seacrhResultViewPages扩展点,填充相应的扩展点属性,便可以激活我们自己设计的界面,并用该界面显示查找到的匹配结果集。下面讲解扩展点seacrhResultViewPages中比较重要的一些属性。
10、searchResultClass-用于表示查找结果集的类,需要实现接口ISearchResult,由于实现该接口需要实现较多的方法,因此Eclipse提供了一个抽象类,用于表示文本查找的结果集,该抽象类(类名为AbstractTextSearchResult)实现了ISearchResult的大部分接口,如果我们实现的查找功能是文本查找,那么就可以继承该类,同时实现少量的方法即可,该类需要和类AbstractTextSearchViewPage同时使用class-用于显示查找结果的页面类,需要实现接口org.eclipse.search.ui.ISearchResultPage,由于实现该接
11、口需要实现较多的方法,因此Eclipse提供一个抽象类(类名为AbstractTextSearchViewPage)实现了该接口,该类主要用于显示文本查找的结果集。如果我们实现的查找功能是文本查找,那么只需继承该类并实现少量的方法即可。AbstractTextSearchViewPage和AbstractTextSearchResult通常一起使用,当然还需要用到Match类和MatchEvent等类,下小节将会详细说明。为了更好地说明如何使用该扩展点,举一个例子说明,如下为org.eclipse.search插件中的文件查找结果集视图实现的扩展点代码,位于plugin.xml文件中。exte
12、nsionid=FileSearchPagepoint=org.eclipse.search.searchResultviewPagesEclipse主菜单的查找(Search)菜单中加入你的菜单项对一些重要的查找功能,我们希望提供多种途径激活这些功能。如添加一个菜单项到查找(Search)主菜单中,如图6所示为文件查找的菜单项。图6.Eclipse自带文件查找的菜单那么如何添加我们自己的菜单项到Eclipse的查找主菜单中呢?答案是:添加org.eclipse.ui.actionSets扩展点,然后创建一个action,并且action的menuBarPath设置为org.eclipse.s
13、earch.menu/dialogGroup。为了更好地说明如何使用该扩展点,举一个例子说明,如下为创建一个”AmSearch”菜单项到Search主菜单中实现的扩展点代码,位于plugin.xml文件中。相关的函数、接口和类对查找结果集排序通常我们以表格(TableViewer)和树状结构(TreeViewer)显示匹配的结果集,因此,自然涉及到对结果集排序的问题。在Eclipse3.0版本之前,如果需要对查找结果集视图中的TableViewer或TreeViewer进行排序,则需要使用扩展点org.eclipse.search.searchResultSorters。但是,3.0以后的版本
14、不需要添加该扩展点,可以直接写代码对TableViewer或TreeViewer排序,只需继承org.eclipse.jface.viewers.ViewerSorter。下面给出了一个简单的排序类代码。如果想让下面代码工作,则需要设置该类为TableViewer的Sorter,通过调用函数setSorter方法实现。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),从而实现文本查找功能。如果我们也需要开发基于文本查找的功能,那么完全可以继承或使用这些类,否则,为了与Eclipse的查找框架保持一致和加强我们插件的可扩展性,建议大家也创建类似的类,并实现相应的功能。下面分别就这些类进行说明。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对象。因此,我们在开发查找功能时需要继承该类SearchResultEvent,提供我们的查找功能与该事件相关的对象,由org.eclipse.search.ui.ISearchResult激活该事件。一般而言,继承类会提供事件的类型(如增加,删除匹配项等),匹配的结果集(如包含Match的集合(Collection),可以参考MatchEvent和RemoveAllEvent类。org.eclipse.search.ui.ISearchResult接口该接口用于表示查找结果集。前面讲到的org.eclipse.search.searchPages扩展点的属性searchResultC
19、lass对应的类需要实现该接口。Eclipse提供的表示文本查找结果集的抽象类org.eclipse.search.ui.text.AbstractTextSearchResult实现了该接口。如果我们实现基于文本查找的功能,那么可以继承该类,实现少量的方法即可。一般而言,在实现该接口的继承类中会描述匹配结果集的结构,例如,包括了Match集合和org.eclipse.search.ui.lSearchResultListener(下面将会讲至U)集合等。org.eclipse.search.ui.ISearchResultListener接口该接口表示查找结果集发生变化的事件接口。当结果集发
20、生变化时,通知事件监听者(这里为查找结果集视图)作出相应的行为。该接口中提供了一个方法searchResultChanged,其参数为SearchResultEvent。就实现而言,我们可以让查找结果集视图实现该接口,并调用模型(Model,我们这里表现为ISearchResult)中的方法注册/注销该事件(继承方式),另外,我们也可以在查找结果集视图的构造函数中定义匿名类,实现该接口中的方法,同时调用模型中的方法注册/注销该匿名类事件(组合方式)。从大部分的实现方法来看,我们会使用后者(组合方式),因为该接口中只有一个方法,并且使用匿名类也更加灵活。Eclipse针对文本查找的结果集视图抽象
21、类org.eclipse.search.ui.text.AbstractTextSearchViewPage也是采用匿名类的方式。org.eclipse.search.ui.NewSearchUI类该类提供了访问Eclipse查找GUI的入口方法,它采用Facade设计模式。下面就该类中的一些重要函数进行说明。调用下面这个方法表示在当前的Page里激活查找结果集视图(searchresultview)。activateSearchResultview()调用下面这个方法表示发送cance命令到后台运行的query。cancelQuery(lSearchQueryquery)调用下面这个方法表示
22、获取当前的查找结果集视图。getSearchResultview()调用下面这个方法表示打开查找对话框,并激活由pageId指定的查找页。openSearchDialog(lworkbenchwindowwindow,Stringpageld)调用下面这些方法表示运行指定的query,可以在前台或者后台运行,此时Eclipse会启动一个job运行。runQueryInBackground(ISearchQueryquery)runQueryInBackground(ISearchQueryquery,ISearchResultViewPartview)runQueryInForeground(
23、IRunnableContextcontext,ISearchQueryquery)runQueryInForeground(IRunnableContextcontext,ISearchQueryquery,iSearchResultviewPartview)十回页首编程实践通过前两节的讲述,相信大家对Eclipse的查找框架已经很清楚了,下面将给出一个例子说明如何使用这些扩展点,如何实现接口和继承类,如何让我们的查找功能在Eclipse的查找框架下工作。首先,如图7给出了Eclipse查找框架的流程,本文将按照这个流程图中的步骤及其各个步骤涉及到的方法,接口和类,给出它们的代码框架,读者想
24、要让其运行,必须实现相应的方法,接口和类。图7.Eclipse查找框架的流程N用门输人或茹样杳找采件(SearchPayciftSi:1!)CTRI.-H.SeareliMenuN用门输人或茹样杳找采件(SearchPayciftSi:1!)CTRI.-H.SeareliMenu査找Joh虻炭cSloping)Jl;Jj.tlIjSearchButton/Enterf构ifiQuery.Jf启动Job执fli.Query)JfilISearchResultLidtener,姑黒童发生变化逐个冑找卩L甩的汀果集构造Match.并播人到结果集LSearchResiiLc)ifii活杏找結果集視图I
25、senrctiRjraulrPage)-i1:址ISeauhRcsiultListeoer,甘实现searchJesuIrfhangedfj宓ISearcliResnltFafiefcUJr5il査找纳果集发生为化,激沽TdbeViewer/TreeViewerIJLabeIProviJer,呈示唱九的匹配蛇果集开始阶段(弹出查找对话框)当用户按下Ctrl+H键,或者通过Eclipse的Search菜单选择相应的查找项(如果我们定义了自己的Action在Search菜单中),Eclipse将会弹出查找对话框。如果只需要Crtl+H激活查找对话框,那么添加searchPages扩展点,并填写相应
26、的属性,而不需要其他额外的代码,在查找对话框中就会有我们的查找页(还记得前面讲的searchPages扩展点的enable属性吗,如果该属性设为true,那么扩展的查找页将会出现在对话框中,否则将被隐藏,需要通过“Customize”按钮激活)。如果需要在search菜单中定义自己的菜单,那么首先添加actionSets扩展点,如下所示。然后再事件处理中通过NewSearchUI提供的openSearchDialog函数打开对话框,此时需要提供查找页的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);用户输入(查找页面)所有查找功能的输入都是在查找页面进行的,因此,我们需要使用search
28、Pages扩展点,提供自己的查找页面,从而在该页面内定制我们的GUI(如何摆放Widget,如何布局等等)。以下是扩展点的实现。下面分析ESearchPage的代码,该类继承DialogPage,并且实现ISearchPage接口。该类中,我们需要重载createControl方法,用于创建Widgets,布局我们的查找页面。通常,我们需要把当前用户的输入和选择保存到DialogSetting中,如果查找页面需要输入文本,那么我们可以定制历史输入的个数,该值通常为20(Eclipse文件查找)。需要注意:在createControl方法中,我们必须调用方法setControl来设置查找页面的上
29、层控件,否则的话,查找页面会创建失败(后面会给出失败的原因)。下面给出了该类的一些关键代码为参考之用。publicclassESearchPageextendsDialogPageimplementsISearchPageprivateISearchPageContainerfcontainer;/定义页面需要的controlpublicESearchPage()OverridepublicvoidcreateControl(Compositeparent)/创建显示在查找页面的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方法中调用Setting方法,那么查找页面的widgets将会创建失败,为什么呢?如果你单步跟踪调试,会发现类ernal.ui.SearchDialog中包含调用我们创建的查找页面代码,如下所示,从代码中可以看出,如果没有调用setControl方法,那么page.getControl()将返回Null值,故创建失败,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)当我们点击查找对话框中Search按钮,这时候会调用ESearchPage类中的performAction()方法。该方法将启动Job执行Query(实现了ISearchQuery的类),我们可以选择在前台还是后台运行(具体方法,可以参考上一节中NewSearchUI提供的静态方法)。一般而言,performAction方法首先调用函数activateSearchResultView()激活查找结
34、果视图,然后调用函数runQueryInBackground()运行指定的Query。上面讲到,在运行Query之前,通常会调用方法NewSearchUI.activateSearchResultView()激活查找结果视图(需要使用searchResultPages扩展点),此时仅仅是当前查找功能的结果集界面显示。查找结果视图继承Page类,并实现ISearchResultPage接口,下面分析该类中的一些关键代码。通常我们会在构造函数中定义ISearchResultListener,并提供相应的监听方法。在setInput方法中,需要根据当前显示在查找结果视图中的匹配结果集合和新的匹配结果
35、集合状态和值,注册或注销该事件。所有的匹配结果集合均通过调用查找结果集视图中TableViewer的内容提供者(ContentProvider)逐个插入到TableViewer中。getLabel()用于显示在TableViewer/TreeViewer上面的一个label的内容,通常用于显示查找到多少个匹配项。下面给出了部分关键代码,读者可以参考AbstractTextSearchViewPage类中的一些实现。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);查找(执行Query
39、)当调用runQuerylnBackground或runQuerylnForeground方法之后,Eclipse查找框架会启动一个Job运行我们定义的Query,该类是Eclipse查找框架中最主要的一个类之一,它定义了如何进行查找,同时把查找匹配项添加到ISearchResult,并且以友好的用户体验方式即progressMonitor显示目前查找的进度。该类提供了很多方法,例如,是否可以重新运行,是否可以在后台运行及显示进度的对话框的标题等等,下面给出类ESearchQuery的部分关键代码的实现。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);/在指定的范围逐个查找结果集,如果找到,添加到ISearchResult/其流程大致如下For()找到匹配项构造一个Match调用ISearchResult的函数添加该MatchMonitor.
42、work(1)catch(RuntimeExceptione)finallyif(monitor!=null)monitor.done();从上面的描述可知,在类ESearchQuery会调用ESearchResult类中的方法添加查找的匹配项,接下来将讲解查找结果类ESearchResult。EsearchResult类实现ISearchResult接口,用于保存查找到的匹配项。该类除了要实现最重要的两个方法,添加和删除ISearchResultListener方法外,同时需要定义添加匹配的结果集,删除结果集等方法。下面给出该类中的一些关键代码,其中添加匹配的结果集的方法addMatch,添
43、加传入的匹配项到匹配结果集合中,同时通知ISearchResultListener事件的监听者。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类即可。下面是一个简单的匹配类的实现EMatch类。publicclassEMatchEDataObjectfMatchElement;publicStringgetName()returnfMatchElement.getName();publicEMatch(EDataObjectmatchElement)fMat
46、chElement=matchElement;同时,在查找到匹配项,需要通知事件的监听者当前事件的类型(通常有三种:增加了匹配项,删除匹配项和清空匹配项),Eclipse查找框架提供了SearchResultEvent基类,文本查找定义了两个类:MatchEvent(包含增加和删除匹配项类型事件),RemoveAllEvent(清空匹配项事件)。通常在我们开始查找之前,发送清空匹配项类型事件,让查找结果集视图清空上一次的匹配项,然后再查找的过程,如果查找到匹配项,则发送增加匹配项事件,使查找结果集视图把该匹配项添加到界面上(TableViewer或TreeViewer)。这里不给出查找结果集事
47、件的关键代码,因为MatchEvent和RemoveAllEvent的源码已经很清晰,读者可以参考这两个类的实现。显示查找结果集前面在讲激活查找结果集视图的时候,已经说明在Eclipse的查找框架内,并不是通过TableViewer的setInput方法把匹配的结果集显示在Search视图中,而是通过TableViewer的add方法把匹配项添加到查找结果集视图中。具体而言,Eclipse查找框架会启动一个UIJob定时地把查找到的匹配项添加到Search视图中,这样可以增强用户体验。以AbstractTextSearchViewPage中的UpdateUIJob为例,其间隔时间为500毫秒。
48、通过调用runBatchedUpdates方法把当前查找到的匹配项添加到Search视图中,以下是其中的一些关键代码。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中的代码,该函数会调用elementsChanged函数触发TableViewer调用add方法,把相应的匹配项添加到TableViewer中,然后清除从需要更新的匹配项集合中删除,如下为其关键代码。privatesynchronizedvoidrunBatchedUpdates()elementsChanged(fBatchedUpdates.toArray();fBatchedU
51、pdates.clear();updateBusyLabel();前面讲到,runBatchedUpdates方法会将当前查找到的匹配项添加到Search视图中,那么如何获取当前查找到的匹配项呢?这就需要借助ISearchResultListener,即当前查找到的匹配项通过我们定义的事件监听函数获取,如下为定义查找结果集发生变化的类及其监听函数handleSearchResultChanged中的关键代码。我们注意到,MatchEvent中包含事件的类型和当前查找到的匹配项,如果当前事件为REMOVED_ALL类型,那么从查找结果视图中清除所有的匹配项。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();由于增加/删除匹配项设计GUI操作,因此我们需要启动UIJob运行,因此,runBatchedUpdates函数调用postUpdate函数启动Job,把匹配项显示到查找结果视图上。如下为postUpdate的一些关键代码。fBatchedUpdates);privatesynchronizedvoidpostUpdate(Matchmatches)fBatchedUpdates);evaluateChangedElements(matches,scheduleUlUpdate();普回页首总结至此为止,已经把Eclipse查找框架的流程及涉及到的类进行了详细的说明,相信读者
54、已经有清晰的认识了,但是,由于Eclipse中的所有查找功能都共用一个视图,导致这些查找功能不能同时使用,而且,有时候我们可能需要定义自己的查找结果集视图,那么Eclipse查找框架中的有些类就不能使用了,如ISearchQuery,此时,我们不能再给其查找框架了,但是,这个框架的思想我们可以借鉴,读者有兴趣的话,可以开发类似于Eclipse的查找框架,但是使用的是我们自己定义的查找结果集视图。下面给出如何使用自己的查找结果集视图显示匹配项的关键代码,其大致思想是新建一个Job,在Job运行时进行查找,并把查找的匹配项保存起来,待Job运行结束后,激活我们自定义的查找结果集视图,最后把结果集填
55、充到该视图中。提示:Eclipse查找功能是一个非常典型的MVC模式,设计我们自己的查找框架(SearchFramework)时,完全可以参考该模式,简洁方便。publicclassSearchJobextendsJobprotectedStringfJobName;protectedStringfTaskName;protectedIStatusrun(IProgressMonitormonitor)/查找代码,保存查找到的匹配项protectedvoidperformJobDone()/启动UI线程,激活查找结果视图,并填充匹配项到视图中publicSearchJob(Stringname)super(name);fJobName=name;this.a
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 班级纪律管理与执行措施计划
- 出售履带挂车合同样本
- 保温罐车销售合同样本
- 农药化肥合同标准文本
- 2025年小产权房购买合同范本
- 班级自我评估与反馈机制计划
- 关于店铺租赁合同样本
- 农村旧房买卖合同样本
- 出售股合同标准文本
- 冲锋舟租赁合同范例
- 2025年广东广州市高三一模英语试卷试题及答案
- 2025浙江嘉兴市桐乡市部分国有企业招聘员工41人笔试参考题库附带答案详解
- 2025年中国经纬仪行业市场调查研究及投资前景展望报告
- 施工现场临时用电施工方案
- 网络安全基本知识试题及答案
- 湖南省常德市2025届高三下学期模拟考试(二模)物理试卷(含答案)
- 甘肃省招聘卫生健康人才笔试真题2024
- 杭州2025年浙江杭州余杭区余杭街道招聘编外劳务派遣人员25人笔试历年参考题库附带答案详解
- 2024-2025学年度四川省达州市达川区铭仁园学校高一第二学期3月月考历史试题(含答案)
- 2025年全球美容与美容个护趋势报告:中国篇
- 大规模住区的物业管理创新模式研究
评论
0/150
提交评论