katebuffer.h
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
00389 private:
00394 void editTagLine (uint line);
00395
00400 void editRemoveTagLine (uint line);
00401
00406 void editInsertTagLine (uint line);
00407
00408 private:
00412 uint editSessionNumber;
00413
00417 bool editIsRunning;
00418
00422 uint editTagLineStart;
00423
00427 uint editTagLineEnd;
00428
00429 public:
00433 void clear();
00434
00440 bool openFile (const QString &m_file);
00441
00447 bool loadingBorked () const { return m_loadingBorked; }
00448
00453 bool canEncode ();
00454
00460 bool saveFile (const QString &m_file);
00461
00462 public:
00466 inline KateTextLine::Ptr line(uint i)
00467 {
00468 KateBufBlock *buf = findBlock(i);
00469 if (!buf)
00470 return 0;
00471
00472 if (i < m_lineHighlighted)
00473 return buf->line (i - buf->startLine());
00474
00475 return line_internal (buf, i);
00476 }
00477
00478 private:
00482 KateTextLine::Ptr line_internal (KateBufBlock *buf, uint i);
00483
00484 public:
00488 inline KateTextLine::Ptr plainLine(uint i)
00489 {
00490 KateBufBlock *buf = findBlock(i);
00491 if (!buf)
00492 return 0;
00493
00494 return buf->line(i - buf->startLine());
00495 }
00496
00500 inline uint count() const { return m_lines; }
00501
00502 private:
00508 KateBufBlock *findBlock (uint i, uint *index = 0)
00509 {
00510
00511 if (i >= m_lines)
00512 return 0;
00513
00514 if ((m_blocks[m_lastFoundBlock]->startLine() <= i) && (m_blocks[m_lastFoundBlock]->endLine() > i))
00515 {
00516 if (index)
00517 (*index) = m_lastFoundBlock;
00518
00519 return m_blocks[m_lastFoundBlock];
00520 }
00521
00522 return findBlock_internal (i, index);
00523 }
00524
00525 KateBufBlock *findBlock_internal (uint i, uint *index = 0);
00526
00527 public:
00531 void changeLine(uint i);
00532
00536 void insertLine(uint i, KateTextLine::Ptr line);
00537
00541 void removeLine(uint i);
00542
00543 public:
00544 inline uint countVisible () { return m_lines - m_regionTree.getHiddenLinesCount(m_lines); }
00545
00546 inline uint lineNumber (uint visibleLine) { return m_regionTree.getRealLine (visibleLine); }
00547
00548 inline uint lineVisibleNumber (uint line) { return m_regionTree.getVirtualLine (line); }
00549
00550 inline void lineInfo (KateLineInfo *info, unsigned int line) { m_regionTree.getLineInfo(info,line); }
00551
00552 inline uint tabWidth () const { return m_tabWidth; }
00553
00554 inline KVMAllocator *vm () { return &m_vm; }
00555
00556 public:
00557 void setTabWidth (uint w);
00558
00565 void setHighlight (KateHighlighting *highlight);
00566
00567 KateHighlighting *highlight () { return m_highlight; };
00568
00572 void invalidateHighlighting();
00573
00574 KateCodeFoldingTree *foldingTree () { return &m_regionTree; };
00575
00576 public slots:
00580 void setLineVisible (unsigned int lineNr, bool visible);
00581
00582 private:
00595 bool doHighlight (KateBufBlock *buf, uint from, uint to, bool invalidate);
00596
00597 signals:
00601 void codeFoldingUpdated();
00602
00607 void tagLines(int start, int end);
00608
00609 private:
00613 KateDocument *m_doc;
00614
00618 uint m_lines;
00619
00624 QValueVector<KateBufBlock*> m_blocks;
00625
00629 uint m_lastInSyncBlock;
00630
00634 uint m_lastFoundBlock;
00635
00639 KVMAllocator m_vm;
00640
00645 bool m_cacheReadError;
00646 bool m_cacheWriteError;
00647
00651 bool m_loadingBorked;
00652
00656 private:
00660 KateHighlighting *m_highlight;
00661
00665 KateCodeFoldingTree m_regionTree;
00666
00667
00668 uint m_tabWidth;
00669
00670 uint m_lineHighlightedMax;
00671 uint m_lineHighlighted;
00672
00676 uint m_maxDynamicContexts;
00677
00681 private:
00685 KateBufBlockList m_loadedBlocks;
00686 };
00687
00688 #endif
00689
00690
This file is part of the documentation for kate Library Version 3.3.0.