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

Eclipse JDT FindReferencesAction

Eclipseプラグイン開発JDTでクラスやメソッドを検索 してビューに表示する方法について。


概要

FindReferencesActionは、クラスやメソッドが使われている箇所を検索して“検索結果ビュー”に表示する為のアクションクラス。
Javaエディター上のコンテキストメニューの「References」→「Workspace」等で使われる。

自分でクラスやメソッド(IJavaElement)を検索(して結果を表示)するのにも使える。


メニューハンドラー経由でFindReferencesActionを使用する例。

import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IMethod;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.internal.ui.javaeditor.JavaEditor;
import org.eclipse.jdt.ui.actions.FindReferencesAction;
import org.eclipse.jface.text.ITextSelection;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.handlers.HandlerUtil;
@SuppressWarnings("restriction")
public class ExampleSearchHandler extends AbstractHandler {
	@Override
	public Object execute(final ExecutionEvent event) throws ExecutionException {
		IEditorPart editor = HandlerUtil.getActiveEditor(event);
		if (editor instanceof JavaEditor) {
			findReferences((JavaEditor) editor);
		}
		return null;
	}
	private void findReferences(JavaEditor editor) {
		ITextSelection selection = (ITextSelection) editor.getSelectionProvider().getSelection();

		FindReferencesAction action = new FindReferencesAction(editor);
		action.run(selection);
	}
}

FindReferencesActionのコンストラクターにはJavaEditorを渡す。
JavaEditorはインターナル(内部専用)のクラスなので、使う場合はrestrictionの警告を抑止する。

runメソッドにITextSelectionを渡すと、エディター上の選択されている位置のクラスやメソッド(IJavaElement)が検索され、Seachビューに結果が表示される。
(単なるISelectionを受け取るrunメソッドもあるが、そのメソッドは中身が空なので、何も実行されない)


Referencesメニュー

独自の探索メニューは、コンテキストメニューの「References」のサブメニューに追加したいところだが、メニューIDが分からないorz

「References」自体のメニューIDも不明だが、
group.find」を指定すると、Referencesメニューの上に追加することが出来る。

plugin.xml:

   <extension
         point="org.eclipse.ui.commands">
      <category
            id="example.category"
            name="example">
      </category>
      <command
            categoryId="example.category"
            id="example.command.exampleSearch"
            name="References example">
      </command>
   </extension>
   <extension
         point="org.eclipse.ui.handlers">
      <handler
            class="com.example.ExampleSearchHandler"
            commandId="example.command.exampleSearch">
         <enabledWhen>
            <with variable="activeEditorId">
               <equals value="org.eclipse.jdt.ui.CompilationUnitEditor" />
            </with>
         </enabledWhen>
      </handler>
   </extension>
   <extension
         point="org.eclipse.ui.menus">
      <menuContribution
            allPopups="false"
            locationURI="popup:org.eclipse.jdt.ui.CompilationUnitEditor.EditorContext?after=group.find">
         <command
               commandId="example.command.exampleSearch"
               style="push">
         </command>
      </menuContribution>
   </extension>

IJavaElementを検索する例

検索したいクラスやメソッドのIJavaElement(ITypeやIMethod)が別途取得できている場合は、それを直接指定して検索することが出来る。

	private void findReferences(JavaEditor editor, IJavaElement element) {
		FindReferencesAction action = new FindReferencesAction(editor);
		action.run(element);
	}

Javaエディター上で選択されたIJavaElementを加工して探索対象を変えたい場合は、run(IJavaElement)メソッドをオーバーライドする。

	private void findReferences(JavaEditor editor) {
		FindReferencesAction action = new FindReferencesAction(editor) {
			@Override
			public void run(IJavaElement element) {
				IJavaElement target = getMyTarget(element); // 探索対象を変更
				if (target != null) {
					super.run(target);
				}
			}
		};

		ITextSelection selection = (ITextSelection) editor.getSelectionProvider().getSelection();
		action.run(selection);
	}

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