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