« テキストエディタ上のカーソル位置の取得方法 | トップページ | テキストエディタで指定位置へジャンプ »

2004.09.03

エディタを開く Part2

もう3ヶ月近く前になるが,2004年5月24日に「エディタを開く」という記事を書いた。あるファイルをプラグインのプログラム内からエディタを使って開くための方法を紹介したのだが,当時はEclipseのバージョン2.1.3を対象にしていた。6月に入ってEclipseのバージョン3.0が公開されたわけだが,実はEclipse3.0になってからいくつかのAPIが廃止あるいは非互換になっている。どんなAPIが対象化というと,Eclipseのヘルプの中の,

  「Platform Plug-in Developer Guide」→「3.0 Plug-in Migration Guide」→「Incompatibilities」

を見れば非互換になったものを把握することができる。これを見てみると,「エディタを開く」で紹介したIWorkbenchPage#openEditor(IFile)メソッドが,見事に廃止の対象になっていた。残念ながら,完全に「エディタを開く」はEclipse3.0以降では参考にならない記事になってしまったので,ここでエディタを開くための新しい方法を紹介する。

Eclipse3.0からは,IWorkbenchPageインタフェースのopenEditorメソッドについて,引数にIFileオブジェクトを取るものが廃止され,IEditorInputオブジェクトおよびエディタIDの文字列を引数に取るメソッドのみに限定された。その理由は「IWorkbenchPartインタフェースは,一般的なワークベンチの中での定義なのにも関わらず,IFileなど特定のリソースに依存してしまっているので,それに関連するメソッドを削除した」ということらしい。ごもっともである。

さて,ではIFileオブジェクトを使って直接エディタを開くことはできなくなってしまったかというと,そうではない。Eclipse3.0からIDEクラスが追加され,IDEクラスにIFileオブジェクトを使ってエディタを開くためのメソッドが提供されている。

  IFile file = ...;

  IWorkbench workbench = PlatformUI.getWorkbench();
  IWorkbenchWindow window = workbench.getActiveWorkbenchWindow();
  IWorkbenchPage page = window.getActivePage();

  IEditorPart editorPart = IDE.openEditor(page, file);

アクティブなIWorkbenchPartオブジェクトを取得するのは「エディタを開く」と同じ。IWorkbenchPartオブジェクトが取得できれば,あとはIDEクラスのクラスメソッドであるopenEditorメソッドに,IWorkbenchPartオブジェクトとIFileオブジェクトを渡せば,エディタが開かれ,その結果のIEditorPartオブジェクトが返却される

このIDEクラスのopenEditorメソッド,結局はIWorkbenchPageインタフェースのopenEditorメソッドが利用されている。つまり,IFileオブジェクトを持つIFileEditorInputオブジェクトを生成し,さらにIFileオブジェクトで表されるファイルの名前から開くべきエディタの種類(エディタID)を決定し,それらをIWorkbenchPageインタフェースのopenEditorメソッドに渡してエディタを開く,という処理である。どのエディタで開くか(エディタIDの取得)は,IDEクラスのgetEditorDescriptorメソッドに判断ロジックが記述されている。その判断ロジックは,「エディタを開く」で紹介したものとほぼ同じである。

このようなインタフェース間やクラス間の依存性の排除などの見直しがされているあたりに,Eclipseの設計者のこだわりというか理想の高さを感じる。

|

« テキストエディタ上のカーソル位置の取得方法 | トップページ | テキストエディタで指定位置へジャンプ »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/12631/1347920

この記事へのトラックバック一覧です: エディタを開く Part2:

« テキストエディタ上のカーソル位置の取得方法 | トップページ | テキストエディタで指定位置へジャンプ »