Kate
katecodefoldinghelpers.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 #ifndef _KATE_CODEFOLDING_HELPERS_
00020 #define _KATE_CODEFOLDING_HELPERS_
00021
00022
00023 #include <qptrlist.h>
00024 #include <qvaluelist.h>
00025 #include <qobject.h>
00026 #include <qintdict.h>
00027 #include <qmemarray.h>
00028
00029 class KateCodeFoldingTree;
00030 class KateTextCursor;
00031 class KateBuffer;
00032
00033 class QString;
00034
00035
00036 class KateHiddenLineBlock
00037 {
00038 public:
00039 unsigned int start;
00040 unsigned int length;
00041 };
00042
00043 class KateLineInfo
00044 {
00045 public:
00046 bool topLevel;
00047 bool startsVisibleBlock;
00048 bool startsInVisibleBlock;
00049 bool endsBlock;
00050 bool invalidBlockEnd;
00051 };
00052
00053 class KateCodeFoldingNode
00054 {
00055 friend class KateCodeFoldingTree;
00056
00057 public:
00058 KateCodeFoldingNode ();
00059 KateCodeFoldingNode (KateCodeFoldingNode *par, signed char typ, unsigned int sLRel);
00060
00061 ~KateCodeFoldingNode ();
00062
00063 inline int nodeType () { return type;}
00064
00065 inline bool isVisible () {return visible;}
00066
00067 inline KateCodeFoldingNode *getParentNode () {return parentNode;}
00068
00069 bool getBegin (KateCodeFoldingTree *tree, KateTextCursor* begin);
00070 bool getEnd (KateCodeFoldingTree *tree, KateTextCursor *end);
00071
00075 protected:
00076 inline bool noChildren () const { return m_children.isEmpty(); }
00077
00078 inline uint childCount () const { return m_children.size(); }
00079
00080 inline KateCodeFoldingNode *child (uint index) const { return m_children[index]; }
00081
00082 inline int findChild (KateCodeFoldingNode *node, uint start = 0) const { return m_children.find (node, start); }
00083
00084 inline void appendChild (KateCodeFoldingNode *node) { m_children.resize(m_children.size()+1); m_children[m_children.size()-1] = node; }
00085
00086 void insertChild (uint index, KateCodeFoldingNode *node);
00087
00088 KateCodeFoldingNode *takeChild (uint index);
00089
00090 void clearChildren ();
00091
00092 int cmpPos(KateCodeFoldingTree *tree, uint line, uint col);
00093
00097 private:
00098 KateCodeFoldingNode *parentNode;
00099 unsigned int startLineRel;
00100 unsigned int endLineRel;
00101
00102 unsigned int startCol;
00103 unsigned int endCol;
00104
00105 bool startLineValid;
00106 bool endLineValid;
00107
00108 signed char type;
00109 bool visible;
00110 bool deleteOpening;
00111 bool deleteEnding;
00112
00113 QMemArray<KateCodeFoldingNode*> m_children;
00114 };
00115
00116 class KateCodeFoldingTree : public QObject
00117 {
00118 friend class KateCodeFoldingNode;
00119
00120 Q_OBJECT
00121
00122 public:
00123 KateCodeFoldingTree (KateBuffer *buffer);
00124 ~KateCodeFoldingTree ();
00125
00126 KateCodeFoldingNode *findNodeForLine (unsigned int line);
00127
00128 unsigned int getRealLine (unsigned int virtualLine);
00129 unsigned int getVirtualLine (unsigned int realLine);
00130 unsigned int getHiddenLinesCount (unsigned int docLine);
00131
00132 bool isTopLevel (unsigned int line);
00133
00134 void lineHasBeenInserted (unsigned int line);
00135 void lineHasBeenRemoved (unsigned int line);
00136 void debugDump ();
00137 void getLineInfo (KateLineInfo *info,unsigned int line);
00138
00139 unsigned int getStartLine (KateCodeFoldingNode *node);
00140
00141 void fixRoot (int endLRel);
00142 void clear ();
00143
00144 KateCodeFoldingNode *findNodeForPosition(unsigned int line, unsigned int column);
00145 private:
00146
00147 KateCodeFoldingNode m_root;
00148
00149 KateBuffer *m_buffer;
00150
00151 QIntDict<unsigned int> lineMapping;
00152 QIntDict<bool> dontIgnoreUnchangedLines;
00153
00154 QPtrList<KateCodeFoldingNode> markedForDeleting;
00155 QPtrList<KateCodeFoldingNode> nodesForLine;
00156 QValueList<KateHiddenLineBlock> hiddenLines;
00157
00158 unsigned int hiddenLinesCountCache;
00159 bool something_changed;
00160 bool hiddenLinesCountCacheValid;
00161
00162 static bool trueVal;
00163
00164 KateCodeFoldingNode *findNodeForLineDescending (KateCodeFoldingNode *, unsigned int, unsigned int, bool oneStepOnly=false);
00165
00166 bool correctEndings (signed char data, KateCodeFoldingNode *node, unsigned int line, unsigned int endCol, int insertPos);
00167
00168 void dumpNode (KateCodeFoldingNode *node, const QString &prefix);
00169 void addOpening (KateCodeFoldingNode *node, signed char nType,QMemArray<uint>* list, unsigned int line,unsigned int charPos);
00170 void addOpening_further_iterations (KateCodeFoldingNode *node,signed char nType, QMemArray<uint>*
00171 list,unsigned int line,int current,unsigned int startLine,unsigned int charPos);
00172
00173 void incrementBy1 (KateCodeFoldingNode *node, KateCodeFoldingNode *after);
00174 void decrementBy1 (KateCodeFoldingNode *node, KateCodeFoldingNode *after);
00175
00176 void cleanupUnneededNodes (unsigned int line);
00177
00181 bool removeEnding (KateCodeFoldingNode *node,unsigned int line);
00182
00186 bool removeOpening (KateCodeFoldingNode *node,unsigned int line);
00187
00188 void findAndMarkAllNodesforRemovalOpenedOrClosedAt (unsigned int line);
00189 void findAllNodesOpenedOrClosedAt (unsigned int line);
00190
00191 void addNodeToFoundList (KateCodeFoldingNode *node,unsigned int line,int childpos);
00192 void addNodeToRemoveList (KateCodeFoldingNode *node,unsigned int line);
00193 void addHiddenLineBlock (KateCodeFoldingNode *node,unsigned int line);
00194
00195 bool existsOpeningAtLineAfter(unsigned int line, KateCodeFoldingNode *node);
00196
00197 void dontDeleteEnding (KateCodeFoldingNode*);
00198 void dontDeleteOpening (KateCodeFoldingNode*);
00199
00200 void updateHiddenSubNodes (KateCodeFoldingNode *node);
00201 void moveSubNodesUp (KateCodeFoldingNode *node);
00202
00203 public slots:
00204 void updateLine (unsigned int line,QMemArray<uint>* regionChanges, bool *updated, bool changed,bool colschanged);
00205 void toggleRegionVisibility (unsigned int);
00206 void collapseToplevelNodes ();
00207 void expandToplevelNodes (int numLines);
00208 int collapseOne (int realLine);
00209 void expandOne (int realLine, int numLines);
00213 void ensureVisible( uint line );
00214
00215 signals:
00216 void regionVisibilityChangedAt (unsigned int);
00217 void regionBeginEndAddedRemoved (unsigned int);
00218 };
00219
00220 #endif
00221
00222