]> git.lyx.org Git - lyx.git/blobdiff - src/undo.C
fix crash when collapsing ert with cursor inside
[lyx.git] / src / undo.C
index 4723b57b43d0e73d7ac00042069f84f4e047a0b1..1517cf6360613361bd4d25504e560d93ce49cd3c 100644 (file)
@@ -24,6 +24,7 @@
 #include "paragraph.h"
 
 #include "mathed/math_support.h"
+#include "insets/updatableinset.h"
 
 #include <algorithm>
 
@@ -55,7 +56,6 @@ void recordUndo(Undo::undo_kind kind,
 {
        if (first_pit > last_pit)
                std::swap(first_pit, last_pit);
-
        // create the position information of the Undo entry
        Undo undo;
        undo.kind = kind;
@@ -105,6 +105,7 @@ void recordUndo(Undo::undo_kind kind,
        undo_finished = false;
 }
 
+
 void recordUndo(Undo::undo_kind kind,
        LCursor & cur, pit_type first_pit, pit_type last_pit,
        limited_stack<Undo> & stack)
@@ -141,6 +142,13 @@ void performUndoOrRedo(BufferView & bv, Undo const & undo)
                // re-insert old stuff instead
                first = plist.begin();
                advance(first, undo.from);
+
+               // this ugly stuff is needed until we get rid of the
+               // inset_owner backpointer
+               ParagraphList::const_iterator pit = undo.pars.begin();
+               ParagraphList::const_iterator end = undo.pars.end();
+               for (; pit != end; ++pit)
+                       const_cast<Paragraph &>(*pit).setInsetOwner(dynamic_cast<UpdatableInset *>(&dit.inset()));
                plist.insert(first, undo.pars.begin(), undo.pars.end());
        }
 
@@ -156,58 +164,25 @@ void performUndoOrRedo(BufferView & bv, Undo const & undo)
 bool textUndoOrRedo(BufferView & bv,
        limited_stack<Undo> & stack, limited_stack<Undo> & otherstack)
 {
+       finishUndo();
+
        if (stack.empty()) {
                // Nothing to do.
-               finishUndo();
                return false;
        }
 
-       //
        // Adjust undo stack and get hold of current undo data.
-       //
        Undo undo = stack.top();
        stack.pop();
-       finishUndo();
 
+       // We will store in otherstack the part of the document under 'undo'
+       DocIterator cell_dit = undo.cell.asDocIterator(&bv.buffer()->inset());
 
-       //
-       // This implements redo.
-       //
-
-       // The cursor will be placed at cur_dit after
-       // the ongoing undo operation.
-       DocIterator cur_dit =
-               undo.cursor.asDocIterator(&bv.buffer()->inset());
-
-       // This is the place the cursor is currently located.
-       LCursor & cur = bv.cursor();
-       DocIterator cell_dit = cur;
-
-       // If both places have the same depth we stay in the same
-       // cell and store paragraphs from this cell. Otherwise we
-       // will drop slices from the more nested iterator and
-       // create an undo item from a single paragraph of the common
-       // ancestor.
-       DocIterator ancestor_dit = cur_dit;
-       while (ancestor_dit.size() > cur.size())
-               ancestor_dit.pop_back();
-
-       if (cur_dit.size() == cell_dit.size()) {
-               recordUndo(Undo::ATOMIC, cell_dit,
-                       cell_dit.pit(), cur_dit.pit(),
-                       cur_dit, otherstack);
-       }
-       else {
-               recordUndo(Undo::ATOMIC, ancestor_dit,
-                       ancestor_dit.pit(),
-                       ancestor_dit.pit(),
-                       cur_dit, otherstack);
-       }
-
+       recordUndo(Undo::ATOMIC, cell_dit,
+                  undo.from, cell_dit.lastpit() - undo.end,
+                  bv.cursor(), otherstack);
 
-       //
-       // This does the actual undo.
-       //
+       // This does the actual undo/redo.
        performUndoOrRedo(bv, undo);
        return true;
 }
@@ -281,8 +256,8 @@ void recordUndo(LCursor & cur, Undo::undo_kind kind,
 }
 
 
-void recordUndoFullDocument(LCursor &)
+void recordUndoFullDocument(LCursor & cur)
 {
-       //recordUndo(Undo::ATOMIC,
-       //      cur, 0, cur.bv().text()->paragraphs().size() - 1);
+       recordUndo(Undo::ATOMIC, cur, 0,
+                  cur.bv().text()->paragraphs().size() - 1);
 }