mirror of
https://git.lyx.org/repos/lyx.git
synced 2024-11-22 10:00:33 +00:00
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:
parent
099030e50a
commit
03ea5d80b7
@ -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):
|
||||
|
39
src/cursor.C
39
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;
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user