]> git.lyx.org Git - features.git/blobdiff - src/Undo.cpp
The way this was done here is inconsistent with how it is done
[features.git] / src / Undo.cpp
index b305edef7909bbe1ab761e2884d769bdd5e1ca7c..7a1c6fdf574474119e403ad72071da4c333c42ce 100644 (file)
@@ -33,6 +33,7 @@
 #include "support/debug.h"
 #include "support/gettext.h"
 #include "support/lassert.h"
+#include "support/lyxtime.h"
 
 #include <algorithm>
 #include <deque>
@@ -72,7 +73,7 @@ struct UndoElement
                    bool lc, size_t gid) :
                kind(kin), cur_before(cb), cell(cel), from(fro), end(en),
                pars(pl), array(ar), bparams(0),
-               lyx_clean(lc), group_id(gid)
+               lyx_clean(lc), group_id(gid), time(current_time())
                {
                }
        ///
@@ -80,11 +81,11 @@ struct UndoElement
                                bool lc, size_t gid) :
                kind(ATOMIC_UNDO), cur_before(cb), cell(), from(0), end(0),
                pars(0), array(0), bparams(new BufferParams(bp)),
-               lyx_clean(lc), group_id(gid)
+               lyx_clean(lc), group_id(gid), time(current_time())
        {
        }
        ///
-       UndoElement(UndoElement const & ue)
+       UndoElement(UndoElement const & ue) : time(current_time())
        {
                kind = ue.kind;
                cur_before = ue.cur_before;
@@ -121,12 +122,14 @@ struct UndoElement
        ParagraphList * pars;
        /// the contents of the saved MathData (for mathed)
        MathData * array;
-       /// Only used in case of full backups
+       /// Only used in case of params undo
        BufferParams const * bparams;
        /// Was the buffer clean at this point?
        bool lyx_clean;
        /// the element's group id
        size_t group_id;
+       /// timestamp
+       time_t time;
 private:
        /// Protect construction
        UndoElement();
@@ -321,12 +324,17 @@ void Undo::Private::doRecordUndo(UndoKind kind,
        if (!undo_finished_
            && kind != ATOMIC_UNDO
            && !stack.empty()
+           && !stack.top().bparams
            && samePar(stack.top().cell, cell)
            && stack.top().kind == kind
            && stack.top().from == from
-           && stack.top().end == end) {
+           && stack.top().end == end
+           && stack.top().cur_after == cur_before
+           && current_time() - stack.top().time <= 2) {
                // reset cur_after; it will be filled correctly by endUndoGroup.
                stack.top().cur_after = CursorData();
+               // update the timestamp of the undo element
+               stack.top().time = current_time();
                return;
        }
 
@@ -426,10 +434,12 @@ void Undo::Private::doTextUndoOrRedo(CursorData & cur, UndoElementStack & stack,
 
        if (undo.bparams)
                doRecordUndoBufferParams(undo.cur_after, otherstack);
-       else
+       else {
+               LATTEST(undo.end <= cell_dit.lastpit());
                doRecordUndo(ATOMIC_UNDO, cell_dit,
                                         undo.from, cell_dit.lastpit() - undo.end, undo.cur_after,
                                         otherstack);
+       }
        otherstack.top().cur_after = undo.cur_before;
 
        // This does the actual undo/redo.
@@ -567,43 +577,31 @@ void Undo::endUndoGroup(CursorData const & cur)
 }
 
 
-// FIXME: remove these convenience functions and make
-// Private::recordUndo public as sole interface. The code in the
-// convenience functions can move to Cursor.cpp.
-
 void Undo::recordUndo(CursorData const & cur, UndoKind kind)
 {
        d->recordUndo(kind, cur, cur.pit(), cur.pit(), cur);
 }
 
 
-void Undo::recordUndoInset(CursorData const & cur, UndoKind kind,
-                          Inset const * inset)
+void Undo::recordUndo(CursorData const & cur, pit_type from, pit_type to)
+{
+       d->recordUndo(ATOMIC_UNDO, cur, from, to, cur);
+}
+
+
+void Undo::recordUndoInset(CursorData const & cur, Inset const * inset)
 {
        if (!inset || inset == &cur.inset()) {
                DocIterator c = cur;
                c.pop_back();
-               d->recordUndo(kind, c, c.pit(), c.pit(), cur);
+               d->recordUndo(ATOMIC_UNDO, c, c.pit(), c.pit(), cur);
        } else if (inset == cur.nextInset())
-               recordUndo(cur, kind);
+               recordUndo(cur);
        else
                LYXERR0("Inset not found, no undo stack added.");
 }
 
 
-void Undo::recordUndo(CursorData const & cur, UndoKind kind, pit_type from)
-{
-       d->recordUndo(kind, cur, cur.pit(), from, cur);
-}
-
-
-void Undo::recordUndo(CursorData const & cur, UndoKind kind,
-       pit_type from, pit_type to)
-{
-       d->recordUndo(kind, cur, from, to, cur);
-}
-
-
 void Undo::recordUndoBufferParams(CursorData const & cur)
 {
        d->recordUndoBufferParams(cur);
@@ -621,5 +619,18 @@ void Undo::recordUndoFullBuffer(CursorData const & cur)
        endUndoGroup();
 }
 
+/// UndoGroupHelper class stuff
+
+void UndoGroupHelper::resetBuffer(Buffer * buf)
+{
+       if (buf == buffer_)
+               return;
+       if (buffer_)
+               buffer_->undo().endUndoGroup();
+       buffer_ = buf;
+       if (buffer_)
+               buffer_->undo().beginUndoGroup();
+}
+
 
 } // namespace lyx