• Skip to content
  • Skip to link menu
  • KDE API Reference
  • kdelibs-4.14.38 API Reference
  • KDE Home
  • Contact Us
 

kjsembed

  • kjsembed
  • examples
  • kjsconsole
numberedtextview.cpp
Go to the documentation of this file.
1/* This file is part of the KDE libraries
2 Copyright (C) 2005, 2006 Ian Reinhart Geiser <geiseri@kde.org>
3 Copyright (C) 2005, 2006 Matt Broadstone <mbroadst@gmail.com>
4 Copyright (C) 2005, 2006 Richard J. Moore <rich@kde.org>
5 Copyright (C) 2005, 2006 Erik L. Bunce <kde@bunce.us>
6
7 This library is free software; you can redistribute it and/or
8 modify it under the terms of the GNU Library General Public
9 License as published by the Free Software Foundation; either
10 version 2 of the License, or (at your option) any later version.
11
12 This library is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 Library General Public License for more details.
16
17 You should have received a copy of the GNU Library General Public License
18 along with this library; see the file COPYING.LIB. If not, write to
19 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
20 Boston, MA 02110-1301, USA.
21*/
22
23#include "numberedtextview.h"
24
25#include <QtGui/QTextDocument>
26#include <QtGui/QTextBlock>
27#include <QtGui/QTextEdit>
28#include <QtGui/QBoxLayout>
29#include <QtGui/QScrollBar>
30#include <QtGui/QPainter>
31#include <QtGui/QTextObjectInterface>
32#include <QtGui/QToolTip>
33#include <QtCore/QDebug>
34
35NumberBar::NumberBar( QWidget *parent )
36 : QWidget( parent ), edit(0), m_stopLine(-1), m_currentLine(-1), m_bugLine(-1)
37{
38 setFixedWidth( fontMetrics().width( QString("0000") + 10 + 32 ) );
39 stopMarker = QPixmap( ":/images/no.png" );
40 currentMarker = QPixmap( ":/images/next.png" );
41 bugMarker = QPixmap( ":/images/bug.png" );
42}
43
44NumberBar::~NumberBar()
45{
46}
47
48void NumberBar::setCurrentLine( int lineno )
49{
50 m_currentLine = lineno;
51}
52
53void NumberBar::setStopLine( int lineno )
54{
55 m_stopLine = lineno;
56}
57
58void NumberBar::setBugLine( int lineno )
59{
60 m_bugLine = lineno;
61}
62
63int NumberBar::currentLine() const
64{
65 return m_currentLine;
66}
67
68int NumberBar::stopLine() const
69{
70 return m_stopLine;
71}
72
73int NumberBar::bugLine() const
74{
75 return m_bugLine;
76}
77
78void NumberBar::setTextEdit( QTextEdit *edit )
79{
80 this->edit = edit;
81 connect( edit->document()->documentLayout(), SIGNAL(update(QRectF)),
82 this, SLOT(update()) );
83 connect( edit->verticalScrollBar(), SIGNAL(valueChanged(int)),
84 this, SLOT(update()) );
85}
86
87void NumberBar::paintEvent( QPaintEvent * )
88{
89 QAbstractTextDocumentLayout *layout = edit->document()->documentLayout();
90 int contentsY = edit->verticalScrollBar()->value();
91 qreal pageBottom = contentsY + edit->viewport()->height();
92 const QFontMetrics fm = fontMetrics();
93 const int ascent = fontMetrics().ascent() + 1; // height = ascent + descent + 1
94 int lineCount = 1;
95
96 QPainter p(this);
97
98 bugRect = QRect();
99 stopRect = QRect();
100 currentRect = QRect();
101
102 for ( QTextBlock block = edit->document()->begin();
103 block.isValid(); block = block.next(), ++lineCount ) {
104
105 const QRectF boundingRect = layout->blockBoundingRect( block );
106
107 QPointF position = boundingRect.topLeft();
108 if ( position.y() + boundingRect.height() < contentsY )
109 continue;
110 if ( position.y() > pageBottom )
111 break;
112
113 const QString txt = QString::number( lineCount );
114 p.drawText( width() - fm.width(txt), qRound( position.y() ) - contentsY + ascent, txt );
115
116 // Bug marker
117 if ( m_bugLine == lineCount ) {
118 p.drawPixmap( 1, qRound( position.y() ) - contentsY, bugMarker );
119 bugRect = QRect( 1, qRound( position.y() ) - contentsY, bugMarker.width(), bugMarker.height() );
120 }
121
122 // Stop marker
123 if ( m_stopLine == lineCount ) {
124 p.drawPixmap( 1, qRound( position.y() ) - contentsY, stopMarker );
125 stopRect = QRect( 1, qRound( position.y() ) - contentsY, stopMarker.width(), stopMarker.height() );
126 }
127
128 // Current line marker
129 if ( m_currentLine == lineCount ) {
130 p.drawPixmap( 1, qRound( position.y() ) - contentsY, currentMarker );
131 currentRect = QRect( 1, qRound( position.y() ) - contentsY, currentMarker.width(), currentMarker.height() );
132 }
133 }
134}
135
136bool NumberBar::event( QEvent *event )
137{
138 if ( event->type() == QEvent::ToolTip ) {
139 QHelpEvent *helpEvent = static_cast<QHelpEvent *>(event);
140
141 if ( stopRect.contains( helpEvent->pos() ) ) {
142 QToolTip::showText( helpEvent->globalPos(), "Stop Here" );
143 }
144 else if ( currentRect.contains( helpEvent->pos() ) ) {
145 QToolTip::showText( helpEvent->globalPos(), "Current Line" );
146 }
147 else if ( bugRect.contains( helpEvent->pos() ) ) {
148 QToolTip::showText( helpEvent->globalPos(), "Error Line" );
149 }
150 }
151
152 return QWidget::event(event);
153}
154
155NumberedTextView::NumberedTextView( QWidget *parent )
156 : QFrame( parent )
157{
158 setFrameStyle( QFrame::StyledPanel | QFrame::Sunken );
159 setLineWidth( 2 );
160
161 // Setup the main view
162 view = new QTextEdit( this );
163 view->setFontFamily( "Monospace" );
164 view->setLineWrapMode( QTextEdit::NoWrap );
165 view->setFrameStyle( QFrame::NoFrame );
166 view->installEventFilter( this );
167
168 connect( view->document(), SIGNAL(contentsChange(int,int,int)), this, SLOT(textChanged(int,int,int)) );
169
170 // Setup the line number pane
171 numbers = new NumberBar( this );
172 numbers->setTextEdit( view );
173 // Testing...
174 numbers->setStopLine( 3 );
175 numbers->setBugLine( 1 );
176 setCurrentLine( 5 );
177
178 box = new QHBoxLayout( this );
179 box->setSpacing( 0 );
180 box->setMargin( 0 );
181 box->addWidget( numbers );
182 box->addWidget( view );
183}
184
185NumberedTextView::~NumberedTextView()
186{
187}
188
189void NumberedTextView::setCurrentLine( int lineno )
190{
191 numbers->setCurrentLine( lineno );
192 textChanged( 0, 0, 1 );
193}
194
195void NumberedTextView::setStopLine( int lineno )
196{
197 numbers->setStopLine( lineno );
198}
199
200void NumberedTextView::setBugLine( int lineno )
201{
202 numbers->setBugLine( lineno );
203}
204
205int NumberedTextView::currentLine() const
206{
207 return numbers->currentLine();
208}
209
210int NumberedTextView::stopLine() const
211{
212 return numbers->stopLine();
213}
214
215int NumberedTextView::bugLine() const
216{
217 return numbers->bugLine();
218}
219
220QString NumberedTextView::text() const
221{
222 return view->toPlainText ();
223}
224
225void NumberedTextView::setText( const QString &text )
226{
227 view->setPlainText(text);
228}
229
230
231void NumberedTextView::textChanged( int pos, int removed, int added )
232{
233 Q_UNUSED( pos );
234
235 if ( removed == 0 && added == 0 )
236 return;
237
238 QTextBlock block = highlight.block();
239 QTextBlockFormat fmt = block.blockFormat();
240 QColor bg = view->palette().base().color();
241 fmt.setBackground( bg );
242 highlight.setBlockFormat( fmt );
243
244 int lineCount = 1;
245 for ( QTextBlock block = view->document()->begin();
246 block.isValid(); block = block.next(), ++lineCount ) {
247
248 if ( lineCount == numbers->currentLine() ) {
249 fmt = block.blockFormat();
250 QColor bg = view->palette().color(QPalette::Highlight).light( 175 );
251 fmt.setBackground( bg );
252
253 highlight = QTextCursor( block );
254 highlight.movePosition( QTextCursor::EndOfBlock, QTextCursor::KeepAnchor );
255 highlight.setBlockFormat( fmt );
256
257 break;
258 }
259 }
260}
261
262bool NumberedTextView::eventFilter( QObject *obj, QEvent *event )
263{
264 if ( obj != view )
265 return QFrame::eventFilter(obj, event);
266
267 if ( event->type() == QEvent::ToolTip ) {
268 QHelpEvent *helpEvent = static_cast<QHelpEvent *>(event);
269
270 QTextCursor cursor = view->cursorForPosition( helpEvent->pos() );
271 cursor.movePosition( QTextCursor::StartOfWord, QTextCursor::MoveAnchor );
272 cursor.movePosition( QTextCursor::EndOfWord, QTextCursor::KeepAnchor );
273
274 QString word = cursor.selectedText();
275 emit mouseHover( word );
276 emit mouseHover( helpEvent->pos(), word );
277
278 // QToolTip::showText( helpEvent->globalPos(), word ); // For testing
279 }
280
281 return false;
282}
283
284#include "numberedtextview.moc"
NumberBar
Definition: numberedtextview.h:37
NumberBar::setStopLine
void setStopLine(int lineno)
Definition: numberedtextview.cpp:53
NumberBar::stopLine
int stopLine() const
Definition: numberedtextview.cpp:68
NumberBar::setBugLine
void setBugLine(int lineno)
Definition: numberedtextview.cpp:58
NumberBar::NumberBar
NumberBar(QWidget *parent)
Definition: numberedtextview.cpp:35
NumberBar::paintEvent
void paintEvent(QPaintEvent *ev)
Definition: numberedtextview.cpp:87
NumberBar::bugLine
int bugLine() const
Definition: numberedtextview.cpp:73
NumberBar::currentLine
int currentLine() const
Definition: numberedtextview.cpp:63
NumberBar::setCurrentLine
void setCurrentLine(int lineno)
Definition: numberedtextview.cpp:48
NumberBar::setTextEdit
void setTextEdit(QTextEdit *edit)
Definition: numberedtextview.cpp:78
NumberBar::~NumberBar
~NumberBar()
Definition: numberedtextview.cpp:44
NumberBar::event
bool event(QEvent *ev)
Definition: numberedtextview.cpp:136
NumberedTextView::stopLine
int stopLine
Definition: numberedtextview.h:81
NumberedTextView::currentLine
int currentLine
Definition: numberedtextview.h:80
NumberedTextView::setBugLine
void setBugLine(int lineno)
Sets the line that should have the bug line indicator.
Definition: numberedtextview.cpp:200
NumberedTextView::mouseHover
void mouseHover(const QString &word)
Emitted when the mouse is hovered over the text edit component.
NumberedTextView::bugLine
int bugLine
Definition: numberedtextview.h:82
NumberedTextView::text
QString text
Definition: numberedtextview.h:79
NumberedTextView::eventFilter
bool eventFilter(QObject *obj, QEvent *event)
Definition: numberedtextview.cpp:262
NumberedTextView::setText
void setText(const QString &text)
Definition: numberedtextview.cpp:225
NumberedTextView::textChanged
void textChanged(int pos, int added, int removed)
Definition: numberedtextview.cpp:231
NumberedTextView::~NumberedTextView
~NumberedTextView()
Definition: numberedtextview.cpp:185
NumberedTextView::setCurrentLine
void setCurrentLine(int lineno)
Sets the line that should have the current line indicator.
Definition: numberedtextview.cpp:189
NumberedTextView::NumberedTextView
NumberedTextView(QWidget *parent=0)
Definition: numberedtextview.cpp:155
NumberedTextView::setStopLine
void setStopLine(int lineno)
Sets the line that should have the stop line indicator.
Definition: numberedtextview.cpp:195
QFrame
QObject
QWidget
numberedtextview.h
parent
QObject * parent
Definition: qaction_binding.cpp:48
This file is part of the KDE documentation.
Documentation copyright © 1996-2023 The KDE developers.
Generated on Mon Feb 20 2023 00:00:00 by doxygen 1.9.6 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

kjsembed

Skip menu "kjsembed"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members

kdelibs-4.14.38 API Reference

Skip menu "kdelibs-4.14.38 API Reference"
  • DNSSD
  • Interfaces
  •   KHexEdit
  •   KMediaPlayer
  •   KSpeech
  •   KTextEditor
  • kconf_update
  • KDE3Support
  •   KUnitTest
  • KDECore
  • KDED
  • KDEsu
  • KDEUI
  • KDEWebKit
  • KDocTools
  • KFile
  • KHTML
  • KImgIO
  • KInit
  • kio
  • KIOSlave
  • KJS
  •   KJS-API
  •   WTF
  • kjsembed
  • KNewStuff
  • KParts
  • KPty
  • Kross
  • KUnitConversion
  • KUtils
  • Nepomuk
  • Plasma
  • Solid
  • Sonnet
  • ThreadWeaver
Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal