内部構造>Undoの仕組み
2006.04.11
文字列バッファの文字を追加・削除する場合やキャレット位置を変更する場合にはその履歴を記録することでUndoが行えるようになっている.
操作種別,キャレットの物理位置,操作に関連したデータブロックを保持するクラス.このオブジェクト1つで1種類の操作1つを格納する.
COpeを複数束ねるクラス.内容としてはCOpe*の可変長配列にすぎない.1コマンドの文書操作が複数の操作に該当するため,1回のUndoで元に戻す単位に束ねている.
Undo/Redoバッファ.COpeBlk*をリスト管理する.現在のUndo/redo位置も管理する.CEditDocのメンバである.
1つのコマンドの実行毎CEditView::HandleCommand()にてCEditView::m_pcOpeBlkにCOpeBlkオブジェクトが作成され,コマンド完了時点でCOpeBufへ新たな操作として登録される.
m_pcOpeBlkの操作は基本的にCEditViewのみで行われる.CEditViewにはバッファ操作とUndo登録を対にして行うためのメソッド群(DeleteData, DeleteData2, InsertData_CEditView, ReplaceData_CEditView)が用意されている.
CEditView::Command_UNDO(), CEditView::Command_REDO()でUndo/Redoを行う.COpeBuf::m_cOpeBufからUndo/Redo対象となるCOpeBufを取り出してそれを再生する.再生にもCEditViewのバッファ操作関数を用いるが,それらはCEditView::m_bDoing_UndoRedo がTRUEの場合にはUndoバッファに操作を記録しない.