]> git.lyx.org Git - features.git/commitdiff
try to fix broken cursor (from Andr�)
authorGeorg Baum <Georg.Baum@post.rwth-aachen.de>
Tue, 15 Feb 2005 17:34:54 +0000 (17:34 +0000)
committerGeorg Baum <Georg.Baum@post.rwth-aachen.de>
Tue, 15 Feb 2005 17:34:54 +0000 (17:34 +0000)
git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@9635 a592a061-630c-0410-9148-cb99ea01b6c8

src/ChangeLog
src/cursor.C
src/cursor.h
src/lyxfunc.C

index f5d4251677dcaeb7593c8d238eef4a3b1e09a95e..db30f1c8fa6a2bf17b83f9b42d4537e69a587b8e 100644 (file)
@@ -1,3 +1,9 @@
+2005-02-13  André Pönitz  <poenitz@gmx.net>
+
+       * 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  <leeming@lyx.org>
 
        * lyx_main.C (error_handler):
index 6aeaec8884d0d8f47d0cf33045fe79c611b77a8e..ac9bd45ab8ec4aff76e5812afd04d4b9dc4f3a03 100644 (file)
@@ -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;
+       }
+}
index 8deab33a050541b339807115d2e1853cb56d9d7c..332bf219fbdc603efb3716f369cb1776a46b833f 100644 (file)
@@ -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);
index ef7ccd59c7d45a6b6e94e0428d73a66062066df5..f6e54aa3faf682d4d37af6ac964aedb5cdc7c024 100644 (file)
@@ -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