aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/Editor.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'src/Editor.cxx')
-rw-r--r--src/Editor.cxx55
1 files changed, 39 insertions, 16 deletions
diff --git a/src/Editor.cxx b/src/Editor.cxx
index e8774c698..5effff931 100644
--- a/src/Editor.cxx
+++ b/src/Editor.cxx
@@ -11,6 +11,7 @@
#include <ctype.h>
#include <string>
+#include <vector>
// With Borland C++ 5.5, including <string> includes Windows.h leading to defining
// FindText to FindTextA which makes calls here to Document::FindText fail.
@@ -146,8 +147,9 @@ Editor::Editor() {
verticalScrollBarVisible = true;
endAtLastLine = true;
caretSticky = false;
- multiLineCaret = false;
- multiLineCaretBlinks = true;
+ multipleSelection = false;
+ additionalSelectionTyping = false;
+ additionalCaretsBlink = true;
virtualSpaceOptions = SCVS_NONE;
virtualSpaceOptions = SCVS_USERACCESSIBLE;
@@ -3104,7 +3106,7 @@ void Editor::DrawCarets(Surface *surface, ViewStyle &vsDraw, int lineDoc, int xS
xposCaret += ll->wrapIndent;
}
if ((xposCaret >= 0) && (vsDraw.caretWidth > 0) && (vsDraw.caretStyle != CARETSTYLE_INVISIBLE) &&
- ((posDrag.IsValid()) || ((caret.active && caret.on) || (!multiLineCaretBlinks && !mainCaret)))) {
+ ((posDrag.IsValid()) || ((caret.active && caret.on) || (!additionalCaretsBlink && !mainCaret)))) {
bool caretAtEOF = false;
bool caretAtEOL = false;
bool drawBlockCaret = false;
@@ -3663,8 +3665,18 @@ void Editor::AddChar(char ch) {
AddCharUTF(s, 1);
}
+void Editor::FilterSelections() {
+ if (!additionalSelectionTyping && (sel.Count() > 1)) {
+ SelectionRange rangeOnly = sel.RangeMain();
+ InvalidateSelection(rangeOnly, true);
+ sel.EmptyRanges();
+ sel.AddSelection(rangeOnly);
+ }
+}
+
// AddCharUTF inserts an array of bytes which may or may not be in UTF-8.
void Editor::AddCharUTF(char *s, unsigned int len, bool treatAsDBCS) {
+ FilterSelections();
{
UndoGroup ug(pdoc, (sel.Count() > 1) || !sel.Empty() || inOverstrike);
for (size_t r=0; r<sel.Count(); r++) {
@@ -3757,6 +3769,7 @@ void Editor::AddCharUTF(char *s, unsigned int len, bool treatAsDBCS) {
}
void Editor::ClearSelection() {
+ FilterSelections();
UndoGroup ug(pdoc);
for (size_t r=0; r<sel.Count(); r++) {
if (!sel.Range(r).Empty()) {
@@ -3915,6 +3928,7 @@ void Editor::DelChar() {
}
void Editor::DelCharBack(bool allowLineStartDeletion) {
+ FilterSelections();
if (sel.IsRectangular())
allowLineStartDeletion = false;
UndoGroup ug(pdoc, (sel.Count() > 1) || !sel.Empty());
@@ -3928,7 +3942,7 @@ void Editor::DelCharBack(bool allowLineStartDeletion) {
int lineCurrentPos = pdoc->LineFromPosition(sel.Range(r).caret.Position());
if (allowLineStartDeletion || (pdoc->LineStart(lineCurrentPos) != sel.Range(r).caret.Position())) {
if (pdoc->GetColumn(sel.Range(r).caret.Position()) <= pdoc->GetLineIndentation(lineCurrentPos) &&
- pdoc->GetColumn(sel.Range(r).caret.Position()) > 0 && pdoc->backspaceUnindents) {
+ pdoc->GetColumn(sel.Range(r).caret.Position()) > 0 && pdoc->backspaceUnindents) {
UndoGroup ugInner(pdoc, !ug.Needed());
int indentation = pdoc->GetLineIndentation(lineCurrentPos);
int indentationStep = pdoc->IndentSize();
@@ -5638,7 +5652,7 @@ void Editor::ButtonDown(Point pt, unsigned int curTime, bool shift, bool ctrl, b
SetMouseCapture(true);
if (inDragDrop != ddInitial) {
SetDragPosition(SelectionPosition(invalidPosition));
- if (ctrl) {
+ if (ctrl && multipleSelection) {
InvalidateSelection(SelectionRange(newPos), true);
sel.AddSelection(newPos);
} else if (!shift) {
@@ -5749,9 +5763,10 @@ void Editor::ButtonMove(Point pt) {
sel.Rectangular() = SelectionRange(movePos, sel.Rectangular().anchor);
SetSelection(movePos, sel.RangeMain().anchor);
} else if (sel.Count() > 1) {
- sel.TrimSelection(sel.RangeMain().anchor, movePos);
- sel.RangeMain() = SelectionRange(movePos, sel.RangeMain().anchor);
- InvalidateSelection(SelectionRange(movePos, sel.RangeMain().anchor), true);
+ SelectionRange range(movePos, sel.RangeMain().anchor);
+ sel.TrimSelection(range);
+ sel.RangeMain() = range;
+ InvalidateSelection(range, true);
} else {
SetSelection(movePos, sel.RangeMain().anchor);
}
@@ -8123,21 +8138,29 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
pdoc->AddUndoAction(wParam, lParam & UNDO_MAY_COALESCE);
break;
- case SCI_SETMULTILINECARET:
- multiLineCaret = wParam != 0;
+ case SCI_SETMULTIPLESELECTION:
+ multipleSelection = wParam != 0;
+ InvalidateCaret();
+ break;
+
+ case SCI_GETMULTIPLESELECTION:
+ return multipleSelection;
+
+ case SCI_SETADDITIONALSELECTIONTYPING:
+ additionalSelectionTyping = wParam != 0;
InvalidateCaret();
break;
- case SCI_GETMULTILINECARET:
- return multiLineCaret;
+ case SCI_GETADDITIONALSELECTIONTYPING:
+ return additionalSelectionTyping;
- case SCI_SETMULTILINECARETBLINKS:
- multiLineCaretBlinks = wParam != 0;
+ case SCI_SETADDITIONALCARETSBLINK:
+ additionalCaretsBlink = wParam != 0;
InvalidateCaret();
break;
- case SCI_GETMULTILINECARETBLINKS:
- return multiLineCaretBlinks;
+ case SCI_GETADDITIONALCARETSBLINK:
+ return additionalCaretsBlink;
case SCI_GETSELECTIONS:
return sel.Count();