Kate
katetextline.h
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef __KATE_TEXTLINE_H__
00024 #define __KATE_TEXTLINE_H__
00025
00026 #include <ksharedptr.h>
00027
00028 #include <qmemarray.h>
00029 #include <qstring.h>
00030
00031 class KateRenderer;
00032 class QTextStream;
00033
00041 class KateTextLine : public KShared
00042 {
00043 public:
00047 typedef KSharedPtr<KateTextLine> Ptr;
00048
00049 public:
00053 enum Flags
00054 {
00055 flagNoOtherData = 1,
00056 flagHlContinue = 2,
00057 flagAutoWrapped = 4,
00058 flagFoldingColumnsOutdated = 8,
00059 flagNoIndentationBasedFolding = 16,
00060 flagNoIndentationBasedFoldingAtStart = 32
00061 };
00062
00063 public:
00069 KateTextLine ();
00070
00074 ~KateTextLine ();
00075
00079 public:
00083 inline void setFoldingColumnsOutdated(bool set) { if (set) m_flags |= KateTextLine::flagFoldingColumnsOutdated; else m_flags&=
00084 (~KateTextLine::flagFoldingColumnsOutdated);}
00085
00090 inline bool foldingColumnsOutdated() { return m_flags & KateTextLine::flagFoldingColumnsOutdated; }
00091
00092
00097 inline uint length() const { return m_text.length(); }
00098
00103 inline bool hlLineContinue () const { return m_flags & KateTextLine::flagHlContinue; }
00104
00109 inline bool isAutoWrapped () const { return m_flags & KateTextLine::flagAutoWrapped; }
00110
00115 int firstChar() const;
00116
00121 int lastChar() const;
00122
00129 int nextNonSpaceChar(uint pos) const;
00130
00137 int previousNonSpaceChar(uint pos) const;
00138
00145 inline QChar getChar (uint pos) const { return m_text[pos]; }
00146
00151 inline const QChar *text() const { return m_text.unicode(); }
00152
00167 inline uchar *attributes () const { return m_attributes.data(); }
00168
00173 inline const QString& string() const { return m_text; }
00174
00181 inline QString string(uint startCol, uint length) const
00182 { return m_text.mid(startCol, length); }
00183
00188 const QChar *firstNonSpace() const;
00189
00195 uint indentDepth (uint tabwidth) const;
00196
00204 int cursorX(uint pos, uint tabChars) const;
00205
00211 uint lengthWithTabs (uint tabChars) const;
00212
00219 bool stringAtPos(uint pos, const QString& match) const;
00220
00226 bool startingWith(const QString& match) const;
00227
00233 bool endingWith(const QString& match) const;
00234
00245 bool searchText (uint startCol, const QString &text,
00246 uint *foundAtCol, uint *matchLen,
00247 bool casesensitive = true,
00248 bool backwards = false);
00249
00259 bool searchText (uint startCol, const QRegExp ®exp,
00260 uint *foundAtCol, uint *matchLen,
00261 bool backwards = false);
00262
00271 inline uchar attribute (uint pos) const
00272 {
00273 if (pos < m_attributes.size()) return m_attributes[pos];
00274 return 0;
00275 }
00276
00281 inline const QMemArray<short> &ctxArray () const { return m_ctx; };
00282
00286 inline const bool noIndentBasedFolding() const { return m_flags & KateTextLine::flagNoIndentationBasedFolding; };
00287 inline const bool noIndentBasedFoldingAtStart() const { return m_flags & KateTextLine::flagNoIndentationBasedFoldingAtStart; };
00292 inline const QMemArray<uint> &foldingListArray () const { return m_foldingList; };
00293
00298 inline const QMemArray<unsigned short> &indentationDepthArray () const { return m_indentationDepth; };
00299
00307 void insertText (uint pos, uint insLen, const QChar *insText, uchar *insAttribs = 0);
00308
00314 void removeText (uint pos, uint delLen);
00315
00320 void truncate(uint newLen);
00321
00326 inline void setHlLineContinue (bool cont)
00327 {
00328 if (cont) m_flags = m_flags | KateTextLine::flagHlContinue;
00329 else m_flags = m_flags & ~ KateTextLine::flagHlContinue;
00330 }
00331
00336 inline void setAutoWrapped (bool wrapped)
00337 {
00338 if (wrapped) m_flags = m_flags | KateTextLine::flagAutoWrapped;
00339 else m_flags = m_flags & ~ KateTextLine::flagAutoWrapped;
00340 }
00341
00346 inline void setContext (QMemArray<short> &val) { m_ctx.assign (val); }
00347
00351 inline void setNoIndentBasedFolding(bool val)
00352 {
00353 if (val) m_flags = m_flags | KateTextLine::flagNoIndentationBasedFolding;
00354 else m_flags = m_flags & ~ KateTextLine::flagNoIndentationBasedFolding;
00355 }
00356
00357 inline void setNoIndentBasedFoldingAtStart(bool val)
00358 {
00359 if (val) m_flags = m_flags | KateTextLine::flagNoIndentationBasedFoldingAtStart;
00360 else m_flags = m_flags & ~ KateTextLine::flagNoIndentationBasedFoldingAtStart;
00361 }
00362
00367 inline void setFoldingList (QMemArray<uint> &val) { m_foldingList.assign (val); m_foldingList.detach(); }
00368
00373 inline void setIndentationDepth (QMemArray<unsigned short> &val) { m_indentationDepth.assign (val); }
00374
00378 public:
00384 inline uint dumpSize (bool withHighlighting) const
00385 {
00386 return ( 1
00387 + sizeof(uint)
00388 + (m_text.length() * sizeof(QChar))
00389 + ( withHighlighting ?
00390 ( (3 * sizeof(uint))
00391 + (m_text.length() * sizeof(uchar))
00392 + (m_ctx.size() * sizeof(short))
00393 + (m_foldingList.size() * sizeof(uint))
00394 + (m_indentationDepth.size() * sizeof(unsigned short))
00395 ) : 0
00396 )
00397 );
00398 }
00399
00407 char *dump (char *buf, bool withHighlighting) const;
00408
00415 char *restore (char *buf);
00416
00420 private:
00424 QString m_text;
00425
00431 QMemArray<uchar> m_attributes;
00432
00436 QMemArray<short> m_ctx;
00437
00441 QMemArray<uint> m_foldingList;
00442
00446 QMemArray<unsigned short> m_indentationDepth;
00447
00451 uchar m_flags;
00452 };
00453
00454 #endif
00455
00456