From: Jean-Marc Lasgouttes Date: Thu, 13 Jul 2006 07:43:48 +0000 (+0000) Subject: * src/text3.C (dispatch): merge the SELECT and non-SELECT cursor X-Git-Tag: 1.6.10~12953 X-Git-Url: https://git.lyx.org/gitweb/?a=commitdiff_plain;h=eda16880847f63741572fcdc33d600f0b9a4787f;p=lyx.git * src/text3.C (dispatch): merge the SELECT and non-SELECT cursor movement LFUNs; use LCursor::selHandle consistently (fixes bugs 2119 and 2259, and also a crash related to with dEPM) git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@14436 a592a061-630c-0410-9148-cb99ea01b6c8 --- diff --git a/src/text3.C b/src/text3.C index 4a494ecd46..5b2aecec62 100644 --- a/src/text3.C +++ b/src/text3.C @@ -399,65 +399,21 @@ void LyXText::dispatch(LCursor & cur, FuncRequest & cmd) finishChange(cur, false); break; - case LFUN_WORD_FORWARD: - if (!cur.mark()) - cur.clearSelection(); - if (isRTL(cur.paragraph())) - needsUpdate = cursorLeftOneWord(cur); - else - needsUpdate = cursorRightOneWord(cur); - finishChange(cur, false); - break; - - case LFUN_WORD_BACKWARD: - if (!cur.mark()) - cur.clearSelection(); - if (isRTL(cur.paragraph())) - needsUpdate = cursorRightOneWord(cur); - else - needsUpdate = cursorLeftOneWord(cur); - finishChange(cur, false); - break; - case LFUN_BUFFER_BEGIN: - if (cur.depth() == 1) { - if (!cur.mark()) - cur.clearSelection(); - needsUpdate = cursorTop(cur); - finishChange(cur, false); - } else { - cur.undispatched(); - } - break; - case LFUN_BUFFER_BEGIN_SELECT: + cur.selHandle(cmd.action == LFUN_BUFFER_BEGIN_SELECT); if (cur.depth() == 1) { - if (!cur.selection()) - cur.resetAnchor(); needsUpdate = cursorTop(cur); - finishChange(cur, true); } else { cur.undispatched(); } break; case LFUN_BUFFER_END: - if (cur.depth() == 1) { - if (!cur.mark()) - cur.clearSelection(); - needsUpdate = cursorBottom(cur); - finishChange(cur, false); - } else { - cur.undispatched(); - } - break; - case LFUN_BUFFER_END_SELECT: + cur.selHandle(cmd.action == LFUN_BUFFER_END_SELECT); if (cur.depth() == 1) { - if (!cur.selection()) - cur.resetAnchor(); needsUpdate = cursorBottom(cur); - finishChange(cur, true); } else { cur.undispatched(); } @@ -525,83 +481,72 @@ void LyXText::dispatch(LCursor & cur, FuncRequest & cmd) break; case LFUN_PARAGRAPH_UP: - if (!cur.mark()) - cur.clearSelection(); - needsUpdate = cursorUpParagraph(cur); - finishChange(cur, false); - break; - case LFUN_PARAGRAPH_UP_SELECT: - if (!cur.selection()) - cur.resetAnchor(); - cursorUpParagraph(cur); - finishChange(cur, true); + cur.selHandle(cmd.action == LFUN_PARAGRAPH_UP_SELECT); + needsUpdate = cursorUpParagraph(cur); break; case LFUN_PARAGRAPH_DOWN: - if (!cur.mark()) - cur.clearSelection(); - needsUpdate = cursorDownParagraph(cur); - finishChange(cur, false); - break; - case LFUN_PARAGRAPH_DOWN_SELECT: - if (!cur.selection()) - cur.resetAnchor(); - cursorDownParagraph(cur); - finishChange(cur, true); + cur.selHandle(cmd.action == LFUN_PARAGRAPH_DOWN_SELECT); + needsUpdate = cursorDownParagraph(cur); break; + case LFUN_SCREEN_UP: case LFUN_SCREEN_UP_SELECT: update(cur); - if (!cur.selection()) - cur.resetAnchor(); - needsUpdate = cursorPrevious(cur); - finishChange(cur, true); + cur.selHandle(cmd.action == LFUN_SCREEN_UP_SELECT); + if (cur.pit() == 0 && cur.textRow().pos() == 0) { + cur.undispatched(); + cmd = FuncRequest(LFUN_FINISHED_UP); + } else { + needsUpdate = cursorPrevious(cur); + } break; + case LFUN_SCREEN_DOWN: case LFUN_SCREEN_DOWN_SELECT: update(cur); - if (!cur.selection()) - cur.resetAnchor(); - needsUpdate = cursorNext(cur); - finishChange(cur, true); + cur.selHandle(cmd.action == LFUN_SCREEN_DOWN_SELECT); + if (cur.pit() == cur.lastpit() + && cur.textRow().endpos() == cur.lastpos()) { + cur.undispatched(); + cmd = FuncRequest(LFUN_FINISHED_DOWN); + } else { + needsUpdate = cursorNext(cur); + } break; + case LFUN_LINE_BEGIN: case LFUN_LINE_BEGIN_SELECT: update(cur); - if (!cur.selection()) - cur.resetAnchor(); + cur.selHandle(cmd.action == LFUN_LINE_BEGIN_SELECT); needsUpdate = cursorHome(cur); - finishChange(cur, true); break; + case LFUN_LINE_END: case LFUN_LINE_END_SELECT: update(cur); - if (!cur.selection()) - cur.resetAnchor(); + cur.selHandle(cmd.action == LFUN_LINE_END_SELECT); needsUpdate = cursorEnd(cur); - finishChange(cur, true); break; + case LFUN_WORD_FORWARD: case LFUN_WORD_FORWARD_SELECT: - if (!cur.selection()) - cur.resetAnchor(); + cur.selHandle(cmd.action == LFUN_WORD_FORWARD_SELECT); if (isRTL(cur.paragraph())) - cursorLeftOneWord(cur); + needsUpdate = cursorLeftOneWord(cur); else - cursorRightOneWord(cur); - finishChange(cur, true); + needsUpdate = cursorRightOneWord(cur); break; + case LFUN_WORD_BACKWARD: case LFUN_WORD_BACKWARD_SELECT: - if (!cur.selection()) - cur.resetAnchor(); + cur.selHandle(cmd.action == LFUN_WORD_BACKWARD_SELECT); if (isRTL(cur.paragraph())) - cursorRightOneWord(cur); + needsUpdate = cursorRightOneWord(cur); else - cursorLeftOneWord(cur); - finishChange(cur, true); + needsUpdate = cursorLeftOneWord(cur); break; case LFUN_WORD_SELECT: { @@ -610,47 +555,6 @@ void LyXText::dispatch(LCursor & cur, FuncRequest & cmd) break; } - case LFUN_SCREEN_UP: - update(cur); - if (!cur.mark()) - cur.clearSelection(); - finishChange(cur, false); - if (cur.pit() == 0 && cur.textRow().pos() == 0) { - cur.undispatched(); - cmd = FuncRequest(LFUN_FINISHED_UP); - } else { - needsUpdate = cursorPrevious(cur); - } - break; - - case LFUN_SCREEN_DOWN: - update(cur); - if (!cur.mark()) - cur.clearSelection(); - finishChange(cur, false); - if (cur.pit() == cur.lastpit() - && cur.textRow().endpos() == cur.lastpos()) { - cur.undispatched(); - cmd = FuncRequest(LFUN_FINISHED_DOWN); - } else { - needsUpdate = cursorNext(cur); - } - break; - - case LFUN_LINE_BEGIN: - if (!cur.mark()) - cur.clearSelection(); - needsUpdate = cursorHome(cur); - finishChange(cur, false); - break; - - case LFUN_LINE_END: - if (!cur.mark()) - cur.clearSelection(); - needsUpdate = cursorEnd(cur); - finishChange(cur, false); - break; - case LFUN_BREAK_LINE: { // Not allowed by LaTeX (labels or empty par) if (cur.pos() > cur.paragraph().beginOfBody()) {