]>
git.saurik.com Git - wxWidgets.git/blob - src/stc/scintilla/src/Decoration.cxx
1 /** @file Decoration.cxx
2 ** Visual elements added over text.
4 // Copyright 1998-2007 by Neil Hodgson <neilh@scintilla.org>
5 // The License.txt file describes the conditions under which this software may be distributed.
14 #include "Scintilla.h"
15 #include "SplitVector.h"
16 #include "Partitioning.h"
17 #include "RunStyles.h"
18 #include "Decoration.h"
21 using namespace Scintilla
;
24 Decoration::Decoration(int indicator_
) : next(0), indicator(indicator_
) {
27 Decoration::~Decoration() {
30 bool Decoration::Empty() {
31 return (rs
.Runs() == 1) && (rs
.AllSameAs(0));
34 DecorationList::DecorationList() : currentIndicator(0), currentValue(1), current(0),
35 lengthDocument(0), root(0), clickNotified(false) {
38 DecorationList::~DecorationList() {
39 Decoration
*deco
= root
;
41 Decoration
*decoNext
= deco
->next
;
49 Decoration
*DecorationList::DecorationFromIndicator(int indicator
) {
50 for (Decoration
*deco
=root
; deco
; deco
= deco
->next
) {
51 if (deco
->indicator
== indicator
) {
58 Decoration
*DecorationList::Create(int indicator
, int length
) {
59 currentIndicator
= indicator
;
60 Decoration
*decoNew
= new Decoration(indicator
);
61 decoNew
->rs
.InsertSpace(0, length
);
63 Decoration
*decoPrev
= 0;
64 Decoration
*deco
= root
;
66 while (deco
&& (deco
->indicator
< indicator
)) {
75 decoPrev
->next
= decoNew
;
80 void DecorationList::Delete(int indicator
) {
81 Decoration
*decoToDelete
= 0;
83 if (root
->indicator
== indicator
) {
87 Decoration
*deco
=root
;
88 while (deco
->next
&& !decoToDelete
) {
89 if (deco
->next
&& deco
->next
->indicator
== indicator
) {
90 decoToDelete
= deco
->next
;
91 deco
->next
= decoToDelete
->next
;
104 void DecorationList::SetCurrentIndicator(int indicator
) {
105 currentIndicator
= indicator
;
106 current
= DecorationFromIndicator(indicator
);
110 void DecorationList::SetCurrentValue(int value
) {
111 currentValue
= value
? value
: 1;
114 bool DecorationList::FillRange(int &position
, int value
, int &fillLength
) {
116 current
= DecorationFromIndicator(currentIndicator
);
118 current
= Create(currentIndicator
, lengthDocument
);
121 bool changed
= current
->rs
.FillRange(position
, value
, fillLength
);
122 if (current
->Empty()) {
123 Delete(currentIndicator
);
128 void DecorationList::InsertSpace(int position
, int insertLength
) {
129 const bool atEnd
= position
== lengthDocument
;
130 lengthDocument
+= insertLength
;
131 for (Decoration
*deco
=root
; deco
; deco
= deco
->next
) {
132 deco
->rs
.InsertSpace(position
, insertLength
);
134 deco
->rs
.FillRange(position
, 0, insertLength
);
139 void DecorationList::DeleteRange(int position
, int deleteLength
) {
140 lengthDocument
-= deleteLength
;
142 for (deco
=root
; deco
; deco
= deco
->next
) {
143 deco
->rs
.DeleteRange(position
, deleteLength
);
148 void DecorationList::DeleteAnyEmpty() {
149 Decoration
*deco
= root
;
151 if ((lengthDocument
== 0) || deco
->Empty()) {
152 Delete(deco
->indicator
);
160 int DecorationList::AllOnFor(int position
) {
162 for (Decoration
*deco
=root
; deco
; deco
= deco
->next
) {
163 if (deco
->rs
.ValueAt(position
)) {
164 mask
|= 1 << deco
->indicator
;
170 int DecorationList::ValueAt(int indicator
, int position
) {
171 Decoration
*deco
= DecorationFromIndicator(indicator
);
173 return deco
->rs
.ValueAt(position
);
178 int DecorationList::Start(int indicator
, int position
) {
179 Decoration
*deco
= DecorationFromIndicator(indicator
);
181 return deco
->rs
.StartRun(position
);
186 int DecorationList::End(int indicator
, int position
) {
187 Decoration
*deco
= DecorationFromIndicator(indicator
);
189 return deco
->rs
.EndRun(position
);