source: trunk/examples/widgets/codeeditor/codeeditor.cpp@ 561

Last change on this file since 561 was 561, checked in by Dmitry A. Kuminov, 15 years ago

trunk: Merged in qt 4.6.1 sources.

File size: 5.1 KB
Line 
1/****************************************************************************
2**
3** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
4** All rights reserved.
5** Contact: Nokia Corporation ([email protected])
6**
7** This file is part of the examples of the Qt Toolkit.
8**
9** $QT_BEGIN_LICENSE:LGPL$
10** Commercial Usage
11** Licensees holding valid Qt Commercial licenses may use this file in
12** accordance with the Qt Commercial License Agreement provided with the
13** Software or, alternatively, in accordance with the terms contained in
14** a written agreement between you and Nokia.
15**
16** GNU Lesser General Public License Usage
17** Alternatively, this file may be used under the terms of the GNU Lesser
18** General Public License version 2.1 as published by the Free Software
19** Foundation and appearing in the file LICENSE.LGPL included in the
20** packaging of this file. Please review the following information to
21** ensure the GNU Lesser General Public License version 2.1 requirements
22** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
23**
24** In addition, as a special exception, Nokia gives you certain additional
25** rights. These rights are described in the Nokia Qt LGPL Exception
26** version 1.1, included in the file LGPL_EXCEPTION.txt in this 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 have questions regarding the use of this file, please contact
37** Nokia at [email protected].
38** $QT_END_LICENSE$
39**
40****************************************************************************/
41
42#include <QtGui>
43
44#include "codeeditor.h"
45
46//![constructor]
47
48CodeEditor::CodeEditor(QWidget *parent) : QPlainTextEdit(parent)
49{
50 lineNumberArea = new LineNumberArea(this);
51
52 connect(this, SIGNAL(blockCountChanged(int)), this, SLOT(updateLineNumberAreaWidth(int)));
53 connect(this, SIGNAL(updateRequest(QRect,int)), this, SLOT(updateLineNumberArea(QRect,int)));
54 connect(this, SIGNAL(cursorPositionChanged()), this, SLOT(highlightCurrentLine()));
55
56 updateLineNumberAreaWidth(0);
57 highlightCurrentLine();
58}
59
60//![constructor]
61
62//![extraAreaWidth]
63
64int CodeEditor::lineNumberAreaWidth()
65{
66 int digits = 1;
67 int max = qMax(1, blockCount());
68 while (max >= 10) {
69 max /= 10;
70 ++digits;
71 }
72
73 int space = 3 + fontMetrics().width(QLatin1Char('9')) * digits;
74
75 return space;
76}
77
78//![extraAreaWidth]
79
80//![slotUpdateExtraAreaWidth]
81
82void CodeEditor::updateLineNumberAreaWidth(int /* newBlockCount */)
83{
84 setViewportMargins(lineNumberAreaWidth(), 0, 0, 0);
85}
86
87//![slotUpdateExtraAreaWidth]
88
89//![slotUpdateRequest]
90
91void CodeEditor::updateLineNumberArea(const QRect &rect, int dy)
92{
93 if (dy)
94 lineNumberArea->scroll(0, dy);
95 else
96 lineNumberArea->update(0, rect.y(), lineNumberArea->width(), rect.height());
97
98 if (rect.contains(viewport()->rect()))
99 updateLineNumberAreaWidth(0);
100}
101
102//![slotUpdateRequest]
103
104//![resizeEvent]
105
106void CodeEditor::resizeEvent(QResizeEvent *e)
107{
108 QPlainTextEdit::resizeEvent(e);
109
110 QRect cr = contentsRect();
111 lineNumberArea->setGeometry(QRect(cr.left(), cr.top(), lineNumberAreaWidth(), cr.height()));
112}
113
114//![resizeEvent]
115
116//![cursorPositionChanged]
117
118void CodeEditor::highlightCurrentLine()
119{
120 QList<QTextEdit::ExtraSelection> extraSelections;
121
122 if (!isReadOnly()) {
123 QTextEdit::ExtraSelection selection;
124
125 QColor lineColor = QColor(Qt::yellow).lighter(160);
126
127 selection.format.setBackground(lineColor);
128 selection.format.setProperty(QTextFormat::FullWidthSelection, true);
129 selection.cursor = textCursor();
130 selection.cursor.clearSelection();
131 extraSelections.append(selection);
132 }
133
134 setExtraSelections(extraSelections);
135}
136
137//![cursorPositionChanged]
138
139//![extraAreaPaintEvent_0]
140
141void CodeEditor::lineNumberAreaPaintEvent(QPaintEvent *event)
142{
143 QPainter painter(lineNumberArea);
144 painter.fillRect(event->rect(), Qt::lightGray);
145
146//![extraAreaPaintEvent_0]
147
148//![extraAreaPaintEvent_1]
149 QTextBlock block = firstVisibleBlock();
150 int blockNumber = block.blockNumber();
151 int top = (int) blockBoundingGeometry(block).translated(contentOffset()).top();
152 int bottom = top + (int) blockBoundingRect(block).height();
153//![extraAreaPaintEvent_1]
154
155//![extraAreaPaintEvent_2]
156 while (block.isValid() && top <= event->rect().bottom()) {
157 if (block.isVisible() && bottom >= event->rect().top()) {
158 QString number = QString::number(blockNumber + 1);
159 painter.setPen(Qt::black);
160 painter.drawText(0, top, lineNumberArea->width(), fontMetrics().height(),
161 Qt::AlignRight, number);
162 }
163
164 block = block.next();
165 top = bottom;
166 bottom = top + (int) blockBoundingRect(block).height();
167 ++blockNumber;
168 }
169}
170//![extraAreaPaintEvent_2]
171
Note: See TracBrowser for help on using the repository browser.