Kate
katebuffer.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 #ifndef __KATE_BUFFER_H__
00021 #define __KATE_BUFFER_H__
00022
00023 #include "katetextline.h"
00024 #include "katecodefoldinghelpers.h"
00025
00026 #include <kvmallocator.h>
00027
00028 #include <qptrlist.h>
00029 #include <qobject.h>
00030 #include <qtimer.h>
00031 #include <qvaluevector.h>
00032
00033 class KateLineInfo;
00034 class KateDocument;
00035 class KateHighlighting;
00036 class KateBufBlockList;
00037 class KateBuffer;
00038 class KateFileLoader;
00039
00040 class QTextCodec;
00041
00049 class KateBufBlock
00050 {
00051 friend class KateBufBlockList;
00052
00053 public:
00061 KateBufBlock ( KateBuffer *parent, KateBufBlock *prev = 0, KateBufBlock *next = 0,
00062 KateFileLoader *stream = 0 );
00063
00067 ~KateBufBlock ();
00068
00069 private:
00074 void fillBlock (KateFileLoader *stream);
00075
00076 public:
00080 enum State
00081 {
00082 stateSwapped = 0,
00083 stateClean = 1,
00084 stateDirty = 2
00085 };
00086
00091 State state () const { return m_state; }
00092
00093 public:
00101 KateTextLine::Ptr line(uint i);
00102
00109 void insertLine(uint i, KateTextLine::Ptr line);
00110
00116 void removeLine(uint i);
00117
00122 void markDirty ();
00123
00124 public:
00129 inline uint startLine () const { return m_startLine; };
00130
00135 inline void setStartLine (uint line) { m_startLine = line; }
00136
00141 inline uint endLine () const { return m_startLine + m_lines; }
00142
00147 inline uint lines () const { return m_lines; }
00148
00153 inline KateBufBlock *prev () { return m_prev; }
00154
00159 inline KateBufBlock *next () { return m_next; }
00160
00164 private:
00168 void swapIn ();
00169
00173 void swapOut ();
00174
00175 private:
00180 KateBufBlock::State m_state;
00181
00185 uint m_startLine;
00186
00190 uint m_lines;
00191
00195 KVMAllocator::Block *m_vmblock;
00196
00200 uint m_vmblockSize;
00201
00205 QValueVector<KateTextLine::Ptr> m_stringList;
00206
00210 KateBuffer* m_parent;
00211
00215 KateBufBlock *m_prev;
00216
00220 KateBufBlock *m_next;
00221
00222 private:
00227 KateBufBlockList *list;
00228
00232 KateBufBlock *listPrev;
00233
00237 KateBufBlock *listNext;
00238 };
00239
00248 class KateBufBlockList
00249 {
00250 public:
00254 KateBufBlockList ();
00255
00256 public:
00261 inline uint count() const { return m_count; }
00262
00267 inline KateBufBlock *first () { return m_first; };
00268
00273 inline KateBufBlock *last () { return m_last; };
00274
00280 inline bool isFirst (KateBufBlock *buf) { return m_first == buf; };
00281
00287 inline bool isLast (KateBufBlock *buf) { return m_last == buf; };
00288
00294 void append (KateBufBlock *buf);
00295
00300 inline static void remove (KateBufBlock *buf)
00301 {
00302 if (buf->list)
00303 buf->list->removeInternal (buf);
00304 }
00305
00306 private:
00311 void removeInternal (KateBufBlock *buf);
00312
00313 private:
00317 uint m_count;
00318
00322 KateBufBlock *m_first;
00323
00327 KateBufBlock *m_last;
00328 };
00329
00341 class KateBuffer : public QObject
00342 {
00343 Q_OBJECT
00344
00345 friend class KateBufBlock;
00346
00347 public:
00352 inline static uint maxLoadedBlocks () { return m_maxLoadedBlocks; }
00353
00358 static void setMaxLoadedBlocks (uint count);
00359
00360 private:
00364 static uint m_maxLoadedBlocks;
00365
00366 public:
00371 KateBuffer (KateDocument *doc);
00372
00376 ~KateBuffer ();
00377
00378 public:
00382 void editStart ();
00383
00387 void editEnd ();
00388
00394 inline bool editChanged () const { return editChangesDone; }
00395
00400 inline uint editTagStart () const { return editTagLineStart; }
00401
00406 inline uint editTagEnd () const { return editTagLineEnd; }
00407
00412 inline bool editTagFrom () const { return editTagLineFrom; }
00413
00414 private:
00418 uint editSessionNumber;
00419
00423 bool editIsRunning;
00424
00428 uint editTagLineStart;
00429
00433 uint editTagLineEnd;
00434
00438 bool editTagLineFrom;
00439
00443 bool editChangesDone;
00444
00445 public:
00449 void clear();
00450
00456 bool openFile (const QString &m_file);
00457
00463 bool loadingBorked () const { return m_loadingBorked; }
00464
00469 bool binary () const { return m_binary; }
00470
00475 bool canEncode ();
00476
00482 bool saveFile (const QString &m_file);
00483
00484 public:
00488 inline KateTextLine::Ptr line(uint i)
00489 {
00490 KateBufBlock *buf = findBlock(i);
00491 if (!buf)
00492 return 0;
00493
00494 if (i < m_lineHighlighted)
00495 return buf->line (i - buf->startLine());
00496
00497 return line_internal (buf, i);
00498 }
00499
00500 private:
00504 KateTextLine::Ptr line_internal (KateBufBlock *buf, uint i);
00505
00506 inline void addIndentBasedFoldingInformation(QMemArray<uint> &foldingList,bool addindent,uint deindent);
00507 inline void updatePreviousNotEmptyLine(KateBufBlock *blk,uint current_line,bool addindent,uint deindent);
00508 public:
00512 inline KateTextLine::Ptr plainLine(uint i)
00513 {
00514 KateBufBlock *buf = findBlock(i);
00515 if (!buf)
00516 return 0;
00517
00518 return buf->line(i - buf->startLine());
00519 }
00520
00524 inline uint count() const { return m_lines; }
00525
00526 private:
00532 KateBufBlock *findBlock (uint i, uint *index = 0)
00533 {
00534
00535 if (i >= m_lines)
00536 return 0;
00537
00538 if ((m_blocks[m_lastFoundBlock]->startLine() <= i) && (m_blocks[m_lastFoundBlock]->endLine() > i))
00539 {
00540 if (index)
00541 (*index) = m_lastFoundBlock;
00542
00543 return m_blocks[m_lastFoundBlock];
00544 }
00545
00546 return findBlock_internal (i, index);
00547 }
00548
00549 KateBufBlock *findBlock_internal (uint i, uint *index = 0);
00550
00551 public:
00555 void changeLine(uint i);
00556
00560 void insertLine(uint i, KateTextLine::Ptr line);
00561
00565 void removeLine(uint i);
00566
00567 public:
00568 inline uint countVisible () { return m_lines - m_regionTree.getHiddenLinesCount(m_lines); }
00569
00570 inline uint lineNumber (uint visibleLine) { return m_regionTree.getRealLine (visibleLine); }
00571
00572 inline uint lineVisibleNumber (uint line) { return m_regionTree.getVirtualLine (line); }
00573
00574 inline void lineInfo (KateLineInfo *info, unsigned int line) { m_regionTree.getLineInfo(info,line); }
00575
00576 inline uint tabWidth () const { return m_tabWidth; }
00577
00578 public:
00579 void setTabWidth (uint w);
00580
00587 void setHighlight (uint hlMode);
00588
00589 KateHighlighting *highlight () { return m_highlight; };
00590
00594 void invalidateHighlighting();
00595
00596 KateCodeFoldingTree *foldingTree () { return &m_regionTree; };
00597
00598 public slots:
00599 void codeFoldingColumnUpdate(unsigned int lineNr);
00600
00601 private:
00614 bool doHighlight (KateBufBlock *buf, uint from, uint to, bool invalidate);
00615
00616 signals:
00620 void codeFoldingUpdated();
00621
00626 void tagLines(int start, int end);
00627
00628 private:
00632 KateDocument *m_doc;
00633
00637 uint m_lines;
00638
00643 QValueVector<KateBufBlock*> m_blocks;
00644
00648 uint m_lastInSyncBlock;
00649
00653 uint m_lastFoundBlock;
00654
00659 bool m_cacheReadError;
00660 bool m_cacheWriteError;
00661
00665 bool m_loadingBorked;
00666
00670 bool m_binary;
00671
00675 private:
00679 KateHighlighting *m_highlight;
00680
00684 KateCodeFoldingTree m_regionTree;
00685
00686
00687 uint m_tabWidth;
00688
00689 uint m_lineHighlightedMax;
00690 uint m_lineHighlighted;
00691
00695 uint m_maxDynamicContexts;
00696
00700 private:
00704 KateBufBlockList m_loadedBlocks;
00705 };
00706
00707 #endif
00708
00709