2015-12-13 2 views
3

Я разрабатываю плагин eclipse, где пользователь может искать java-код, учитывая некоторый текстовый запрос, аналогичный обычному диалогу поиска java в eclipse.Расширение Eclipse Java Search

Java Search Image

Я использую следующий код для поиска текста, предоставленного пользователем

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. Search Dialog page Image

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. В основном у меня есть два вопроса:

  1. Согласованные результаты имеют тип Object. Как передать эти результаты в ISearchResultView, который принимает IFIL как вход?
  2. Как получить результаты в нижнем формате?

Search Result View Image

Я уже прошел через следующие ссылки:

Любая помощь весьма приветствуется.

+0

'ISearchResultView' является устаревшим,' ISearchResultPage' объявлена ​​с помощью 'org.eclipse.search.searchResultViewPages' рекомендуемый метод. –

+0

Спасибо, что указали это, но это не помогло. –

ответ

1

Обычно вы должны реализовать ISearchResultPage, который способен отображать результаты поиска. В своем методе createControl() вам необходимо создать зрителя, который знает, как представить совпадения.

Общепринятая абстрактная реализация ISearchResultPage - AbstractTextSearchViewPage. Этот класс использует TableViewer или TreeViewer для представления машин, в зависимости от того, являются ли они иерархическими или нет. В случае, если вы используете последний, выполните его методы configureTreeViewer() и/или configureTableViewer(), чтобы зрители были оснащены поставщиками меток и поставщиками контента, которые знают конкретный тип, который представляет совпадение, то есть то, что вы называете «Соответствующие результаты типа Object ».

Конструктор AbstractTextSearchViewPage должен указать, какие виды макетов он поддерживает: FLAG_LAYOUT_FLAT и/или FLAG_LAYOUT_TREE. Фактическое представление можно изменить с помощью setLayout().

Для начала можно ограничить страницу поиска представлений к плоским макету и осуществить его 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(); 
} 
+0

Хорошо, я создал класс FileSearchResultContentProvider реализует ITreeContentProvider, IStructuredContentProvider, а также модифицировал SearchResultPage для расширения AbstractTextSearchViewPage, но как мне реализовать метод configureTreeViewer и другие методы, которые вам нужны для переопределения в классе FileSearchResultContentProvider. –

+0

Я сделал все упомянутые изменения, но все еще не в состоянии следить за тем, что вы предлагаете. Можете ли вы просмотреть мой код здесь? Https://github.com/payamrastogi/searchprovider –

+0

Ваш 'SearchResultPage' переопределяет' createControl() '. Если вы посмотрите в суперкласс, вы, вероятно, заметите, что это не то, что вы хотите. –

Смежные вопросы