1
/****************************************************************************
3
** Copyright (C) 2005-2005 Trolltech AS. All rights reserved.
5
** This file is part of the example classes of the Qt Toolkit.
7
** This file may be distributed under the terms of the Q Public License
8
** as defined by Trolltech AS of Norway and appearing in the file
9
** LICENSE.QPL included in the packaging of this file.
11
** This file may be distributed and/or modified under the terms of the
12
** GNU General Public License version 2 as published by the Free Software
13
** Foundation and appearing in the file LICENSE.GPL included in the
14
** packaging of this file.
16
** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
17
** information about Qt Commercial License Agreements.
18
** See http://www.trolltech.com/qpl/ for QPL licensing information.
19
** See http://www.trolltech.com/gpl/ for GPL licensing information.
21
** Contact info@trolltech.com if any conditions of this licensing are
24
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
25
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
27
****************************************************************************/
31
#include "highlighter.h"
33
Highlighter::Highlighter(QObject *parent)
38
void Highlighter::addToDocument(QTextDocument *doc)
40
connect(doc, SIGNAL(contentsChange(int, int, int)),
41
this, SLOT(highlight(int, int, int)));
44
void Highlighter::addMapping(const QString &pattern,
45
const QTextCharFormat &format)
47
mappings[pattern] = format;
50
void Highlighter::highlight(int position, int removed, int added)
52
QTextDocument *doc = qobject_cast<QTextDocument *>(sender());
54
QTextBlock block = doc->findBlock(position);
60
endBlock = doc->findBlock(position + added);
64
while (block.isValid() && !(endBlock < block)) {
65
highlightBlock(block);
70
void Highlighter::highlightBlock(QTextBlock block)
72
QTextLayout *layout = block.layout();
73
const QString text = block.text();
75
QList<QTextLayout::FormatRange> overrides;
77
foreach (QString pattern, mappings.keys()) {
78
QRegExp expression(pattern);
79
int i = text.indexOf(expression);
81
QTextLayout::FormatRange range;
83
range.length = expression.matchedLength();
84
range.format = mappings[pattern];
87
i = text.indexOf(expression, i + expression.matchedLength());
91
layout->setAdditionalFormats(overrides);
92
const_cast<QTextDocument *>(block.document())->markContentsDirty(
93
block.position(), block.length());