]> git.lyx.org Git - lyx.git/blobdiff - src/undo.C
ws changes mostly
[lyx.git] / src / undo.C
index 58aaa6612d74b9e2a09d6d1d98a80a2db570d970..1517cf6360613361bd4d25504e560d93ce49cd3c 100644 (file)
 #include "paragraph.h"
 
 #include "mathed/math_support.h"
+#include "insets/updatableinset.h"
 
 #include <algorithm>
 
-using lyx::par_type;
+using lyx::pit_type;
 
 using std::advance;
 using std::endl;
@@ -48,14 +49,13 @@ std::ostream & operator<<(std::ostream & os, Undo const & undo)
 
 
 void recordUndo(Undo::undo_kind kind,
-       DocIterator & cell, 
-       par_type first_par, par_type last_par,
+       DocIterator & cell,
+       pit_type first_pit, pit_type last_pit,
        DocIterator & cur,
        limited_stack<Undo> & stack)
 {
-       if (first_par > last_par)
-               std::swap(first_par, last_par);
-
+       if (first_pit > last_pit)
+               std::swap(first_pit, last_pit);
        // create the position information of the Undo entry
        Undo undo;
        undo.kind = kind;
@@ -64,8 +64,8 @@ void recordUndo(Undo::undo_kind kind,
        lyxerr << "recordUndo: cur: " << cur << endl;
        lyxerr << "recordUndo: pos: " << cur.pos() << endl;
        //lyxerr << "recordUndo: cell: " << cell << endl;
-       undo.from = first_par;
-       undo.end = cell.lastpar() - last_par;
+       undo.from = first_pit;
+       undo.end = cell.lastpit() - last_pit;
 
        // Undo::ATOMIC are always recorded (no overlapping there).
        // As nobody wants all removed character appear one by one when undoing,
@@ -91,9 +91,9 @@ void recordUndo(Undo::undo_kind kind,
                BOOST_ASSERT(text);
                ParagraphList & plist = text->paragraphs();
                ParagraphList::iterator first = plist.begin();
-               advance(first, first_par);
+               advance(first, first_pit);
                ParagraphList::iterator last = plist.begin();
-               advance(last, last_par + 1);
+               advance(last, last_pit + 1);
                undo.pars = ParagraphList(first, last);
        }
 
@@ -105,14 +105,15 @@ void recordUndo(Undo::undo_kind kind,
        undo_finished = false;
 }
 
+
 void recordUndo(Undo::undo_kind kind,
-       LCursor & cur, par_type first_par, par_type last_par,
+       LCursor & cur, pit_type first_pit, pit_type last_pit,
        limited_stack<Undo> & stack)
 {
-       BOOST_ASSERT(first_par <= cur.lastpar());
-       BOOST_ASSERT(last_par <= cur.lastpar());
+       BOOST_ASSERT(first_pit <= cur.lastpit());
+       BOOST_ASSERT(last_pit <= cur.lastpit());
 
-       recordUndo(kind, cur, first_par, last_par, cur, stack);
+       recordUndo(kind, cur, first_pit, last_pit, cur, 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.par(), cur_dit.par(),
-                       cur_dit, otherstack);
-       }
-       else {
-               recordUndo(Undo::ATOMIC, ancestor_dit,
-                       ancestor_dit.par(),
-                       ancestor_dit.par(),
-                       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;
 }
@@ -237,7 +212,7 @@ bool textRedo(BufferView & bv)
 
 
 void recordUndo(Undo::undo_kind kind,
-       LCursor & cur, par_type first, par_type last)
+       LCursor & cur, pit_type first, pit_type last)
 {
        Buffer * buf = cur.bv().buffer();
        recordUndo(kind, cur, first, last, buf->undostack());
@@ -250,7 +225,7 @@ void recordUndo(Undo::undo_kind kind,
 
 void recordUndo(LCursor & cur, Undo::undo_kind kind)
 {
-       recordUndo(kind, cur, cur.par(), cur.par());
+       recordUndo(kind, cur, cur.pit(), cur.pit());
 }
 
 
@@ -264,25 +239,25 @@ void recordUndoInset(LCursor & cur, Undo::undo_kind kind)
 
 void recordUndoSelection(LCursor & cur, Undo::undo_kind kind)
 {
-       recordUndo(kind, cur, cur.selBegin().par(), cur.selEnd().par());
+       recordUndo(kind, cur, cur.selBegin().pit(), cur.selEnd().pit());
 }
 
 
-void recordUndo(LCursor & cur, Undo::undo_kind kind, par_type from)
+void recordUndo(LCursor & cur, Undo::undo_kind kind, pit_type from)
 {
-       recordUndo(kind, cur, cur.par(), from);
+       recordUndo(kind, cur, cur.pit(), from);
 }
 
 
 void recordUndo(LCursor & cur, Undo::undo_kind kind,
-       par_type from, par_type to)
+       pit_type from, pit_type to)
 {
        recordUndo(kind, cur, from, to);
 }
 
 
-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);
 }