aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/Editor.cxx58
-rw-r--r--src/Selection.cxx79
-rw-r--r--src/Selection.h5
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