关于Eclipse提供了很完善的搜索功能:

zotero搜索引擎插件_java

上面的ICD Search为自定义。

下面通过代码实践,完成自定义搜索的实现,其实对于搜索,也是通过插入点的机制来实现的。原Eclipse中的搜索也是一个插件:

下载点我


实践:

1.加入插入点searchpage,即对应search对话框中的一个tab页。

<extension point="org.eclipse.search.searchPages">  
 
 
 

       <page  
 
 
 

           id="cn.edu.nuaa.icdt.dialog.ICDSearchPage" 
 
 
 
 label="ICD Search" 
 
 
 
 icon="icons/icdt/nls_search_obj.gif" 
 
 
 
 sizeHint="250,160" 
 
 
 
 tabPosition="1"  //指定自定义搜索tab的位置 
 
 
 
 extensions="*:1" 
 
 
 
 showScopeSection="true"         
 
 
 
 canSearchEnclosingProjects="true" 
 
 
 
 class=" 
  cn.edu.nuaa.icdt.dialog.ICDSearchPage">  
 
 
 
 </page>  
 
 
 

    </extension>

DialogPage  implements org.eclipse.search.ui. ISearchPage

在此类中有几个注意点

    1)在createControl中要利用 setControl(parent);使得getControl能够获得对象。

    2)performAction,是执行search查询指令。

    3)通过NewSearchUI.activateSearchResultView();激活结果view。

    4)通过NewSearchUI.runQueryInBackground(getSearchQuery());传入的query可以将本对话框中的一些属性信息传入。

2.由搜索tab传入的ISearchQuery,通过run方法即可以执行查询数据的操作。需要注意的是对于query,定义了一个ISearchResult,查询的数据都要装进这个ISearchResult。同时对于查询得到的数据必须封装成Match。

3.一旦传入的ISearchQuery的ISearchReult有动作,也就是查询到了数据,应该是要触发操作,更新数据域的。由于对于这个ISearchReult在配置中是有指定的。因为查询数据,是启用一个新的线程进行数据搜索的。

4.设计搜索结果页面

<extension  
  
 
  
 id="ICDSearchResultPage" 
  
 
  
 point="org.eclipse.search.searchResultViewPages">  
  
 
  

        <viewPage  
  
 
  
 id="cn.edu.nuaa.icdt.search.ICDSearchResultPage" 
  
 
  
 searchResultClass="cn.edu.nuaa.icdt.search.ESearchResult"//指定result 
  
 
  
 helpContextId="org.eclipse.search.file_search_result_page" 
  
 
  
 class="cn.edu.nuaa.icdt.search.ICDSearchResultPage"> //指定结果显示页面 
  
 
  
 </viewPage>  
  
 
  

     </extension>

Page implements  ISearchResultPage。

对于ISearchResultPage,通常不直接从此类继承,而是从AbstractTextSearchVewPage类继承。对于AbstractTextSearchVewPage来说,继承后有如下几个函数可能重写:

protected void configureTreeViewer(TreeViewer viewer) 配置我们风格的TreeViewer

protected void configureTableViewer(TableViewer viewer) 配置我们风格的TableViewer

protected void showMatch(Match match, int currentOffset, int currentLength, boolean activate) 重载此方法, 实现自己的匹配项的定位.  

有一个重要的注意是,在接口的getControl方法返回的控件。查看源码。

注意:

    1由于对于query搜索是一条一条记录搜索出来的,则需要不停的触发更新input操作。(存在问题)

    2当然也可以在query时,不利用新的搜索线程,而只是一下子全部搜索出来,返回给界面展示。(易实现)

上面参考网站中设计,通过对比成品项目:

下载点我

后利用Abstract相关的类,重新设计相关操作,则避免了自定义相关监听器,或触发器。最终成功完成。

public class ICDTSearchContentProvider implements IStructuredContentProvider, 
  
 
  
IFileSearchContentProvider  
  
 
 

   public class ICDTSearchLabelProvider implements ITableLabelProvider 
 
 
 

   public class ESearchResult extends AbstractTextSearchResult 
 
 
 

   public class ICDSearchResultPage extends AbstractTextSearchViewPage

具体查看源代码注释:

对于addMatch之后触发操作,会通过result和结果页的视图(通过配置Plugin),查找到elementChange,最终找到contentProvider,从而更新tableView.

效果展示:

zotero搜索引擎插件_plugin_02

zotero搜索引擎插件_java_03