- // are we not at the start or end?
- if (up) {
- if (pit() == 0 && row == 0)
- return false;
- } else {
- if (pit() + 1 >= int(text()->paragraphs().size()) &&
- row + 1 >= int(pm.rows().size()))
- return false;
+ 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;
+ bool valid_destination = false;
+ for(; dummy.depth(); dummy.pop())
+ if (!dummy.atFirstOrLastRow(up)) {
+ valid_destination = true;
+ break;
+ }
+
+ // 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;