Eclipse Plugin开发深入理解查找 Search 功能及其扩展点Word格式.docx
- 文档编号:19436177
- 上传时间:2023-01-06
- 格式:DOCX
- 页数:26
- 大小:124.31KB
Eclipse Plugin开发深入理解查找 Search 功能及其扩展点Word格式.docx
《Eclipse Plugin开发深入理解查找 Search 功能及其扩展点Word格式.docx》由会员分享,可在线阅读,更多相关《Eclipse Plugin开发深入理解查找 Search 功能及其扩展点Word格式.docx(26页珍藏版)》请在冰豆网上搜索。
查找页面是查找功能的入口,提供了查找模式和条件等内容的输入界面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文件中。
<
extensionpoint="
org.eclipse.search.searchPages"
>
page
id="
org.eclipse.search.internal.ui.text.TextSearchPage"
label="
%fileSearch"
icon="
$nl$/icons/full/elcl16/tsearch_obj.gif"
sizeHint="
250,160"
tabPosition="
1"
extensions="
*:
showScopeSection="
true"
canSearchEnclosingProjects="
class="
/page>
/extension>
查找结果视图(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文件中。
extension
FileSearchPage"
point="
org.eclipse.search.searchResultViewPages"
viewPage
org.eclipse.search.text.FileSearchResultPage"
searchResultClass="
org.eclipse.search.internal.ui.text.FileSearchResult"
helpContextId="
org.eclipse.search.file_search_result_page"
org.eclipse.search.internal.ui.text.FileSearchPage"
/viewPage>
Eclipse主菜单的查找(Search)菜单中加入你的菜单项
对一些重要的查找功能,我们希望提供多种途径激活这些功能。
如添加一个菜单项到查找(Search)主菜单中,如图6所示为文件查找的菜单项。
图6.Eclipse自带文件查找的菜单
那么如何添加我们自己的菜单项到Eclipse的查找主菜单中呢?
答案是:
添加org.eclipse.ui.actionSets扩展点,然后创建一个action,并且action的menuBarPath设置为org.eclipse.search.menu/dialogGroup。
为了更好地说明如何使用该扩展点,举一个例子说明,如下为创建一个”AmSearch…”菜单项到Search主菜单中实现的扩展点代码,位于plugin.xml文件中。
org.eclipse.ui.actionSets"
actionSet
org.eclipse.am.ui.workbenchActionSet"
%actionSet.am.label"
visible="
action
org.eclipse.am.ui.handlers.ESearchHandler"
definitionId="
mands.ESearch"
icons/Search.gif"
mands.BGSearch"
AMSearch…"
menubarPath="
org.eclipse.search.menu/dialogGroup"
style="
push"
/action>
/actionSet>
相关的函数、接口和类
对查找结果集排序
通常我们以表格(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扩展点,如下所示。
com.ibm.bg.ui.workbenchActionSet"
Example"
com.ibm.bg.ui.handlers.ESearchHandler"
mands.ESearch"
icons/lookup_criteria.gif"
ESearch"
然后再事件处理中通过NewSearchUI提供的openSearchDialog函数打开对话框,此时需要提供查找页的ID,这里我们定义为ESearchPage,后面将会讲到。
publicclassESearchHandlerimplementsIWorkbenchWindowActionDelegate{
privateIWorkbenchWindowfWindow;
publicvoidinit(IWorkbenchWindowwindow){
fWindow=
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Eclipse Plugin开发深入理解查找 Search 功能及其扩展点 Plugin 开发 深入 理解 查找 功能 及其 扩展