+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):
if (empty())
return;
+ fixIfBroken();
FuncRequest cmd = cmd0;
LCursor safe = *this;
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;
+ }
+}
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);
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)
//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