« Javaエディタのコンテキストメニュー | トップページ | あるファイルがエディタで開かれているかを取得する方法 »

2004.07.30

テキストバッファを使ったIDocumentオブジェクトの取得

Eclipseでの作業のほとんどは,エディタに対してテキスト(Javaのソースコードなど)を編集する作業だろう。そして各種プラグインがエディタに機能を提供し,編集作業の補佐を行っている。プラグインからエディタで編集されているテキストを操作するためには,「テキストエディタからのIEditorInput,IDocumentオブジェクトの取得」で紹介した方法でエディタからIDocumentオブジェクトを取得し,それに対して各種メソッドを呼び出して内容を操作すればよい。

しかし,時にはエディタで開かれていないファイルに対しても,その内容について何らかの操作を行いたくなる。「プラグイン内で自動的に対象のファイルをエディタを開いて,IDocumentオブジェクトを取得してテキストを操作すればいいじゃん」というのは確かにありだが,対象のファイルが数多くある場合には,この方法は良い選択とは言えない。このような,エディタを開かずにファイルの内容をIDocumentオブジェクトとして取得したい時のために,Eclipseではテキストバッファと呼ばれる機構を用意してくれている。

テキストバッファの機構は,org.eclipse.core.filebuffersプラグインにより提供されているので,下記のようにプラグイン・マニフェスト内でorg.eclipse.core.filebuffersプラグインの使用を宣言する。

  <plugin ...>
    ...
    <requires>
      ...
      <import plugin="org.eclipse.core.filebuffers"/>
    </requires>
    ...
  </plugin>

では,IDocumentオブジェクトの取得までのコードを見てみよう。

  IPath targetFilePath = ...; // 対象のファイルのパス

  ITextFileBufferManager manager = FileBuffers.getTextFileBufferManager();
  manager.connect(targetFilePath, null);
  ITextFileBuffer buffer = manager.getTextFileBuffer(targetFilePath);
  IDocument document = buffer.getDocument();

最初にテキストバッファを管理してくれるITextFileBufferManagerオブジェクトをFileBuffersクラスのgetTextFileBufferManagerメソッドを使って生成する。その後,connectメソッドに処理対象のファイルのパス(IPathオブジェクト)を渡して,管理オブジェクトにファイルを接続する。第2引数にはIProgressMonitorインタフェースを渡せるようになっている。

管理オブジェクトへファイルを接続できれば,あとはgetTextFileBufferメソッドを使ってITextFileBufferオブジェクトを取得する。この時点でテキストバッファがVM内に存在するようになる。そして,getDocumentメソッドを呼び出すことでIDocumentオブジェクトを取得することができる。IDocumentオブジェクトへの操作は,テキストバッファ内の内容に反映される

IDocumentインタフェースを通じたテキストへの操作は,テキストバッファには反映されているが,ファイルに即座に反映されるわけではない。テキストバッファの内容をファイルに反映するためのコードが下記である。

  buffer.commit(null, true);
  manager.disconnect(targetFilePath, null);

ITextFileBufferオブジェクトのcommitメソッドを呼び出すことにより,テキストバッファの内容がファイルに書き出される。進捗状況を表示したいときは,第1引数にIProgressMonitorオブジェクトを渡す。第2引数は,commitメソッドの呼び出し時に,もしテキストバッファとファイルシステム上のファイルの内容が同期が取れていなかった場合に,問答無用でテキストバッファ内の内容でファイルを上書きするかどうかを指定する。

最後にITextFileBufferManagerオブジェクトのdisconnectメソッドを呼び出して,ファイルを管理オブジェクトから切断する。もちろん,commitメソッドを呼び出さずにdisconnectメソッドを呼び出せば,テキストバッファの内容は破棄されてファイルの内容も元のままとなる。

上記の方法を使えば,エディタに頼ることなく,ファイルの内容をIDocumentオブジェクトとして取り出すことができ,エディタからIDocumentオブジェクトを取得して内容を操作するときと全く同じことを,エディタを開かずに行うことができるようになる。いい感じ。

|

« Javaエディタのコンテキストメニュー | トップページ | あるファイルがエディタで開かれているかを取得する方法 »

コメント

コメントを書く



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




トラックバック

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

この記事へのトラックバック一覧です: テキストバッファを使ったIDocumentオブジェクトの取得:

« Javaエディタのコンテキストメニュー | トップページ | あるファイルがエディタで開かれているかを取得する方法 »