Eclipseプラグイン実践テクニック(2)
高機能なXMLエディタをプラグインとして作る



ハイパーリンク機能

 最後にハイパーリンク機能についても触れておきましょう。EclipseのすべてのテキストエディタではURLに対するハイパーリンク機能がすでに提供されています。Ctrlキーを押しながらURL部分にマウスを合わせると以下のようにリンクが表示され、クリックするとそのURLをブラウザで開くことができます。

図6 標準のURL リンク機能

 このほかにもJavaエディタではCtrl+クリックによるハイパーリンクでクラスやメソッドの宣言部を開くことができます。この機能はとても便利なので普段のコーディングで利用されている方も多いのではないでしょうか。今回は、XMLエディタでJavaのクラス名に対するハイパーリンク機能を実装してみます。Javaプロジェクト内のXMLファイルでクラス名らしき部分を発見した場合に、そのクラスをエディタで開けるようにします。

 ハイパーリンク機能を拡張するにはorg.eclipse.jface.text.hyperlink.IHyperlinkインターフェイスと、org.eclipse.jface.text.hyperlink.IHyperlinkDetectorインターフェイスを実装したクラスをそれぞれ自前で用意する必要があります。それぞれのクラスの役割は以下のとおりです。

  • IHyperlinkDetector ― ハイパーリンクする部分を検出するためのクラス。検出結果としてIHyperlinkを返却する。
  • IHyperlink ― ハイパーリンクする部分、およびリンクがクリックされた場合の処理などを行うオブジェクト。

 まずはIHyperlinkの実装クラスであるClassNameHyperlinkを見てみましょう。このクラスはJDTのAPIを利用して、 Javaの型をエディタで開く処理を実装しています。

リスト8
public class ClassNameHyperlink implements IHyperlink {

  private IType type;
  private IRegion region;

  public ClassNameHyperlink(IType type, IRegion region){
    this.type = type;
    this.region = region;
  }

  public IRegion getHyperlinkRegion() {
    return region;
  }

  public String getTypeLabel() {
    return null;
  }

  public String getHyperlinkText() {
    return null;
  }

  public void open() {
    try {
      // エディタで開く
      JavaUI.openInEditor(type);
    } catch (PartInitException e) {
      e.printStackTrace();
    } catch (JavaModelException e) {
      e.printStackTrace();
    }
  }

}

 IHyperlinkDetectorの実装クラスであるClassNameHyperlinkDetectorでは、マウス位置の文字列がクラス名らしき文字列だった場合にそのクラスがプロジェクト内に存在するかどうかを調べ、存在した場合は上記のClassNameHyperlinkを返却します。

リスト9
public class ClassNameHyperlinkDetector implements
IHyperlinkDetector {

  private IJavaProject project;

  public ClassNameHyperlinkDetector(IJavaProject project){
    this.project = project;
  }

  public IHyperlink[] detectHyperlinks(ITextViewer textViewer,
      IRegion region, boolean canShowMultipleHyperlinks) {

    String source = textViewer.getDocument().get();
    int offset = region.getOffset();

    // マウス位置の文字列を切り出す
    String word = String.valueOf(source.charAt(offset));
    int index = offset -1;
    while(index >= 0){
      char c = source.charAt(index);
      if(Character.isJavaIdentifierPart(c) || c=='.'){
        word = c + word;
        index--;
      } else {
        break;
      }
    }
    index = offset + 1;
    offset = offset - word.length() + 1;
    while(source.length()>index){
      char c = source.charAt(index);
      if(Character.isJavaIdentifierPart(c) || c=='.'){
        word = word + c;
        index++;
      } else {
        break;
      }
    }

    // 型が存在するかどうか調べる
    try {
      IType type = project.findType(word);
      if(type!=null && type.exists()){
        return new IHyperlink[]{
          new ClassNameHyperlink(type,
          new Region(offset, word.length()))
        };
      }
    } catch (JavaModelException e) {
    }

    return null;
  }
}

 エディタクラスのcreatePartControl()メソッドをオーバーライドし、このディテクタをTextViewer#setHyperlinkDetector()メソッドでセットします。標準で利用可能なURL リンク機能を提供するURLHyperlinkDetectorも一緒にセットしています。

リスト10
public class XMLEditor extends TextEditor ... {

  ...

  public void createPartControl(Composite parent) {
    super.createPartControl(parent);

    IFileEditorInput input
    = (IFileEditorInput)getEditorInput();
    IProject project = input.getFile().getProject();
    IJavaProject javaProject = JavaCore.create(project);

    ClassNameHyperlinkDetector detector =
    new ClassNameHyperlinkDetector(javaProject);
    TextViewer textViewer = (TextViewer)getSourceViewer();
    textViewer.setHyperlinkDetectors(new IHyperlinkDetector[]{
      new URLHyperlinkDetector(textViewer),
      detector }, SWT.CTRL);
  }


}

 以上でハイパーリンク機能の実装は完了です。以下のようにCtrlキーを押しながらマウスを合わせると、クラス名の部分がリンクになり、クリックするとエディタで開くことができます。

図7 クラス名に対するハイパーリンク

おわりに

 テキストエディタはEclipseプラグインの中でも非常に多機能かつ奥の深いコンポーネントであり、このほかにもさまざまなカスタマイズを行うことが可能です。今回の例はサンプルということで作り込みの甘い部分もあり、実用的なエディタを提供するにはもう少しブラッシュアップが必要になりますが、より高機能なエディタを実装するための足掛かりとしていただければ幸いです。

 次回は独自のパースペクティブを作成する方法について解説する予定です。

4/4

 INDEX

第2回 高機能なXMLエディタをプラグインとして作る

  Page1
テキストエディタの拡張
  Page2
コードアシストの実装
  Page3
ダブルクリック時の動作のカスタマイズ
  Page4
ハイパーリンク機能


Java Solution全記事一覧



Java Agile フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Java Agile 記事ランキング

本日 月間