Eclipse Plugin开发深入理解查找 Search 功能及其扩展点.docx
- 文档编号:6423570
- 上传时间:2023-01-06
- 格式:DOCX
- 页数:26
- 大小:124.31KB
Eclipse Plugin开发深入理解查找 Search 功能及其扩展点.docx
《Eclipse Plugin开发深入理解查找 Search 功能及其扩展点.docx》由会员分享,可在线阅读,更多相关《Eclipse Plugin开发深入理解查找 Search 功能及其扩展点.docx(26页珍藏版)》请在冰豆网上搜索。
EclipsePlugin开发深入理解查找Search功能及其扩展点
深入理解查找(Search)功能及其扩展点
查找功能是Eclipse中一个非常重要的特性,它提供了丰富的查找结果,人性化的结果展示,以及方便的定位,并可以查看查找历史记录(用户可以配置历史记录的个数)和使用上一次的条件重新运行查找功能。
Eclipse3.4插件开发版本提供了四种查找功能,包括文件查找,任务查找,Java查找和插件查找,IBMRSA(RationalSoftwareArchitect)更是提供了多达八种的查找功能,因此,如何扩展Eclipse的查找功能,并实现特定于我们自己插件的查找功能,是插件开发者需要掌握的重要技能,本文将首先概要介绍Eclipse的查找功能;然后详细说明如何进行扩展查找功能,包括需要使用的扩展点和涉及到的接口和函数;最后以一个实例的形式引导读者深入理解Eclipse的查找功能。
引言
查找功能是计算机语言开发环境/平台的一个非常重要的特性。
Eclipse也不例外,它提供了丰富的查找功能(用户可以输入正则表达式或任意字符串,指定查找范围和匹配选项等等),并且提供了简单易用的接口方便开发人员扩展。
Eclipse的查找功能是基于MVC设计模式架构的,因此如果读者先前对MVC模式了解的话,有助于读者理解Eclipse的查找框架。
在Eclipse的开发平台中,通过快捷键CTRL+H或者Search菜单可以激活其查找功能,如图1为Eclipse3.4插件开发版本按下快捷键时弹出的查找对话框(SearchDialog)。
图1.Eclipse3.4版本的查找对话框
如图2为IBMRSA7.5.2版本按下快捷键时弹出的查找对话框,提供了多大八种查找功能。
图2.IBMRSA7.5.2版本的查找对话框
总体而言,Eclipse中的查找功能由三部分组成:
查找对话框、查找页面和查找结果集视图;下面分别就这三部分进行具体描述。
查找对话框是Eclipse查找功能的入口,Eclipse中所有的查找功能都可以在该对话框中找到,如图1和图2显示了Eclipse和IBMRSA中的查找对话框。
查找对话框中包含了当前Eclipse开发平台提供的所有查找页面,如果用户页面觉得页面太多,可以通过“Customize…”按钮定制,只显示使用频率较高的查找页面,隐藏其它页面。
虽然我们不能对这些页面排序,然而,Eclipse提供了相应的扩展点(Extensionpoint)让开发人员定制其查找页面的位置(通过tabPosition属性可以指定,下一节会进行详细介绍)。
查找页面是查找功能的入口,提供了查找模式和条件等内容的输入界面GUI。
在Eclipse中,为了保持查找功能的一致性,当我们的插件需要提供查找功能,通常会为其创建一个查找页面,并放在查找对话框里面。
每一个查找功能对应有一个查找页面,用于接收用户进行查找的内容,范围等输入条件。
如图3为ClearCase插件的查找页面。
图3.Eclipse中ClearCase的查找页面
作为一个完整的查找框架,还需要提供一个显示查找到结果集的界面。
在Eclipse中,这个界面叫做查找结果集视图,它提供了丰富的工具栏和菜单,诸如上/下一个匹配项、重新查找、展开和收缩结果集等操作,并且可以根据查找结果的类型用相应的编辑器打开。
Eclipse中,所有的查找功能共用一个视图,该视图提供两种显示方式:
表格(TableViewer)和树状结构(TreeViewer)。
查找结果视图的标题为“Search”,如图4所示为作者使用Eclipse自带的文件查找搜索“*”的结果集视图。
图4.Eclipse中显示查找结果的视图
回页首
Eclipse查找功能的扩展点
由上一节我们可知,Eclipse的查找功能主要是由三部分组成:
查找对话框、查找页面和查找结果集视图,至此,我们对Eclipse的查找功能有了感观的认识,本小节将从Eclipse提供的扩展点,函数,接口和类等方面详细说明Eclipse的查找功能。
查找对话框/查找页面的扩展点
如果我们想要插入一个查找页面到查找对话框中,那么需要添加扩展点org.eclipse.search.searchPages。
该扩展点允许其他插件为特定的查找功能注册属于自己的查找页面。
下面说明需要注意的扩展点的一些属性:
∙id–查找页面的唯一标志。
∙label–显示在查找对话框中页面的标题。
∙class–创建查找页面显示的control的类,该类通常继承抽象类org.eclipse.jface.dialogs.DialogPage,并且实现接口org.eclipse.search.ui.ISearchPage。
∙sizeHint–暗示该查找页面激活时的大小,其输入格式为"width,height",如"50,60"。
∙tabPosition–整形数字,表示该查找页面在查找对话框中显示的位置,查找对话框中包含一个TabFolder,TabFolder包含了若干个页面,如果该元素没有指定,那么Eclipse将按照这些页面标题的字母顺序进行排列。
数字越小,其对应的页面越靠前。
∙enabled–如果该属性没有指定或者为false,那么当用户通过CTRL+H,或者search菜单激活查找对话框时,该页面不会自动显示,用户可以通过“Customize”按钮手动显示该页面。
∙canSearchEnclosingProjects和showScopeSection–如果这两个属性都设置为true,那么Eclipse会自动添加一个Scope到你的查找页面的最下面,如图5所示为File查找的Scope域,不需要用户单独创建该区域。
图5.文件查找页面的Scope区域
为了更好地说明如何使用该扩展点,举一个例子说明,如下为org.eclipse.search插件中的文件查找页面实现的扩展点代码,位于plugin.xml文件中。
id="org.eclipse.search.internal.ui.text.TextSearchPage" label="%fileSearch" icon="$nl$/icons/full/elcl16/tsearch_obj.gif" sizeHint="250,160" tabPosition="1" extensions="*: 1" showScopeSection="true" canSearchEnclosingProjects="true" class="org.eclipse.search.internal.ui.text.TextSearchPage">
查找结果视图(SearchResultView)的扩展点
对org.eclipse.search.searchPages扩展后,当我们按下查找(Search)按钮后,Eclipse的查找框架会激活查找结果集视图,那么如何让我们自己设计的界面显示在查找结果集视图中呢?
答案很明显,通过添加org.eclipse.search.seacrhResultViewPages扩展点,填充相应的扩展点属性,便可以激活我们自己设计的界面,并用该界面显示查找到的匹配结果集。
下面讲解扩展点seacrhResultViewPages中比较重要的一些属性。
∙searchResultClass–用于表示查找结果集的类,需要实现接口ISearchResult,由于实现该接口需要实现较多的方法,因此Eclipse提供了一个抽象类,用于表示文本查找的结果集,该抽象类(类名为AbstractTextSearchResult)实现了ISearchResult的大部分接口,如果我们实现的查找功能是文本查找,那么就可以继承该类,同时实现少量的方法即可,该类需要和类AbstractTextSearchViewPage同时使用
∙class-用于显示查找结果的页面类,需要实现接口org.eclipse.search.ui.ISearchResultPage,由于实现该接口需要实现较多的方法,因此Eclipse提供一个抽象类(类名为AbstractTextSearchViewPage)实现了该接口,该类主要用于显示文本查找的结果集。
如果我们实现的查找功能是文本查找,那么只需继承该类并实现少量的方法即可。
AbstractTextSearchViewPage和AbstractTextSearchResult通常一起使用,当然还需要用到Match类和MatchEvent等类,下小节将会详细说明。
为了更好地说明如何使用该扩展点,举一个例子说明,如下为org.eclipse.search插件中的文件查找结果集视图实现的扩展点代码,位于plugin.xml文件中。
id="FileSearchPage" point="org.eclipse.search.searchResultViewPages"> id="org.eclipse.search.text.FileSearchResultPage" searchResultClass="org.eclipse.search.internal.ui.text.FileSearchResult" helpContextId="org.eclipse.search.file_search_result_page" class="org.eclipse.search.internal.ui.text.FileSearchPage">
Eclipse主菜单的查找(Search)菜单中加入你的菜单项
对一些重要的查找功能,我们希望提供多种途径激活这些功能。
如添加一个菜单项到查找(Search)主菜单中,如图6所示为文件查找的菜单项。
图6.Eclipse自带文件查找的菜单
那么如何添加我们自己的菜单项到Eclipse的查找主菜单中呢?
答案是:
添加org.eclipse.ui.actionSets扩展点,然后创建一个action,并且action的menuBarPath设置为org.eclipse.search.menu/dialogGroup。
为了更好地说明如何使用该扩展点,举一个例子说明,如下为创建一个”AmSearch…”菜单项到Search主菜单中实现的扩展点代码,位于plugin.xml文件中。
point="org.eclipse.ui.actionSets"> id="org.eclipse.am.ui.workbenchActionSet" label="%actionSet.am.label" visible="true"> class="org.eclipse.am.ui.handlers.ESearchHandler" definitionId="mands.ESearch" icon="icons/Search.gif" id="mands.BGSearch" label="AMSearch…" menubarPath="org.eclipse.search.menu/dialogGroup" style="push">
相关的函数、接口和类
对查找结果集排序
通常我们以表格(TableViewer)和树状结构(TreeViewer)显示匹配的结果集,因此,自然涉及到对结果集排序的问题。
在Eclipse3.0版本之前,如果需要对查找结果集视图中的TableViewer或TreeViewer进行排序,则需要使用扩展点org.eclipse.search.searchResultSorters。
但是,3.0以后的版本不需要添加该扩展点,可以直接写代码对TableViewer或TreeViewer排序,只需继承org.eclipse.jface.viewers.ViewerSorter。
下面给出了一个简单的排序类代码。
如果想让下面代码工作,则需要设置该类为TableViewer的Sorter,通过调用函数setSorter方法实现。
publicclassESearchResultSorterextendsViewerSorter{
privateintcolumnIndex=-1
privateintdir=SWT.DOWN;
publicBGSearchResultSorter(intcolumnIndex,intdir){
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针对文本查找,除了提供前面讲到的AbstractTextSearchViewPage和AbstractTextSearchResult类外,还提供了配套的类Match,MatchEvent和RemoveAllEvent(均继承类SearchResultEvent),从而实现文本查找功能。
如果我们也需要开发基于文本查找的功能,那么完全可以继承或使用这些类,否则,为了与Eclipse的查找框架保持一致和加强我们插件的可扩展性,建议大家也创建类似的类,并实现相应的功能。
下面分别就这些类进行说明。
1.org.eclipse.search.ui.text.Match类
该类用于表示查找过程中匹配的对象,是Eclipse为文本查找定义的Match类,该类包含匹配的元素(文件或资源等等),查找字符串在该元素中的起始偏移量(offset)和匹配长度,如果我们的查找功能是基于文本的,那么可以继承该类,否则,我们可以自己定义Match类(不用继承该类)。
2.org.eclipse.search.ui.SearchResultEvent类
该类保存了提供给事件(Event)接收者需要的对象,例如,如果该事件为增加一个Match类对象,那么通过这个事件可以获取该对象。
基于文本查找的两个时间MatchEvent和RemoveAllEvent均继承该类,其中MatchEvent类用于增加或删除Match对象,RemoveAllEvent为删除所有Match对象。
因此,我们在开发查找功能时需要继承该类SearchResultEvent,提供我们的查找功能与该事件相关的对象,由org.eclipse.search.ui.ISearchResult激活该事件。
一般而言,继承类会提供事件的类型(如增加,删除匹配项等),匹配的结果集(如包含Match的集合(Collection)),可以参考MatchEvent和RemoveAllEvent类。
3.org.eclipse.search.ui.ISearchResult接口
该接口用于表示查找结果集。
前面讲到的org.eclipse.search.searchPages扩展点的属性searchResultClass对应的类需要实现该接口。
Eclipse提供的表示文本查找结果集的抽象类org.eclipse.search.ui.text.AbstractTextSearchResult实现了该接口。
如果我们实现基于文本查找的功能,那么可以继承该类,实现少量的方法即可。
一般而言,在实现该接口的继承类中会描述匹配结果集的结构,例如,包括了Match集合和org.eclipse.search.ui.ISearchResultListener(下面将会讲到)集合等。
4.org.eclipse.search.ui.ISearchResultListener接口
该接口表示查找结果集发生变化的事件接口。
当结果集发生变化时,通知事件监听者(这里为查找结果集视图)作出相应的行为。
该接口中提供了一个方法searchResultChanged,其参数为SearchResultEvent。
就实现而言,我们可以让查找结果集视图实现该接口,并调用模型(Model,我们这里表现为ISearchResult)中的方法注册/注销该事件(继承方式),另外,我们也可以在查找结果集视图的构造函数中定义匿名类,实现该接口中的方法,同时调用模型中的方法注册/注销该匿名类事件(组合方式)。
从大部分的实现方法来看,我们会使用后者(组合方式),因为该接口中只有一个方法,并且使用匿名类也更加灵活。
Eclipse针对文本查找的结果集视图抽象类org.eclipse.search.ui.text.AbstractTextSearchViewPage也是采用匿名类的方式。
5.org.eclipse.search.ui.NewSearchUI类
该类提供了访问Eclipse查找GUI的入口方法,它采用Facade设计模式。
下面就该类中的一些重要函数进行说明。
调用下面这个方法表示在当前的Page里激活查找结果集视图(searchresultview)。
activateSearchResultView()
调用下面这个方法表示发送‘cancel’命令到后台运行的query。
cancelQuery(ISearchQueryquery)
调用下面这个方法表示获取当前的查找结果集视图。
getSearchResultView()
调用下面这个方法表示打开查找对话框,并激活由pageId指定的查找页。
openSearchDialog(IWorkbenchWindowwindow,StringpageId)
调用下面这些方法表示运行指定的query,可以在前台或者后台运行,此时Eclipse会启动一个job运行。
runQueryInBackground(ISearchQueryquery)
runQueryInBackground(ISearchQueryquery,ISearchResultViewPartview)
runQueryInForeground(IRunnableContextcontext,ISearchQueryquery)
runQueryInForeground(IRunnableContextcontext,ISearchQueryquery,
ISearchResultViewPartview)
回页首
编程实践
通过前两节的讲述,相信大家对Eclipse的查找框架已经很清楚了,下面将给出一个例子说明如何使用这些扩展点,如何实现接口和继承类,如何让我们的查找功能在Eclipse的查找框架下工作。
首先,如图7给出了Eclipse查找框架的流程,本文将按照这个流程图中的步骤及其各个步骤涉及到的方法,接口和类,给出它们的代码框架,读者想要让其运行,必须实现相应的方法,接口和类。
图7.Eclipse查找框架的流程
开始阶段(弹出查找对话框)
当用户按下Ctrl+H键,或者通过Eclipse的Search菜单选择相应的查找项(如果我们定义了自己的Action在Search菜单中),Eclipse将会弹出查找对话框。
如果只需要Crtl+H激活查找对话框,那么添加searchPages扩展点,并填写相应的属性,而不需要其他额外的代码,在查找对话框中就会有我们的查找页(还记得前面讲的searchPages扩展点的enable属性吗,如果该属性设为true,那么扩展的查找页将会出现在对话框中,否则将被隐藏,需要通过“Customize…”按钮激活)。
如果需要在search菜单中定义自己的菜单,那么首先添加actionSets扩展点,如下所示。
point="org.eclipse.ui.actionSets"> id="com.ibm.bg.ui.workbenchActionSet" label="Example" visible="true"> class="com.ibm.bg.ui.handlers.ESearchHandler" definitionId="mands.ESearch" icon="icons/lookup_criteria.gif" id="mands.ESearch" label="ESearch" menubarPath="org.eclipse.search.menu/dialogGroup" style="push">
然后再事件处理中通过NewSearchUI提供的openSearchDialog函数打开对话框,此时需要提供查找页的ID,这里我们定义为ESearchPage,后面将会讲到。
publicclassESearchHandlerimplementsIWorkbenchWindowActionDelegate{
privateIWorkbenchWindowfWindow;
publicvoidinit(IWorkbenchWindowwindow){
fWindow=
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Eclipse Plugin开发深入理解查找 Search 功能及其扩展点 Plugin 开发 深入 理解 查找 功能 及其 扩展