source: trunk/src/qt3support/text/q3syntaxhighlighter.cpp@ 353

Last change on this file since 353 was 2, checked in by Dmitry A. Kuminov, 16 years ago

Initially imported qt-all-opensource-src-4.5.1 from Trolltech.

File size: 7.7 KB
Line 
1/****************************************************************************
2**
3** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
4** Contact: Qt Software Information ([email protected])
5**
6** This file is part of the Qt3Support module of the Qt Toolkit.
7**
8** $QT_BEGIN_LICENSE:LGPL$
9** Commercial Usage
10** Licensees holding valid Qt Commercial licenses may use this file in
11** accordance with the Qt Commercial License Agreement provided with the
12** Software or, alternatively, in accordance with the terms contained in
13** a written agreement between you and Nokia.
14**
15** GNU Lesser General Public License Usage
16** Alternatively, this file may be used under the terms of the GNU Lesser
17** General Public License version 2.1 as published by the Free Software
18** Foundation and appearing in the file LICENSE.LGPL included in the
19** packaging of this file. Please review the following information to
20** ensure the GNU Lesser General Public License version 2.1 requirements
21** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
22**
23** In addition, as a special exception, Nokia gives you certain
24** additional rights. These rights are described in the Nokia Qt LGPL
25** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
26** package.
27**
28** GNU General Public License Usage
29** Alternatively, this file may be used under the terms of the GNU
30** General Public License version 3.0 as published by the Free Software
31** Foundation and appearing in the file LICENSE.GPL included in the
32** packaging of this file. Please review the following information to
33** ensure the GNU General Public License version 3.0 requirements will be
34** met: http://www.gnu.org/copyleft/gpl.html.
35**
36** If you are unsure which license is appropriate for your use, please
37** contact the sales department at [email protected].
38** $QT_END_LICENSE$
39**
40****************************************************************************/
41
42#include "q3syntaxhighlighter.h"
43#include "q3syntaxhighlighter_p.h"
44
45#ifndef QT_NO_SYNTAXHIGHLIGHTER
46#include "q3textedit.h"
47#include "qtimer.h"
48
49QT_BEGIN_NAMESPACE
50
51/*!
52 \class Q3SyntaxHighlighter
53 \brief The Q3SyntaxHighlighter class is a base class for
54 implementing Q3TextEdit syntax highlighters.
55
56 \compat
57
58 A syntax highligher automatically highlights parts of the text in
59 a Q3TextEdit. Syntax highlighters are often used when the user is
60 entering text in a specific format (for example, source code) and
61 help the user to read the text and identify syntax errors.
62
63 To provide your own syntax highlighting for Q3TextEdit, you must
64 subclass Q3SyntaxHighlighter and reimplement highlightParagraph().
65
66 When you create an instance of your Q3SyntaxHighlighter subclass,
67 pass it the Q3TextEdit that you want the syntax highlighting to be
68 applied to. After this your highlightParagraph() function will be
69 called automatically whenever necessary. Use your
70 highlightParagraph() function to apply formatting (e.g. setting
71 the font and color) to the text that is passed to it.
72*/
73
74/*!
75 Constructs the Q3SyntaxHighlighter and installs it on \a textEdit.
76 Ownership of the Q3SyntaxHighlighter is transferred to the \a
77 textEdit
78*/
79
80Q3SyntaxHighlighter::Q3SyntaxHighlighter(Q3TextEdit *textEdit)
81 : para(0), edit(textEdit), d(new Q3SyntaxHighlighterPrivate)
82{
83 textEdit->document()->setPreProcessor(new Q3SyntaxHighlighterInternal(this));
84 textEdit->document()->invalidate();
85 QTimer::singleShot(0, textEdit->viewport(), SLOT(update()));
86}
87
88/*!
89 Destructor. Uninstalls this syntax highlighter from the textEdit()
90*/
91
92Q3SyntaxHighlighter::~Q3SyntaxHighlighter()
93{
94 delete d;
95 textEdit()->document()->setPreProcessor(0);
96}
97
98/*!
99 \fn int Q3SyntaxHighlighter::highlightParagraph(const QString &text, int endStateOfLastPara)
100
101 This function is called when necessary by the rich text engine,
102 i.e. on paragraphs which have changed.
103
104 In your reimplementation you should parse the paragraph's \a text
105 and call setFormat() as often as necessary to apply any font and
106 color changes that you require. Your function must return a value
107 which indicates the paragraph's end state: see below.
108
109 Some syntaxes can have constructs that span paragraphs. For
110 example, a C++ syntax highlighter should be able to cope with
111 \c{/}\c{*...*}\c{/} comments that span paragraphs. To deal
112 with these cases it is necessary to know the end state of the
113 previous paragraph (e.g. "in comment").
114
115 If your syntax does not have paragraph spanning constructs, simply
116 ignore the \a endStateOfLastPara parameter and always return 0.
117
118 Whenever highlightParagraph() is called it is passed a value for
119 \a endStateOfLastPara. For the very first paragraph this value is
120 always -2. For any other paragraph the value is the value returned
121 by the most recent highlightParagraph() call that applied to the
122 preceding paragraph.
123
124 The value you return is up to you. We recommend only returning 0
125 (to signify that this paragraph's syntax highlighting does not
126 affect the following paragraph), or a positive integer (to signify
127 that this paragraph has ended in the middle of a paragraph
128 spanning construct).
129
130 To find out which paragraph is highlighted, call
131 currentParagraph().
132
133 For example, if you're writing a simple C++ syntax highlighter,
134 you might designate 1 to signify "in comment". For a paragraph
135 that ended in the middle of a comment you'd return 1, and for
136 other paragraphs you'd return 0. In your parsing code if \a
137 endStateOfLastPara was 1, you would highlight the text as a C++
138 comment until you reached the closing \c{*}\c{/}.
139*/
140
141/*!
142 This function is applied to the syntax highlighter's current
143 paragraph (the text of which is passed to the highlightParagraph()
144 function).
145
146 The specified \a font and \a color are applied to the text from
147 position \a start for \a count characters. (If \a count is 0,
148 nothing is done.)
149*/
150
151void Q3SyntaxHighlighter::setFormat(int start, int count, const QFont &font, const QColor &color)
152{
153 if (!para || count <= 0)
154 return;
155 Q3TextFormat *f = 0;
156 f = para->document()->formatCollection()->format(font, color);
157 para->setFormat(start, count, f);
158 f->removeRef();
159}
160
161/*! \overload */
162
163void Q3SyntaxHighlighter::setFormat(int start, int count, const QColor &color)
164{
165 if (!para || count <= 0)
166 return;
167 Q3TextFormat *f = 0;
168 QFont fnt = textEdit()->QWidget::font();
169 f = para->document()->formatCollection()->format(fnt, color);
170 para->setFormat(start, count, f);
171 f->removeRef();
172}
173
174/*! \overload */
175
176void Q3SyntaxHighlighter::setFormat(int start, int count, const QFont &font)
177{
178 if (!para || count <= 0)
179 return;
180 Q3TextFormat *f = 0;
181 QColor c = textEdit()->viewport()->palette().color(textEdit()->viewport()->foregroundRole());
182 f = para->document()->formatCollection()->format(font, c);
183 para->setFormat(start, count, f);
184 f->removeRef();
185}
186
187/*!
188 \fn Q3TextEdit *Q3SyntaxHighlighter::textEdit() const
189
190 Returns the Q3TextEdit on which this syntax highlighter is
191 installed
192*/
193
194/*! Redoes the highlighting of the whole document.
195*/
196
197void Q3SyntaxHighlighter::rehighlight()
198{
199 Q3TextParagraph *s = edit->document()->firstParagraph();
200 while (s) {
201 s->invalidate(0);
202 s->state = -1;
203 s->needPreProcess = true;
204 s = s->next();
205 }
206 edit->repaintContents();
207}
208
209/*!
210 Returns the id of the paragraph which is highlighted, or -1 of no
211 paragraph is currently highlighted.
212
213 Usually this function is called from within highlightParagraph().
214*/
215
216int Q3SyntaxHighlighter::currentParagraph() const
217{
218 return d->currentParagraph;
219}
220
221QT_END_NAMESPACE
222
223#endif
Note: See TracBrowser for help on using the repository browser.