aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/Editor.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'src/Editor.cxx')
-rw-r--r--src/Editor.cxx45
1 files changed, 29 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;