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);
}