diff options
author | Marko Njezic <devnull@localhost> | 2011-06-06 23:36:54 +0200 |
---|---|---|
committer | Marko Njezic <devnull@localhost> | 2011-06-06 23:36:54 +0200 |
commit | 264af00abad56559c4bcdaddccade3c3fc14e240 (patch) | |
tree | c07296f111dca255ae237e05acb3d2b7fb740205 /src | |
parent | d9b171eab5d8aa18b67f9804c9ebcf0a30dcf778 (diff) | |
download | scintilla-mirror-264af00abad56559c4bcdaddccade3c3fc14e240.tar.gz |
Fix line selection of wrapped lines. Bug #3312763.
Diffstat (limited to 'src')
-rw-r--r-- | src/Editor.cxx | 46 | ||||
-rw-r--r-- | src/Editor.h | 4 |
2 files changed, 25 insertions, 25 deletions
diff --git a/src/Editor.cxx b/src/Editor.cxx index e7f768e98..6a8d9c80e 100644 --- a/src/Editor.cxx +++ b/src/Editor.cxx @@ -131,7 +131,7 @@ Editor::Editor() { selectionType = selChar; lastXChosen = 0; - lineAnchor = 0; + lineAnchorPos = 0; originalAnchorPos = 0; wordSelectAnchorStartPos = 0; wordSelectAnchorEndPos = 0; @@ -6007,17 +6007,22 @@ Window::Cursor Editor::GetMarginCursor(Point pt) { return Window::cursorReverseArrow; } -void Editor::LineSelection(int lineCurrent_, int lineAnchor_) { - if (lineAnchor_ < lineCurrent_) { - SetSelection(pdoc->LineStart(lineCurrent_ + 1), - pdoc->LineStart(lineAnchor_)); - } else if (lineAnchor_ > lineCurrent_) { - SetSelection(pdoc->LineStart(lineCurrent_), - pdoc->LineStart(lineAnchor_ + 1)); +void Editor::LineSelection(int lineCurrentPos_, int lineAnchorPos_) { + int selCurrentPos, selAnchorPos; + if (lineAnchorPos_ < lineCurrentPos_) { + selCurrentPos = StartEndDisplayLine(lineCurrentPos_, false) + 1; + selCurrentPos = pdoc->MovePositionOutsideChar(selCurrentPos, 1); + selAnchorPos = StartEndDisplayLine(lineAnchorPos_, true); + } else if (lineAnchorPos_ > lineCurrentPos_) { + selCurrentPos = StartEndDisplayLine(lineCurrentPos_, true); + selAnchorPos = StartEndDisplayLine(lineAnchorPos_, false) + 1; + selAnchorPos = pdoc->MovePositionOutsideChar(selAnchorPos, 1); } else { // Same line, select it - SetSelection(pdoc->LineStart(lineAnchor_ + 1), - pdoc->LineStart(lineAnchor_)); + selCurrentPos = StartEndDisplayLine(lineAnchorPos_, false) + 1; + selCurrentPos = pdoc->MovePositionOutsideChar(selCurrentPos, 1); + selAnchorPos = StartEndDisplayLine(lineAnchorPos_, true); } + SetSelection(selCurrentPos, selAnchorPos); } void Editor::WordSelection(int pos) { @@ -6133,8 +6138,8 @@ void Editor::ButtonDown(Point pt, unsigned int curTime, bool shift, bool ctrl, b wordSelectInitialCaretPos = sel.MainCaret(); WordSelection(wordSelectInitialCaretPos); } else if (selectionType == selLine) { - lineAnchor = LineFromLocation(pt); - SetSelection(pdoc->LineStart(lineAnchor + 1), pdoc->LineStart(lineAnchor)); + lineAnchorPos = newPos.Position(); + LineSelection(lineAnchorPos, lineAnchorPos); //Platform::DebugPrintf("Triple click: %d - %d\n", anchor, currentPos); } else { SetEmptySelection(sel.MainCaret()); @@ -6154,20 +6159,16 @@ void Editor::ButtonDown(Point pt, unsigned int curTime, bool shift, bool ctrl, b return; } if (!shift) { - lineAnchor = LineFromLocation(pt); // Single click in margin: select whole line - LineSelection(lineAnchor, lineAnchor); - SetSelection(pdoc->LineStart(lineAnchor + 1), - pdoc->LineStart(lineAnchor)); + lineAnchorPos = newPos.Position(); + LineSelection(lineAnchorPos, lineAnchorPos); } else { // Single shift+click in margin: select from line anchor to clicked line if (sel.MainAnchor() > sel.MainCaret()) - lineAnchor = pdoc->LineFromPosition(sel.MainAnchor() - 1); + lineAnchorPos = sel.MainAnchor() - 1; else - lineAnchor = pdoc->LineFromPosition(sel.MainAnchor()); - int lineStart = LineFromLocation(pt); - LineSelection(lineStart, lineAnchor); - //lineAnchor = lineStart; // Keep the same anchor for ButtonMove + lineAnchorPos = sel.MainAnchor(); + LineSelection(newPos.Position(), lineAnchorPos); } SetDragPosition(SelectionPosition(invalidPosition)); @@ -6330,8 +6331,7 @@ void Editor::ButtonMove(Point pt) { } } else { // Continue selecting by line - int lineMove = LineFromLocation(pt); - LineSelection(lineMove, lineAnchor); + LineSelection(movePos.Position(), lineAnchorPos); } } diff --git a/src/Editor.h b/src/Editor.h index 5c01ee83d..877f41443 100644 --- a/src/Editor.h +++ b/src/Editor.h @@ -202,7 +202,7 @@ protected: // ScintillaBase subclass needs access to much of Editor SelectionPosition posDrop; int hotSpotClickPos; int lastXChosen; - int lineAnchor; + int lineAnchorPos; int originalAnchorPos; int wordSelectAnchorStartPos; int wordSelectAnchorEndPos; @@ -492,7 +492,7 @@ protected: // ScintillaBase subclass needs access to much of Editor bool PointInSelection(Point pt); bool PointInSelMargin(Point pt); Window::Cursor GetMarginCursor(Point pt); - void LineSelection(int lineCurrent_, int lineAnchor_); + void LineSelection(int lineCurrentPos_, int lineAnchorPos_); void WordSelection(int pos); void DwellEnd(bool mouseMoved); void MouseLeave(); |