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
;
65 SelectionSegment(SelectionPosition a
, SelectionPosition b
) {
77 void Extend(SelectionPosition p
) {
85 struct SelectionRange
{
86 SelectionPosition caret
;
87 SelectionPosition 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 #include "wx/vector.h"
137 wxVector
<SelectionRange
> ranges
;
138 wxVector
<SelectionRange
> rangesSaved
;
139 SelectionRange rangeRectangular
;
144 enum selTypes
{ noSel
, selStream
, selRectangle
, selLines
, selThin
};
149 bool IsRectangular() const;
150 int MainCaret() const;
151 int MainAnchor() const;
152 SelectionRange
&Rectangular();
153 SelectionSegment
Limits() const;
154 // This is for when you want to move the caret in response to a
155 // user direction command - for rectangular selections, use the range
156 // that covers all selected text otherwise return the main selection.
157 SelectionSegment
LimitsForRectangularElseMain() const;
158 size_t Count() const;
160 void SetMain(size_t r
);
161 SelectionRange
&Range(size_t r
);
162 SelectionRange
&RangeMain();
163 bool MoveExtends() const;
164 void SetMoveExtends(bool moveExtends_
);
166 SelectionPosition
Last() const;
168 void MovePositions(bool insertion
, int startChange
, int length
);
169 void TrimSelection(SelectionRange range
);
170 void SetSelection(SelectionRange range
);
171 void AddSelection(SelectionRange range
);
172 void TentativeSelection(SelectionRange range
);
173 void CommitTentative();
174 int CharacterInSelection(int posCharacter
) const;
175 int InSelectionForEOL(int pos
) const;
176 int VirtualSpaceFor(int pos
) const;
178 void RemoveDuplicates();
180 bool Tentative() const { return tentativeMain
; }
181 wxVector
<SelectionRange
> RangesCopy() const {