You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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:关联视图与搜索触发逻辑

可以通过菜单按钮或快捷键触发搜索,将结果传递给自定义视图:

  1. 在插件的plugin.xml中为自定义视图添加菜单贡献,绑定搜索触发命令
  2. 在命令处理类中执行步骤1的搜索逻辑,然后通过IWorkbenchPage获取自定义视图实例,调用updateCustomView()方法传递结果

替代方案:复用现有搜索结果

如果你想直接获取Eclipse默认搜索视图的结果,可以通过SearchManager获取当前活跃的搜索结果:

import org.eclipse.search.ui.SearchManager;

ISearchResult activeResult = SearchManager.getDefault().getActiveSearchResult();
if (activeResult != null) {
    // 将activeResult传递给自定义视图
}

内容的提问来源于stack exchange,提问作者Satya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 15:42:37