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