テキストエディタで指定位置へジャンプ
テキストエディタ上で「Ctrl+L」キーを押すと出てくる指定行ジャンプ機能。これをプラグインのプログラムから行う方法を紹介する。
テキストエディタ上のある地点(位置または行)に移動させるには,まず移動したい場所にマーカーをつける。そして,そのマーカーめがけてジャンプする。以下が,そのコードの例である。
IEditorPart editorPart = ...;
IEditorPart editorPart = editorPart.getEditorInput();
IResource resource = (IResource)editorPart.getAdapter(IResource.class);
Map attributes = new HashMap();
attributes.put(IMarker.CHAR_START, new Integer(50));
attributes.put(IMarker.CHAR_END, new Integer(50));
IMarker marker = resource.createMarker(IMarker.TEXT));
marker.setAttributes(attributes);
IDE.gotoMarker(editorPart, marker);
marker.delete();
処理対象のIEditorPartオブジェクトからIEditorInputオブジェクトを取得し,IEditorInputオブジェクトから実際のリソース(IResource)オブジェクトをgetAdapterメソッドを使って取得する。通常はIFileオブジェクトが返却されるだろう。
IResourceオブジェクトが取得できたら,「リソースへのマーキング」で紹介したcreateMarkerメソッドを使って,マーカーを作成する。この際,マーカーの種類として「標準マーカー」で紹介したIMarker.TEXTを指定する。そしてマーカーの属性として,IMarker.CHAR_STARTおよびIMarker.CHAR_ENDにエディタ上でジャンプしたい位置を指定する。各属性値に同じ値を指定することで,エディタ内の文字列の先頭文字からの指定位置にカーソルが移動される。異なる値を指定したときは,その範囲の文字列が選択されて,カーソルが選択文字列の直後に位置される。
マーカーが作成できたら,IDEクラスのgotoMarkerメソッドにIEditorPartオブジェクトとIMarkerオブジェクトを渡すことで,指定された場所にジャンプされる。gotoMarkerメソッドの実行後は,マーカーは必要ないものになるので,deleteメソッドを使用してマーカーを削除しておく。
上記は指定位置へのジャンプだったが,指定行へのジャンプの場合は,マーカーの属性としてIMarker.LINE_NUMBERを使用する。
Map attributes = new HashMap();
attributes.put(IMarker.LINE_NUMBER, new Integer(5));
これにより,5行目の文字列が選択され,6行目の先頭にカーソルが移動されるようになる。
実は上記のジャンプ処理は,AbstractDecoratedTextEditorクラスを継承しているテキストエディタに関して適用される動きであり,エディタであれば何でもそうなるわけではない。EclipseのデフォルトテキストエディタであるTextEditorクラスや,Javaソースコード編集用のエディタであるCompilationUnitEditorクラスは,このAbstractDecoratedTextEditorクラスを継承しているので,上記の方法が使用できる。
マーカーへのジャンプ処理は,IGotoMarkerインタフェースによって規定されている。IDEクラスのgotoMarkerメソッドは,指定されたIEditorPartオブジェクトがIGotoMarkerインタフェースを実装しているかをチェックし,実装していればIEditorPartオブジェクトのgotoMarkerメソッドを呼び出して,ジャンプ処理を行わせている。つまり,エディタがIGotoMarkerインタフェースのgotoMarkerメソッドをどのように実装しているかによって,ジャンプ処理の動きが変わってくるということになる。
| 固定リンク
この記事へのコメントは終了しました。
コメント