X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FUndo.h;h=c2b9b5d074b4e6e8fbef33e40e5aac73e74df3b3;hb=dab71087cf2954b77d3d2c0e67b868f9be82fba9;hp=f91b02fe8fd7c0d13970bc4c6c9658b762265101;hpb=574931dcdb04f0b3be09dc7a2305611c5e88ed78;p=lyx.git diff --git a/src/Undo.h b/src/Undo.h index f91b02fe8f..c2b9b5d074 100644 --- a/src/Undo.h +++ b/src/Undo.h @@ -23,7 +23,7 @@ namespace lyx { class Buffer; class BufferParams; -class DocIterator; +class CursorData; class Inset; class MathData; class ParagraphList; @@ -47,17 +47,23 @@ enum UndoKind { 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 &); /// End a sequence of INSERT_UNDO or DELETE_UNDO type of undo /// operations (grouping of consecutive characters insertion/deletion). @@ -77,9 +83,23 @@ public: * 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. /** @@ -88,26 +108,22 @@ public: * 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(DocIterator const & cur, UndoKind kind, - pit_type from, pit_type to); - - /// Convenience: record undo information for the range between - /// 'from' and cursor. - void recordUndo(DocIterator const & cur, UndoKind kind, pit_type from); + void recordUndo(CursorData const & cur, pit_type from, pit_type to); /// Convenience: record undo information for the single /// paragraph or cell containing the cursor. - void recordUndo(DocIterator const & cur, UndoKind kind = ATOMIC_UNDO); + void recordUndo(CursorData const & cur, UndoKind kind = ATOMIC_UNDO); - /// Convenience: record undo information for the inset - /// containing the cursor. - void recordUndoInset(DocIterator const & cur, - UndoKind kind = ATOMIC_UNDO, - Inset const * inset = 0); + /// prepare undo for the inset containing the cursor + void recordUndoInset(CursorData const & cur, Inset const * inset); + + /// 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; @@ -115,6 +131,29 @@ private: }; +/** Helper class to simplify the use of undo groups across several buffers. + * + * The undo group is created when the object is instanciated; it is + * then ended as the object goes out of scope or the buffer is reset + * (see below) + */ +class UndoGroupHelper { +public: + UndoGroupHelper(Buffer * buf = 0); + + ~UndoGroupHelper(); + + /** Close the current undo group if necessary and create a new one + * for buffer \c buf. + */ + void resetBuffer(Buffer * buf); + +private: + class Impl; + Impl * const d; +}; + + } // namespace lyx