diff options
Diffstat (limited to 'WebKit/qt/Api/qwebview.cpp')
-rw-r--r-- | WebKit/qt/Api/qwebview.cpp | 593 |
1 files changed, 593 insertions, 0 deletions
diff --git a/WebKit/qt/Api/qwebview.cpp b/WebKit/qt/Api/qwebview.cpp new file mode 100644 index 0000000..3d67437 --- /dev/null +++ b/WebKit/qt/Api/qwebview.cpp @@ -0,0 +1,593 @@ +/* + Copyright (C) 2007 Trolltech ASA + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#include "config.h" +#include "qwebview.h" +#include "qwebframe.h" +#include "qevent.h" +#include "qpainter.h" + +class QWebViewPrivate +{ +public: + QWebPage *page; +}; + +/*! + \class QWebView + \since 4.4 + \brief The QWebView class provides a widget that is used to view and edit web documents. + + QWebView is the main widget component of the QtWebKit web browsing module. +*/ + +/*! + Constructs an empty QWebView with parent \a parent. +*/ +QWebView::QWebView(QWidget *parent) + : QWidget(parent) +{ + d = new QWebViewPrivate; + d->page = 0; + + QPalette pal = palette(); + pal.setBrush(QPalette::Background, Qt::white); + + setAttribute(Qt::WA_OpaquePaintEvent); + + setPalette(pal); + setAcceptDrops(true); + + setMouseTracking(true); + setFocusPolicy(Qt::WheelFocus); +} + +/*! + Destructor. +*/ +QWebView::~QWebView() +{ + if (d->page && d->page->parent() == this) + delete d->page; + delete d; +} + +/*! + Returns a pointer to the underlying web page. + + \sa setPage() +*/ +QWebPage *QWebView::page() const +{ + if (!d->page) { + QWebView *that = const_cast<QWebView *>(this); + that->setPage(new QWebPage(that)); + } + return d->page; +} + +/*! + Makes \a page the new web page of the web view. + + The parent QObject of the provided page remains the owner + of the object. If the current document is a child of the web + view, then it is deleted. + + \sa page() +*/ +void QWebView::setPage(QWebPage *page) +{ + if (d->page == page) + return; + if (d->page) { + if (d->page->parent() == this) { + delete d->page; + } else { + d->page->disconnect(this); + } + } + d->page = page; + if (d->page) { + d->page->setView(this); + // #### connect signals + QWebFrame *mainFrame = d->page->mainFrame(); + connect(mainFrame, SIGNAL(loadStarted()), + this, SIGNAL(loadStarted())); + connect(mainFrame, SIGNAL(loadFinished()), + this, SIGNAL(loadFinished())); + connect(mainFrame, SIGNAL(titleChanged(const QString&)), + this, SIGNAL(titleChanged(const QString&))); + connect(mainFrame, SIGNAL(iconLoaded()), + this, SIGNAL(iconLoaded())); + connect(mainFrame, SIGNAL(urlChanged(const QUrl &)), + this, SIGNAL(urlChanged(const QUrl &))); + + connect(d->page, SIGNAL(loadProgressChanged(int)), + this, SIGNAL(loadProgressChanged(int))); + connect(d->page, SIGNAL(statusBarTextChanged(const QString &)), + this, SIGNAL(statusBarTextChanged(const QString &))); + } + update(); +} + +/*! + Downloads the specified \a url and displays it. +*/ +void QWebView::load(const QUrl &url) +{ + page()->mainFrame()->load(url); +} + +#if QT_VERSION < 0x040400 +void QWebView::load(const QWebNetworkRequest &request) +#else +void QWebView::load(const QNetworkRequest &request, + QNetworkAccessManager::Operation operation, + const QByteArray &body) +#endif +{ + page()->mainFrame()->load(request +#if QT_VERSION >= 0x040400 + , operation, body +#endif + ); +} + +/*! + Sets the content of the web view to the specified \a html. + + External objects referenced in the HTML document are located relative to \a baseUrl. +*/ +void QWebView::setHtml(const QString &html, const QUrl &baseUrl) +{ + page()->mainFrame()->setHtml(html, baseUrl); +} + +/*! + Sets the content of the web view to the specified \a html. + + External objects referenced in the HTML document are located relative to \a baseUrl. +*/ +void QWebView::setHtml(const QByteArray &html, const QUrl &baseUrl) +{ + page()->mainFrame()->setHtml(html, baseUrl); +} + +/*! + Sets the content of the web view to the specified content \a data. If the \a mimeType argument + is empty it is assumed that the content is HTML. + + External objects referenced in the HTML document are located relative to \a baseUrl. +*/ +void QWebView::setContent(const QByteArray &data, const QString &mimeType, const QUrl &baseUrl) +{ + page()->mainFrame()->setContent(data, mimeType, baseUrl); +} + +/*! + Returns a pointer to the view's history of navigated web pages. + + It is equivalent to + + \snippet doc/src/snippets/code/src.3rdparty.webkit.WebKit.qt.Api.qwebview.cpp 0 +*/ +QWebHistory *QWebView::history() const +{ + return page()->history(); +} + +/*! + Returns a pointer to the view/page specific settings object. + + It is equivalent to + + \snippet doc/src/snippets/code/src.3rdparty.webkit.WebKit.qt.Api.qwebview.cpp 1 +*/ +QWebSettings *QWebView::settings() const +{ + return page()->settings(); +} + +/*! + \property QWebView::title + \brief the title of the web page currently viewed. +*/ +QString QWebView::title() const +{ + if (d->page) + return d->page->mainFrame()->title(); + return QString(); +} + +/*! + \property QWebView::url + \brief the url of the web page currently viewed. +*/ +QUrl QWebView::url() const +{ + if (d->page) + return d->page->mainFrame()->url(); + return QUrl(); +} + +/*! + \property QWebView::icon + \brief the icon associated with the web page currently viewed. +*/ +QPixmap QWebView::icon() const +{ + if (d->page) + return d->page->mainFrame()->icon(); + return QPixmap(); +} + +/*! + \property QWebView::selectedText + \brief the text currently selected. +*/ +QString QWebView::selectedText() const +{ + if (d->page) + return d->page->selectedText(); + return QString(); +} + +/*! + Returns a pointer to a QAction that encapsulates the specified web action \a action. +*/ +QAction *QWebView::action(QWebPage::WebAction action) const +{ + return page()->action(action); +} + +/*! + Triggers the specified \a action. If it is a checkable action the specified \a checked state is assumed. + + The following example triggers the copy action and therefore copies any selected text to the clipboard. + + \snippet doc/src/snippets/code/src.3rdparty.webkit.WebKit.qt.Api.qwebview.cpp 2 +*/ +void QWebView::triggerAction(QWebPage::WebAction action, bool checked) +{ + page()->triggerAction(action, checked); +} + +/*! + \property QWebView::modified + \brief whether the document was modified by the user + + Parts of HTML documents can be editable for example through the \c{contenteditable} attribute on + HTML elements. +*/ +bool QWebView::isModified() const +{ + if (d->page) + return d->page->isModified(); + return false; +} + +Qt::TextInteractionFlags QWebView::textInteractionFlags() const +{ + // ### FIXME (add to page) + return Qt::TextInteractionFlags(); +} + +/*! + \property QWebView::textInteractionFlags + \brief how the view should handle user input + + Specifies how the user can interact with the text on the page. +*/ + +void QWebView::setTextInteractionFlags(Qt::TextInteractionFlags flags) +{ + Q_UNUSED(flags) + // ### FIXME (add to page) +} + +/*! + \reimp +*/ +QSize QWebView::sizeHint() const +{ + return QSize(800, 600); // ####... +} + +/*! + Convenience slot that stops loading the document. + + It is equivalent to + + \snippet doc/src/snippets/code/src.3rdparty.webkit.WebKit.qt.Api.qwebview.cpp 3 +*/ +void QWebView::stop() +{ + if (d->page) + d->page->triggerAction(QWebPage::Stop); +} + +/*! + Convenience slot that loads the previous document in the list of + documents built by navigating links. Does nothing if there is no + previous document. + + It is equivalent to + + \snippet doc/src/snippets/code/src.3rdparty.webkit.WebKit.qt.Api.qwebview.cpp 4 +*/ +void QWebView::backward() +{ + if (d->page) + d->page->triggerAction(QWebPage::GoBack); +} + +/*! + Convenience slot that loads the next document in the list of + documents built by navigating links. Does nothing if there is no + next document. + + It is equivalent to + + \snippet doc/src/snippets/code/src.3rdparty.webkit.WebKit.qt.Api.qwebview.cpp 5 +*/ +void QWebView::forward() +{ + if (d->page) + d->page->triggerAction(QWebPage::GoForward); +} + +/*! + Reloads the current document. +*/ +void QWebView::reload() +{ + if (d->page) + d->page->triggerAction(QWebPage::Reload); +} + +/*! \reimp +*/ +void QWebView::resizeEvent(QResizeEvent *e) +{ + if (d->page) + d->page->setViewportSize(e->size()); +} + +/*! \reimp +*/ +void QWebView::paintEvent(QPaintEvent *ev) +{ + if (!d->page) + return; +#ifdef QWEBKIT_TIME_RENDERING + QTime time; + time.start(); +#endif + + QWebFrame *frame = d->page->mainFrame(); + QPainter p(this); + + frame->render(&p, ev->region()); + +#ifdef QWEBKIT_TIME_RENDERING + int elapsed = time.elapsed(); + qDebug()<<"paint event on "<<ev->region()<<", took to render = "<<elapsed; +#endif +} + +/*! + This function is called whenever WebKit wants to create a new window, for example as a result of + a JavaScript request to open a document in a new window. +*/ +QWebView *QWebView::createWindow() +{ + return 0; +} + +/*! \reimp +*/ +void QWebView::mouseMoveEvent(QMouseEvent* ev) +{ + if (d->page) + d->page->event(ev); +} + +/*! \reimp +*/ +void QWebView::mousePressEvent(QMouseEvent* ev) +{ + if (d->page) + d->page->event(ev); +} + +/*! \reimp +*/ +void QWebView::mouseDoubleClickEvent(QMouseEvent* ev) +{ + if (d->page) + d->page->event(ev); +} + +/*! \reimp +*/ +void QWebView::mouseReleaseEvent(QMouseEvent* ev) +{ + if (d->page) + d->page->event(ev); +} + +/*! \reimp +*/ +void QWebView::contextMenuEvent(QContextMenuEvent* ev) +{ + if (d->page) + d->page->event(ev); +} + +/*! \reimp +*/ +void QWebView::wheelEvent(QWheelEvent* ev) +{ + if (d->page) + d->page->event(ev); + + if (!ev->isAccepted()) + return QWidget::wheelEvent(ev); +} + +/*! \reimp +*/ +void QWebView::keyPressEvent(QKeyEvent* ev) +{ + if (d->page) + d->page->event(ev); + if (!ev->isAccepted()) + QWidget::keyPressEvent(ev); +} + +/*! \reimp +*/ +void QWebView::keyReleaseEvent(QKeyEvent* ev) +{ + if (d->page) + d->page->event(ev); + if (!ev->isAccepted()) + QWidget::keyReleaseEvent(ev); +} + +/*! \reimp +*/ +void QWebView::focusInEvent(QFocusEvent* ev) +{ + if (d->page) + d->page->event(ev); + QWidget::focusInEvent(ev); +} + +/*! \reimp +*/ +void QWebView::focusOutEvent(QFocusEvent* ev) +{ + QWidget::focusOutEvent(ev); + if (d->page) + d->page->event(ev); +} + +/*! \reimp +*/ +void QWebView::dragEnterEvent(QDragEnterEvent* ev) +{ +#ifndef QT_NO_DRAGANDDROP + if (d->page) + d->page->event(ev); +#endif +} + +/*! \reimp +*/ +void QWebView::dragLeaveEvent(QDragLeaveEvent* ev) +{ +#ifndef QT_NO_DRAGANDDROP + if (d->page) + d->page->event(ev); +#endif +} + +/*! \reimp +*/ +void QWebView::dragMoveEvent(QDragMoveEvent* ev) +{ +#ifndef QT_NO_DRAGANDDROP + if (d->page) + d->page->event(ev); +#endif +} + +/*! \reimp +*/ +void QWebView::dropEvent(QDropEvent* ev) +{ +#ifndef QT_NO_DRAGANDDROP + if (d->page) + d->page->event(ev); +#endif +} + +/*! \reimp +*/ +bool QWebView::focusNextPrevChild(bool next) +{ + if (d->page && d->page->focusNextPrevChild(next)) + return true; + return QWidget::focusNextPrevChild(next); +} + +/*! + \fn void QWebView::titleChanged(const QString &title) + + This signal is emitted whenever the \a title of the main frame changes. + + \sa title() +*/ + +/*! + \fn void QWebView::urlChanged(const QUrl &url) + + This signal is emitted whenever the \a url of the main frame changes. + + \sa url() +*/ + +/*! + \fn void QWebView::statusBarTextChanged(const QString& text) + + This signal is emitted when the statusbar \a text is changed by the page. +*/ + +/*! + \fn void QWebView::iconLoaded() + + This signal is emitted whenever the icon of the page is loaded or changes. +*/ + +/*! + \fn void QWebView::loadStarted() + + This signal is emitted when a new load of the frame is started. +*/ + +/*! + \fn void QWebView::loadFinished() + + This signal is emitted when a load of the frame is finished. +*/ + +/*! + \fn void QWebView::selectionChanged() + + This signal is emitted whenever the selection changes. +*/ + +/*! + \fn void QWebView::loadProgressChanged(int progress) + + This signal is emitted when the global progress status changes. + The current value is provided by \a progress in percent. + It accumulates changes from all the child frames. +*/ |