テキストバッファとエディタ
突然だが,今回はテキストバッファについてもう少し知識を深めることにしよう。
「テキストバッファを使ったIDocumentオブジェクトの取得」で紹介したテキストバッファをプラグイン開発者が直接利用する機会は,そう滅多にないかもしれない。やはりエディタに表示されている内容に対しての操作が中心になるだろうし,裏側で自動的にテキストファイルの内容が変更されているというのを,あまり良く思わない人もいるだろう。ただし,Eclipseはこのテキストバッファ抜きで語ることはできなくなった。
org.eclipse.core.filebuffersプラグインは,実はEclipse3.0から提供されたものである。Eclipse3.0になってから,このテキストバッファはEclipse内で大活躍している。つまり,テキストを扱うエディタは,テキストバッファを利用するように新たに書き直されているのだ。そして,あるファイルを複数のエディタで同時に開いたときは,それぞれのエディタはテキストバッファを共有する。つまり,片方のエディタで行った編集作業が,即座にもう1つのエディタにも伝達される,ということがテキストバッファの採用により実現されているのである(バッファ関連のコールバックメソッドはIFileBufferListenerインタフェースに規定されている)。
org.eclipse.core.filebuffersプラグインにより,テキストバッファは一元管理されている。つまり,
IPath targetFilePath = ...; // 対象のファイルのパス
ITextFileBufferManager manager = FileBuffers.getTextFileBufferManager();
manager.connect(targetFilePath, null);
ITextFileBuffer buffer = manager.getTextFileBuffer(targetFilePath);
という処理を行った際に,例えば既にtargetFilePathで示されるファイルが何らかのエディタで開かれていた場合は,既にそのエディタがテキストバッファを作成しているので,上記のgetTextFileBufferメソッドは新たにテキストバッファを作成するのではなく,エディタにより作成されたテキストバッファが返される。よって,
IDocument document = buffer.getDocument();
としてIDocumentオブジェクトを取得し,そのIDocumentオブジェクトに対して文字列の挿入などを行ったとすると,もちろんエディタにも文字列の挿入が反映される。エディタが持つIDocumentオブジェクトと,テキストバッファから取得したIDocumentオブジェクトが,同一のテキストバッファを指し示している証拠である。
ちなみに,
buffer.commit(null, true);
とした場合は,エディタで保存を行ったのと同じ効果が得られる。もちろん,エディタ上でも「*」マークが消されるので,エディタの内容(すなわちテキストバッファの内容)が保存されたことがわかるだろう。
| 固定リンク
この記事へのコメントは終了しました。
コメント