]> git.lyx.org Git - lyx.git/blobdiff - src/undo.C
and this
[lyx.git] / src / undo.C
index 23885423274afa431634185f7ea8ba01d8a1f023..08431d9ee2c395eeec516278d054e5eb0ed015ee 100644 (file)
@@ -29,6 +29,9 @@
 
 using lyx::par_type;
 
+using std::advance;
+using std::endl;
+
 
 namespace {
 
@@ -38,8 +41,7 @@ bool undo_finished;
 
 std::ostream & operator<<(std::ostream & os, Undo const & undo)
 {
-       return os << " from: " << undo.from
-               << " end: " << undo.end
+       return os << " from: " << undo.from << " end: " << undo.end
                << " cursor:\n" << undo.cursor;
 }
 
@@ -57,7 +59,9 @@ void recordUndo(Undo::undo_kind kind,
        // create the position information of the Undo entry
        Undo undo;
        undo.kind = kind;
-       undo.cursor = StableDocumentIterator(cur);
+       undo.cursor = StableDocIterator(cur);
+       lyxerr << "recordUndo: cur: " << cur << endl;
+       lyxerr << "recordUndo: undo.cursor: " << undo.cursor << endl;
        undo.from = first_par;
        undo.end = cur.lastpar() - last_par;
 
@@ -91,7 +95,7 @@ void recordUndo(Undo::undo_kind kind,
                undo.pars = ParagraphList(first, last);
        }
 
-       // push the undo entry to undo stack 
+       // push the undo entry to undo stack
        //lyxerr << "undo record: " << stack.top() << std::endl;
        stack.push(undo);
 
@@ -104,7 +108,8 @@ void performUndoOrRedo(BufferView & bv, Undo const & undo)
 {
        LCursor & cur = bv.cursor();
        lyxerr << "undo, performing: " << undo << std::endl;
-       cur.setCursor(undo.cursor.asDocumentIterator(&bv.buffer()->inset()), false);
+       cur.setCursor(undo.cursor.asDocIterator(&bv.buffer()->inset()));
+       cur.selection() = false;
 
        if (cur.inMathed()) {
                // We stored the full cell here as there is not much to be
@@ -135,12 +140,12 @@ void performUndoOrRedo(BufferView & bv, Undo const & undo)
 }
 
 
-// returns false if no undo possible
+// Returns false if no undo possible.
 bool textUndoOrRedo(BufferView & bv,
        limited_stack<Undo> & stack, limited_stack<Undo> & otherstack)
 {
        if (stack.empty()) {
-               // nothing to do
+               // Nothing to do.
                finishUndo();
                return false;
        }
@@ -149,13 +154,21 @@ bool textUndoOrRedo(BufferView & bv,
        stack.pop();
        finishUndo();
 
-       // this implements redo
+       // This implements redo
        otherstack.push(undo);
-       DocumentIterator dit =
-               undo.cursor.asDocumentIterator(&bv.buffer()->inset());
+       // FIXME: This triggers the error in dociterator.C +454
+       // could the reason be that we rebuild the dit _before_ the
+       // contents is actually 'undone'?
+       // I.e. state now is 'A', state on undo stack is 'B'.
+       // dit is created according to positions from undo.cursor, i.e. B
+       // but current buffer contents is more likely 'A'.
+       DocIterator dit = undo.cursor.asDocIterator(&bv.buffer()->inset());
        if (dit.inMathed()) {
-               // not much to be done
+               // Easy way out: store a full cell.
+               otherstack.top().array = asString(dit.cell());
        } else {
+               // As cells might be too large in texted, store just a part
+               // of the paragraph list.
                otherstack.top().pars.clear();
                LyXText * text = dit.text();
                BOOST_ASSERT(text);
@@ -180,7 +193,7 @@ bool textUndoOrRedo(BufferView & bv,
 
 void finishUndo()
 {
-       // makes sure the next operation will be stored
+       // Make sure the next operation will be stored.
        undo_finished = true;
 }
 
@@ -205,9 +218,9 @@ void recordUndo(Undo::undo_kind kind,
        Buffer * buf = cur.bv().buffer();
        recordUndo(kind, cur, first, last, buf->undostack());
        buf->redostack().clear();
-       //lyxerr << "undostack:\n";
-       //for (size_t i = 0, n = buf->undostack().size(); i != n && i < 6; ++i)
-       //      lyxerr << "  " << i << ": " << buf->undostack()[i] << std::endl;
+       lyxerr << "undostack:\n";
+       for (size_t i = 0, n = buf->undostack().size(); i != n && i < 6; ++i)
+               lyxerr << "  " << i << ": " << buf->undostack()[i] << std::endl;
 }
 
 
@@ -217,6 +230,14 @@ void recordUndo(LCursor & cur, Undo::undo_kind kind)
 }
 
 
+void recordUndoInset(LCursor & cur, Undo::undo_kind kind)
+{
+       LCursor c = cur;
+       c.pop();
+       recordUndo(c, kind);
+}
+
+
 void recordUndoSelection(LCursor & cur, Undo::undo_kind kind)
 {
        recordUndo(kind, cur, cur.selBegin().par(), cur.selEnd().par());