try to fix broken cursor (from Andr�)

git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@9635 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
Georg Baum 2005-02-15 17:34:54 +00:00
parent 099030e50a
commit 03ea5d80b7
4 changed files with 53 additions and 18 deletions

View 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):

View 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;
}
}

View 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);

View 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