aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/Editor.cxx45
-rw-r--r--src/Editor.h1
-rw-r--r--src/Selection.cxx8
-rw-r--r--src/Selection.h4
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);