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

kjsembed

  • sources
  • kde-4.12
  • kdelibs
  • 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 
35 NumberBar::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 
44 NumberBar::~NumberBar()
45 {
46 }
47 
48 void NumberBar::setCurrentLine( int lineno )
49 {
50  m_currentLine = lineno;
51 }
52 
53 void NumberBar::setStopLine( int lineno )
54 {
55  m_stopLine = lineno;
56 }
57 
58 void NumberBar::setBugLine( int lineno )
59 {
60  m_bugLine = lineno;
61 }
62 
63 int NumberBar::currentLine() const
64 {
65  return m_currentLine;
66 }
67 
68 int NumberBar::stopLine() const
69 {
70  return m_stopLine;
71 }
72 
73 int NumberBar::bugLine() const
74 {
75  return m_bugLine;
76 }
77 
78 void 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 
87 void 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 
136 bool 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 
155 NumberedTextView::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 
185 NumberedTextView::~NumberedTextView()
186 {
187 }
188 
189 void NumberedTextView::setCurrentLine( int lineno )
190 {
191  numbers->setCurrentLine( lineno );
192  textChanged( 0, 0, 1 );
193 }
194 
195 void NumberedTextView::setStopLine( int lineno )
196 {
197  numbers->setStopLine( lineno );
198 }
199 
200 void NumberedTextView::setBugLine( int lineno )
201 {
202  numbers->setBugLine( lineno );
203 }
204 
205 int NumberedTextView::currentLine() const
206 {
207  return numbers->currentLine();
208 }
209 
210 int NumberedTextView::stopLine() const
211 {
212  return numbers->stopLine();
213 }
214 
215 int NumberedTextView::bugLine() const
216 {
217  return numbers->bugLine();
218 }
219 
220 QString NumberedTextView::text() const
221 {
222  return view->toPlainText ();
223 }
224 
225 void NumberedTextView::setText( const QString &text )
226 {
227  view->setPlainText(text);
228 }
229 
230 
231 void 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 
262 bool 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"
NumberedTextView::eventFilter
bool eventFilter(QObject *obj, QEvent *event)
Definition: numberedtextview.cpp:262
NumberBar::stopLine
int stopLine() const
Definition: numberedtextview.cpp:68
NumberBar::paintEvent
void paintEvent(QPaintEvent *ev)
Definition: numberedtextview.cpp:87
NumberedTextView::~NumberedTextView
~NumberedTextView()
Definition: numberedtextview.cpp:185
NumberedTextView::setStopLine
void setStopLine(int lineno)
Sets the line that should have the stop line indicator.
Definition: numberedtextview.cpp:195
NumberedTextView::setText
void setText(const QString &text)
Definition: numberedtextview.cpp:225
QWidget
NumberedTextView::setBugLine
void setBugLine(int lineno)
Sets the line that should have the bug line indicator.
Definition: numberedtextview.cpp:200
NumberBar::currentLine
int currentLine() const
Definition: numberedtextview.cpp:63
NumberedTextView::NumberedTextView
NumberedTextView(QWidget *parent=0)
Definition: numberedtextview.cpp:155
QObject
parent
QObject * parent
Definition: qaction_binding.cpp:48
KJSEmbed::JSEventUtils::event
KJS::JSObject * event(KJS::ExecState *exec, const QEvent *ev)
Definition: jseventutils.cpp:31
NumberedTextView::stopLine
int stopLine() const
numberedtextview.h
NumberedTextView::mouseHover
void mouseHover(const QString &word)
Emitted when the mouse is hovered over the text edit component.
NumberBar::setBugLine
void setBugLine(int lineno)
Definition: numberedtextview.cpp:58
NumberBar::setCurrentLine
void setCurrentLine(int lineno)
Definition: numberedtextview.cpp:48
NumberedTextView::currentLine
int currentLine() const
NumberBar
Definition: numberedtextview.h:36
NumberBar::NumberBar
NumberBar(QWidget *parent)
Definition: numberedtextview.cpp:35
NumberBar::setTextEdit
void setTextEdit(QTextEdit *edit)
Definition: numberedtextview.cpp:78
DomDocumentNS::text
QDomText text
Definition: dom.cpp:443
NumberedTextView::setCurrentLine
void setCurrentLine(int lineno)
Sets the line that should have the current line indicator.
Definition: numberedtextview.cpp:189
NumberBar::bugLine
int bugLine() const
Definition: numberedtextview.cpp:73
NumberBar::event
bool event(QEvent *ev)
Definition: numberedtextview.cpp:136
NumberedTextView::text
QString text() const
WidgetNS::width
END_QOBJECT_METHOD int width
Definition: qwidget_binding.cpp:90
NumberedTextView::bugLine
int bugLine() const
NumberedTextView::textChanged
void textChanged(int pos, int added, int removed)
Definition: numberedtextview.cpp:231
NumberBar::setStopLine
void setStopLine(int lineno)
Definition: numberedtextview.cpp:53
QFrame
NumberBar::~NumberBar
~NumberBar()
Definition: numberedtextview.cpp:44
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 22:47:53 by doxygen 1.8.7 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 API Reference

Skip menu "kdelibs 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
  • kjsembed
  •   WTF
  • KNewStuff
  • KParts
  • KPty
  • Kross
  • KUnitConversion
  • KUtils
  • Nepomuk
  • Nepomuk-Core
  • Nepomuk
  • Plasma
  • Solid
  • Sonnet
  • ThreadWeaver

Search



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