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
00028
class KateBuffer;
00029
00030
class QString;
00031
00032
00033
class KateHiddenLineBlock
00034 {
00035
public:
00036
unsigned int start;
00037
unsigned int length;
00038 };
00039
00040
class KateLineInfo
00041 {
00042
public:
00043
bool topLevel;
00044
bool startsVisibleBlock;
00045
bool startsInVisibleBlock;
00046
bool endsBlock;
00047
bool invalidBlockEnd;
00048 };
00049
00050
class KateCodeFoldingNode
00051 {
00052
public:
00053 KateCodeFoldingNode();
00054 KateCodeFoldingNode(KateCodeFoldingNode *par,
signed char typ,
unsigned int sLRel);
00055 ~KateCodeFoldingNode();
00056
00057
inline QPtrList<KateCodeFoldingNode> *childnodes ()
00058 {
00059
if (!m_childnodes)
00060 {
00061 m_childnodes =
new QPtrList<KateCodeFoldingNode>;
00062 m_childnodes->setAutoDelete (
true);
00063 }
00064
00065
return m_childnodes;
00066 }
00067
00068
inline bool hasChildNodes ()
00069 {
00070
if (!m_childnodes)
00071
return false;
00072
00073
return !m_childnodes->isEmpty ();
00074 }
00075
00076
00077 KateCodeFoldingNode *parentNode;
00078
unsigned int startLineRel;
00079
unsigned int endLineRel;
00080
00081
bool startLineValid;
00082
bool endLineValid;
00083
00084
signed char type;
00085
bool visible;
00086
bool deleteOpening;
00087
bool deleteEnding;
00088
00089
protected:
00090
QPtrList<KateCodeFoldingNode> *m_childnodes;
00091 };
00092
00093
00094
class KateCodeFoldingTree :
public QObject,
public KateCodeFoldingNode
00095 {
00096 Q_OBJECT
00097
00098
public:
00099 KateCodeFoldingTree (
KateBuffer *buffer);
00100 ~KateCodeFoldingTree ();
00101
00102 KateCodeFoldingNode *findNodeForLine (
unsigned int line);
00103
00104
unsigned int getRealLine (
unsigned int virtualLine);
00105
unsigned int getVirtualLine (
unsigned int realLine);
00106
unsigned int getHiddenLinesCount (
unsigned int docLine);
00107
00108
bool isTopLevel (
unsigned int line);
00109
00110
void lineHasBeenInserted (
unsigned int line);
00111
void lineHasBeenRemoved (
unsigned int line);
00112
void debugDump ();
00113
void getLineInfo (KateLineInfo *info,
unsigned int line);
00114
00115
unsigned int getStartLine (KateCodeFoldingNode *node);
00116
00117
void fixRoot (
int endLRel);
00118
void clear ();
00119
00120
private:
00121
KateBuffer *m_buffer;
00122
00123
QIntDict<unsigned int> lineMapping;
00124
QIntDict<bool> dontIgnoreUnchangedLines;
00125
00126
QPtrList<KateCodeFoldingNode> markedForDeleting;
00127
QPtrList<KateCodeFoldingNode> nodesForLine;
00128
QValueList<KateHiddenLineBlock> hiddenLines;
00129
00130
unsigned int hiddenLinesCountCache;
00131
bool something_changed;
00132
bool hiddenLinesCountCacheValid;
00133
00134
static bool trueVal;
00135
00136 KateCodeFoldingNode *findNodeForLineDescending (KateCodeFoldingNode *,
unsigned int,
unsigned int,
bool oneStepOnly=
false);
00137
00138
bool correctEndings (
signed char data, KateCodeFoldingNode *node,
unsigned int line,
int insertPos);
00139
00140
void dumpNode (KateCodeFoldingNode *node,
QString prefix);
00141
void addOpening (KateCodeFoldingNode *node,
signed char nType,
QMemArray<signed char>* list,
unsigned int line);
00142
void addOpening_further_iterations (KateCodeFoldingNode *node,
signed char nType,
QMemArray<signed char>*
00143 list,
unsigned int line,
int current,
unsigned int startLine);
00144
00145
void incrementBy1 (KateCodeFoldingNode *node, KateCodeFoldingNode *after);
00146
void decrementBy1 (KateCodeFoldingNode *node, KateCodeFoldingNode *after);
00147
00148
void cleanupUnneededNodes (
unsigned int line);
00149
00153
bool removeEnding (KateCodeFoldingNode *node,
unsigned int line);
00154
00158
bool removeOpening (KateCodeFoldingNode *node,
unsigned int line);
00159
00160
void findAndMarkAllNodesforRemovalOpenedOrClosedAt (
unsigned int line);
00161
void findAllNodesOpenedOrClosedAt (
unsigned int line);
00162
00163
void addNodeToFoundList (KateCodeFoldingNode *node,
unsigned int line,
int childpos);
00164
void addNodeToRemoveList (KateCodeFoldingNode *node,
unsigned int line);
00165
void addHiddenLineBlock (KateCodeFoldingNode *node,
unsigned int line);
00166
00167
bool existsOpeningAtLineAfter(
unsigned int line, KateCodeFoldingNode *node);
00168
00169
void dontDeleteEnding (KateCodeFoldingNode*);
00170
void dontDeleteOpening (KateCodeFoldingNode*);
00171
00172
void updateHiddenSubNodes (KateCodeFoldingNode *node);
00173
void moveSubNodesUp (KateCodeFoldingNode *node);
00174
00175
public slots:
00176
void updateLine (
unsigned int line,
QMemArray<signed char>* regionChanges,
bool *updated,
bool changed);
00177
void toggleRegionVisibility (
unsigned int);
00178
void collapseToplevelNodes ();
00179
void expandToplevelNodes (
int numLines);
00180
int collapseOne (
int realLine);
00181
void expandOne (
int realLine,
int numLines);
00185
void ensureVisible( uint line );
00186
00187 signals:
00188
void setLineVisible (
unsigned int,
bool);
00189
void regionVisibilityChangedAt (
unsigned int);
00190
void regionBeginEndAddedRemoved (
unsigned int);
00191 };
00192
00193
#endif
00194
00195