如何在Eclipse RCP自定义视图中实现并展示文本搜索结果
在自定义视图中展示Eclipse文本搜索结果
核心原理
Eclipse的文本搜索结果并非存储在物理文件中,而是以ISearchResult对象的形式存在于内存中,由搜索框架动态生成和管理。要在自定义视图中展示结果,关键是获取这个ISearchResult实例,并将其绑定到视图的UI控件上。
步骤1:执行文本搜索并获取结果
你可以直接调用Eclipse搜索API触发文本搜索,同时监听结果返回:
import org.eclipse.search.ui.text.TextSearchEngine; import org.eclipse.search.ui.text.TextSearchQueryProvider; import org.eclipse.search.ui.ISearchResult; import org.eclipse.search.ui.ISearchResultListener; import org.eclipse.search.ui.SearchResultEvent; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.ResourcesPlugin; // 1. 构建搜索查询 TextSearchQueryProvider queryProvider = TextSearchQueryProvider.getPreferred(); IResource[] searchScope = {ResourcesPlugin.getWorkspace().getRoot()}; // 搜索整个工作区 String searchText = "你的搜索关键词"; boolean caseSensitive = false; boolean wholeWord = false; ISearchQuery query = queryProvider.createQuery(searchText, caseSensitive, wholeWord, searchScope); // 2. 创建搜索引擎并执行搜索 TextSearchEngine engine = TextSearchEngine.create(); engine.search(query, monitor -> {}, new ISearchResultListener() { @Override public void searchResultChanged(SearchResultEvent event) { // 搜索结果更新时触发,获取最新的ISearchResult ISearchResult result = event.getSearchResult(); // 将结果传递给自定义视图展示 updateCustomView(result); } });
步骤2:在自定义视图中绑定并展示结果
假设你的自定义视图继承自ViewPart,需要添加UI控件(比如TableViewer)来展示结果:
import org.eclipse.ui.part.ViewPart; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.swt.widgets.Composite; import org.eclipse.search.ui.text.Match; import org.eclipse.search.ui.text.AbstractTextSearchResult; public class CustomSearchView extends ViewPart { private TableViewer viewer; private AbstractTextSearchResult currentResult; @Override public void createPartControl(Composite parent) { viewer = new TableViewer(parent); // 配置TableViewer的内容提供者、标签提供者(按需自定义) viewer.setContentProvider(new SearchResultContentProvider()); viewer.setLabelProvider(new SearchResultLabelProvider()); } // 接收外部传入的搜索结果并刷新视图 public void updateCustomView(ISearchResult result) { if (result instanceof AbstractTextSearchResult) { currentResult = (AbstractTextSearchResult) result; viewer.setInput(currentResult); // 替换监听器,避免重复监听 if (currentResult != null) { currentResult.removeListener(resultListener); currentResult.addListener(resultListener); } } } private final ISearchResultListener resultListener = new ISearchResultListener() { @Override public void searchResultChanged(SearchResultEvent event) { // 结果更新时刷新视图 viewer.refresh(); } }; @Override public void setFocus() { viewer.getControl().setFocus(); } @Override public void dispose() { // 销毁视图时移除监听器,防止内存泄漏 if (currentResult != null) { currentResult.removeListener(resultListener); } super.dispose(); } }
步骤3:关联视图与搜索触发逻辑
可以通过菜单按钮或快捷键触发搜索,将结果传递给自定义视图:
- 在插件的
plugin.xml中为自定义视图添加菜单贡献,绑定搜索触发命令 - 在命令处理类中执行步骤1的搜索逻辑,然后通过
IWorkbenchPage获取自定义视图实例,调用updateCustomView()方法传递结果
替代方案:复用现有搜索结果
如果你想直接获取Eclipse默认搜索视图的结果,可以通过SearchManager获取当前活跃的搜索结果:
import org.eclipse.search.ui.SearchManager; ISearchResult activeResult = SearchManager.getDefault().getActiveSearchResult(); if (activeResult != null) { // 将activeResult传递给自定义视图 }
内容的提问来源于stack exchange,提问作者Satya
相关产品推荐
相关产品推荐

