From 03ea5d80b75a41b7c3a800ec7ce03c4e6e379b3d Mon Sep 17 00:00:00 2001 From: Georg Baum Date: Tue, 15 Feb 2005 17:34:54 +0000 Subject: [PATCH] =?UTF-8?q?try=20to=20fix=20broken=20cursor=20(from=20Andr?= =?UTF-8?q?=EF=BF=BD)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@9635 a592a061-630c-0410-9148-cb99ea01b6c8 --- src/ChangeLog | 6 ++++++ src/cursor.C | 39 +++++++++++++++++++++++++++++++++++++++ src/cursor.h | 2 ++ src/lyxfunc.C | 24 ++++++------------------ 4 files changed, 53 insertions(+), 18 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index f5d4251677..db30f1c8fa 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,9 @@ +2005-02-13 André Pönitz + + * Cursor.[Ch] (fixIfBroken): new method, try to fix a broken cursor + * Cursor.C (dispatch): use fixIfBroken + * lyxfunc.C (getStatus): use fixIfBroken + 2005-02-15 Angus Leeming * lyx_main.C (error_handler): diff --git a/src/cursor.C b/src/cursor.C index 6aeaec8884..ac9bd45ab8 100644 --- a/src/cursor.C +++ b/src/cursor.C @@ -199,6 +199,7 @@ void LCursor::dispatch(FuncRequest const & cmd0) if (empty()) return; + fixIfBroken(); FuncRequest cmd = cmd0; LCursor safe = *this; @@ -1139,3 +1140,41 @@ LyXFont LCursor::getFont() const return font; } + + +void LCursor::fixIfBroken() +{ + // find out last good level + LCursor copy = *this; + size_t newdepth = depth(); + while (!copy.empty()) { + if (copy.idx() > copy.lastidx()) { + lyxerr << "wrong idx " << copy.idx() + << ", max is " << copy.lastidx() + << " at level " << copy.depth() + << ". Trying to correct this." << endl; + newdepth = copy.depth() - 1; + } + else if (copy.pit() > copy.lastpit()) { + lyxerr << "wrong pit " << copy.pit() + << ", max is " << copy.lastpit() + << " at level " << copy.depth() + << ". Trying to correct this." << endl; + newdepth = copy.depth() - 1; + } + else if (copy.pos() > copy.lastpos()) { + lyxerr << "wrong pos " << copy.pos() + << ", max is " << copy.lastpos() + << " at level " << copy.depth() + << ". Trying to correct this." << endl; + newdepth = copy.depth() - 1; + } + copy.pop(); + } + // shrink cursor to a size where everything is valid, possibly + // leaving insets + while (depth() > newdepth) { + pop(); + lyxerr << "correcting cursor to level " << depth() << endl; + } +} diff --git a/src/cursor.h b/src/cursor.h index 8deab33a05..332bf219fb 100644 --- a/src/cursor.h +++ b/src/cursor.h @@ -152,6 +152,8 @@ public: void needsUpdate(); /// don't call update() when done void noUpdate(); + /// fix cursor in circumstances that should never happen + void fixIfBroken(); /// output friend std::ostream & operator<<(std::ostream & os, LCursor const & cur); diff --git a/src/lyxfunc.C b/src/lyxfunc.C index ef7ccd59c7..f6e54aa3fa 100644 --- a/src/lyxfunc.C +++ b/src/lyxfunc.C @@ -146,6 +146,9 @@ namespace { bool getStatus(LCursor cursor, FuncRequest const & cmd, FuncStatus & status) { + // Try to fix cursor in case it is broken. + cursor.fixIfBroken(); + // This is, of course, a mess. Better create a new doc iterator and use // this in Inset::getStatus. This might require an additional // BufferView * arg, though (which should be avoided) @@ -155,30 +158,15 @@ bool getStatus(LCursor cursor, //lyxerr << "\nLCursor::getStatus: cmd: " << cmd << endl << *this << endl; DocIterator::idx_type & idx = cursor.idx(); DocIterator::idx_type const lastidx = cursor.lastidx(); - - if (idx > lastidx) { - lyxerr << "wrong idx " << idx << ", max is " << lastidx - << ". Trying to correct this." << endl; - idx = lastidx; - } + BOOST_ASSERT(idx <= lastidx); DocIterator::pit_type & pit = cursor.pit(); DocIterator::pit_type const lastpit = cursor.lastpit(); - - if (pit > lastpit) { - lyxerr << "wrong par " << pit << ", max is " << lastpit - << ". Trying to correct this." << endl; - pit = lastpit; - } + BOOST_ASSERT(pit <= lastpit); DocIterator::pos_type & pos = cursor.pos(); DocIterator::pos_type const lastpos = cursor.lastpos(); - - if (pos > lastpos) { - lyxerr << "wrong pos " << pos << ", max is " << lastpos - << ". Trying to correct this." << endl; - pos = lastpos; - } + BOOST_ASSERT(pos <= lastpos); // The inset's getStatus() will return 'true' if it made // a definitive decision on whether it want to handle the