diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/Editor.cxx | 58 | ||||
-rw-r--r-- | src/Selection.cxx | 79 | ||||
-rw-r--r-- | src/Selection.h | 5 |
3 files changed, 46 insertions, 96 deletions
diff --git a/src/Editor.cxx b/src/Editor.cxx index 5effff931..71c8965fb 100644 --- a/src/Editor.cxx +++ b/src/Editor.cxx @@ -687,34 +687,20 @@ void Editor::SetRectangularRange() { if (sel.IsRectangular()) { int xAnchor = XFromPosition(sel.Rectangular().anchor); int xCaret = XFromPosition(sel.Rectangular().caret); - bool anchorTop = sel.Rectangular().anchor < sel.Rectangular().caret; - bool anchorLeft = xAnchor < xCaret; if (sel.selType == Selection::selThin) { xCaret = xAnchor; } - SelectionPosition selStart = sel.Rectangular().Start(); - SelectionPosition selEnd = sel.Rectangular().End(); - int lineStart = pdoc->LineFromPosition(selStart.Position()); - int lineEnd = pdoc->LineFromPosition(selEnd.Position()); - // Left of rectangle - int minX = Platform::Minimum(xAnchor, xCaret); - // Right of rectangle - int maxX = Platform::Maximum(xAnchor, xCaret); - sel.EmptyRanges(); - int increment = 1; - if (!anchorTop) { - increment = -1; - lineEnd = lineStart; - lineStart = pdoc->LineFromPosition(selEnd.Position()); - } - for (int line=lineStart; line != lineEnd+increment; line += increment) { - SelectionPosition spMin(SPositionFromLineX(line, minX)); - SelectionPosition spMax(SPositionFromLineX(line, maxX)); - if ((virtualSpaceOptions & SCVS_RECTANGULARSELECTION) == 0) { - spMin.SetVirtualSpace(0); - spMax.SetVirtualSpace(0); - } - sel.AddSelection(spMin, spMax, anchorLeft); + int lineAnchor = pdoc->LineFromPosition(sel.Rectangular().anchor.Position()); + int lineCaret = pdoc->LineFromPosition(sel.Rectangular().caret.Position()); + int increment = (lineCaret > lineAnchor) ? 1 : -1; + for (int line=lineAnchor; line != lineCaret+increment; line += increment) { + SelectionRange range(SPositionFromLineX(line, xCaret), SPositionFromLineX(line, xAnchor)); + if ((virtualSpaceOptions & SCVS_RECTANGULARSELECTION) == 0) + range.ClearVirtualSpace(); + if (line == lineAnchor) + sel.SetSelection(range); + else + sel.AddSelection(range); } } } @@ -3669,8 +3655,7 @@ void Editor::FilterSelections() { if (!additionalSelectionTyping && (sel.Count() > 1)) { SelectionRange rangeOnly = sel.RangeMain(); InvalidateSelection(rangeOnly, true); - sel.EmptyRanges(); - sel.AddSelection(rangeOnly); + sel.SetSelection(rangeOnly); } } @@ -3686,7 +3671,7 @@ void Editor::AddCharUTF(char *s, unsigned int len, bool treatAsDBCS) { if (!sel.Range(r).Empty()) { if (sel.Range(r).Length()) { pdoc->DeleteChars(positionInsert, sel.Range(r).Length()); - sel.ClearVirtualSpace(r); + sel.Range(r).ClearVirtualSpace(); } else { // Range is all virtual so collapse to start of virtual space sel.Range(r).MinimizeVirtualSpace(); @@ -3695,7 +3680,7 @@ void Editor::AddCharUTF(char *s, unsigned int len, bool treatAsDBCS) { if (positionInsert < pdoc->Length()) { if (!IsEOLChar(pdoc->CharAt(positionInsert))) { pdoc->DelChar(positionInsert); - sel.ClearVirtualSpace(r); + sel.Range(r).ClearVirtualSpace(); } } } @@ -3704,7 +3689,7 @@ void Editor::AddCharUTF(char *s, unsigned int len, bool treatAsDBCS) { sel.Range(r).caret.SetPosition(positionInsert + len); sel.Range(r).anchor.SetPosition(positionInsert + len); } - sel.ClearVirtualSpace(r); + sel.Range(r).ClearVirtualSpace(); // If in wrap mode rewrap current line so EnsureCaretVisible has accurate information if (wrapState != eWrapNone) { AutoSurface surface(this); @@ -3777,7 +3762,7 @@ void Editor::ClearSelection() { sel.Range(r).End().Position())) { pdoc->DeleteChars(sel.Range(r).Start().Position(), sel.Range(r).Length()); - sel.ClearVirtualSpace(r); + sel.Range(r).ClearVirtualSpace(); } } } @@ -3884,10 +3869,10 @@ void Editor::Clear() { if (!RangeContainsProtected(sel.Range(r).caret.Position(), sel.Range(r).caret.Position() + 1)) { if ((sel.Count() == 1) || !IsEOLChar(pdoc->CharAt(sel.Range(r).caret.Position()))) { pdoc->DelChar(sel.Range(r).caret.Position()); - sel.ClearVirtualSpace(r); + sel.Range(r).ClearVirtualSpace(); } // else multiple selection so don't eat line ends } else { - sel.ClearVirtualSpace(r); + sel.Range(r).ClearVirtualSpace(); } } } else { @@ -3960,7 +3945,7 @@ void Editor::DelCharBack(bool allowLineStartDeletion) { } } } else { - sel.ClearVirtualSpace(r); + sel.Range(r).ClearVirtualSpace(); } } } else { @@ -8171,13 +8156,12 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) { break; case SCI_SETSELECTION: - sel.Clear(); - sel.RangeMain() = SelectionRange(wParam, lParam); + sel.SetSelection(SelectionRange(wParam, lParam)); Redraw(); break; case SCI_ADDSELECTION: - sel.AddSelection(SelectionPosition(wParam), SelectionPosition(lParam), false); + sel.AddSelection(SelectionRange(wParam, lParam)); Redraw(); break; diff --git a/src/Selection.cxx b/src/Selection.cxx index eada57d5e..43607b244 100644 --- a/src/Selection.cxx +++ b/src/Selection.cxx @@ -72,26 +72,6 @@ int SelectionRange::Length() const { } } -#ifdef NEEDED -// Like Length but takes virtual space into account -int SelectionRange::Width() const { - SelectionPosition first; - SelectionPosition last; - if (anchor > caret) { - first = caret; - last = anchor; - } else { - first = anchor; - last = caret; - } - if (first.Position() == last.Position()) { - return last.VirtualSpace() - first.VirtualSpace(); - } else { - return last.Position() - first.Position() + last.VirtualSpace(); - } -} -#endif - bool SelectionRange::Contains(int pos) const { if (anchor > caret) return (pos >= caret.Position()) && (pos <= anchor.Position()); @@ -176,7 +156,7 @@ void SelectionRange::MinimizeVirtualSpace() { } } -Selection::Selection() : ranges(0), nRanges(0), mainRange(0), moveExtends(false), selType(selStream) { +Selection::Selection() : mainRange(0), moveExtends(false), selType(selStream) { AddSelection(SelectionPosition(0)); } @@ -200,7 +180,7 @@ SelectionRange &Selection::Rectangular() { } size_t Selection::Count() const { - return nRanges; + return ranges.size(); } size_t Selection::Main() const { @@ -208,7 +188,7 @@ size_t Selection::Main() const { } void Selection::SetMain(size_t r) { - PLATFORM_ASSERT(r < nRanges); + PLATFORM_ASSERT(r < ranges.size()); mainRange = r; } @@ -220,10 +200,6 @@ SelectionRange &Selection::RangeMain() { return ranges[mainRange]; } -void Selection::ClearVirtualSpace(size_t r) { - ranges[r].ClearVirtualSpace(); -} - bool Selection::MoveExtends() const { return moveExtends; } @@ -233,7 +209,7 @@ void Selection::SetMoveExtends(bool moveExtends_) { } bool Selection::Empty() const { - for (size_t i=0; i<nRanges; i++) { + for (size_t i=0; i<ranges.size(); i++) { if (!ranges[i].Empty()) return false; } @@ -242,7 +218,7 @@ bool Selection::Empty() const { SelectionPosition Selection::Last() const { SelectionPosition lastPosition; - for (size_t i=0; i<nRanges; i++) { + for (size_t i=0; i<ranges.size(); i++) { if (lastPosition < ranges[i].caret) lastPosition = ranges[i].caret; if (lastPosition < ranges[i].anchor) @@ -253,56 +229,53 @@ SelectionPosition Selection::Last() const { int Selection::Length() const { int len = 0; - for (size_t i=0; i<nRanges; i++) { + for (size_t i=0; i<ranges.size(); i++) { len += ranges[i].Length(); } return len; } void Selection::MovePositions(bool insertion, int startChange, int length) { - for (size_t i=0; i<nRanges; i++) { + for (size_t i=0; i<ranges.size(); i++) { ranges[i].caret.MoveForInsertDelete(insertion, startChange, length); ranges[i].anchor.MoveForInsertDelete(insertion, startChange, length); } } void Selection::TrimSelection(SelectionRange range) { - for (size_t i=0; i<nRanges;) { + for (size_t i=0; i<ranges.size();) { if ((i != mainRange) && (ranges[i].Trim(range))) { // Trimmed to empty so remove - for (size_t j=i;j<nRanges-1;j++) { + for (size_t j=i;j<ranges.size()-1;j++) { ranges[j] = ranges[j+1]; if (j == mainRange-1) mainRange--; } - nRanges--; + ranges.pop_back(); } else { i++; } } } +void Selection::SetSelection(SelectionRange range) { + ranges.clear(); + ranges.push_back(range); + mainRange = ranges.size() - 1; +} + void Selection::AddSelection(SelectionRange range) { - ranges.resize(nRanges + 1); TrimSelection(range); - ranges[nRanges] = range; - mainRange = nRanges; - nRanges++; + ranges.push_back(range); + mainRange = ranges.size() - 1; } void Selection::AddSelection(SelectionPosition spPos) { AddSelection(SelectionRange(spPos, spPos)); } -void Selection::AddSelection(SelectionPosition spStartPos, SelectionPosition spEndPos, bool anchorLeft) { - if (anchorLeft) - AddSelection(SelectionRange(spEndPos, spStartPos)); - else - AddSelection(SelectionRange(spStartPos, spEndPos)); -} - int Selection::CharacterInSelection(int posCharacter) const { - for (size_t i=0; i<nRanges; i++) { + for (size_t i=0; i<ranges.size(); i++) { if (ranges[i].ContainsCharacter(posCharacter)) return i == mainRange ? 1 : 2; } @@ -310,7 +283,7 @@ int Selection::CharacterInSelection(int posCharacter) const { } int Selection::InSelectionForEOL(int pos) const { - for (size_t i=0; i<nRanges; i++) { + for (size_t i=0; i<ranges.size(); i++) { if (!ranges[i].Empty() && (pos > ranges[i].Start().Position()) && (pos <= ranges[i].End().Position())) return i == mainRange ? 1 : 2; } @@ -319,7 +292,7 @@ int Selection::InSelectionForEOL(int pos) const { int Selection::VirtualSpaceFor(int pos) const { int virtualSpace = 0; - for (size_t i=0; i<nRanges; i++) { + for (size_t i=0; i<ranges.size(); i++) { if ((ranges[i].caret.Position() == pos) && (virtualSpace < ranges[i].caret.VirtualSpace())) virtualSpace = ranges[i].caret.VirtualSpace(); if ((ranges[i].anchor.Position() == pos) && (virtualSpace < ranges[i].anchor.VirtualSpace())) @@ -329,15 +302,11 @@ int Selection::VirtualSpaceFor(int pos) const { } void Selection::Clear() { - nRanges = 1; - mainRange = 0; + ranges.clear(); + ranges.push_back(SelectionRange()); + mainRange = ranges.size() - 1; selType = selStream; moveExtends = false; ranges[mainRange].Reset(); rangeRectangular.Reset(); } - -void Selection::EmptyRanges() { - nRanges = 0; - mainRange = 0; -} diff --git a/src/Selection.h b/src/Selection.h index e98709312..9e5372638 100644 --- a/src/Selection.h +++ b/src/Selection.h @@ -124,7 +124,6 @@ struct SelectionRange { class Selection { std::vector<SelectionRange> ranges; SelectionRange rangeRectangular; - size_t nRanges; size_t mainRange; bool moveExtends; public: @@ -142,7 +141,6 @@ public: void SetMain(size_t r); SelectionRange &Range(size_t r); SelectionRange &RangeMain(); - void ClearVirtualSpace(size_t r); bool MoveExtends() const; void SetMoveExtends(bool moveExtends_); bool Empty() const; @@ -150,14 +148,13 @@ public: int Length() const; void MovePositions(bool insertion, int startChange, int length); void TrimSelection(SelectionRange range); + void SetSelection(SelectionRange range); void AddSelection(SelectionRange range); void AddSelection(SelectionPosition spPos); - void AddSelection(SelectionPosition spStartPos, SelectionPosition spEndPos, bool anchorLeft); int CharacterInSelection(int posCharacter) const; int InSelectionForEOL(int pos) const; int VirtualSpaceFor(int pos) const; void Clear(); - void EmptyRanges(); }; #ifdef SCI_NAMESPACE |