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」のサブメニューに追加したいところだが、メニューIDが分からないorz
「References」自体のメニューIDも不明だが、
「group.find
」を指定すると、Referencesメニューの上に追加することが出来る。
<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(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); }