aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/Editor.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'src/Editor.cxx')
-rw-r--r--src/Editor.cxx92
1 files changed, 54 insertions, 38 deletions
diff --git a/src/Editor.cxx b/src/Editor.cxx
index 826824cbd..016ef3383 100644
--- a/src/Editor.cxx
+++ b/src/Editor.cxx
@@ -167,8 +167,7 @@ Editor::Editor() : durationWrapOneLine(0.00001, 0.000001, 0.0001) {
multiPasteMode = SC_MULTIPASTE_ONCE;
virtualSpaceOptions = SCVS_NONE;
- targetStart = 0;
- targetEnd = 0;
+ targetRange = SelectionSegment();
searchFlags = 0;
topLine = 0;
@@ -755,7 +754,7 @@ void Editor::MultipleSelectAdd(AddNumber addNumber) {
const Range rangeMainSelection(sel.RangeMain().Start().Position(), sel.RangeMain().End().Position());
const std::string selectedText = RangeText(rangeMainSelection.start, rangeMainSelection.end);
- const Range rangeTarget(targetStart, targetEnd);
+ const Range rangeTarget(targetRange.start.Position(), targetRange.end.Position());
std::vector<Range> searchRanges;
// Search should be over the target range excluding the current selection so
// may need to search 2 ranges, after the selection then before the selection.
@@ -1601,17 +1600,17 @@ bool Editor::WrapLines(WrapScope ws) {
}
void Editor::LinesJoin() {
- if (!RangeContainsProtected(targetStart, targetEnd)) {
+ if (!RangeContainsProtected(targetRange.start.Position(), targetRange.end.Position())) {
UndoGroup ug(pdoc);
bool prevNonWS = true;
- for (Sci::Position pos = targetStart; pos < targetEnd; pos++) {
+ for (Sci::Position pos = targetRange.start.Position(); pos < targetRange.end.Position(); pos++) {
if (pdoc->IsPositionInLineEnd(pos)) {
- targetEnd -= pdoc->LenChar(pos);
+ targetRange.end.Add(-pdoc->LenChar(pos));
pdoc->DelChar(pos);
if (prevNonWS) {
// Ensure at least one space separating previous lines
const Sci::Position lengthInserted = pdoc->InsertString(pos, " ", 1);
- targetEnd += lengthInserted;
+ targetRange.end.Add(lengthInserted);
}
} else {
prevNonWS = pdoc->CharAt(pos) != ' ';
@@ -1631,13 +1630,13 @@ const char *Editor::StringFromEOLMode(int eolMode) noexcept {
}
void Editor::LinesSplit(int pixelWidth) {
- if (!RangeContainsProtected(targetStart, targetEnd)) {
+ if (!RangeContainsProtected(targetRange.start.Position(), targetRange.end.Position())) {
if (pixelWidth == 0) {
const PRectangle rcText = GetTextRectangle();
pixelWidth = static_cast<int>(rcText.Width());
}
- const Sci::Line lineStart = pdoc->SciLineFromPosition(targetStart);
- Sci::Line lineEnd = pdoc->SciLineFromPosition(targetEnd);
+ const Sci::Line lineStart = pdoc->SciLineFromPosition(targetRange.start.Position());
+ Sci::Line lineEnd = pdoc->SciLineFromPosition(targetRange.end.Position());
const char *eol = StringFromEOLMode(pdoc->eolMode);
UndoGroup ug(pdoc);
for (Sci::Line line = lineStart; line <= lineEnd; line++) {
@@ -1651,11 +1650,11 @@ void Editor::LinesSplit(int pixelWidth) {
const Sci::Position lengthInserted = pdoc->InsertString(
posLineStart + lengthInsertedTotal + ll->LineStart(subLine),
eol, strlen(eol));
- targetEnd += lengthInserted;
+ targetRange.end.Add(lengthInserted);
lengthInsertedTotal += lengthInserted;
}
}
- lineEnd = pdoc->SciLineFromPosition(targetEnd);
+ lineEnd = pdoc->SciLineFromPosition(targetRange.end.Position());
}
}
}
@@ -4156,12 +4155,12 @@ Sci::Position Editor::SearchInTarget(const char *text, Sci::Position length) {
if (!pdoc->HasCaseFolder())
pdoc->SetCaseFolder(CaseFolderForEncoding());
try {
- const Sci::Position pos = pdoc->FindText(targetStart, targetEnd, text,
+ const Sci::Position pos = pdoc->FindText(targetRange.start.Position(), targetRange.end.Position(), text,
searchFlags,
&lengthFound);
if (pos != -1) {
- targetStart = pos;
- targetEnd = pos + lengthFound;
+ targetRange.start.SetPosition(pos);
+ targetRange.end.SetPosition(pos + lengthFound);
}
return pos;
} catch (RegexError &) {
@@ -5249,8 +5248,7 @@ void Editor::SetDocPointer(Document *document) {
// Ensure all positions within document
sel.Clear();
- targetStart = 0;
- targetEnd = 0;
+ targetRange = SelectionSegment();
braces[0] = Sci::invalidPosition;
braces[1] = Sci::invalidPosition;
@@ -5585,11 +5583,20 @@ Sci::Position Editor::ReplaceTarget(bool replacePatterns, const char *text, Sci:
return 0;
}
}
- if (targetStart != targetEnd)
- pdoc->DeleteChars(targetStart, targetEnd - targetStart);
- targetEnd = targetStart;
- const Sci::Position lengthInserted = pdoc->InsertString(targetStart, text, length);
- targetEnd = targetStart + lengthInserted;
+
+ // Remove the text inside the range
+ if (targetRange.Length() > 0)
+ pdoc->DeleteChars(targetRange.start.Position(), targetRange.Length());
+ targetRange.end = targetRange.start;
+
+ // Realize virtual space of target start
+ Sci::Position startAfterSpaceInsertion = RealizeVirtualSpace(targetRange.start.Position(), targetRange.start.VirtualSpace());
+ targetRange.start.SetPosition(startAfterSpaceInsertion);
+ targetRange.end = targetRange.start;
+
+ // Insert the new text
+ const Sci::Position lengthInserted = pdoc->InsertString(targetRange.start.Position(), text, length);
+ targetRange.end.SetPosition(targetRange.start.Position() + lengthInserted);
return length;
}
@@ -5982,41 +5989,50 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
break;
case SCI_SETTARGETSTART:
- targetStart = static_cast<Sci::Position>(wParam);
+ targetRange.start.SetPosition(static_cast<Sci::Position>(wParam));
break;
case SCI_GETTARGETSTART:
- return targetStart;
+ return targetRange.start.Position();
+
+ case SCI_SETTARGETSTARTVIRTUALSPACE:
+ targetRange.start.SetVirtualSpace(static_cast<Sci::Position>(wParam));
+ break;
+
+ case SCI_GETTARGETSTARTVIRTUALSPACE:
+ return targetRange.start.VirtualSpace();
case SCI_SETTARGETEND:
- targetEnd = static_cast<Sci::Position>(wParam);
+ targetRange.end.SetPosition(static_cast<Sci::Position>(wParam));
break;
case SCI_GETTARGETEND:
- return targetEnd;
+ return targetRange.end.Position();
+
+ case SCI_SETTARGETENDVIRTUALSPACE:
+ targetRange.end.SetVirtualSpace(static_cast<Sci::Position>(wParam));
+ break;
+
+ case SCI_GETTARGETENDVIRTUALSPACE:
+ return targetRange.end.VirtualSpace();
case SCI_SETTARGETRANGE:
- targetStart = static_cast<Sci::Position>(wParam);
- targetEnd = lParam;
+ targetRange.start.SetPosition(static_cast<Sci::Position>(wParam));
+ targetRange.end.SetPosition(lParam);
break;
case SCI_TARGETWHOLEDOCUMENT:
- targetStart = 0;
- targetEnd = pdoc->Length();
+ targetRange.start.SetPosition(0);
+ targetRange.end.SetPosition(pdoc->Length());
break;
case SCI_TARGETFROMSELECTION:
- if (sel.MainCaret() < sel.MainAnchor()) {
- targetStart = sel.MainCaret();
- targetEnd = sel.MainAnchor();
- } else {
- targetStart = sel.MainAnchor();
- targetEnd = sel.MainCaret();
- }
+ targetRange.start = sel.RangeMain().Start();
+ targetRange.end = sel.RangeMain().End();
break;
case SCI_GETTARGETTEXT: {
- std::string text = RangeText(targetStart, targetEnd);
+ std::string text = RangeText(targetRange.start.Position(), targetRange.end.Position());
return BytesResult(lParam, reinterpret_cast<const unsigned char *>(text.c_str()), text.length());
}