kate Library API Documentation

katearbitraryhighlight.cpp

00001 /* This file is part of the KDE libraries
00002    Copyright (C) 2003 Hamish Rodda <rodda@kde.org>
00003 
00004    This library is free software; you can redistribute it and/or
00005    modify it under the terms of the GNU Library General Public
00006    License version 2 as published by the Free Software Foundation.
00007 
00008    This library is distributed in the hope that it will be useful,
00009    but WITHOUT ANY WARRANTY; without even the implied warranty of
00010    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00011    Library General Public License for more details.
00012 
00013    You should have received a copy of the GNU Library General Public License
00014    along with this library; see the file COPYING.LIB.  If not, write to
00015    the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
00016    Boston, MA 02111-1307, USA.
00017 */
00018 
00019 #include "katearbitraryhighlight.h"
00020 #include "katearbitraryhighlight.moc"
00021 
00022 #include "katesupercursor.h"
00023 #include "katedocument.h"
00024 
00025 #include <kdebug.h>
00026 
00027 #include <qfont.h>
00028 
00029 ArbitraryHighlightRange::ArbitraryHighlightRange(KateSuperCursor* start,
00030 KateSuperCursor* end, QObject* parent, const char* name)   :
00031 KateSuperRange(start, end, parent, name) {
00032 }
00033 
00034 ArbitraryHighlightRange::ArbitraryHighlightRange(KateDocument* doc, const KateRange& range, QObject* parent, const char* name)
00035   : KateSuperRange(doc, range, parent, name)
00036 {
00037 }
00038 
00039 ArbitraryHighlightRange::ArbitraryHighlightRange(KateDocument* doc, const KateTextCursor& start, const KateTextCursor& end, QObject* parent, const char* name)
00040   : KateSuperRange(doc, start, end, parent, name)
00041 {
00042 }
00043 
00044 ArbitraryHighlightRange::~ArbitraryHighlightRange()
00045 {
00046 }
00047 
00048 KateArbitraryHighlight::KateArbitraryHighlight(KateDocument* parent, const char* name)
00049   : QObject(parent, name)
00050 {
00051 }
00052 
00053 KateAttribute ArbitraryHighlightRange::merge(QPtrList<KateSuperRange> ranges)
00054 {
00055   ranges.sort();
00056 
00057   KateAttribute ret;
00058 
00059   if (ranges.first() && ranges.current()->inherits("ArbitraryHighlightRange"))
00060     ret = *(static_cast<ArbitraryHighlightRange*>(ranges.current()));
00061 
00062   KateSuperRange* r;
00063   while ((r = ranges.next())) {
00064     if (r->inherits("ArbitraryHighlightRange")) {
00065       ArbitraryHighlightRange* hl = static_cast<ArbitraryHighlightRange*>(r);
00066       ret += *hl;
00067     }
00068   }
00069 
00070   return ret;
00071 }
00072 
00073 void KateArbitraryHighlight::addHighlightToDocument(KateSuperRangeList* list)
00074 {
00075   m_docHLs.append(list);
00076   connect(list, SIGNAL(rangeEliminated(KateSuperRange*)), SLOT(slotRangeEliminated(KateSuperRange*)));
00077 }
00078 
00079 void KateArbitraryHighlight::addHighlightToView(KateSuperRangeList* list, KateView* view)
00080 {
00081   if (!m_viewHLs[view])
00082     m_viewHLs.insert(view, new QPtrList<KateSuperRangeList>());
00083 
00084   m_viewHLs[view]->append(list);
00085 
00086   connect(list, SIGNAL(rangeEliminated(KateSuperRange*)), SLOT(slotTagRange(KateSuperRange*)));
00087   connect(list, SIGNAL(tagRange(KateSuperRange*)), SLOT(slotTagRange(KateSuperRange*)));
00088 }
00089 
00090 KateSuperRangeList& KateArbitraryHighlight::rangesIncluding(uint line, KateView* view)
00091 {
00092   // OPTIMISE make return value persistent
00093 
00094   static KateSuperRangeList s_return(false);
00095 
00096   Q_ASSERT(!s_return.autoDelete());
00097   s_return.clear();
00098 
00099   //--- TEMPORARY OPTIMISATION: return the actual range when there are none or one. ---
00100   if (m_docHLs.count() + m_viewHLs.count() == 0)
00101     return s_return;
00102   else if (m_docHLs.count() + m_viewHLs.count() == 1)
00103     if (m_docHLs.count())
00104       return *(m_docHLs.first());
00105     else
00106       if (m_viewHLs.values().first() && m_viewHLs.values().first()->count() == 1)
00107         if (m_viewHLs.keys().first() == view && m_viewHLs.values().first())
00108           return *(m_viewHLs.values().first()->first());
00109   //--- END Temporary optimisation ---
00110 
00111   if (view) {
00112     QPtrList<KateSuperRangeList>* list = m_viewHLs[view];
00113     if (list)
00114       for (KateSuperRangeList* l = list->first(); l; l = list->next())
00115         if (l->count())
00116           s_return.appendList(l->rangesIncluding(line));
00117 
00118   } else {
00119     for (QMap<KateView*, QPtrList<KateSuperRangeList>* >::Iterator it = m_viewHLs.begin(); it != m_viewHLs.end(); it++)
00120       for (KateSuperRangeList* l = (*it)->first(); l; l = (*it)->next())
00121         if (l->count())
00122           s_return.appendList(l->rangesIncluding(line));
00123   }
00124 
00125   for (KateSuperRangeList* l = m_docHLs.first(); l; l = m_docHLs.next())
00126     if (l->count())
00127       s_return.appendList(l->rangesIncluding(line));
00128 
00129   return s_return;
00130 }
00131 
00132 void KateArbitraryHighlight::slotTagRange(KateSuperRange* range)
00133 {
00134   emit tagLines(viewForRange(range), range);
00135 }
00136 
00137 KateView* KateArbitraryHighlight::viewForRange(KateSuperRange* range)
00138 {
00139   for (QMap<KateView*, QPtrList<KateSuperRangeList>* >::Iterator it = m_viewHLs.begin(); it != m_viewHLs.end(); it++)
00140     for (KateSuperRangeList* l = (*it)->first(); l; l = (*it)->next())
00141       if (l->contains(range))
00142         return it.key();
00143 
00144   // This must belong to a document-global highlight
00145   return 0L;
00146 }
00147 
00148 // kate: space-indent on; indent-width 2; replace-tabs on;
KDE Logo
This file is part of the documentation for kate Library Version 3.2.2.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Wed Apr 21 18:45:16 2004 by doxygen 1.3.6-20040222 written by Dimitri van Heesch, © 1997-2003