summaryrefslogtreecommitdiffstats
path: root/kate/part/katecodefoldinghelpers.h
diff options
context:
space:
mode:
Diffstat (limited to 'kate/part/katecodefoldinghelpers.h')
-rw-r--r--kate/part/katecodefoldinghelpers.h222
1 files changed, 222 insertions, 0 deletions
diff --git a/kate/part/katecodefoldinghelpers.h b/kate/part/katecodefoldinghelpers.h
new file mode 100644
index 000000000..bd5e5e8d5
--- /dev/null
+++ b/kate/part/katecodefoldinghelpers.h
@@ -0,0 +1,222 @@
+/* This file is part of the KDE libraries
+ Copyright (C) 2002 Joseph Wenninger <jowenn@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License version 2 as published by the Free Software Foundation.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef _KATE_CODEFOLDING_HELPERS_
+#define _KATE_CODEFOLDING_HELPERS_
+
+//BEGIN INCLUDES + FORWARDS
+#include <qptrlist.h>
+#include <qvaluelist.h>
+#include <qobject.h>
+#include <qintdict.h>
+#include <qmemarray.h>
+
+class KateCodeFoldingTree;
+class KateTextCursor;
+class KateBuffer;
+
+class QString;
+//END
+
+class KateHiddenLineBlock
+{
+ public:
+ unsigned int start;
+ unsigned int length;
+};
+
+class KateLineInfo
+{
+ public:
+ bool topLevel;
+ bool startsVisibleBlock;
+ bool startsInVisibleBlock;
+ bool endsBlock;
+ bool invalidBlockEnd;
+};
+
+class KateCodeFoldingNode
+{
+ friend class KateCodeFoldingTree;
+
+ public:
+ KateCodeFoldingNode ();
+ KateCodeFoldingNode (KateCodeFoldingNode *par, signed char typ, unsigned int sLRel);
+
+ ~KateCodeFoldingNode ();
+
+ inline int nodeType () { return type;}
+
+ inline bool isVisible () {return visible;}
+
+ inline KateCodeFoldingNode *getParentNode () {return parentNode;}
+
+ bool getBegin (KateCodeFoldingTree *tree, KateTextCursor* begin);
+ bool getEnd (KateCodeFoldingTree *tree, KateTextCursor *end);
+
+ /**
+ * accessors for the child nodes
+ */
+ protected:
+ inline bool noChildren () const { return m_children.isEmpty(); }
+
+ inline uint childCount () const { return m_children.size(); }
+
+ inline KateCodeFoldingNode *child (uint index) const { return m_children[index]; }
+
+ inline int findChild (KateCodeFoldingNode *node, uint start = 0) const { return m_children.find (node, start); }
+
+ inline void appendChild (KateCodeFoldingNode *node) { m_children.resize(m_children.size()+1); m_children[m_children.size()-1] = node; }
+
+ void insertChild (uint index, KateCodeFoldingNode *node);
+
+ KateCodeFoldingNode *takeChild (uint index);
+
+ void clearChildren ();
+
+ int cmpPos(KateCodeFoldingTree *tree, uint line, uint col);
+
+ /**
+ * data members
+ */
+ private:
+ KateCodeFoldingNode *parentNode;
+ unsigned int startLineRel;
+ unsigned int endLineRel;
+
+ unsigned int startCol;
+ unsigned int endCol;
+
+ bool startLineValid;
+ bool endLineValid;
+
+ signed char type; // 0 -> toplevel / invalid
+ bool visible;
+ bool deleteOpening;
+ bool deleteEnding;
+
+ QMemArray<KateCodeFoldingNode*> m_children;
+};
+
+class KateCodeFoldingTree : public QObject
+{
+ friend class KateCodeFoldingNode;
+
+ Q_OBJECT
+
+ public:
+ KateCodeFoldingTree (KateBuffer *buffer);
+ ~KateCodeFoldingTree ();
+
+ KateCodeFoldingNode *findNodeForLine (unsigned int line);
+
+ unsigned int getRealLine (unsigned int virtualLine);
+ unsigned int getVirtualLine (unsigned int realLine);
+ unsigned int getHiddenLinesCount (unsigned int docLine);
+
+ bool isTopLevel (unsigned int line);
+
+ void lineHasBeenInserted (unsigned int line);
+ void lineHasBeenRemoved (unsigned int line);
+ void debugDump ();
+ void getLineInfo (KateLineInfo *info,unsigned int line);
+
+ unsigned int getStartLine (KateCodeFoldingNode *node);
+
+ void fixRoot (int endLRel);
+ void clear ();
+
+ KateCodeFoldingNode *findNodeForPosition(unsigned int line, unsigned int column);
+ private:
+
+ KateCodeFoldingNode m_root;
+
+ KateBuffer *m_buffer;
+
+ QIntDict<unsigned int> lineMapping;
+ QIntDict<bool> dontIgnoreUnchangedLines;
+
+ QPtrList<KateCodeFoldingNode> markedForDeleting;
+ QPtrList<KateCodeFoldingNode> nodesForLine;
+ QValueList<KateHiddenLineBlock> hiddenLines;
+
+ unsigned int hiddenLinesCountCache;
+ bool something_changed;
+ bool hiddenLinesCountCacheValid;
+
+ static bool trueVal;
+
+ KateCodeFoldingNode *findNodeForLineDescending (KateCodeFoldingNode *, unsigned int, unsigned int, bool oneStepOnly=false);
+
+ bool correctEndings (signed char data, KateCodeFoldingNode *node, unsigned int line, unsigned int endCol, int insertPos);
+
+ void dumpNode (KateCodeFoldingNode *node, const QString &prefix);
+ void addOpening (KateCodeFoldingNode *node, signed char nType,QMemArray<uint>* list, unsigned int line,unsigned int charPos);
+ void addOpening_further_iterations (KateCodeFoldingNode *node,signed char nType, QMemArray<uint>*
+ list,unsigned int line,int current,unsigned int startLine,unsigned int charPos);
+
+ void incrementBy1 (KateCodeFoldingNode *node, KateCodeFoldingNode *after);
+ void decrementBy1 (KateCodeFoldingNode *node, KateCodeFoldingNode *after);
+
+ void cleanupUnneededNodes (unsigned int line);
+
+ /**
+ * if returns true, this node has been deleted !!
+ */
+ bool removeEnding (KateCodeFoldingNode *node,unsigned int line);
+
+ /**
+ * if returns true, this node has been deleted !!
+ */
+ bool removeOpening (KateCodeFoldingNode *node,unsigned int line);
+
+ void findAndMarkAllNodesforRemovalOpenedOrClosedAt (unsigned int line);
+ void findAllNodesOpenedOrClosedAt (unsigned int line);
+
+ void addNodeToFoundList (KateCodeFoldingNode *node,unsigned int line,int childpos);
+ void addNodeToRemoveList (KateCodeFoldingNode *node,unsigned int line);
+ void addHiddenLineBlock (KateCodeFoldingNode *node,unsigned int line);
+
+ bool existsOpeningAtLineAfter(unsigned int line, KateCodeFoldingNode *node);
+
+ void dontDeleteEnding (KateCodeFoldingNode*);
+ void dontDeleteOpening (KateCodeFoldingNode*);
+
+ void updateHiddenSubNodes (KateCodeFoldingNode *node);
+ void moveSubNodesUp (KateCodeFoldingNode *node);
+
+ public slots:
+ void updateLine (unsigned int line,QMemArray<uint>* regionChanges, bool *updated, bool changed,bool colschanged);
+ void toggleRegionVisibility (unsigned int);
+ void collapseToplevelNodes ();
+ void expandToplevelNodes (int numLines);
+ int collapseOne (int realLine);
+ void expandOne (int realLine, int numLines);
+ /**
+ Ensures that all nodes surrounding @p line are open
+ */
+ void ensureVisible( uint line );
+
+ signals:
+ void regionVisibilityChangedAt (unsigned int);
+ void regionBeginEndAddedRemoved (unsigned int);
+};
+
+#endif
+
+// kate: space-indent on; indent-width 2; replace-tabs on;