From: Alfredo Braunstein Date: Mon, 6 Dec 2004 13:06:13 +0000 (+0000) Subject: fix two undo crashes X-Git-Tag: 1.6.10~14754 X-Git-Url: https://git.lyx.org/gitweb/?a=commitdiff_plain;h=b5e2e1a3b503a7bc1204ff9d9ef95c72318a024b;p=features.git fix two undo crashes git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@9348 a592a061-630c-0410-9148-cb99ea01b6c8 --- diff --git a/src/ChangeLog b/src/ChangeLog index 0d5886c981..487a8575c6 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,4 +1,9 @@ +2004-12-06 Alfredo Braunstein + + * undo.C (textUndoOrRedo): simplify logic, fix a crash + (performUndoOrRedo): set the inset owner of paragraphs (fix a crash) + 2004-12-06 Alfredo Braunstein * lyxfunc.C: diff --git a/src/undo.C b/src/undo.C index 03786d50c2..92593be105 100644 --- a/src/undo.C +++ b/src/undo.C @@ -24,6 +24,7 @@ #include "paragraph.h" #include "mathed/math_support.h" +#include "insets/updatableinset.h" #include @@ -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(*pit).setInsetOwner(dynamic_cast(&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 & stack, limited_stack & 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(); - - // - // 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); - } + // We will store in otherstack the part of the document under 'undo' + DocIterator cell_dit = undo.cell.asDocIterator(&bv.buffer()->inset()); + 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; }