00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
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
00093
00094
static KateSuperRangeList s_return(
false);
00095
00096 Q_ASSERT(!s_return.autoDelete());
00097 s_return.clear();
00098
00099
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
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
00145
return 0L;
00146 }
00147
00148