]> git.lyx.org Git - lyx.git/commitdiff
workaround crash in undo. This is not a proper fix but 'works'.
authorAndré Pönitz <poenitz@gmx.net>
Sat, 23 Oct 2004 11:04:41 +0000 (11:04 +0000)
committerAndré Pönitz <poenitz@gmx.net>
Sat, 23 Oct 2004 11:04:41 +0000 (11:04 +0000)
Have a look at the new 'FIXME' if yiou are interested...

git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@9112 a592a061-630c-0410-9148-cb99ea01b6c8

src/coordcache.C
src/dociterator.C
src/text.C
src/undo.C

index 6f75791eb940486641c4f511dd1156e3d4760896..11e5a8db3ee51eb691388aac5ff2c007dc76f546 100644 (file)
@@ -14,10 +14,10 @@ void lyxbreaker(void const * data, const char * hint, int size)
 
 void CoordCache::clear()
 {
-       lyxerr << "CoordCache: removing " << arrays_.data_.size()
-               << " arrays" << std::endl;
-       lyxerr << "CoordCache: removing " << insets_.data_.size()
-               << " insets" << std::endl;
+//     lyxerr << "CoordCache: removing " << arrays_.data_.size()
+//             << " arrays" << std::endl;
+//     lyxerr << "CoordCache: removing " << insets_.data_.size()
+//             << " insets" << std::endl;
        arrays_.clear();
        insets_.clear();
 }
index 2df577b5f4adfffe1cc6caf21a2fcc57c700a139..49b8471f4a52c11f95e823df57e57c049ce4886d 100644 (file)
@@ -57,6 +57,10 @@ InsetBase * DocIterator::nextInset()
        BOOST_ASSERT(!empty());
        if (pos() == lastpos())
                return 0;
+       if (pos() > lastpos()) {
+               lyxerr << "Should not happen, but it does. " << endl;
+               return 0;
+       }
        if (inMathed())
                return nextAtom().nucleus();
        return paragraph().isInset(pos()) ? paragraph().getInset(pos()) : 0;
@@ -440,13 +444,19 @@ StableDocIterator::StableDocIterator(const DocIterator & dit)
 }
 
 
-DocIterator
-StableDocIterator::asDocIterator(InsetBase * inset) const
+DocIterator StableDocIterator::asDocIterator(InsetBase * inset) const
 {
        // this function re-creates the cache of inset pointers
        //lyxerr << "converting:\n" << *this << endl;
        DocIterator dit = DocIterator(*inset);
        for (size_t i = 0, n = data_.size(); i != n; ++i) {
+               if (inset == 0) {
+                       // FIXME
+                       lyxerr << "Should not happen, but does e.g. after C-n C-l C-z S-C-z"
+                               << endl << "dit: " << dit << endl
+                               << " lastpos: " << dit.lastpos() << endl;
+                       break;
+               }
                dit.push_back(data_[i]);
                dit.back().inset_ = inset;
                if (i + 1 != n)
index 05954f6ddc9e5f92ad642019f3c02bb5cff3f8ae..6dcc706c3d6d9aa0dfa602261b9714c7ecd03951 100644 (file)
@@ -625,12 +625,11 @@ int LyXText::leftMargin(par_type const pit, pos_type const pos) const
 
 int LyXText::rightMargin(Paragraph const & par) const
 {
-       LyXTextClass const & tclass = bv()->buffer()->params().getLyXTextClass();
-
        // We do not want rightmargins on inner texts.
        if (bv()->text() != this)
                return 0;
 
+       LyXTextClass const & tclass = bv()->buffer()->params().getLyXTextClass();
        int const r_margin =
                ::rightMargin()
                + font_metrics::signedWidth(tclass.rightmargin(),
@@ -640,7 +639,6 @@ int LyXText::rightMargin(Paragraph const & par) const
                * 4 / (par.getDepth() + 4);
 
        return r_margin;
-
 }
 
 
index d7a36941d0b6769fd933840b2475f3ce4f988c80..08431d9ee2c395eeec516278d054e5eb0ed015ee 100644 (file)
 
 #include <algorithm>
 
-using std::advance;
-
 using lyx::par_type;
 
+using std::advance;
 using std::endl;
 
 
@@ -42,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;
 }
 
@@ -62,6 +60,8 @@ void recordUndo(Undo::undo_kind kind,
        Undo undo;
        undo.kind = kind;
        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;
 
@@ -140,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;
        }
@@ -154,10 +154,15 @@ bool textUndoOrRedo(BufferView & bv,
        stack.pop();
        finishUndo();
 
-       // this implements redo
+       // This implements redo
        otherstack.push(undo);
-       DocIterator dit =
-               undo.cursor.asDocIterator(&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()) {
                // Easy way out: store a full cell.
                otherstack.top().array = asString(dit.cell());
@@ -188,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;
 }