我正在开发一个eclipse插件,用户可以在给定一些文本查询的情况下搜索java代码,类似于eclipse中常用的java搜索对话框。
我正在使用以下代码搜索用户提供的文字
SearchPattern pattern = SearchPattern.createPattern("<search_string>",
IJavaSearchConstants.TYPE, IJavaSearchConstants.PARAMETER_DECLARATION_TYPE_REFERENCE,
SearchPattern.R_EXACT_MATCH);
// step 2: Create search scope
// IJavaSearchScope scope = SearchEngine.createJavaSearchScope(packages);
IJavaSearchScope scope = SearchEngine.createWorkspaceScope();
// step3: define a result collector
SearchRequestor requestor = new SearchRequestor()
{
public void acceptSearchMatch(SearchMatch match)
{
System.out.println(match.getElement());
}
};
// step4: start searching
SearchEngine searchEngine = new SearchEngine();
try {
searchEngine.search(pattern, new SearchParticipant[] { SearchEngine
.getDefaultSearchParticipant() }, scope, requestor,
null);
} catch (CoreException e) {
e.printStackTrace();
}
此外,我还可以将搜索对话框中的查询字符串传递给实现ISearchPage的类。
public class QuerySearchPage extends DialogPage implements ISearchPage
{
...
public boolean performAction()
{
System.out.println(txtQuery.getText());
search();//search using the SearchEngine
SearchOperation so = new SearchOperation(iFileSet);
IRunnableWithProgress query = so;
try
{
container.getRunnableContext().run(true, true, query);
}
catch (InvocationTargetException | InterruptedException e)
{
e.printStackTrace();
}
return true;
}
}
最后我遇到了需要将搜索结果传递给ISearchResultView的问题。基本上,我有两个问题:
我已经浏览了以下链接:
非常欢迎任何帮助。
答案 0 :(得分:1)
通常,您将实现能够显示搜索结果的ISearchResultPage
。在其createControl()
方法中,您需要创建一个知道如何呈现匹配项的查看器。
ISearchResultPage
的常用抽象实现是AbstractTextSearchViewPage
。此类使用TableViewer
或TreeViewer
来显示这些工具,具体取决于它们是否是分层的。如果您使用后者,请实施其configureTreeViewer()
和/或configureTableViewer()
方法,以便查看者配备标签提供者和内容提供者,这些提供者和内容提供者知道代表匹配的特定类型,即您提到的作为'对象的匹配结果'。
必须告诉AbstractTextSearchViewPage
构造函数它支持哪种布局:FLAG_LAYOUT_FLAT
和/或FLAG_LAYOUT_TREE
。可以使用setLayout()
更改实际表示。
首先,您可以将搜索视图页面限制为 flat 布局并实现其configureTableViewer()
,如下所示:
viewer.setLabelProvider( new MyLabelProvider() );
viewer.setContentProvider( new MyContentProvider() );
内容提供商的输入是您的ISearchResult
实施。因此MyContentProvider
可以从搜索结果中获取要显示的元素。
@Override
public void inputChanged( Viewer viewer, Object oldInput, Object newInput ) {
searchResult = ( MySearchResult )newInput;
}
@Override
public Object[] getElements( Object inputElement ) {
return searchResult.getElements();
}
答案 1 :(得分:0)
以下链接似乎相关。我希望它有所帮助:https://wiki.eclipse.org/FAQ_How_do_I_implement_a_search_operation%3F