« テキストバッファとエディタ | トップページ | 文字列の移動,コピーを行うテキスト編集クラス »

2004.08.05

ドキュメントの操作を簡単にするテキスト編集クラス

一般的にエディタに対して機能を拡張するプラグインでは,IDocumentインタフェースで表されるドキュメント(テキスト)を操作することが求められる。すなわち,エディタ内のテキストに対して,文字列の挿入や削除,置換などを行わなければならない。もちろん,IDocumentインタフェースのreplaceメソッドを使えば,テキスト操作を全て行うことができるのだが,ちょっと考えただけでも恐ろしくなるほどreplaceメソッドだけではテキスト操作は難しい

例えば,「09012345678」という電話番号があったとして,これに「-」を2つ加えて「090-1234-5678」としたいとすると,単純に考えると「3文字目の後と,7文字目の後に『-』を挿入する」となる。そこで,

  IDocument document = ...; // 09012345678
  document.replace(3, 0, "-");
  document.replace(7, 0, "-");

と実行してみると,結果は「090-123-45678」となってしまう。1回目のreplaceメソッドの実行によって1文字挿入されてしまったために,挿入すべき位置がずれてしまうからである。もちろん挿入した文字数を考慮して2回目の挿入位置を考慮すればいい話だが,もっと複雑なテキスト編集を行う場合は,はっきりいって誰でも頭の中はパニックになるだろう。

そんな大変なテキスト編集を簡単にするために,Eclipseでは便利なTextEditクラス(とそのサブクラス群)を用意してくれているTextEditクラスの機構を使うことで,上記のような操作位置の計算を自動的に行ってくれる

TextEditクラスは抽象クラスであり,開発者が使うのはTextEditクラスのサブクラスである。以下が代表的なTextEditクラスのサブクラスである。

  ・InsertEdit - 指定位置への文字列の挿入
    ex) new InsertEdit(10, "hoge"); // 9文字目に"hoge"を挿入

  ・DeleteEdit - 指定位置から指定長さ分だけ文字列の削除
    ex) new DeleteEdit(10, 5); // 9文字目から5文字分を削除

  ・ReplaceEdit - 指定位置から指定長さ分の文字列の置換
    ex) new RplaceEdit(10, 5, "hoge"); // 9文字目から5文字分を"hoge"に置換

これらのクラスのインスタンスを複数組み合わせることにより,ドキュメントを操作できる。例えば,先の電話番号の例では,InsertEditオブジェクトを2つ生成すればよい。

  InsertEdit edit1 = new InsertEdit(3, "-");
  InsertEdit edit2 = new InsertEdit(7, "-");

2つ目の「-」を挿入するInsertEditオブジェクトの生成では,1つ目の挿入を気にすることなく,7文字目を指定している。

さて,この2つのテキスト編集オブジェクトをドキュメントに対して一気に適用させるために,MultiTextEditクラスを使用する

  MultiTextEdit multiTextEdit = new MultiTextEdit();
  multiTextEdit.addChild(edit1);
  multiTextEdit.addChild(edit2);

MultiTextEditオブジェクトを生成し,addChildメソッドを使って先ほど生成したInsertEditオブジェクトを登録する。もちろんaddChildメソッドにRemoveEditオブジェクトやReplaceオブジェクトを渡すことも可能である。

最後に,applyメソッドにIDocumentオブジェクトを渡すことで,ドキュメントにテキスト編集を適用させる

  multiTextEdit.apply(document);

これにより,各テキスト編集の位置を内部で自動計算しながら,ドキュメントの内容が変更され,めでたく「090-1234-5678」となる。このように,TextEditクラスのサブクラスを用いることによって,元のドキュメントの内容を基準としたテキスト編集を手軽に行うことができる。しかもテキストの編集内容が複雑になればなるほど,TextEditクラスの恩恵を感じることができるはず。お試しあれ。

|

« テキストバッファとエディタ | トップページ | 文字列の移動,コピーを行うテキスト編集クラス »

コメント

コメントを書く



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




トラックバック

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

この記事へのトラックバック一覧です: ドキュメントの操作を簡単にするテキスト編集クラス:

« テキストバッファとエディタ | トップページ | 文字列の移動,コピーを行うテキスト編集クラス »