Kate
katesmartmanager.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 KATESMARTMANAGER_H
00020 #define KATESMARTMANAGER_H
00021
00022 #include <QtCore/QObject>
00023 #include <QtCore/QSet>
00024 #include <QtCore/QLinkedList>
00025 #include <QtCore/QThreadStorage>
00026
00027 #include <ktexteditor/smartrange.h>
00028
00029 #include "kateedit.h"
00030
00031 class KateDocument;
00032 class KateSmartCursor;
00033 class KateSmartRange;
00034 class KateSmartGroup;
00035
00042 class KateSmartManager : public QObject
00043 {
00044 Q_OBJECT
00045
00046 public:
00047 explicit KateSmartManager(KateDocument* parent);
00048 virtual ~KateSmartManager();
00049
00050 KateDocument* doc() const;
00051
00063 inline bool isClearing() const { return m_clearing; }
00064 void clear(bool includingInternal);
00065
00066 int currentRevision() const;
00067 void releaseRevision(int revision) const;
00068 void useRevision(int revision = -1);
00069 KTextEditor::Cursor translateFromRevision(const KTextEditor::Cursor& cursor, KTextEditor::SmartCursor::InsertBehavior insertBehavior = KTextEditor::SmartCursor::StayOnInsert) const;
00070 KTextEditor::Range translateFromRevision(const KTextEditor::Range& range, KTextEditor::SmartRange::InsertBehaviors insertBehavior = KTextEditor::SmartRange::ExpandLeft | KTextEditor::SmartRange::ExpandRight) const;
00071
00072 KateSmartCursor* newSmartCursor(const KTextEditor::Cursor& position = KTextEditor::Cursor(), KTextEditor::SmartCursor::InsertBehavior insertBehavior = KTextEditor::SmartCursor::MoveOnInsert, bool internal = true);
00073 void deleteCursors(bool includingInternal);
00074
00075 KateSmartRange* newSmartRange(const KTextEditor::Range& range = KTextEditor::Range(), KTextEditor::SmartRange* parent = 0L, KTextEditor::SmartRange::InsertBehaviors insertBehavior = KTextEditor::SmartRange::DoNotExpand, bool internal = true);
00076 KateSmartRange* newSmartRange(KateSmartCursor* start, KateSmartCursor* end, KTextEditor::SmartRange* parent = 0L, KTextEditor::SmartRange::InsertBehaviors insertBehavior = KTextEditor::SmartRange::DoNotExpand, bool internal = true);
00077 void unbindSmartRange(KTextEditor::SmartRange* range);
00078 void deleteRanges(bool includingInternal);
00079
00080 void rangeGotParent(KateSmartRange* range);
00081 void rangeLostParent(KateSmartRange* range);
00083 void rangeDeleted(KateSmartRange* range);
00084
00085 KateSmartGroup* groupForLine(int line) const;
00086
00087 Q_SIGNALS:
00088 void signalRangeDeleted(KateSmartRange* range);
00089
00090 private Q_SLOTS:
00091 void slotTextChanged(KateEditInfo* edit);
00092 void verifyCorrect() const;
00093
00094 private:
00095 KateSmartRange* feedbackRange(const KateEditInfo& edit, KateSmartRange* range);
00096 int usingRevision() const;
00097
00098 void debugOutput() const;
00099
00100 KateSmartGroup* m_firstGroup;
00101 QSet<KateSmartRange*> m_topRanges;
00102 KateSmartGroup* m_invalidGroup;
00103 bool m_clearing;
00104 QThreadStorage<int*> m_usingRevision;
00105 };
00106
00115 class KateSmartGroup
00116 {
00117 public:
00118 KateSmartGroup(int startLine, int endLine, KateSmartGroup* previous, KateSmartGroup* next);
00119
00120 inline int startLine() const { return m_startLine; }
00121 inline int newStartLine() const { return m_newStartLine; }
00122 inline int endLine() const { return m_endLine; }
00123 inline int newEndLine() const { return m_newEndLine; }
00124 inline void setEndLine(int endLine) { m_newEndLine = m_endLine = endLine; }
00125 inline void setNewEndLine(int endLine) { m_newEndLine = endLine; }
00126 inline int length() const { return m_endLine - m_startLine + 1; }
00127 inline bool containsLine(int line) const { return line >= m_newStartLine && line <= m_newEndLine; }
00128
00129 inline KateSmartGroup* previous() const { return m_previous; }
00130 inline void setPrevious(KateSmartGroup* previous) { m_previous = previous; }
00131
00132 inline KateSmartGroup* next() const { return m_next; }
00133 inline void setNext(KateSmartGroup* next) { m_next = next; }
00134
00135 void addCursor(KateSmartCursor* cursor);
00136 void changeCursorFeedback(KateSmartCursor* cursor);
00137 void removeCursor(KateSmartCursor* cursor);
00138
00139 const QSet<KateSmartCursor*>& feedbackCursors() const;
00140
00141 const QSet<KateSmartCursor*>& normalCursors() const;
00142
00143
00149 void joined(KateSmartCursor* cursor);
00150
00156 void leaving(KateSmartCursor* cursor);
00157
00158
00159 void merge();
00160
00161
00162 void translateChanged(const KateEditInfo& edit);
00163 void translateShifted(const KateEditInfo& edit);
00164
00165
00166 void translatedChanged(const KateEditInfo& edit);
00167 void translatedShifted(const KateEditInfo& edit);
00168
00169 void deleteCursors(bool includingInternal);
00170 void deleteCursorsInternal(QSet<KateSmartCursor*>& set);
00171
00172 void debugOutput() const;
00173
00174 private:
00175 int m_startLine, m_newStartLine, m_endLine, m_newEndLine;
00176 KateSmartGroup* m_next;
00177 KateSmartGroup* m_previous;
00178
00179 QSet<KateSmartCursor*> m_feedbackCursors;
00180 QSet<KateSmartCursor*> m_normalCursors;
00181 };
00182
00183 #endif