« ドキュメントの操作を簡単にするテキスト編集クラス | トップページ | エディタからICompilationUnitオブジェクトを取得する方法 »

2004.08.06

文字列の移動,コピーを行うテキスト編集クラス

前回の「ドキュメントの操作を簡単にするテキスト編集クラス」では,ドキュメントのテキストに対して挿入,削除,置換処理を手軽に行うための方法を紹介した。今回は,挿入などよりもちょっと高級な,文字列の移動,コピーをやってくれるテキスト編集クラスを紹介する。

まずは移動から。文字列の移動は,2つのテキスト編集クラスを組み合わせて行う。つまり,文字列の移動を噛み砕くと「○文字目から○文字分を,○文字目に移動する」っていう表現になるが,この前半の「○文字目から○文字分を」を担当するのがMoveSourceEditクラス,後半の「○文字目に移動する」を担当するのがMoveTargetEditクラスである。

早速使い方を見てみよう。例として,「1234567890」という文字列の最初の「123」を5文字目の後に移動する(結果として「4512367890」とする)処理を考えてみる。

  IDocument document = ...; // "1234567890"

  MoveSourceEdit sourceEdit = new MoveSourceEdit(0, 3);
  MoveTargetEdit targetEdit = new MoveTargetEdit(5);
  sourceEdit.setTargetEdit(targetEdit);

  MultiTextEdit multiTextEdit = new MultiTextEdit();
  multiEdit.addChild(sourceEdit);
  multiEdit.addChild(targetEdit);
  multiTextEdit.apply(document); // "4512367890"

まず,移動元の文字列を特定するためのMoveSourceEditオブジェクトを生成する。この際,第1引数に何文字目の文字列なのか,第2引数には何文字分なのかを指定する。上記では「0文字目から3文字分("123")」を指定している。次に,移動先を特定するためのMoveTargetEditオブジェクトを生成する。引数には,何文字目に挿入するかを指定する。移動先の位置は,MoveSourceEditオブジェクトで特定される文字列の長さなどを気にする必要はなく,移動前の文字列における位置でかまわない。上記では5文字目を指定している。

そして,MoveSourceEditオブジェクトとMoveTargetEditオブジェクトを関連付ける。上記では,MoveSourceEditオブジェクトのsetTargetEditメソッドにMoveTargetEditオブジェクトを渡すことで関連付けを行っている。これの代わりに「targetEdit.setSourceEdit(sourceEdit);」というようにしても良い。

あとは前回の「ドキュメントの操作を簡単にするテキスト編集クラス」の時のように,MultiTextEditオブジェクトにMoveSourceEditオブジェクトとMoveTargetEditオブジェクトをaddCihldメソッドを使って登録し,applyメソッドを使ってIDocumentオブジェクトにテキスト編集を適用する。この際注意することは,setTargetEditメソッドまたはsetSourceEditメソッドを使って関連付けをちゃんとしておくことと(これを怠ると例外が発生する),MultiTextEditオブジェクトにMoveSourceEditオブジェクトとMoveTargetEditオブジェクトの両方をちゃんと登録しておくことである(片方だけだと移動処理が中途半端に終わってしまう)。

上記で移動の話は終わり。次にコピーだが,やり方は基本的に移動のときと同じであるが,使用するクラスが違ってくる。コピーの場合は,コピー元の文字列を特定するためにCopySourceEditクラスを,コピー先の位置を特定するためにCopyTargetEditクラスを使用する。

例として「1234567890」の最初の「123」を5文字目の後にコピーして「1234512367890」とする処理を考えると,以下のようなコードで実現できる。

  IDocument document = ...; // "1234567890"

  CopySourceEdit sourceEdit = new CopySourceEdit(0, 3);
  CopyTargetEdit targetEdit = new CopyTargetEdit(5);
  sourceEdit.setTargetEdit(targetEdit);

  MultiTextEdit multiTextEdit = new MultiTextEdit();
  multiEdit.addChild(sourceEdit);
  multiEdit.addChild(targetEdit);
  multiTextEdit.apply(document); // "1234512367890"

良く見ると,移動のときのサンプルとほぼ同じで,使用しているクラスを変えただけである。setSourceEditメソッドとsetTargetEditメソッドの話や,使用時の注意点などもMove~Editクラスのときと同じである。

あるテキストに対して,次々と編集を一気に加えていく処理を行うときは,「ドキュメントの操作を簡単にするテキスト編集クラス」で紹介したInsertEdit,DeleteEdit,ReplaceEditクラスや,今回取り上げたMove~Edit,Copy~Editクラスを組み合わせて実現することで,パニックを起こさずに処理を記述していけることだろう。

|

« ドキュメントの操作を簡単にするテキスト編集クラス | トップページ | エディタからICompilationUnitオブジェクトを取得する方法 »

コメント

コメントを書く



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




トラックバック

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

この記事へのトラックバック一覧です: 文字列の移動,コピーを行うテキスト編集クラス:

« ドキュメントの操作を簡単にするテキスト編集クラス | トップページ | エディタからICompilationUnitオブジェクトを取得する方法 »