エディタで指定行を開く

前回の日記であんなこと書いたけど、ふつーにできるっぽい。


というわけで、Eclipse上のとあるファイルを指定した行で開く方法。
とりあえず試したのは、次の2種類。他にもあるのかも。

  1. マーカーを使う
  2. 無理やり?ジャンプする
マーカーを使う

エディタを開く際によく使うIDE#openEditorには、IMarkerを引数に持つ
メソッドがある。なので、IMarkerの属性に行を指定しておけば、
その行でエディタを開いてくれる。
IMarkerのタイプは、IMarker.TEXTというのを指定する。


コードはこんな感じ。


IFile file = ・・・ // 開くファイル
int line = ・・・ // 行数
IWorkbenchPage page = ・・・

IMarker marker = file.createMarker(IMarker.TEXT);
marker.setAttribute(IMarker.LINE_NUMBER, line);

IDE.openEditor(page, marker);
file.deleteMarkers(IMarker.TEXT, false, IResource.DEPTH_ZERO);

一応は指定した行でエディタを開くことができるが、
その行全体が選択された状態で開かれてしまう。


これがすごーく気に入らなかったので、別の方法を調べたたら、
次の方法を発見した。

無理やりな方法

EclipseでCtrl+Lを押した際に裏で動くクラス(恐らくorg.eclipse.ui.texteditor.GotoLineAction)
から、ぱくってやってみた方法。
指定行で開くというよりは、エディタを開いた後に指定行に移動するイメージ。


IFile file = ・・・ // 開くファイル
int line = ・・・ // 行数
IWorkbenchPage page = ・・・

IEditorPart part = IDE.openEditor(page, file);
ITextEditor editor = (ITextEditor) part;

IDocumentProvider provider = editor.getDocumentProvider();
IDocument document = provider.getDocument(editor.getEditorInput());
int offset = document.getLineOffset(line - 1);
editor.selectAndReveal(offset, 0);

getLineOffsetで-1しているのは、行数がずれるから。
見た目の行数と内部的な行数の違いなのかな?
IDocumentには他にも便利なメソッドがあったりする。


この方法だと、カーソルが指定した行数の先頭にある状態で開ける。
ただし、IEditorPartをITextEditorにキャストしていいのかどうか
まったくもって不明・・・。
まぁ、instanceofでチェックしてもいいんだけど。


それ以前に、これだけのためにこんなにがんばる必要はあるのかどうか
甚だ疑問だったりする。
# 3時間くらいつぶれた。ごめんなさい>お客さん