前回のプログラムを一括で大量の置換した場合、Undoするときも一括でできるようにしてみます。

SetSelectedTextを何回も使うことでひとつずつUndoすることができるわけですが、こんな場合はどうすればいいのでしょうか?

置換は一瞬、Undoはひとつずつ・・・。一括置換のUndoとRedoも一括でできるようにしたいものです。

そのためにはどうすればいいでしょうか? どこまでを一括で処理するべきかをはっきりさせる必要があります。

そこでUndobufのフィールド変数に以下を追加します。

一括置換がおこなわれた時間を記録します。-1以外の値で同じ値が連続する部分が一括置換がおこなわれた部分です。

さて、問題はDoUndoReplacesをどう書くかです。

まず buf.replaceTime が同じものを探します。2つ以上みつかった場合は一括置換が行なわれたことを意味しています。

次にイベントを発生させて、一括でUndoする、ひとつずつUndoする、処理をキャンセルするを選ぶことができるようにします。

一括でUndoする場合は別のSyncRichTextBoxを生成してそこで処理をおこないます(カーソルがチカチカするのを防ぐため)。終わったらデータをコピーし、Undobufも移動させます。

またカーソルの位置も適切な場所になるように調整します。

UndoもRedoも似たような処理なので、まとめて書いています。