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