Set release date.
[geany-mirror.git] / scintilla / Decoration.cxx
blobe4ac0e07c613e93ed3d1e6c471a291ffbbca01c7
1 /** @file Decoration.cxx
2 ** Visual elements added over text.
3 **/
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.
7 #include <stdio.h>
8 #include <string.h>
9 #include <stdlib.h>
10 #include <stdarg.h>
12 #include "Platform.h"
14 #include "Scintilla.h"
15 #include "SplitVector.h"
16 #include "Partitioning.h"
17 #include "RunStyles.h"
18 #include "Decoration.h"
20 #ifdef SCI_NAMESPACE
21 using namespace Scintilla;
22 #endif
24 Decoration::Decoration(int indicator_) : next(0), indicator(indicator_) {
27 Decoration::~Decoration() {
30 bool Decoration::Empty() {
31 return rs.starts->Partitions() == 1;
34 DecorationList::DecorationList() : currentIndicator(0), currentValue(1), current(0),
35 lengthDocument(0), root(0), clickNotified(false) {
38 DecorationList::~DecorationList() {
39 Decoration *deco = root;
40 while (deco) {
41 Decoration *decoNext = deco->next;
42 delete deco;
43 deco = decoNext;
45 root = 0;
46 current = 0;
49 Decoration *DecorationList::DecorationFromIndicator(int indicator) {
50 for (Decoration *deco=root; deco; deco = deco->next) {
51 if (deco->indicator == indicator) {
52 return deco;
55 return 0;
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)) {
67 decoPrev = deco;
68 deco = deco->next;
70 if (decoPrev == 0) {
71 decoNew->next = root;
72 root = decoNew;
73 } else {
74 decoNew->next = deco;
75 decoPrev->next = decoNew;
77 return decoNew;
80 void DecorationList::Delete(int indicator) {
81 Decoration *decoToDelete = 0;
82 if (root) {
83 if (root->indicator == indicator) {
84 decoToDelete = root;
85 root = root->next;
86 } else {
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;
92 } else {
93 deco = deco->next;
98 if (decoToDelete) {
99 delete decoToDelete;
100 current = 0;
104 void DecorationList::SetCurrentIndicator(int indicator) {
105 currentIndicator = indicator;
106 current = DecorationFromIndicator(indicator);
107 currentValue = 1;
110 void DecorationList::SetCurrentValue(int value) {
111 currentValue = value ? value : 1;
114 bool DecorationList::FillRange(int &position, int value, int &fillLength) {
115 if (!current) {
116 current = DecorationFromIndicator(currentIndicator);
117 if (!current) {
118 current = Create(currentIndicator, lengthDocument);
121 bool changed = current->rs.FillRange(position, value, fillLength);
122 if (current->Empty()) {
123 Delete(currentIndicator);
125 return changed;
128 void DecorationList::InsertSpace(int position, int insertLength) {
129 lengthDocument += insertLength;
130 for (Decoration *deco=root; deco; deco = deco->next) {
131 deco->rs.InsertSpace(position, insertLength);
135 void DecorationList::DeleteRange(int position, int deleteLength) {
136 lengthDocument -= deleteLength;
137 Decoration *deco;
138 for (deco=root; deco; deco = deco->next) {
139 deco->rs.DeleteRange(position, deleteLength);
141 DeleteAnyEmpty();
144 void DecorationList::DeleteAnyEmpty() {
145 Decoration *deco = root;
146 while (deco) {
147 if (deco->Empty()) {
148 Delete(deco->indicator);
149 deco = root;
150 } else {
151 deco = deco->next;
156 int DecorationList::AllOnFor(int position) {
157 int mask = 0;
158 for (Decoration *deco=root; deco; deco = deco->next) {
159 if (deco->rs.ValueAt(position)) {
160 mask |= 1 << deco->indicator;
163 return mask;
166 int DecorationList::ValueAt(int indicator, int position) {
167 Decoration *deco = DecorationFromIndicator(indicator);
168 if (deco) {
169 return deco->rs.ValueAt(position);
171 return 0;
174 int DecorationList::Start(int indicator, int position) {
175 Decoration *deco = DecorationFromIndicator(indicator);
176 if (deco) {
177 return deco->rs.StartRun(position);
179 return 0;
182 int DecorationList::End(int indicator, int position) {
183 Decoration *deco = DecorationFromIndicator(indicator);
184 if (deco) {
185 return deco->rs.EndRun(position);
187 return 0;