X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fundo.h;h=9275e0e48cc2ed4cba96dc4fac8b3e9cd1d75381;hb=e94889a041628203c50b66b9a4add63210de6928;hp=fa3d0bc087bbf3bb7a14092dc1806eaaff80593c;hpb=0eccdd1c3613e5170deb77b22174dd0afde833e9;p=lyx.git diff --git a/src/undo.h b/src/undo.h index fa3d0bc087..9275e0e48c 100644 --- a/src/undo.h +++ b/src/undo.h @@ -1,162 +1,135 @@ // -*- C++ -*- -/* This file is part of - * ====================================================== - * - * LyX, The Document Processor - * - * Copyright (C) 1995 Matthias Ettrich, 1995, 1996 LyX Team +/** + * \file undo.h + * This file is part of LyX, the document processor. + * Licence details can be found in the file COPYING. * - *======================================================*/ -#ifndef _UNDO_H -#define _UNDO_H + * \author Asger Alstrup + * \author Lars Gullik Bjønnes + * \author John Levon + * \author André Pönitz + * \author Jürgen Vigna + * + * Full author contact details are available in file CREDITS. + */ + +#ifndef UNDO_H +#define UNDO_H + +#include "dociterator.h" +#include "ParagraphList.h" +#include "bufferparams.h" + +#include "support/types.h" + +#include + +class BufferParams; +class BufferView; +class LCursor; -#ifdef __GNUG__ -#pragma interface -#endif -#include "definitions.h" -#include "lyxparagraph.h" +/** +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 + /// 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, - /// - EDIT, - /// - FINISH + /// Atomic - each of these will have its own entry in the stack + ATOMIC }; - /// + + /// Which kind of operation are we recording for? undo_kind kind; - /// - int number_of_before_par; - /// - int number_of_behind_par; - /// - int number_of_cursor_par; - /// - int cursor_pos; // valid if >= 0 - /// - LyXParagraph* par; - /// - Undo(undo_kind kind_arg, - int number_before_arg, int number_behind_arg, - int cursor_par_arg, int cursor_pos_arg, - LyXParagraph* par_arg) - { - kind = kind_arg; - number_of_before_par = number_before_arg; - number_of_behind_par = number_behind_arg; - number_of_cursor_par = cursor_par_arg; - cursor_pos = cursor_pos_arg; - par = par_arg; - } - /// - ~Undo(){ - LyXParagraph* tmppar; - while (par) { - tmppar = par; - par = par->next; - delete tmppar; - } - } + /// the position of the cursor + StableDocIterator cursor; + /// the position of the cell described + StableDocIterator cell; + /// counted from begin of cell + lyx::pit_type from; + /// complement to end of this cell + lyx::pit_type end; + /// the contents of the saved Paragraphs (for texted) + ParagraphList pars; + /// the stringified contents of the saved MathArray (for mathed) + std::string array; + /// Only used in case of full backups + BufferParams bparams; + /// Only used in case of full backups + bool isFullBuffer; }; -/// A limited Stack for the undo informations. Matthias 290496 -class UndoStack{ -private: - /// - struct StackAtom{ - /// - StackAtom* previous; - /// - Undo* undo; - }; - /// - StackAtom* current; - /// - StackAtom *tmp; - /// - int size; - /// - int limit; -public: - /// - UndoStack(){ - current = 0; - // size must be initialised (thornley) - size = 0; - limit = 100; // the maximum number of undo steps stored. 0 means NO LIMIT. - // Limit can be changed with UndoStack::SetStackLimit(int) - } - /// - Undo *Pop(){ - Undo* result = 0; - if (current){ - result = current->undo; - tmp = current; - current = current->previous; - delete tmp; - size--; - } - else { - size = 0; // for safety... - } - return result; - } - /// - Undo* Top(){ - if (current) - return current->undo; - else - return 0; - } - /// - ~UndoStack(){ - Clear(); - } - /// - void Clear(){ - Undo* tmp_undo = Pop(); - while (tmp_undo){ - delete tmp_undo; - tmp_undo = Pop(); - } - } - /// - void SetStackLimit(int limit_arg) { - limit = limit_arg; - } - - /// - void Push(Undo* undo_arg){ - int i; - StackAtom* tmp2; - if (undo_arg){ - tmp = new StackAtom; - tmp->undo = undo_arg; - tmp->previous = current; - current = tmp; - size++; - if (limit && size > limit){ - for (i=0; iprevious; - while(tmp && tmp->previous){ - tmp2 = tmp->previous->previous; - delete tmp->previous; - size--; - tmp->previous = tmp2; - } - } - } - } -}; +/// this will undo the last action - returns false if no undo possible +bool textUndo(BufferView & bv); + +/// this will redo the last undo - returns false if no redo possible +bool textRedo(BufferView & bv); + +/// makes sure the next operation will be stored +void finishUndo(); + + +/** + * 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. + */ + +/// The general case: prepare undo for an arbitrary range. +void recordUndo(LCursor & cur, Undo::undo_kind kind, + lyx::pit_type from, lyx::pit_type to); + +/// Convenience: prepare undo for the range between 'from' and cursor. +void recordUndo(LCursor & cur, Undo::undo_kind kind, lyx::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); -#endif +#endif // UNDO_FUNCS_H