X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FUndo.h;h=fbfb9e7dbbb3dc40ef3ca1f2fd27725dec470ab1;hb=124e0fc2be2446f7182cba0e5b54961dc1cfab91;hp=b0889319ab988f027475b7374bb33efd47d95230;hpb=17dd64586252db85b4b8268b400afe4402ec5024;p=lyx.git diff --git a/src/Undo.h b/src/Undo.h index b0889319ab..fbfb9e7dbb 100644 --- a/src/Undo.h +++ b/src/Undo.h @@ -5,10 +5,10 @@ * Licence details can be found in the file COPYING. * * \author Asger Alstrup - * \author Lars Gullik Bjønnes + * \author Lars Gullik Bjønnes * \author John Levon - * \author André Pönitz - * \author Jürgen Vigna + * \author André Pönitz + * \author Jürgen Vigna * \author Abdelrazak Younes * * Full author contact details are available in file CREDITS. @@ -22,10 +22,8 @@ namespace lyx { class Buffer; -class BufferParams; -class DocIterator; -class MathData; -class ParagraphList; +class CursorData; +class Inset; /// This is used to combine consecutive undo recordings of the same kind. enum UndoKind { @@ -44,34 +42,28 @@ enum UndoKind { }; -/** - * 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(DocIterator & cur, UndoKind kind, idx_type from, idx_type to); - * and store the cell information in class Undo. - */ class Undo { + /// noncopyable + Undo(Undo const &); + void operator=(Undo const &); public: Undo(Buffer &); ~Undo(); + /// Clear out all undo/redo contents. + void clear(); + /// this will undo the last action - returns false if no undo possible - bool textUndo(DocIterator &); + bool undoAction(CursorData &); /// this will redo the last undo - returns false if no redo possible - bool textRedo(DocIterator &); + bool redoAction(CursorData &); - /// makes sure the next operation will be stored + /// End a sequence of INSERT_UNDO or DELETE_UNDO type of undo + /// operations (grouping of consecutive characters insertion/deletion). void finishUndo(); /// @@ -79,27 +71,56 @@ public: /// bool hasRedoStack() const; - /// open a new group of undo operations. Groups can be nested. - void beginUndoGroup(); + /// Mark all the elements of the undo and redo stacks as dirty + void markDirty(); - /// end the current undo group + /// open a new group of undo operations. + /** + * Groups can be nested. Such a nested group e.g. { {} {} } is undone in + * a single step. This means you can add a group whenever you are not sure. + */ + void beginUndoGroup(); + /// open a new group as above and specify a cursor to set as cur_before + /// of the group's undo elements. + /** + * This cursor takes precedence over what is passed to recordUndo. + * In the case of nested groups, only the first cur_before is + * taken into account. The cursor is reset at the end of the + * top-level group. + */ + void beginUndoGroup(CursorData const & cur_before); + /// end the current undo group. void endUndoGroup(); + /// end the current undo group and set UndoElement::cur_after if necessary. + void endUndoGroup(CursorData const & cur_after); + /// end abruptly the current group and create a new one wih the same nesting level + void splitUndoGroup(CursorData const & cur); + /// return true if an undo group is open and contains at least one element + bool activeUndoGroup() const; + + /// The general case: record undo information for an arbitrary 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. + * Kind of undo is always ATOMIC_UNDO. + */ + void recordUndo(CursorData const & cur, pit_type from, pit_type to); - /// The general case: prepare undo for an arbitrary range. - void recordUndo(DocIterator const & cur, UndoKind kind, - pit_type from, pit_type to); + /// Convenience: record undo information for the single + /// paragraph or cell containing the cursor. + void recordUndo(CursorData const & cur, UndoKind kind = ATOMIC_UNDO); - /// Convenience: prepare undo for the range between 'from' and cursor. - void recordUndo(DocIterator const & cur, UndoKind kind, pit_type from); + /// prepare undo for the inset containing the cursor + void recordUndoInset(CursorData const & cur, Inset const * inset); - /// Convenience: prepare undo for the single paragraph or cell - /// containing the cursor - void recordUndo(DocIterator const & cur, UndoKind kind = ATOMIC_UNDO); - /// Convenience: prepare undo for the inset containing the cursor - void recordUndoInset(DocIterator const & cur, UndoKind kind = ATOMIC_UNDO); + /// Convenience: record undo for buffer parameters + void recordUndoBufferParams(CursorData const & cur); /// Convenience: prepare undo for the whole buffer - void recordUndoFullDocument(DocIterator const & cur); + void recordUndoFullBuffer(CursorData const & cur); private: struct Private; @@ -107,6 +128,28 @@ private: }; +/** Helper class to simplify the use of undo groups across several buffers. + * + * The undo group is open when the object is instantiated or when + * the buffer is reset; it is then ended as the object goes out of + * scope (see below) + */ +class UndoGroupHelper { +public: + // Begin a new undo group for buffer \c buf. + UndoGroupHelper(Buffer * buf); + // End all active undo groups. + ~UndoGroupHelper(); + + // Begin if needed an undo group for buffer \c buf. + void resetBuffer(Buffer * buf); + +private: + class Impl; + Impl * const d; +}; + + } // namespace lyx