Eclipseのプラグイン開発でクラスやメソッドの検索条件を指定するページについて。
メニューバーの「Search」→「Search...」や「File...」「Java...」メニューを選択すると、検索ダイアログが開く。
ここには複数の種類(ファイル検索やJava検索)のページ(タブ)が表示されている。
ISearchPageを実装すれば、自分独自の検索ページ(タブ)を追加することが出来る。
import org.eclipse.search.ui.ISearchPage;
ISearchPageを使うには、「依存関係」の「必須プラグイン」で「org.eclipse.search
」を追加する必要がある。
ISearchPageを実装する例。
import org.eclipse.jface.dialogs.DialogPage; import org.eclipse.search.ui.ISearchPage; import org.eclipse.search.ui.ISearchPageContainer; import org.eclipse.search.ui.ISearchQuery; import org.eclipse.search.ui.NewSearchUI; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Composite;
public class MySearchPage extends DialogPage implements ISearchPage { public static final String ID = "com.example.search.MySearchPage";
private ISearchPageContainer fContainer; @Override public void setContainer(ISearchPageContainer container) { this.fContainer = container; } private ISearchPageContainer getContainer() { return fContainer; }
@Override public void createControl(Composite parent) { Composite composite = new Composite(parent, SWT.NONE); 〜 setControl(composite); }
@Override public boolean performAction() { ISearchQuery query = 〜; NewSearchUI.activateSearchResultView(); NewSearchUI.runQueryInBackground(query); return true; } }
まず、ISearchPageContainerを受け取るsetContainerメソッドを実装する必要がある。
後で使う場合に備えて、getterメソッドも用意しておく。
createControlメソッドは、他のダイアログやビューと同様に画面のコンポーネントを実装する。
performActionメソッドは、Searchボタンが押されたときに実際の検索を行う。
ISearchQueryやNewSearchUIを使って検索を実行する。
実装したISearchPageをplugin.xmlで登録する。
<extension point="org.eclipse.search.searchPages"> <page id="com.example.search.MySearchPage" label="Example Search" sizeHint="460,160" extensions="java:90, jav:90" showScopeSection="true" canSearchEnclosingProjects="true" class="com.example.ui.search.MySearchPage"> </page> </extension>
labelは、検索ページのタブに表示される。
extensionsは、たぶん検索対象のファイルの拡張子を示す。後ろの数字は何かの重み付けらしい。
showScopeSectionをtrueにすると、scopeを選択するグループが表示される。
canSearchEnclosingProjectsをtrueにすると、scopeの選択肢の中に「Enclosing projects」が表示される。
どのscopeが選択されたのかは、ISearchPageContainerから取得することが出来る。
import org.eclipse.jdt.core.search.IJavaSearchScope; import org.eclipse.jface.viewers.ISelection; import org.eclipse.search.ui.ISearchPageContainer; import org.eclipse.ui.IWorkingSet;
@Override public boolean performAction() { IJavaSearchScope scope; int scopeType = getContainer().getSelectedScope(); switch (scopeType) { case ISearchPageContainer.WORKSPACE_SCOPE: scope = SearchEngine.createWorkspaceScope(); break; case ISearchPageContainer.SELECTION_SCOPE: ISelection selection = getContainer().getSelection(); scope = 〜; break; case ISearchPageContainer.SELECTED_PROJECTS_SCOPE: String[] projectNames = getContainer().getSelectedProjectNames(); scope = 〜; break; case ISearchPageContainer.WORKING_SET_SCOPE: IWorkingSet[] workingSets = getContainer().getSelectedWorkingSets(); if (workingSets == null && workingSets.length <= 0) { return false; } scope = 〜; break; } 〜 NewSearchUI.activateSearchResultView(); NewSearchUI.runQueryInBackground(query); return true; }
getContainer()からはスコープに関係する色々な情報が取得できる。
上記の例ではscopeのクラスはIJavaSearchScopeとしたが、ファイルからテキストを検索するTextSearchPageクラスの場合はFileTextSearchScopeを使っている。
NewSearchUIを使って、検索ダイアログを表示することが出来る。
import org.eclipse.core.commands.AbstractHandler; import org.eclipse.core.commands.ExecutionEvent; import org.eclipse.core.commands.ExecutionException; import org.eclipse.search.ui.NewSearchUI; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.PlatformUI;
public class MySearchHandler extends AbstractHandler {
@Override public Object execute(ExecutionEvent event) throws ExecutionException { IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow(); NewSearchUI.openSearchDialog(window, MySearchPage.ID); return null; } }
openSearchDialog()の第2引数には、自分の検索ページのID(plugin.xmlで定義したID)を指定する。
これで検索ダイアログが開き、自分の検索ページ(タブ)が表示される。
自分の検索ダイアログを表示するメニューをメニューバーの「Search」の下に追加したいところだが、Searchメニューは通常の方法とは異なる方法で実装されているらしく、追加する方法は無いっぽいorz