00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "katesmartrange.h"
00020
00021 #include "katedocument.h"
00022 #include "kateview.h"
00023 #include <ktexteditor/attribute.h>
00024 #include "katesmartmanager.h"
00025 #include "katedynamicanimation.h"
00026
00027 #include <kdebug.h>
00028
00029 KateSmartRange::KateSmartRange(const KTextEditor::Range& range, KateDocument* doc, KTextEditor::SmartRange* parent, KTextEditor::SmartRange::InsertBehaviors insertBehavior)
00030 : KTextEditor::SmartRange(new KateSmartCursor(range.start(), doc), new KateSmartCursor(range.end(), doc), parent, insertBehavior)
00031
00032 , m_dynamicDoc(0L)
00033 , m_mouseOver(false)
00034 , m_caretOver(false)
00035 , m_isInternal(false)
00036 {
00037 }
00038
00039 KateSmartRange::KateSmartRange(KateDocument* doc, KTextEditor::SmartRange* parent)
00040 : KTextEditor::SmartRange(new KateSmartCursor(doc), new KateSmartCursor(doc), parent)
00041
00042 , m_dynamicDoc(0L)
00043 , m_mouseOver(false)
00044 , m_caretOver(false)
00045 , m_isInternal(false)
00046 {
00047 }
00048
00049 KateSmartRange::KateSmartRange( KateSmartCursor * start, KateSmartCursor * end, KTextEditor::SmartRange * parent, KTextEditor::SmartRange::InsertBehaviors insertBehavior )
00050 : KTextEditor::SmartRange(start, end, parent, insertBehavior)
00051
00052 , m_dynamicDoc(0L)
00053 , m_mouseOver(false)
00054 , m_caretOver(false)
00055 , m_isInternal(false)
00056 {
00057 }
00058
00059 KateSmartRange::~KateSmartRange()
00060 {
00061 foreach (KTextEditor::SmartRangeNotifier* n, notifiers()) {
00062 emit static_cast<KateSmartRangeNotifier*>(n)->rangeDeleted(this);
00063
00064 }
00065
00066 foreach (KTextEditor::SmartRangeWatcher* w, watchers())
00067 w->rangeDeleted(this);
00068
00069 if (m_start)
00070 kateDocument()->smartManager()->rangeDeleted(this);
00071
00072 foreach (KateSmartRangePtr* ptr, m_pointers)
00073 ptr->deleted();
00074 }
00075
00076 KateDocument * KateSmartRange::kateDocument( ) const
00077 {
00078 return static_cast<KateDocument*>(document());
00079 }
00080
00081 KateSmartRangeNotifier::KateSmartRangeNotifier(KateSmartRange* owner)
00082 : m_owner(owner)
00083 {
00084 }
00085
00086 void KateSmartRangeNotifier::connectNotify(const char* signal)
00087 {
00088 if (receivers(signal) == 1)
00089
00090 if (QMetaObject::normalizedSignature(SIGNAL(positionChanged(SmartRange*))) == signal)
00091 m_owner->checkFeedback();
00092 }
00093
00094 void KateSmartRangeNotifier::disconnectNotify(const char* signal)
00095 {
00096 if (receivers(signal) == 0)
00097
00098 if (QMetaObject::normalizedSignature(SIGNAL(positionChanged(SmartRange*))) == signal)
00099 m_owner->checkFeedback();
00100 }
00101
00102 KTextEditor::SmartRangeNotifier* KateSmartRange::createNotifier()
00103 {
00104 return new KateSmartRangeNotifier(this);
00105 }
00106
00107 void KateSmartRange::shifted( )
00108 {
00109 if (kStart().lastPosition() != kStart() || kEnd().lastPosition() != kEnd()) {
00110
00111 foreach (KTextEditor::SmartRangeNotifier* n, notifiers())
00112 emit static_cast<KateSmartRangeNotifier*>(n)->rangePositionChanged(this);
00113 foreach (KTextEditor::SmartRangeWatcher* w, watchers())
00114 w->rangePositionChanged(this);
00115 }
00116
00117 kStart().resetLastPosition();
00118 kEnd().resetLastPosition();
00119 }
00120
00121 void KateSmartRange::translated(const KateEditInfo& edit)
00122 {
00123
00124
00125 if (end() < edit.start()) {
00126 kStart().resetLastPosition();
00127 kEnd().resetLastPosition();
00128 return;
00129 }
00130
00131
00132 if (kStart().lastPosition() != kStart() || kEnd().lastPosition() != kEnd()) {
00133 foreach (KTextEditor::SmartRangeNotifier* n, notifiers())
00134 emit static_cast<KateSmartRangeNotifier*>(n)->rangePositionChanged(this);
00135 foreach (KTextEditor::SmartRangeWatcher* w, watchers())
00136 w->rangePositionChanged(this);
00137 }
00138
00139
00140 foreach (KTextEditor::SmartRangeNotifier* n, notifiers())
00141 emit static_cast<KateSmartRangeNotifier*>(n)->rangeContentsChanged(this);
00142 foreach (KTextEditor::SmartRangeWatcher* w, watchers())
00143 w->rangeContentsChanged(this);
00144
00145 if (start() == end() && kStart().lastPosition() != kEnd().lastPosition()) {
00146
00147 foreach (KTextEditor::SmartRangeNotifier* n, notifiers())
00148 emit static_cast<KateSmartRangeNotifier*>(n)->rangeEliminated(this);
00149 foreach (KTextEditor::SmartRangeWatcher* w, watchers())
00150 w->rangeEliminated(this);
00151 }
00152
00153 kStart().resetLastPosition();
00154 kEnd().resetLastPosition();
00155 }
00156
00157 void KateSmartRange::feedbackMostSpecific( KateSmartRange * mostSpecific )
00158 {
00159
00160 foreach (KTextEditor::SmartRangeNotifier* n, notifiers())
00161 emit static_cast<KateSmartRangeNotifier*>(n)->rangeContentsChanged(this, mostSpecific);
00162 foreach (KTextEditor::SmartRangeWatcher* w, watchers())
00163 w->rangeContentsChanged(this, mostSpecific);
00164 }
00165
00166 void KateSmartRange::feedbackMouseCaretChange(KTextEditor::View* view, bool mouse, bool entered)
00167 {
00168 if (mouse) {
00169 if (entered) {
00170 foreach (KTextEditor::SmartRangeNotifier* n, notifiers())
00171 emit static_cast<KateSmartRangeNotifier*>(n)->mouseEnteredRange(this, view);
00172 foreach (KTextEditor::SmartRangeWatcher* w, watchers())
00173 w->mouseEnteredRange(this, view);
00174
00175 } else {
00176 foreach (KTextEditor::SmartRangeNotifier* n, notifiers())
00177 emit static_cast<KateSmartRangeNotifier*>(n)->mouseExitedRange(this, view);
00178 foreach (KTextEditor::SmartRangeWatcher* w, watchers())
00179 w->mouseExitedRange(this, view);
00180 }
00181
00182 } else {
00183 if (entered) {
00184 foreach (KTextEditor::SmartRangeNotifier* n, notifiers())
00185 emit static_cast<KateSmartRangeNotifier*>(n)->caretEnteredRange(this, view);
00186 foreach (KTextEditor::SmartRangeWatcher* w, watchers())
00187 w->caretEnteredRange(this, view);
00188
00189 } else {
00190 foreach (KTextEditor::SmartRangeNotifier* n, notifiers())
00191 emit static_cast<KateSmartRangeNotifier*>(n)->caretExitedRange(this, view);
00192 foreach (KTextEditor::SmartRangeWatcher* w, watchers())
00193 w->caretExitedRange(this, view);
00194 }
00195 }
00196 }
00197
00198 void KateSmartRange::setParentRange( SmartRange * r )
00199 {
00200 bool gotParent = false;
00201 bool lostParent = false;
00202 if (!parentRange() && r)
00203 gotParent = true;
00204 else if (parentRange() && !r)
00205 lostParent = true;
00206
00207 SmartRange::setParentRange(r);
00208
00209 if (gotParent)
00210 kateDocument()->smartManager()->rangeGotParent(this);
00211 else if (lostParent)
00212 kateDocument()->smartManager()->rangeLostParent(this);
00213 }
00214
00215 void KateSmartRange::unbindAndDelete( )
00216 {
00217 kateDocument()->smartManager()->rangeDeleted(this);
00218 kStart().unbindFromRange();
00219 kEnd().unbindFromRange();
00220 m_start = 0L;
00221 m_end = 0L;
00222 delete this;
00223 }
00224
00225 void KateSmartRange::setInternal( )
00226 {
00227 m_isInternal = true;
00228 kStart().setInternal();
00229 kEnd().setInternal();
00230 }
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241 void KateSmartRange::addDynamic( KateDynamicAnimation * anim )
00242 {
00243 m_dynamic.append(anim);
00244 }
00245
00246 void KateSmartRange::removeDynamic( KateDynamicAnimation * anim )
00247 {
00248 m_dynamic.removeAll(anim);
00249 }
00250
00251 const QList<KateDynamicAnimation*> & KateSmartRange::dynamicAnimations( ) const
00252 {
00253 return m_dynamic;
00254 }
00255
00256 void KateSmartRange::registerPointer( KateSmartRangePtr * ptr )
00257 {
00258 m_pointers.append(ptr);
00259 }
00260
00261 void KateSmartRange::deregisterPointer( KateSmartRangePtr * ptr )
00262 {
00263 m_pointers.removeAll(ptr);
00264 }
00265
00266 void KateSmartRange::checkFeedback()
00267 {
00268 kStart().checkFeedback();
00269 kEnd().checkFeedback();
00270 }
00271
00272
00273
00274 #include "katesmartrange.moc"