summaryrefslogtreecommitdiff
path: root/noncore/apps/tinykate/libkate/document/katetextline.h
Unidiff
Diffstat (limited to 'noncore/apps/tinykate/libkate/document/katetextline.h') (more/less context) (show whitespace changes)
-rw-r--r--noncore/apps/tinykate/libkate/document/katetextline.h359
1 files changed, 359 insertions, 0 deletions
diff --git a/noncore/apps/tinykate/libkate/document/katetextline.h b/noncore/apps/tinykate/libkate/document/katetextline.h
new file mode 100644
index 0000000..c2968cc
--- a/dev/null
+++ b/noncore/apps/tinykate/libkate/document/katetextline.h
@@ -0,0 +1,359 @@
1/*
2 Copyright (C) 1998, 1999 Jochen Wilhelmy
3 digisnap@cs.tu-berlin.de
4 (C) 2002, 2001 The Kate Team <kwrite-devel@kde.org>
5 (C) 2002 Joseph Wenninger <jowenn@kde.org>
6
7 This library is free software; you can redistribute it and/or
8 modify it under the terms of the GNU Library General Public
9 License as published by the Free Software Foundation; either
10 version 2 of the License, or (at your option) any later version.
11
12 This library is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 Library General Public License for more details.
16
17 You should have received a copy of the GNU Library General Public License
18 along with this library; see the file COPYING.LIB. If not, write to
19 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA.
21*/
22
23#ifndef _KWTEXTLINE_H_
24#define _KWTEXTLINE_H_
25
26#include <stdlib.h>
27
28#include <qstring.h>
29#include <qarray.h>
30#include <qvaluelist.h>
31
32#include <ksharedptr.h>
33
34/**
35 FastValueList: QValueList, but with a faster at() like QList
36 FVPrivate is needed so that "const" functions can change the
37 current position
38*/
39template<class T>
40class FVPrivate
41{
42public:
43 int curpos;
44 typedef QValueListConstIterator<T> Iterator;
45 Iterator curit;
46
47 FVPrivate() { curpos=-1; };
48};
49
50template<class T>
51class FastValueList : public QValueList<T>
52{
53public:
54 typedef QValueListIterator<T> Iterator;
55 typedef QValueListConstIterator<T> ConstIterator;
56protected:
57 FVPrivate<T> *fvp;
58
59 Iterator fastat( uint i ) {
60 uint num=count();
61 if (i>=num) {return end();}
62 if (fvp->curpos<0) { fvp->curpos=0; fvp->curit=begin(); }
63 uint curpos=(uint) fvp->curpos;
64 Iterator curit(fvp->curit.node);
65 if (curpos==i) return curit;
66
67 int diff=i-curpos;
68 bool forward;
69 if (diff<0) diff=-diff;
70 if (((uint)diff < i) && ((uint)diff < num-i)) { // start from current node
71 forward=i > (uint)curpos;
72 } else if (i < num - i) { // start from first node
73 curit=begin(); diff=i; forward=TRUE;
74 } else { // start from last node
75 curit=fromLast(); diff=num - i - 1;
76 if (diff<0) diff=0;
77 forward=FALSE;
78 }
79 if (forward) {
80 while(diff--) curit++;
81 } else {
82 while(diff--) curit--;
83 }
84 fvp->curpos=i; fvp->curit=curit;
85 return curit;
86 }
87 ConstIterator fastat( uint i ) const {
88 uint num=count();
89 if (i>=num) {return end();}
90 if (fvp->curpos<0) { fvp->curpos=0; fvp->curit=begin(); }
91 uint curpos=(uint) fvp->curpos;
92 ConstIterator curit=fvp->curit;
93 if (curpos==i) return curit;
94
95 int diff=i-curpos;
96 bool forward;
97 if (diff<0) diff=-diff;
98 if (((uint)diff < i) && ((uint)diff < num-i)) { // start from current node
99 forward=i > (uint)curpos;
100 } else if (i < num - i) { // start from first node
101 curit=begin(); diff=i; forward=TRUE;
102 } else { // start from last node
103 curit=fromLast(); diff=num - i - 1;
104 if (diff<0) diff=0;
105 forward=FALSE;
106 }
107 if (forward) {
108 while(diff--) curit++;
109 } else {
110 while(diff--) curit--;
111 }
112 fvp->curpos=i; fvp->curit=curit;
113 return curit;
114 }
115
116public:
117 FastValueList() : QValueList<T>()
118 { fvp=new FVPrivate<T>(); }
119 FastValueList(const FastValueList<T>& l) : QValueList<T>(l)
120 { fvp=new FVPrivate<T>(); }
121 ~FastValueList() { delete fvp; }
122
123 Iterator insert( Iterator it, const T& x ) {
124 fvp->curpos=-1; return QValueList<T>::insert(it, x);
125 }
126
127 Iterator append( const T& x ) {
128 fvp->curpos=-1; return QValueList<T>::append( x );
129 }
130 Iterator prepend( const T& x ) {
131 fvp->curpos=-1; return QValueList<T>::prepend( x );
132 }
133
134 Iterator remove( Iterator it ) {
135 fvp->curpos=-1; return QValueList<T>::remove( it );
136 }
137 void remove( const T& x ) {
138 fvp->curpos=-1; QValueList<T>::remove( x );
139 }
140
141 T& operator[] ( uint i ) { detach(); return fastat(i); }
142 const T& operator[] ( uint i ) const { return *fastat(i); }
143 Iterator at( uint i ) { detach(); return fastat(i); }
144 ConstIterator at( uint i ) const { return ConstIterator( fastat(i) ); }
145};
146
147
148/**
149 The TextLine represents a line of text. A text line that contains the
150 text, an attribute for each character, an attribute for the free space
151 behind the last character and a context number for the syntax highlight.
152 The attribute stores the index to a table that contains fonts and colors
153 and also if a character is selected.
154*/
155class TextLine : public KShared
156{
157 friend class KWBuffer;
158 friend class KWBufBlock;
159
160public:
161 typedef KSharedPtr<TextLine> Ptr;
162 typedef FastValueList<Ptr> List;
163
164public:
165 /**
166 Creates an empty text line with given attribute and syntax highlight
167 context
168 */
169 TextLine(uchar attribute = 0, int context = 0);
170 ~TextLine();
171
172 /**
173 Returns the length
174 */
175 uint length() const {return text.length();}
176 /**
177 Universal text manipulation method. It can be used to insert, delete
178 or replace text.
179 */
180 void replace(uint pos, uint delLen, const QChar *insText, uint insLen, uchar *insAttribs = 0L);
181
182 /**
183 Appends a string of length l to the textline
184 */
185 void append(const QChar *s, uint l) {replace(text.length(), 0, s, l);}
186 /**
187 Wraps the text from the given position to the end to the next line
188 */
189 void wrap(TextLine::Ptr nextLine, uint pos);
190 /**
191 Wraps the text of given length from the beginning of the next line to
192 this line at the given position
193 */
194 void unWrap(uint pos, TextLine::Ptr nextLine, uint len);
195 /**
196 Truncates the textline to the new length
197 */
198 void truncate(uint newLen) { text.truncate(newLen); attributes.resize(text.length()); }
199 /**
200 Returns the position of the first character which is not a white space
201 */
202 int firstChar() const;
203 /**
204 Returns the position of the last character which is not a white space
205 */
206 int lastChar() const;
207 /**
208 Removes trailing spaces
209 */
210 void removeSpaces();
211 /**
212 Gets the char at the given position
213 */
214 QChar getChar(uint pos) const;
215 /**
216 Gets the text. WARNING: it is not null terminated
217 */
218 const QChar *getText() const {return text.unicode();};
219 /**
220 Gets a C-like null terminated string
221 */
222 const QString getString() { return text; };
223
224 /*
225 Gets a null terminated pointer to first non space char
226 */
227 const QChar *firstNonSpace();
228 /**
229 Returns the x position of the cursor at the given position, which
230 depends on the number of tab characters
231 */
232 int cursorX(uint pos, uint tabChars) const;
233 /**
234 Is the line starting with the given string
235 */
236 bool startingWith(QString& match);
237 /**
238 Is the line ending with the given string
239 */
240 bool endingWith(QString& match);
241
242 /**
243 Sets the attributes from start to end -1
244 */
245 void setAttribs(uchar attribute, uint start, uint end);
246 /**
247 Sets the attribute for the free space behind the last character
248 */
249 void setAttr(uchar attribute);
250 /**
251 Gets the attribute at the given position
252 */
253 uchar getAttr(uint pos) const;
254 /**
255 Gets the attribute for the free space behind the last character
256 */
257 uchar getAttr() const;
258 /**
259 Gets the attribute, including the select state, at the given position
260 */
261 uchar getRawAttr(uint pos) const;
262 /**
263 Gets the attribute, including the select state, for the free space
264 behind the last character
265 */
266 uchar getRawAttr() const;
267
268 /**
269 Sets the syntax highlight context number
270 */
271 void setContext(int context);
272 /**
273 Gets the syntax highlight context number
274 */
275 int getContext() const;
276
277 /**
278 Sets the select state from start to end -1
279 */
280 void select(bool sel, uint start, uint end);
281 /**
282 Sets the select state from the given position to the end, including
283 the free space behind the last character
284 */
285 void selectEol(bool sel, uint pos);
286 /**
287 Toggles the select state from start to end -1
288 */
289 void toggleSelect(uint start, uint end);
290 /**
291 Toggles the select state from the given position to the end, including
292 the free space behind the last character
293 */
294 void toggleSelectEol(uint pos);
295 /**
296 Returns the number of selected characters
297 */
298 int numSelected() const;
299 /**
300 Returns if the character at the given position is selected
301 */
302 bool isSelected(uint pos) const;
303 /**
304 Returns true if the free space behind the last character is selected
305 */
306 bool isSelected() const;
307 /**
308 Finds the next selected character, starting at the given position
309 */
310 int findSelected(uint pos) const;
311 /**
312 Finds the next unselected character, starting at the given position
313 */
314 int findUnselected(uint pos) const;
315 /**
316 Finds the previous selected character, starting at the given position
317 */
318 int findRevSelected(uint pos) const;
319 /**
320 Finds the previous unselected character, starting at the given position
321 */
322 int findRevUnselected(uint pos) const;
323
324 void clearMark () { myMark = 0; };
325 void addMark ( uint m );
326 void delMark ( uint m );
327 uint mark() { return myMark; };
328
329 uchar *getAttribs() { return attributes.data(); }
330
331 protected:
332 /**
333 The text
334 */
335 QString text;
336 /**
337 The attributes
338 */
339 QArray<uchar> attributes;
340 /**
341 The attribute of the free space behind the end
342 */
343 uchar attr;
344 /**
345 The syntax highlight context
346 */
347 int ctx;
348 /**
349 The marks of the current line
350 */
351 uint myMark;
352};
353
354//text attribute constants
355const int taSelected = 0x40;
356const int taAttrMask = ~taSelected & 0xFF;
357
358#endif //KWTEXTLINE_H
359