Revert the previous fix and fix the DEPM regression.

This reverts r28910.

git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@29248 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
Vincent van Ravesteijn 2009-04-15 20:20:42 +00:00
parent 586afc2a4c
commit cdd802421a

View File

@ -321,6 +321,15 @@ void Cursor::dispatch(FuncRequest const & cmd0)
// object will be used again. // object will be used again.
if (!disp_.dispatched()) { if (!disp_.dispatched()) {
LYXERR(Debug::DEBUG, "RESTORING OLD CURSOR!"); LYXERR(Debug::DEBUG, "RESTORING OLD CURSOR!");
// We might have invalidated the cursor when removing an empty
// paragraph while the cursor could not be moved out the inset
// while we initially thought we could. This might happen when
// a multiline inset becomes an inline inset when the second
// paragraph is removed.
if (safe.pit() > safe.lastpit()) {
safe.pit() = safe.lastpit();
safe.pos() = safe.lastpos();
}
operator=(safe); operator=(safe);
disp_.update(Update::None); disp_.update(Update::None);
disp_.dispatched(false); disp_.dispatched(false);
@ -1776,14 +1785,31 @@ bool Cursor::upDownInText(bool up, bool & updateNeeded)
row = pm.pos2row(pos()); row = pm.pos2row(pos());
if (atFirstOrLastRow(up)) { if (atFirstOrLastRow(up)) {
// Is there a place for the cursor to go ? If yes, we
// can execute the DEPM, otherwise we should keep the
// paragraph to host the cursor.
Cursor dummy = *this; Cursor dummy = *this;
// The cursor hasn't changed yet. This happens when bool valid_destination = false;
// you e.g. move out of an inset. And to give the for(; dummy.depth(); dummy.pop())
// DEPM the possibility of doing something we must if (!dummy.atFirstOrLastRow(up)) {
// provide it with two different cursors. (Lgb, vfr) valid_destination = true;
dummy.pos() = dummy.pos() == 0 ? dummy.lastpos() : 0; break;
dummy.pit() = dummy.pit() == 0 ? dummy.lastpit() : 0; }
updateNeeded |= bv().checkDepm(dummy, *this);
// will a next dispatch follow and if there is a new
// dispatch will it move the cursor out ?
if (depth() > 1 && valid_destination) {
// The cursor hasn't changed yet. This happens when
// you e.g. move out of an inset. And to give the
// DEPM the possibility of doing something we must
// provide it with two different cursors. (Lgb, vfr)
dummy = *this;
dummy.pos() = dummy.pos() == 0 ? dummy.lastpos() : 0;
dummy.pit() = dummy.pit() == 0 ? dummy.lastpit() : 0;
updateNeeded |= bv().checkDepm(dummy, *this);
updateTextTargetOffset();
}
return false; return false;
} }
@ -1797,6 +1823,19 @@ bool Cursor::upDownInText(bool up, bool & updateNeeded)
else else
tm.editXY(*this, xo, yo + textRow().descent() + 1); tm.editXY(*this, xo, yo + textRow().descent() + 1);
clearSelection(); clearSelection();
// This happens when you move out of an inset.
// And to give the DEPM the possibility of doing
// something we must provide it with two different
// cursors. (Lgb)
Cursor dummy = *this;
if (dummy == old)
++dummy.pos();
if (bv().checkDepm(dummy, old)) {
updateNeeded = true;
// Make sure that cur gets back whatever happened to dummy(Lgb)
operator=(dummy);
}
} else { } else {
// if there is a selection, we stay out of any inset, and just jump to the right position: // if there is a selection, we stay out of any inset, and just jump to the right position:
Cursor old = *this; Cursor old = *this;