Kate
katesmartrange.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 KATESMARTRANGE_H
00020 #define KATESMARTRANGE_H
00021
00022 #include "katesmartcursor.h"
00023 #include <ktexteditor/smartrange.h>
00024 #include <ktexteditor/rangefeedback.h>
00025
00026 class KateSmartRange;
00027 class KateDynamicAnimation;
00028 class KateEditInfo;
00029
00033 class KateSmartRangeNotifier : public KTextEditor::SmartRangeNotifier
00034 {
00035 Q_OBJECT
00036 friend class KateSmartRange;
00037
00038 public:
00039 explicit KateSmartRangeNotifier(KateSmartRange* owner);
00040
00045 bool needsPositionChanges() const;
00046
00047 protected:
00048 virtual void connectNotify(const char* signal);
00049 virtual void disconnectNotify(const char* signal);
00050
00051 private:
00052 KateSmartRange* m_owner;
00053 };
00054
00055 class KateSmartRangePtr;
00056
00063 class KateSmartRange : public KTextEditor::SmartRange
00064 {
00065 friend class KateSmartRangeNotifier;
00066
00067 public:
00071 KateSmartRange(const KTextEditor::Range& range, KateDocument* doc, KTextEditor::SmartRange* parent = 0L, KTextEditor::SmartRange::InsertBehaviors insertBehavior = DoNotExpand);
00073 explicit KateSmartRange(KateDocument* doc, KTextEditor::SmartRange* parent = 0L);
00074
00075 KateSmartRange(KateSmartCursor* start, KateSmartCursor* end, KTextEditor::SmartRange* parent = 0L, KTextEditor::SmartRange::InsertBehaviors insertBehavior = DoNotExpand);
00076 virtual ~KateSmartRange();
00077
00079 KateDocument* kateDocument() const;
00081 inline KateSmartCursor& kStart() { return *static_cast<KateSmartCursor*>(m_start); }
00082 inline const KateSmartCursor& kStart() const { return *static_cast<const KateSmartCursor*>(m_start); }
00084 inline KateSmartCursor& kEnd() { return *static_cast<KateSmartCursor*>(m_end); }
00085 inline const KateSmartCursor& kEnd() const { return *static_cast<const KateSmartCursor*>(m_end); }
00086
00087 bool isInternal() const { return m_isInternal; }
00088 void setInternal();
00089
00092 inline bool isMouseOver() { return m_mouseOver; }
00095 inline void setMouseOver(bool mouseOver) { m_mouseOver = mouseOver; }
00096
00097 inline bool isCaretOver() { return m_caretOver; }
00098 inline void setCaretOver(bool caretOver) { m_caretOver = caretOver; }
00099
00100 void unbindAndDelete();
00101
00102 enum AttachActions {
00103 NoActions = 0x0,
00104 TagLines = 0x1,
00105 Redraw = 0x2
00106 };
00107
00108 virtual void setParentRange(SmartRange* r);
00109
00110 using SmartRange::rebuildChildStructure;
00111
00112 inline bool hasDynamic() { return m_dynamic.count(); }
00113 const QList<KateDynamicAnimation*>& dynamicAnimations() const;
00114 void addDynamic(KateDynamicAnimation* anim);
00115 void removeDynamic(KateDynamicAnimation* anim);
00116
00123
00125
00127
00129
00133 bool feedbackEnabled() const { return notifiers().count() || watchers().count(); }
00134
00135
00136
00138 void translated(const KateEditInfo& edit);
00139 void feedbackMostSpecific(KateSmartRange* mostSpecific);
00141 void shifted();
00143 void feedbackMouseCaretChange(KTextEditor::View* view, bool mouse, bool entered);
00144
00145 void registerPointer(KateSmartRangePtr* ptr);
00146 void deregisterPointer(KateSmartRangePtr* ptr);
00147
00148 inline KateSmartRange& operator=(const KTextEditor::Range& r) { setRange(r); return *this; }
00149
00150 protected:
00151 friend class KateSmartCursor;
00152 virtual KTextEditor::SmartRangeNotifier* createNotifier();
00153 virtual void checkFeedback();
00154
00155 private:
00156 void init();
00157
00158 KateDynamicAnimation* m_dynamicDoc;
00159 QList<KateDynamicAnimation*> m_dynamic;
00160 QList<KateSmartRangePtr*> m_pointers;
00161
00162 bool m_mouseOver :1,
00163 m_caretOver :1,
00164 m_isInternal :1;
00165 };
00166
00170 class KateSmartRangePtr
00171 {
00172 public:
00173 explicit KateSmartRangePtr(KateSmartRange* range)
00174 : m_range(range)
00175 {
00176 if (m_range)
00177 m_range->registerPointer(this);
00178 }
00179
00180 ~KateSmartRangePtr()
00181 {
00182 if (m_range)
00183 m_range->deregisterPointer(this);
00184 }
00185
00186 void deleted()
00187 {
00188 m_range = 0L;
00189 }
00190
00191 inline KateSmartRangePtr& operator= ( const KateSmartRangePtr& p )
00192 {
00193 if (m_range)
00194 m_range->deregisterPointer(this);
00195
00196 m_range = p.m_range;
00197
00198 if (m_range)
00199 m_range->registerPointer(this);
00200
00201 return *this;
00202 }
00203
00204 inline KateSmartRangePtr& operator= ( KateSmartRange* p )
00205 {
00206 if (m_range)
00207 m_range->deregisterPointer(this);
00208
00209 m_range = p;
00210
00211 if (m_range)
00212 m_range->registerPointer(this);
00213
00214 return *this;
00215 }
00216
00217 inline bool operator== ( const KateSmartRangePtr& p ) const { return m_range == p.m_range; }
00218 inline bool operator!= ( const KateSmartRangePtr& p ) const { return m_range != p.m_range; }
00219 inline bool operator== ( const KateSmartRange* p ) const { return m_range == p; }
00220 inline bool operator!= ( const KateSmartRange* p ) const { return m_range != p; }
00221 inline KateSmartRange* operator->() const { return m_range; }
00222 inline operator KateSmartRange*() const { return m_range; }
00223
00224 private:
00225 KateSmartRange* m_range;
00226 };
00227
00228
00229
00230 #endif