lyx_mirror/src/Undo.h
Jean-Marc Lasgouttes 17dd645862 Bug 5173: Undo Grouping
http://bugzilla.lyx.org/show_bug.cgi?id=5173

	* Undo.cpp (beginUndoGroup, endUndoGroup): new methods.
	(UndoElement): add group_id member
	(UndoElementStack): when removing old undo entries, make sure to
	remove whole groups.
	(Undo::Private): add group_id and group_level (for nesting) members.
	(doTextUndoOrRedo): new method. Apply _one_ UndoElement.
	(textUndoOrRedo): call doTextUndoOrRedo on each element of the current
	group.
	(recordUndoFullDocument): put inside an undo group

	* Cursor.cpp (beginUndoGroup, endUndoGroup): new methods.

	* LyXFunc.cpp (dispatch): add calls to (begin|end)UndoGroup.

	* lyxfind.cpp (replaceAll): use several recordUndo instead
	of one recordUndoFullDocument.


git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@26178 a592a061-630c-0410-9148-cb99ea01b6c8
2008-08-15 19:24:56 +00:00

114 lines
2.9 KiB
C++

// -*- C++ -*-
/**
* \file Undo.h
* This file is part of LyX, the document processor.
* Licence details can be found in the file COPYING.
*
* \author Asger Alstrup
* \author Lars Gullik Bjønnes
* \author John Levon
* \author André Pönitz
* \author Jürgen Vigna
* \author Abdelrazak Younes
*
* Full author contact details are available in file CREDITS.
*/
#ifndef UNDO_H
#define UNDO_H
#include "support/types.h"
namespace lyx {
class Buffer;
class BufferParams;
class DocIterator;
class MathData;
class ParagraphList;
/// This is used to combine consecutive undo recordings of the same kind.
enum UndoKind {
/**
* Insert something - these will combine to one big chunk
* when many inserts come after each other.
*/
INSERT_UNDO,
/**
* Delete something - these will combine to one big chunk
* when many deletes come after each other.
*/
DELETE_UNDO,
/// Atomic - each of these will have its own entry in the stack
ATOMIC_UNDO
};
/**
* 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
{
public:
Undo(Buffer &);
~Undo();
/// this will undo the last action - returns false if no undo possible
bool textUndo(DocIterator &);
/// this will redo the last undo - returns false if no redo possible
bool textRedo(DocIterator &);
/// makes sure the next operation will be stored
void finishUndo();
///
bool hasUndoStack() const;
///
bool hasRedoStack() const;
/// open a new group of undo operations. Groups can be nested.
void beginUndoGroup();
/// end the current undo group
void endUndoGroup();
/// The general case: prepare undo for an arbitrary range.
void recordUndo(DocIterator const & cur, UndoKind kind,
pit_type from, pit_type to);
/// Convenience: prepare undo for the range between 'from' and cursor.
void recordUndo(DocIterator const & cur, UndoKind kind, pit_type from);
/// 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: prepare undo for the whole buffer
void recordUndoFullDocument(DocIterator const & cur);
private:
struct Private;
Private * const d;
};
} // namespace lyx
#endif // UNDO_H