4 * This file is part of LyX, the document processor.
5 * Licence details can be found in the file COPYING.
7 * \author Asger Alstrup
8 * \author Lars Gullik Bjønnes
10 * \author André Pönitz
11 * \author Jürgen Vigna
12 * \author Abdelrazak Younes
14 * Full author contact details are available in file CREDITS.
20 #include "support/types.h"
28 /// This is used to combine consecutive undo recordings of the same kind.
31 * Insert something - these will combine to one big chunk
32 * when many inserts come after each other.
36 * Delete something - these will combine to one big chunk
37 * when many deletes come after each other.
40 /// Atomic - each of these will have its own entry in the stack
49 void operator=(Undo const &);
56 /// Clear out all undo/redo contents.
59 /// this will undo the last action - returns false if no undo possible
60 bool undoAction(CursorData &);
62 /// this will redo the last undo - returns false if no redo possible
63 bool redoAction(CursorData &);
65 /// End a sequence of INSERT_UNDO or DELETE_UNDO type of undo
66 /// operations (grouping of consecutive characters insertion/deletion).
70 bool hasUndoStack() const;
72 bool hasRedoStack() const;
74 /// Mark all the elements of the undo and redo stacks as dirty
77 /// open a new group of undo operations.
79 * Groups can be nested. Such a nested group e.g. { {} {} } is undone in
80 * a single step. This means you can add a group whenever you are not sure.
82 void beginUndoGroup();
83 /// open a new group as above and specify a cursor to set as cur_before
84 /// of the group's undo elements.
86 * This cursor takes precedence over what is passed to recordUndo.
87 * In the case of nested groups, only the first cur_before is
88 * taken into account. The cursor is reset at the end of the
91 void beginUndoGroup(CursorData const & cur_before);
92 /// end the current undo group.
94 /// end the current undo group and set UndoElement::cur_after if necessary.
95 void endUndoGroup(CursorData const & cur_after);
96 /// end abruptly the current group and create a new one wih the same nesting level
97 void splitUndoGroup(CursorData const & cur);
98 /// return true if an undo group is open and contains at least one element
99 bool activeUndoGroup() const;
101 /// The general case: record undo information for an arbitrary range.
103 * Record undo information - call with the current cursor and
104 * the 'other end' of the range of changed paragraphs. So we
105 * give an inclusive range. This is called before you make the
106 * changes to the paragraph, and it will record the original
107 * information of the paragraphs in the undo stack.
108 * Kind of undo is always ATOMIC_UNDO.
110 void recordUndo(CursorData const & cur, pit_type from, pit_type to);
112 /// Convenience: record undo information for the single
113 /// paragraph or cell containing the cursor.
114 void recordUndo(CursorData const & cur, UndoKind kind = ATOMIC_UNDO);
116 /// prepare undo for the inset containing the cursor
117 void recordUndoInset(CursorData const & cur, Inset const * inset);
119 /// Prepare undo for the whole buffer (but not the buffer parameters)
120 void recordUndoFullBuffer();
122 /// Record undo for buffer parameters, with or without pre-undo
124 void recordUndoBufferParams(CursorData const & cur);
125 void recordUndoBufferParams();
133 /** Helper class to simplify the use of undo groups across several buffers.
135 * The undo group is open when the object is instantiated or when
136 * the buffer is reset; it is then ended as the object goes out of
139 class UndoGroupHelper {
141 // Begin a new undo group for buffer \c buf.
142 UndoGroupHelper(Buffer * buf);
143 // End all active undo groups.
146 // Begin if needed an undo group for buffer \c buf.
147 void resetBuffer(Buffer * buf);