S-JIS[2014-11-22] 変更履歴

Eclipse ISearchPage

Eclipseプラグイン開発でクラスやメソッドの検索条件を指定するページについて。


概要

メニューバーの「Search」→「Search...」や「File...」「Java...」メニューを選択すると、検索ダイアログが開く。
ここには複数の種類(ファイル検索やJava検索)のページ(タブ)が表示されている。
ISearchPageを実装すれば、自分独自の検索ページ(タブ)を追加することが出来る。

import org.eclipse.search.ui.ISearchPage;

ISearchPageを使うには、「依存関係」の「必須プラグイン」で「org.eclipse.search」を追加する必要がある。


ISearchPage

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を使って検索を実行する。


plugin.xml

実装したISearchPageをplugin.xmlで登録する。

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


Eclipseプラグインへ戻る / Eclipseへ戻る / 技術メモへ戻る
メールの送信先:ひしだま