diff options
author | nyamatongwe <unknown> | 2010-01-30 23:32:31 +0000 |
---|---|---|
committer | nyamatongwe <unknown> | 2010-01-30 23:32:31 +0000 |
commit | e819e732d8399f3ad8dd4af236387ba96a196423 (patch) | |
tree | 3cb7dc952cf37135f963373295430eda84b4f90e | |
parent | ca44a024da3b95f46c3a8422b29314defd4ae64b (diff) | |
download | scintilla-mirror-e819e732d8399f3ad8dd4af236387ba96a196423.tar.gz |
Fix bug #2942131 Caret pos after rectagular delete.
-rw-r--r-- | src/Editor.cxx | 45 | ||||
-rw-r--r-- | src/Editor.h | 1 | ||||
-rw-r--r-- | src/Selection.cxx | 8 | ||||
-rw-r--r-- | src/Selection.h | 4 |
4 files changed, 42 insertions, 16 deletions
diff --git a/src/Editor.cxx b/src/Editor.cxx index 8cfbbd6e4..f6e7b0603 100644 --- a/src/Editor.cxx +++ b/src/Editor.cxx @@ -706,6 +706,18 @@ void Editor::SetRectangularRange() { } } +void Editor::ThinRectangularRange() { + if (sel.IsRectangular()) { + sel.selType = Selection::selThin; + if (sel.Rectangular().caret < sel.Rectangular().anchor) { + sel.Rectangular() = SelectionRange(sel.Range(sel.Count()-1).caret, sel.Range(0).anchor); + } else { + sel.Rectangular() = SelectionRange(sel.Range(sel.Count()-1).anchor, sel.Range(0).caret); + } + SetRectangularRange(); + } +} + void Editor::InvalidateSelection(SelectionRange newMain, bool invalidateWholeSelection) { if (sel.Count() > 1 || !(sel.RangeMain().anchor == newMain.anchor) || sel.IsRectangular()) { invalidateWholeSelection = true; @@ -3724,10 +3736,7 @@ void Editor::AddCharUTF(char *s, unsigned int len, bool treatAsDBCS) { if (wrapState != eWrapNone) { SetScrollBars(); } - if (sel.IsRectangular()) { - sel.selType = Selection::selThin; - sel.Rectangular() = SelectionRange(sel.Rectangular().caret, sel.Range(0).anchor); - } + ThinRectangularRange(); // If in wrap mode rewrap current line so EnsureCaretVisible has accurate information EnsureCaretVisible(); // Avoid blinking during rapid typing: @@ -3788,6 +3797,7 @@ void Editor::ClearSelection() { } } } + ThinRectangularRange(); sel.RemoveDuplicates(); ClaimSelection(); } @@ -3985,11 +3995,6 @@ void Editor::DelCharBack(bool allowLineStartDeletion) { } } else { ClearSelection(); - if (sel.IsRectangular()) { - sel.selType = Selection::selThin; - sel.Rectangular() = SelectionRange(sel.Rectangular().caret, sel.Range(0).anchor); - } - //SetEmptySelection(sel.MainCaret()); } sel.RemoveDuplicates(); // Avoid blinking during rapid typing: @@ -4590,8 +4595,14 @@ void Editor::NewLine() { } void Editor::CursorUpOrDown(int direction, Selection::selTypes selt) { - SelectionPosition caretToUse = sel.IsRectangular() ? - sel.Rectangular().caret : sel.Range(sel.Main()).caret; + SelectionPosition caretToUse = sel.Range(sel.Main()).caret; + if (sel.IsRectangular()) { + if (selt == Selection::noSel) { + caretToUse = (direction > 0) ? sel.Limits().end : sel.Limits().start; + } else { + caretToUse = sel.Rectangular().caret; + } + } Point pt = LocationFromPosition(caretToUse); int lineDoc = pdoc->LineFromPosition(caretToUse.Position()); Point ptStartLine = LocationFromPosition(pdoc->LineStart(lineDoc)); @@ -4708,15 +4719,16 @@ int Editor::KeyCommand(unsigned int iMessage) { break; case SCI_CHARLEFT: if (SelectionEmpty() || sel.MoveExtends()) { - if (pdoc->IsLineEndPosition(sel.MainCaret()) && sel.RangeMain().caret.VirtualSpace()) { + if ((sel.Count() == 1) && pdoc->IsLineEndPosition(sel.MainCaret()) && sel.RangeMain().caret.VirtualSpace()) { SelectionPosition spCaret = sel.RangeMain().caret; spCaret.SetVirtualSpace(spCaret.VirtualSpace() - 1); MovePositionTo(spCaret); } else { - MovePositionTo(MovePositionSoVisible(SelectionPosition(sel.MainCaret() - 1), -1)); + MovePositionTo(MovePositionSoVisible( + SelectionPosition((sel.LimitsForRectangularElseMain().start).Position() - 1), -1)); } } else { - MovePositionTo(sel.IsRectangular() ? sel.Limits().start : sel.RangeMain().Start()); + MovePositionTo(sel.LimitsForRectangularElseMain().start); } SetLastXChosen(); break; @@ -4747,10 +4759,11 @@ int Editor::KeyCommand(unsigned int iMessage) { spCaret.SetVirtualSpace(spCaret.VirtualSpace() + 1); MovePositionTo(spCaret); } else { - MovePositionTo(MovePositionSoVisible(SelectionPosition(sel.MainCaret() + 1), 1)); + MovePositionTo(MovePositionSoVisible( + SelectionPosition((sel.LimitsForRectangularElseMain().end).Position() + 1), 1)); } } else { - MovePositionTo(sel.IsRectangular() ? sel.Limits().end : sel.RangeMain().End()); + MovePositionTo(sel.LimitsForRectangularElseMain().end); } SetLastXChosen(); break; diff --git a/src/Editor.h b/src/Editor.h index a0431df29..92dcfb14b 100644 --- a/src/Editor.h +++ b/src/Editor.h @@ -283,6 +283,7 @@ protected: // ScintillaBase subclass needs access to much of Editor SelectionPosition SelectionStart(); SelectionPosition SelectionEnd(); void SetRectangularRange(); + void ThinRectangularRange(); void InvalidateSelection(SelectionRange newMain, bool invalidateWholeSelection=false); void SetSelection(SelectionPosition currentPos_, SelectionPosition anchor_); void SetSelection(int currentPos_, int anchor_); diff --git a/src/Selection.cxx b/src/Selection.cxx index 566cb1074..2cdbe60f2 100644 --- a/src/Selection.cxx +++ b/src/Selection.cxx @@ -192,6 +192,14 @@ SelectionSegment Selection::Limits() const { } } +SelectionSegment Selection::LimitsForRectangularElseMain() const { + if (IsRectangular()) { + return Limits(); + } else { + return SelectionSegment(ranges[mainRange].caret, ranges[mainRange].anchor); + } +} + size_t Selection::Count() const { return ranges.size(); } diff --git a/src/Selection.h b/src/Selection.h index d064af642..a3bac724a 100644 --- a/src/Selection.h +++ b/src/Selection.h @@ -148,6 +148,10 @@ public: int MainAnchor() const; SelectionRange &Rectangular(); SelectionSegment Limits() const; + // This is for when you want to move the caret in response to a + // user direction command - for rectangular selections, use the range + // that covers all selected text otherwise return the main selection. + SelectionSegment LimitsForRectangularElseMain() const; size_t Count() const; size_t Main() const; void SetMain(size_t r); |