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 feedbackRangeContentsChanged(KateSmartRange* mostSpecific);
00141 void shifted();
00143 void feedbackMouseEnteredRange(KTextEditor::View* view);
00144 void feedbackMouseExitedRange(KTextEditor::View* view);
00145 void feedbackCaretEnteredRange(KTextEditor::View* view);
00146 void feedbackCaretExitedRange(KTextEditor::View* view);
00147
00148 void registerPointer(KateSmartRangePtr* ptr);
00149 void deregisterPointer(KateSmartRangePtr* ptr);
00150
00151 inline KateSmartRange& operator=(const KTextEditor::Range& r) { setRange(r); return *this; }
00152
00153 protected:
00154 friend class KateSmartCursor;
00155 virtual KTextEditor::SmartRangeNotifier* createNotifier();
00156 virtual void checkFeedback();
00157
00158 private:
00159 void init();
00160
00161 KateDynamicAnimation* m_dynamicDoc;
00162 QList<KateDynamicAnimation*> m_dynamic;
00163 QList<KateSmartRangePtr*> m_pointers;
00164
00165 bool m_mouseOver :1,
00166 m_caretOver :1,
00167 m_isInternal :1;
00168 };
00169
00173 class KateSmartRangePtr
00174 {
00175 public:
00176 explicit KateSmartRangePtr(KateSmartRange* range)
00177 : m_range(range)
00178 {
00179 if (m_range)
00180 m_range->registerPointer(this);
00181 }
00182
00183 ~KateSmartRangePtr()
00184 {
00185 if (m_range)
00186 m_range->deregisterPointer(this);
00187 }
00188
00189 void deleted()
00190 {
00191 m_range = 0L;
00192 }
00193
00194 inline KateSmartRangePtr& operator= ( const KateSmartRangePtr& p )
00195 {
00196 if (m_range)
00197 m_range->deregisterPointer(this);
00198
00199 m_range = p.m_range;
00200
00201 if (m_range)
00202 m_range->registerPointer(this);
00203
00204 return *this;
00205 }
00206
00207 inline KateSmartRangePtr& operator= ( KateSmartRange* p )
00208 {
00209 if (m_range)
00210 m_range->deregisterPointer(this);
00211
00212 m_range = p;
00213
00214 if (m_range)
00215 m_range->registerPointer(this);
00216
00217 return *this;
00218 }
00219
00220 inline bool operator== ( const KateSmartRangePtr& p ) const { return m_range == p.m_range; }
00221 inline bool operator!= ( const KateSmartRangePtr& p ) const { return m_range != p.m_range; }
00222 inline bool operator== ( const KateSmartRange* p ) const { return m_range == p; }
00223 inline bool operator!= ( const KateSmartRange* p ) const { return m_range != p; }
00224 inline KateSmartRange* operator->() const { return m_range; }
00225 inline operator KateSmartRange*() const { return m_range; }
00226
00227 private:
00228 KateSmartRange* m_range;
00229 };
00230
00231
00232
00233 #endif