X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fundo.h;h=494cf7b6fb70c056edaa1a3a2b08f935aaed314c;hb=9e1ce30ff75b0282f428738aa3f3562c21ceb9df;hp=edf8f5562e86bf93111e33fc00ea0aac55509b8d;hpb=18ce60e3c6d73414d085afe6a76effdcf2e4b65b;p=lyx.git diff --git a/src/undo.h b/src/undo.h index edf8f5562e..494cf7b6fb 100644 --- a/src/undo.h +++ b/src/undo.h @@ -16,102 +16,129 @@ #ifndef UNDO_H #define UNDO_H -#include "ParagraphList_fwd.h" +#include "dociterator.h" +#include "ParagraphList.h" +#include "bufferparams.h" + #include "support/types.h" -class LyXText; +#include + + +namespace lyx { + +class BufferParams; class BufferView; +class DocIterator; +class LCursor; + /** - * These are the elements put on the undo stack. Each object - * contains complete paragraphs and sufficient information - * to restore the state. - */ +These are the elements put on the undo stack. Each object contains complete +paragraphs from some cell and sufficient information to restore the cursor +state. + +The cell is given by a DocIterator pointing to this cell, the 'interesting' +range of paragraphs by counting them from begin and end of cell, +respectively. + +The cursor is also given as DocIterator and should point to some place in +the stored paragraph range. In case of math, we simply store the whole +cell, as there usually is just a simple paragraph in a cell. + +The idea is to store the contents of 'interesting' paragraphs in some +structure ('Undo') _before_ it is changed in some edit operation. +Obviously, the stored ranged should be as small as possible. However, it +there is a lower limit: The StableDocIterator pointing stored in the undo +class must be valid after the changes, too, as it will used as a pointer +where to insert the stored bits when performining undo. + +*/ + class Undo { public: - /** - * The undo kinds are used to combine consecutive undo recordings - * of the same kind. - */ + /// This is used to combine consecutive undo recordings of the same kind. enum undo_kind { /** * Insert something - these will combine to one big chunk * when many inserts come after each other. */ INSERT, - /** * Delete something - these will combine to one big chunk * when many deletes come after each other. */ DELETE, - /// Atomic - each of these will have its own entry in the stack ATOMIC }; - /// constructor - Undo(undo_kind kind, int text, int index, - int first_par, int end_par, int cursor_par, int cursor_pos); - /// which kind of operation are we recording for? + /// Which kind of operation are we recording for? undo_kind kind; - - /// hosting LyXText counted from buffer begin - int text; - - /// cell in a tabular or similar - int index; - - /// offset to the first paragraph in the paragraph list - int first_par; - - /// offset to the last paragraph from the end of parargraph list - int end_par; - - /// offset to the first paragraph in the paragraph list - int cursor_par; - - /// the position of the cursor in the hosting paragraph - int cursor_pos; - - /// the contents of the paragraphs saved + /// the position of the cursor + StableDocIterator cursor; + /// the position of the cell described + StableDocIterator cell; + /// counted from begin of cell + pit_type from; + /// complement to end of this cell + pit_type end; + /// the contents of the saved Paragraphs (for texted) ParagraphList pars; + /// the stringified contents of the saved MathArray (for mathed) + docstring array; + /// Only used in case of full backups + BufferParams bparams; + /// Only used in case of full backups + bool isFullBuffer; }; /// this will undo the last action - returns false if no undo possible -bool textUndo(BufferView *); +bool textUndo(BufferView & bv); /// this will redo the last undo - returns false if no redo possible -bool textRedo(BufferView *); +bool textRedo(BufferView & bv); /// makes sure the next operation will be stored void finishUndo(); -/// whilst undo is frozen, all actions do not get added to the undo stack -void freezeUndo(); - -/// track undos again -void unFreezeUndo(); /** - * Record undo information - call with the first paragraph that will be changed - * and the last paragraph that will be changed. So we give an inclusive - * range. + * Record undo information - call with the current cursor and the 'other + * end' of the range of changed paragraphs. So we give an inclusive range. * This is called before you make the changes to the paragraph, and it * will record the original information of the paragraphs in the undo stack. + * + * FIXME: We need something to record undo in partial grids for mathed. + * Right now we use recordUndoInset if more than one cell is changed, + * but that puts the cursor in front of the inset after undo. We would need + * something like + * recordUndoGrid(LCursor & cur, Undo::undo_kind kind, idx_type from, idx_type to); + * and store the cell information in class Undo. */ -void recordUndo(Undo::undo_kind kind, - LyXText const * text, lyx::paroffset_type first, lyx::paroffset_type last); -/// convienience: prepare undo when change in a single paragraph -void recordUndo(Undo::undo_kind kind, - LyXText const * text, lyx::paroffset_type par); +/// The general case: prepare undo for an arbitrary range. +/// FIXME: replace LCursor with DocIterator. This is not possible right +/// now because we need access to Buffer->params()!. +void recordUndo(LCursor & cur, Undo::undo_kind kind, + pit_type from, pit_type to); + +/// Convenience: prepare undo for the range between 'from' and cursor. +void recordUndo(LCursor & cur, Undo::undo_kind kind, pit_type from); + +/// Convenience: prepare undo for the single paragraph or cell +/// containing the cursor +void recordUndo(LCursor & cur, Undo::undo_kind kind = Undo::ATOMIC); +/// Convenience: prepare undo for the inset containing the cursor +void recordUndoInset(LCursor & cur, Undo::undo_kind kind = Undo::ATOMIC); +/// Convenience: prepare undo for the selected paragraphs +void recordUndoSelection(LCursor & cur, Undo::undo_kind kind = Undo::ATOMIC); + +/// Convenience: prepare undo for the whole buffer +void recordUndoFullDocument(BufferView * bv); -/// convienience: prepare undo for the paragraph that contains the cursor -void recordUndo(BufferView *, Undo::undo_kind kind); -/// are we avoiding tracking undos currently? -extern bool undo_frozen; +} // namespace lyx #endif // UNDO_FUNCS_H