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

messageviewer

  • sources
  • kde-4.12
  • 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  // FIXME on WinCE we use a simple QWebView, check if there's an alternative API for it
205 #ifndef Q_OS_WINCE
206  SuperClass::setAllowExternalContent( allow );
207 #endif
208 #endif
209 }
210 
211 QUrl MailWebView::linkOrImageUrlAt( const QPoint & global ) const
212 {
213  const QTextCursor c = cursorForPosition( viewport()->mapFromGlobal( global ) );
214  const QTextCharFormat f = c.charFormat();
215  const QString ahref = f.anchorHref();
216  if ( ahref.isEmpty() )
217  return f.toImageFormat().name();
218  else
219  return ahref;
220 }
221 
222 void MailWebView::setScrollBarPolicy( Qt::Orientation orientation, Qt::ScrollBarPolicy policy )
223 {
224  switch ( orientation ) {
225  case Qt::Horizontal:
226  setHorizontalScrollBarPolicy( policy );
227  break;
228  case Qt::Vertical:
229  setVerticalScrollBarPolicy( policy );
230  break;
231  default:
232  Q_ASSERT( false );
233  break;
234  }
235 }
236 
237 Qt::ScrollBarPolicy MailWebView::scrollBarPolicy( Qt::Orientation orientation ) const
238 {
239  switch ( orientation ) {
240  case Qt::Horizontal:
241  return horizontalScrollBarPolicy();
242  case Qt::Vertical:
243  return verticalScrollBarPolicy();
244  break;
245  default:
246  Q_ASSERT( false );
247  return Qt::ScrollBarAsNeeded;
248  }
249 }
250 
251 bool MailWebView::replaceInnerHtml( const QString & id, const function<QString()> & delayedHtml )
252 {
253 #ifdef TEMPORARILY_REMOVED
254  QWebElement doc = page()->currentFrame()->documentElement();
255  QWebElement tag = doc.findFirst( "*#" + id );
256  if ( tag.isNull() ) {
257  return false;
258  }
259  tag.setInnerXml( delayedHtml() );
260 #endif
261  return true;
262 }
263 
264 void MailWebView::setElementByIdVisible( const QString & id, bool visible )
265 {
266 #ifdef TEMPORARILY_REMOVED
267  QWebElement doc = page()->currentFrame()->documentElement();
268  QWebElement e = doc.findFirst( "*#" + id );
269  Q_ASSERT( !e.isNull() );
270 
271  if ( visible ) {
272  e.removeAttribute( "display" );
273  } else {
274  e.setStyleProperty( "display", "none" );
275  }
276 #endif
277 }
278 
279 static QTextDocument::FindFlags convert_flags( MailWebView::FindFlags f )
280 {
281  QTextDocument::FindFlags result;
282 #ifdef TEMPORARILY_REMOVED
283  if ( f & MailWebView::FindWrapsAroundDocument )
284  result |= QTextDocument::FindWrapsAroundDocument;
285 #endif
286  if ( f & MailWebView::FindBackward )
287  result |= QTextDocument::FindBackward;
288  if ( f & MailWebView::FindCaseSensitively )
289  result |= QTextDocument::FindCaseSensitively;
290 #ifdef TEMPORARILY_REMOVED
291  if ( f & MailWebView::HighlightAllOccurrences )
292  result |= QTextDocument::HighlightAllOccurrences;
293 #endif
294  return result;
295 }
296 
297 bool MailWebView::findText( const QString & text, FindFlags flags )
298 {
299  return find( text, convert_flags( flags ) );
300 }
301 
302 void MailWebView::clearFindSelection()
303 {
304  // not supported
305 }
306 
307 void MailWebView::keyReleaseEvent(QKeyEvent* e)
308 {
309  QTextBrowser::keyReleaseEvent(e);
310 }
311 
312 void MailWebView::keyPressEvent(QKeyEvent* e)
313 {
314  QTextBrowser::keyPressEvent(e);
315 }
316 
317 void MailWebView::wheelEvent (QWheelEvent* e)
318 {
319  QTextBrowser::wheelEvent(e);
320 }
321 
322 void MailWebView::hideAccessKeys()
323 {
324 }
325 
326 void MailWebView::slotShowDetails()
327 {
328 }
329 
330 void MailWebView::expandUrl(const KUrl &url)
331 {
332  Q_UNUSED(url)
333 }
334 
335 bool MailWebView::isAShortUrl(const KUrl &url) const
336 {
337  Q_UNUSED(url)
338  return false;
339 }
340 
341 #include "moc_mailwebview.cpp"
MessageViewer::MailWebView::selectedText
QString selectedText() const
Definition: mailwebview_textbrowser.cpp:109
MessageViewer::MailWebView::selectAll
void selectAll()
Definition: mailwebview_textbrowser.cpp:141
MessageViewer::MailWebView::relativePosition
double relativePosition() const
Definition: mailwebview_textbrowser.cpp:122
QWidget
convert_flags
static QTextDocument::FindFlags convert_flags(MailWebView::FindFlags f)
Definition: mailwebview_textbrowser.cpp:279
MessageViewer::MailWebView::scrollUp
void scrollUp(int pixels)
Definition: mailwebview_textbrowser.cpp:80
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:237
MessageViewer::MailWebView::FindBackward
Definition: mailwebview.h:65
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:64
MessageViewer::MailWebView::clearFindSelection
void clearFindSelection()
Definition: mailwebview_textbrowser.cpp:302
MessageViewer::MailWebView::scrollToAnchor
void scrollToAnchor(const QString &anchor)
Definition: mailwebview_textbrowser.cpp:168
MessageViewer::MailWebView::wheelEvent
virtual void wheelEvent(QWheelEvent *e)
Definition: mailwebview_textbrowser.cpp:317
MessageViewer::MailWebView::removeAttachmentMarking
bool removeAttachmentMarking(const QString &id)
Definition: mailwebview_textbrowser.cpp:173
MessageViewer::MailWebView::scrollToRelativePosition
void scrollToRelativePosition(double pos)
Definition: mailwebview_textbrowser.cpp:133
MessageViewer::MailWebView::keyReleaseEvent
virtual void keyReleaseEvent(QKeyEvent *)
Reimplement for access key.
Definition: mailwebview_textbrowser.cpp:307
MessageViewer::MailWebView::HighlightAllOccurrences
Definition: mailwebview.h:67
MessageViewer::MailWebView::clearSelection
void clearSelection()
Definition: mailwebview_textbrowser.cpp:146
MessageViewer::MailWebView::FindCaseSensitively
Definition: mailwebview.h:66
MessageViewer::MailWebView::isAShortUrl
bool isAShortUrl(const KUrl &url) const
Definition: mailwebview_textbrowser.cpp:335
MessageViewer::MailWebView::slotShowDetails
void slotShowDetails()
Definition: mailwebview_textbrowser.cpp:326
MessageViewer::MailWebView::linkOrImageUrlAt
QUrl linkOrImageUrlAt(const QPoint &global) const
Definition: mailwebview_textbrowser.cpp:211
MessageViewer::MailWebView::setScrollBarPolicy
void setScrollBarPolicy(Qt::Orientation orientation, Qt::ScrollBarPolicy policy)
Definition: mailwebview_textbrowser.cpp:222
MessageViewer::MailWebView::injectAttachments
void injectAttachments(const boost::function< QString()> &delayedHtml)
Definition: mailwebview_textbrowser.cpp:161
MessageViewer::MailWebView::~MailWebView
~MailWebView()
Definition: mailwebview_textbrowser.cpp:53
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
MessageViewer::MailWebView::setElementByIdVisible
void setElementByIdVisible(const QString &id, bool visible)
Definition: mailwebview_textbrowser.cpp:264
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:251
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:330
MessageViewer::MailWebView::isAttachmentInjectionPoint
bool isAttachmentInjectionPoint(const QPoint &globalPos) const
Definition: mailwebview_textbrowser.cpp:153
MessageViewer::MailWebView::htmlSource
QString htmlSource() const
Definition: mailwebview_textbrowser.cpp:196
MessageViewer::MailWebView::keyPressEvent
virtual void keyPressEvent(QKeyEvent *)
Definition: mailwebview_textbrowser.cpp:312
MessageViewer::MailWebView::findText
bool findText(const QString &test, FindFlags flags)
Definition: mailwebview_textbrowser.cpp:297
MessageViewer::MailWebView::scrollDown
void scrollDown(int pixels)
Definition: mailwebview_textbrowser.cpp:74
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 22:55:57 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

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