1
// Scintilla source code edit control
3
** Classes maintaining the selection.
5
// Copyright 2009 by Neil Hodgson <neilh@scintilla.org>
6
// The License.txt file describes the conditions under which this software may be distributed.
15
class SelectionPosition {
19
explicit SelectionPosition(int position_=INVALID_POSITION, int virtualSpace_=0) : position(position_), virtualSpace(virtualSpace_) {
20
PLATFORM_ASSERT(virtualSpace < 800000);
28
void MoveForInsertDelete(bool insertion, int startChange, int length);
29
bool operator ==(const SelectionPosition &other) const {
30
return position == other.position && virtualSpace == other.virtualSpace;
32
bool operator <(const SelectionPosition &other) const;
33
bool operator >(const SelectionPosition &other) const;
34
bool operator <=(const SelectionPosition &other) const;
35
bool operator >=(const SelectionPosition &other) const;
36
int Position() const {
39
void SetPosition(int position_) {
43
int VirtualSpace() const {
46
void SetVirtualSpace(int virtualSpace_) {
47
PLATFORM_ASSERT(virtualSpace_ < 800000);
48
if (virtualSpace_ >= 0)
49
virtualSpace = virtualSpace_;
51
void Add(int increment) {
52
position = position + increment;
54
bool IsValid() const {
59
// Ordered range to make drawing simpler
60
struct SelectionSegment {
61
SelectionPosition start;
62
SelectionPosition end;
63
SelectionSegment() : start(), end() {
65
SelectionSegment(SelectionPosition a, SelectionPosition b) {
77
void Extend(SelectionPosition p) {
85
struct SelectionRange {
86
SelectionPosition caret;
87
SelectionPosition anchor;
89
SelectionRange() : caret(), anchor() {
91
SelectionRange(SelectionPosition single) : caret(single), anchor(single) {
93
SelectionRange(int single) : caret(single), anchor(single) {
95
SelectionRange(SelectionPosition caret_, SelectionPosition anchor_) : caret(caret_), anchor(anchor_) {
97
SelectionRange(int caret_, int anchor_) : caret(caret_), anchor(anchor_) {
100
return anchor == caret;
103
// int Width() const; // Like Length but takes virtual space into account
104
bool operator ==(const SelectionRange &other) const {
105
return caret == other.caret && anchor == other.anchor;
107
bool operator <(const SelectionRange &other) const {
108
return caret < other.caret || ((caret == other.caret) && (anchor < other.anchor));
114
void ClearVirtualSpace() {
115
anchor.SetVirtualSpace(0);
116
caret.SetVirtualSpace(0);
118
bool Contains(int pos) const;
119
bool Contains(SelectionPosition sp) const;
120
bool ContainsCharacter(int posCharacter) const;
121
SelectionSegment Intersect(SelectionSegment check) const;
122
SelectionPosition Start() const {
123
return (anchor < caret) ? anchor : caret;
125
SelectionPosition End() const {
126
return (anchor < caret) ? caret : anchor;
128
bool Trim(SelectionRange range);
129
// If range is all virtual collapse to start of virtual space
130
void MinimizeVirtualSpace();
134
std::vector<SelectionRange> ranges;
135
std::vector<SelectionRange> rangesSaved;
136
SelectionRange rangeRectangular;
141
enum selTypes { noSel, selStream, selRectangle, selLines, selThin };
146
bool IsRectangular() const;
147
int MainCaret() const;
148
int MainAnchor() const;
149
SelectionRange &Rectangular();
150
SelectionSegment Limits() const;
151
// This is for when you want to move the caret in response to a
152
// user direction command - for rectangular selections, use the range
153
// that covers all selected text otherwise return the main selection.
154
SelectionSegment LimitsForRectangularElseMain() const;
155
size_t Count() const;
157
void SetMain(size_t r);
158
SelectionRange &Range(size_t r);
159
SelectionRange &RangeMain();
160
bool MoveExtends() const;
161
void SetMoveExtends(bool moveExtends_);
163
SelectionPosition Last() const;
165
void MovePositions(bool insertion, int startChange, int length);
166
void TrimSelection(SelectionRange range);
167
void SetSelection(SelectionRange range);
168
void AddSelection(SelectionRange range);
169
void AddSelectionWithoutTrim(SelectionRange range);
170
void TentativeSelection(SelectionRange range);
171
void CommitTentative();
172
int CharacterInSelection(int posCharacter) const;
173
int InSelectionForEOL(int pos) const;
174
int VirtualSpaceFor(int pos) const;
176
void RemoveDuplicates();
178
bool Tentative() const { return tentativeMain; }
179
std::vector<SelectionRange> RangesCopy() const {