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

messageviewer

  • sources
  • kde-4.14
  • kdepim
  • messageviewer
  • viewer
mailwebview_textbrowser.cpp
Go to the documentation of this file.
1 /* Copyright 2010 Thomas McGuire <mcguire@kde.org>
2 
3  This program is free software; you can redistribute it and/or
4  modify it under the terms of the GNU General Public License as
5  published by the Free Software Foundation; either version 2 of
6  the License or (at your option) version 3 or any later version
7  accepted by the membership of KDE e.V. (or its successor approved
8  by the membership of KDE e.V.), which shall act as a proxy
9  defined in Section 14 of version 3 of the license.
10 
11  This program is distributed in the hope that it will be useful,
12  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  GNU General Public License for more details.
15 
16  You should have received a copy of the GNU General Public License
17  along with this program. If not, see <http://www.gnu.org/licenses/>.
18 */
19 
20 
21 #include "mailwebview.h"
22 
23 #include <KDebug>
24 #include <KActionCollection>
25 
26 #include <QContextMenuEvent>
27 #include <QTextCursor>
28 #include <QTextCharFormat>
29 #include <QScrollBar>
30 
31 #include <limits>
32 #include <cassert>
33 
34 using namespace boost;
35 using namespace MessageViewer;
36 
37 MailWebView::MailWebView( KActionCollection *actionCollection, QWidget *parent )
38  : QTextBrowser( parent ), // krazy:exclude=qclasses
39  mActionCollection(actionCollection)
40 {
41  setOpenLinks( false );
42 
43  connect( this, SIGNAL(highlighted(QString)),
44  this, SIGNAL(linkHovered(QString)) );
45  connect( this, SIGNAL(anchorClicked(QUrl)),
46  this, SIGNAL(linkClicked(QUrl)) );
47 
48 #ifdef KDEPIM_MOBILE_UI
49  setFrameShape( NoFrame );
50 #endif
51 }
52 
53 MailWebView::~MailWebView() {}
54 
55 bool MailWebView::event( QEvent *event )
56 {
57 #ifdef TEMPORARILY_REMOVED
58  if ( event->type() == QEvent::ContextMenu ) {
59  // Don't call SuperClass::event() here, it will do silly things like selecting the text
60  // under the mouse cursor, which we don't want.
61 
62  QContextMenuEvent const *contextMenuEvent = static_cast<QContextMenuEvent*>( event );
63  const QWebFrame * const frame = page()->currentFrame();
64  const QWebHitTestResult hit = frame->hitTestContent( contextMenuEvent->pos() );
65  kDebug() << "Right-clicked URL:" << hit.linkUrl();
66  emit popupMenu( hit.linkUrl().toString(), QUrl(), mapToGlobal( contextMenuEvent->pos() ) );
67  event->accept();
68  return true;
69  }
70 #endif
71  return QTextBrowser::event( event ); // krazy:exclude=qclasses
72 }
73 
74 void MailWebView::scrollDown( int pixels )
75 {
76  if ( QScrollBar * const vsb = verticalScrollBar() )
77  vsb->setValue( vsb->value() + pixels );
78 }
79 
80 void MailWebView::scrollUp( int pixels )
81 {
82  scrollDown( -pixels );
83 }
84 
85 bool MailWebView::isScrolledToBottom() const
86 {
87  const QScrollBar * const vsb = verticalScrollBar();
88  return !vsb || vsb->value() == vsb->maximum();
89 }
90 
91 void MailWebView::scrollPageDown( int percent )
92 {
93  if ( QScrollBar * const vsb = verticalScrollBar() ) {
94  const qint64 height = vsb->pageStep();
95  const qint64 current = vsb->value();
96  // do arithmetic in higher precision, and check for overflow:
97  const qint64 newPosition = current + height * percent / 100;
98  if ( newPosition > std::numeric_limits<int>::max() )
99  kWarning() << "new position" << newPosition << "exceeds range of 'int'!";
100  vsb->setValue( newPosition );
101  }
102 }
103 
104 void MailWebView::scrollPageUp( int percent )
105 {
106  scrollPageDown( -percent );
107 }
108 
109 QString MailWebView::selectedText() const
110 {
111  return textCursor().selectedText().replace( QChar::ParagraphSeparator, QLatin1Char('\n') );
112 }
113 
114 bool MailWebView::hasVerticalScrollBar() const
115 {
116  if ( const QScrollBar * const vsb = verticalScrollBar() )
117  return vsb->isVisible();
118  else
119  return false;
120 }
121 
122 double MailWebView::relativePosition() const
123 {
124  if ( const QScrollBar * const vsb = verticalScrollBar() ) {
125  const double pos = vsb->value();
126  const int height = vsb->maximum();
127  return height ? pos / height : 0.0 ;
128  } else {
129  return 0.0;
130  }
131 }
132 
133 void MailWebView::scrollToRelativePosition( double pos )
134 {
135  // FIXME: This doesn't work, Qt resets the scrollbar value somewhere in the event handler.
136  // Using a singleshot timer wouldn't work either, since that introduces visible scrolling.
137  if ( QScrollBar * const vsb = verticalScrollBar() )
138  vsb->setValue( vsb->maximum() * pos );
139 }
140 
141 void MailWebView::selectAll()
142 {
143  QTextBrowser::selectAll(); // krazy:exclude=qclasses
144 }
145 
146 void MailWebView::clearSelection()
147 {
148  QTextCursor cursor = textCursor();
149  cursor.clearSelection();
150  setTextCursor( cursor );
151 }
152 
153 bool MailWebView::isAttachmentInjectionPoint( const QPoint & global ) const
154 {
155  // this is not needed in the cases we use QTextBrowser, but should eventually be implemented
156  kDebug() << "sorry, not implemented";
157  Q_UNUSED( global );
158  return false;
159 }
160 
161 void MailWebView::injectAttachments( const function<QString()> & delayedHtml )
162 {
163  // this is not needed in the cases we use QTextBrowser, but should eventually be implemented
164  kDebug() << "sorry, not implemented";
165  Q_UNUSED( delayedHtml );
166 }
167 
168 void MailWebView::scrollToAnchor( const QString & anchor )
169 {
170  QTextBrowser::scrollToAnchor( anchor ); // krazy:exclude=qclasses
171 }
172 
173 bool MailWebView::removeAttachmentMarking( const QString & id )
174 {
175  // this is not needed in the cases we use QTextBrowser, but should eventually be implemented
176  kDebug() << "sorry, not implemented";
177  Q_UNUSED( id );
178  return true;
179 }
180 
181 void MailWebView::markAttachment( const QString & id, const QString & style )
182 {
183  // this is not needed in the cases we use QTextBrowser, but should eventually be implemented
184  kDebug() << "sorry, not implemented";
185  Q_UNUSED( id );
186  Q_UNUSED( style );
187 }
188 
189 void MailWebView::setHtml( const QString & html, const QUrl & base )
190 {
191  // PENDING(marc) does that make sense?
192  setSource( base );
193  QTextBrowser::setHtml( html ); // krazy:exclude=qclasses
194 }
195 
196 QString MailWebView::htmlSource() const
197 {
198  return toHtml();
199 }
200 
201 void MailWebView::setAllowExternalContent( bool allow )
202 {
203 #ifdef TEMPORARILY_REMOVED
204  SuperClass::setAllowExternalContent( allow );
205 #endif
206 }
207 
208 QUrl MailWebView::linkOrImageUrlAt( const QPoint & global ) const
209 {
210  const QTextCursor c = cursorForPosition( viewport()->mapFromGlobal( global ) );
211  const QTextCharFormat f = c.charFormat();
212  const QString ahref = f.anchorHref();
213  if ( ahref.isEmpty() )
214  return f.toImageFormat().name();
215  else
216  return ahref;
217 }
218 
219 void MailWebView::setScrollBarPolicy( Qt::Orientation orientation, Qt::ScrollBarPolicy policy )
220 {
221  switch ( orientation ) {
222  case Qt::Horizontal:
223  setHorizontalScrollBarPolicy( policy );
224  break;
225  case Qt::Vertical:
226  setVerticalScrollBarPolicy( policy );
227  break;
228  default:
229  Q_ASSERT( false );
230  break;
231  }
232 }
233 
234 Qt::ScrollBarPolicy MailWebView::scrollBarPolicy( Qt::Orientation orientation ) const
235 {
236  switch ( orientation ) {
237  case Qt::Horizontal:
238  return horizontalScrollBarPolicy();
239  case Qt::Vertical:
240  return verticalScrollBarPolicy();
241  break;
242  default:
243  Q_ASSERT( false );
244  return Qt::ScrollBarAsNeeded;
245  }
246 }
247 
248 bool MailWebView::replaceInnerHtml( const QString & id, const function<QString()> & delayedHtml )
249 {
250 #ifdef TEMPORARILY_REMOVED
251  QWebElement doc = page()->currentFrame()->documentElement();
252  QWebElement tag = doc.findFirst( "*#" + id );
253  if ( tag.isNull() ) {
254  return false;
255  }
256  tag.setInnerXml( delayedHtml() );
257 #endif
258  return true;
259 }
260 
261 void MailWebView::setElementByIdVisible( const QString & id, bool visible )
262 {
263 #ifdef TEMPORARILY_REMOVED
264  QWebElement doc = page()->currentFrame()->documentElement();
265  QWebElement e = doc.findFirst( "*#" + id );
266  Q_ASSERT( !e.isNull() );
267 
268  if ( visible ) {
269  e.removeAttribute( "display" );
270  } else {
271  e.setStyleProperty( "display", "none" );
272  }
273 #endif
274 }
275 
276 static QTextDocument::FindFlags convert_flags( MailWebView::FindFlags f )
277 {
278  QTextDocument::FindFlags result;
279 #ifdef TEMPORARILY_REMOVED
280  if ( f & MailWebView::FindWrapsAroundDocument )
281  result |= QTextDocument::FindWrapsAroundDocument;
282 #endif
283  if ( f & MailWebView::FindBackward )
284  result |= QTextDocument::FindBackward;
285  if ( f & MailWebView::FindCaseSensitively )
286  result |= QTextDocument::FindCaseSensitively;
287 #ifdef TEMPORARILY_REMOVED
288  if ( f & MailWebView::HighlightAllOccurrences )
289  result |= QTextDocument::HighlightAllOccurrences;
290 #endif
291  return result;
292 }
293 
294 bool MailWebView::findText( const QString & text, FindFlags flags )
295 {
296  return find( text, convert_flags( flags ) );
297 }
298 
299 void MailWebView::clearFindSelection()
300 {
301  // not supported
302 }
303 
304 void MailWebView::keyReleaseEvent(QKeyEvent* e)
305 {
306  QTextBrowser::keyReleaseEvent(e);
307 }
308 
309 void MailWebView::keyPressEvent(QKeyEvent* e)
310 {
311  QTextBrowser::keyPressEvent(e);
312 }
313 
314 void MailWebView::wheelEvent (QWheelEvent* e)
315 {
316  QTextBrowser::wheelEvent(e);
317 }
318 
319 void MailWebView::hideAccessKeys()
320 {
321 }
322 
323 void MailWebView::slotShowDetails()
324 {
325 }
326 
327 void MailWebView::expandUrl(const KUrl &url)
328 {
329  Q_UNUSED(url)
330 }
331 
332 bool MailWebView::isAShortUrl(const KUrl &url) const
333 {
334  Q_UNUSED(url)
335  return false;
336 }
337 
338 #include "moc_mailwebview.cpp"
QEvent
QWidget
QEvent::type
Type type() const
MessageViewer::MailWebView::selectedText
QString selectedText() const
Definition: mailwebview_textbrowser.cpp:109
QTextCursor
QWebFrame
QTextCursor::clearSelection
void clearSelection()
QTextCursor::charFormat
QTextCharFormat charFormat() const
QTextCharFormat::anchorHref
QString anchorHref() const
QWebElement::setStyleProperty
void setStyleProperty(const QString &name, const QString &value)
MessageViewer::MailWebView::selectAll
void selectAll()
Definition: mailwebview_textbrowser.cpp:141
QTextBrowser::keyPressEvent
virtual void keyPressEvent(QKeyEvent *ev)
QTextEdit::setHtml
void setHtml(const QString &text)
MessageViewer::MailWebView::relativePosition
double relativePosition() const
Definition: mailwebview_textbrowser.cpp:122
QWheelEvent
convert_flags
static QTextDocument::FindFlags convert_flags(MailWebView::FindFlags f)
Definition: mailwebview_textbrowser.cpp:276
QScrollBar
QWebHitTestResult
QPoint
QUrl::toString
QString toString(QFlags< QUrl::FormattingOption > options) const
MessageViewer::MailWebView::scrollUp
void scrollUp(int pixels)
Definition: mailwebview_textbrowser.cpp:80
QTextEdit::selectAll
void selectAll()
MessageViewer::MailWebView::markAttachment
void markAttachment(const QString &id, const QString &style)
Definition: mailwebview_textbrowser.cpp:181
MessageViewer::MailWebView::hasVerticalScrollBar
bool hasVerticalScrollBar() const
Definition: mailwebview_textbrowser.cpp:114
MessageViewer::MailWebView::scrollBarPolicy
Qt::ScrollBarPolicy scrollBarPolicy(Qt::Orientation orientation) const
Definition: mailwebview_textbrowser.cpp:234
QWebFrame::hitTestContent
QWebHitTestResult hitTestContent(const QPoint &pos) const
QTextEdit::scrollToAnchor
void scrollToAnchor(const QString &name)
MessageViewer::MailWebView::FindBackward
Definition: mailwebview.h:58
MessageViewer::MailWebView::setHtml
void setHtml(const QString &html, const QUrl &baseUrl)
Definition: mailwebview_textbrowser.cpp:189
MessageViewer::MailWebView::event
virtual bool event(QEvent *event)
Reimplemented to catch context menu events and emit popupMenu()
Definition: mailwebview_textbrowser.cpp:55
MessageViewer::MailWebView::FindWrapsAroundDocument
Definition: mailwebview.h:57
MessageViewer::MailWebView::clearFindSelection
void clearFindSelection()
Definition: mailwebview_textbrowser.cpp:299
MessageViewer::MailWebView::scrollToAnchor
void scrollToAnchor(const QString &anchor)
Definition: mailwebview_textbrowser.cpp:168
QContextMenuEvent
MessageViewer::MailWebView::wheelEvent
virtual void wheelEvent(QWheelEvent *e)
Definition: mailwebview_textbrowser.cpp:314
MessageViewer::MailWebView::removeAttachmentMarking
bool removeAttachmentMarking(const QString &id)
Definition: mailwebview_textbrowser.cpp:173
QWebElement
MessageViewer::MailWebView::scrollToRelativePosition
void scrollToRelativePosition(double pos)
Definition: mailwebview_textbrowser.cpp:133
QString::isEmpty
bool isEmpty() const
MessageViewer::MailWebView::keyReleaseEvent
virtual void keyReleaseEvent(QKeyEvent *)
Reimplement for access key.
Definition: mailwebview_textbrowser.cpp:304
MessageViewer::MailWebView::HighlightAllOccurrences
Definition: mailwebview.h:60
QWebElement::setInnerXml
void setInnerXml(const QString &markup)
MessageViewer::MailWebView::clearSelection
void clearSelection()
Definition: mailwebview_textbrowser.cpp:146
MessageViewer::MailWebView::FindCaseSensitively
Definition: mailwebview.h:59
QString
QWebHitTestResult::linkUrl
QUrl linkUrl() const
MessageViewer::MailWebView::isAShortUrl
bool isAShortUrl(const KUrl &url) const
Definition: mailwebview_textbrowser.cpp:332
QTextEdit::wheelEvent
virtual void wheelEvent(QWheelEvent *e)
QWebElement::isNull
bool isNull() const
QTextEdit::keyReleaseEvent
virtual void keyReleaseEvent(QKeyEvent *e)
QTextCharFormat
QUrl
QLatin1Char
QAbstractSlider::value
value
MessageViewer::MailWebView::slotShowDetails
void slotShowDetails()
Definition: mailwebview_textbrowser.cpp:323
MessageViewer::MailWebView::linkOrImageUrlAt
QUrl linkOrImageUrlAt(const QPoint &global) const
Definition: mailwebview_textbrowser.cpp:208
QWebElement::findFirst
QWebElement findFirst(const QString &selectorQuery) const
QString::replace
QString & replace(int position, int n, QChar after)
QKeyEvent
QContextMenuEvent::pos
const QPoint & pos() const
MessageViewer::MailWebView::setScrollBarPolicy
void setScrollBarPolicy(Qt::Orientation orientation, Qt::ScrollBarPolicy policy)
Definition: mailwebview_textbrowser.cpp:219
MessageViewer::MailWebView::injectAttachments
void injectAttachments(const boost::function< QString()> &delayedHtml)
Definition: mailwebview_textbrowser.cpp:161
MessageViewer::MailWebView::~MailWebView
~MailWebView()
Definition: mailwebview_textbrowser.cpp:53
QTextBrowser::event
virtual bool event(QEvent *e)
QWebElement::removeAttribute
void removeAttribute(const QString &name)
mailwebview.h
MessageViewer::MailWebView::isScrolledToBottom
bool isScrolledToBottom() const
Definition: mailwebview_textbrowser.cpp:85
MessageViewer::MailWebView::popupMenu
void popupMenu(const QUrl &url, const QUrl &imageUrl, const QPoint &point)
Emitted when the user right-clicks somewhere.
MessageViewer::MailWebView::scrollPageDown
void scrollPageDown(int percent)
Definition: mailwebview_textbrowser.cpp:91
QTextBrowser
MessageViewer::MailWebView::setElementByIdVisible
void setElementByIdVisible(const QString &id, bool visible)
Definition: mailwebview_textbrowser.cpp:261
MessageViewer::MailWebView::setAllowExternalContent
void setAllowExternalContent(bool allow)
Definition: mailwebview_textbrowser.cpp:201
MessageViewer::MailWebView::replaceInnerHtml
bool replaceInnerHtml(const QString &id, const boost::function< QString()> &delayedHtml)
Definition: mailwebview_textbrowser.cpp:248
QTextFormat::toImageFormat
QTextImageFormat toImageFormat() const
QAbstractSlider::maximum
maximum
MessageViewer::MailWebView::linkHovered
void linkHovered(const QString &link, const QString &title=QString(), const QString &textContent=QString())
MessageViewer::MailWebView::scrollPageUp
void scrollPageUp(int percent)
Definition: mailwebview_textbrowser.cpp:104
MessageViewer::MailWebView::expandUrl
void expandUrl(const KUrl &url)
Definition: mailwebview_textbrowser.cpp:327
MessageViewer::MailWebView::isAttachmentInjectionPoint
bool isAttachmentInjectionPoint(const QPoint &globalPos) const
Definition: mailwebview_textbrowser.cpp:153
QTextDocument::FindFlags
typedef FindFlags
MessageViewer::MailWebView::htmlSource
QString htmlSource() const
Definition: mailwebview_textbrowser.cpp:196
MessageViewer::MailWebView::keyPressEvent
virtual void keyPressEvent(QKeyEvent *)
Definition: mailwebview_textbrowser.cpp:309
MessageViewer::MailWebView::findText
bool findText(const QString &test, FindFlags flags)
Definition: mailwebview_textbrowser.cpp:294
MessageViewer::MailWebView::scrollDown
void scrollDown(int pixels)
Definition: mailwebview_textbrowser.cpp:74
QTextImageFormat::name
QString name() const
This file is part of the KDE documentation.
Documentation copyright © 1996-2020 The KDE developers.
Generated on Mon Jun 22 2020 13:32:45 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

messageviewer

Skip menu "messageviewer"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Related Pages

kdepim API Reference

Skip menu "kdepim API Reference"
  • akonadi_next
  • akregator
  • blogilo
  • calendarsupport
  • console
  •   kabcclient
  •   konsolekalendar
  • kaddressbook
  • kalarm
  •   lib
  • kdgantt2
  • kjots
  • kleopatra
  • kmail
  • knode
  • knotes
  • kontact
  • korgac
  • korganizer
  • ktimetracker
  • libkdepim
  • libkleo
  • libkpgp
  • mailcommon
  • messagelist
  • messageviewer
  • pimprint

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