undolist.rb

Path: lib/fox12/undolist.rb
Last Update: Sat Aug 07 05:45:22 CDT 2004

This is a "pure Ruby" implementation of the FXUndoList and FXCommand classes from the standard FOX distribution. Since those classes are independent of the rest of FOX this is a simpler (and probably more efficient) approach than trying to wrap the original C++ classes.

Notes (by Jeroen, lifted from FXUndoList.cpp):

  • When a command is undone, it’s moved to the redo list.
  • When a command is redone, it’s moved back to the undo list.
  • Whenever adding a new command, the redo list is deleted.
  • At any time, you can trim down the undo list down to a given maximum size or a given number of undo records. This should keep the memory overhead within sensible bounds.
  • To keep track of when we get back to an "unmodified" state, a mark can be set. The mark is basically a counter which is incremented with every undo record added, and decremented when undoing a command. When we get back to 0, we are back to the unmodified state.

    If, after setting the mark, we have called FXUndoList#undo, then the mark can be reached by calling FXUndoList#redo.

    If the marked position is in the redo-list, then adding a new undo record will cause the redo-list to be deleted, and the marked position will become unreachable.

    The marked state may also become unreachable when the undo list is trimmed.

  • You can call also kill the redo list without adding a new command to the undo list, although this may cause the marked position to become unreachable.
  • We measure the size of the undo-records in the undo-list; when the records are moved to the redo-list, they usually contain different information!

Required files

fox12   fox12/responder  

[Validate]