From a8de881058afebc41642eecb777a8f6c61cedaac Mon Sep 17 00:00:00 2001 From: "Aaron J. Seigo" Date: Thu, 3 Apr 2008 22:49:19 +0000 Subject: [PATCH] move webcontent implementation into libplasma svn path=/trunk/KDE/kdebase/workspace/libs/plasma/; revision=793418 --- widgets/webcontent.cpp | 253 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 253 insertions(+) create mode 100644 widgets/webcontent.cpp diff --git a/widgets/webcontent.cpp b/widgets/webcontent.cpp new file mode 100644 index 000000000..0de1a473b --- /dev/null +++ b/widgets/webcontent.cpp @@ -0,0 +1,253 @@ +/* + * Copyright 2006-2007 Aaron Seigo + * + * This program 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, or + * (at your option) any later version. + * + * This program 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 General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "webcontent.h" +#include "webpage.h" + +namespace Plasma +{ + +class WebContent::Private +{ +public: + WebPage *page; + bool loaded; +}; + +WebContent::WebContent(QGraphicsItem *parent , QObject *parentObject) + : Widget(parent, parentObject), + d(new Private) +{ + d->loaded = false; + d->page = new WebPage(this); + connect(d->page, SIGNAL(loadProgress(int)), this, SIGNAL(loadProgress(int))); + connect(d->page->mainFrame(), SIGNAL(loadDone(bool)), this, SLOT(loadingComplete(bool))); +} + +WebContent::~WebContent() +{ +} + +void WebContent::setUrl(const QUrl &url) +{ + d->loaded = false; + d->page->mainFrame()->load(url); +} + +void WebContent::setHtml(const QByteArray &html, const QUrl &baseUrl) +{ + d->loaded = false; + d->page->mainFrame()->setHtml(html, baseUrl); +} + +QSizeF WebContent::sizeHint() const +{ + if (d->loaded) { + return d->page->mainFrame()->contentsSize(); + } + + return Widget::sizeHint(); +} + +QWebPage* WebContent::page() const +{ + return d->page; +} + +QWebFrame* WebContent::mainFrame() const +{ + return d->page->mainFrame(); +} + +void WebContent::paintWidget(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) +{ + Q_UNUSED(widget) + + if (d->loaded) { + //kDebug() << "painting page"; + d->page->mainFrame()->render(painter, option->rect); + } +} + +void WebContent::mouseMoveEvent(QGraphicsSceneMouseEvent *event) +{ + QMouseEvent me(QEvent::MouseMove, event->pos().toPoint(), event->button(), + event->buttons(), event->modifiers()); + d->page->event(&me); + if (me.isAccepted()) { + event->accept(); + } +} + +void WebContent::mousePressEvent(QGraphicsSceneMouseEvent *event) +{ + QMouseEvent me(QEvent::MouseButtonPress, event->pos().toPoint(), event->button(), + event->buttons(), event->modifiers()); + d->page->event(&me); + if (me.isAccepted()) { + event->accept(); + } +} + +void WebContent::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event) +{ + QMouseEvent me(QEvent::MouseButtonDblClick, event->pos().toPoint(), event->button(), + event->buttons(), event->modifiers()); + d->page->event(&me); + if (me.isAccepted()) { + event->accept(); + } +} + +void WebContent::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) +{ + QMouseEvent me(QEvent::MouseButtonRelease, event->pos().toPoint(), event->button(), + event->buttons(), event->modifiers()); + d->page->event(&me); + if (me.isAccepted()) { + event->accept(); + } +} + +void WebContent::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) +{ + QContextMenuEvent ce(static_cast(event->reason()), + event->pos().toPoint(), event->screenPos()); + d->page->event(&ce); + if (ce.isAccepted()) { + event->accept(); + } +} + +void WebContent::wheelEvent(QGraphicsSceneWheelEvent *event) +{ + QWheelEvent we(event->pos().toPoint(), event->delta(), event->buttons(), + event->modifiers(), event->orientation()); + + d->page->event(&we); + + if (we.isAccepted()) { + event->accept(); + } else { + Widget::wheelEvent(event); + } +} + +void WebContent::keyPressEvent(QKeyEvent * event) +{ + d->page->event(event); + + if (!event->isAccepted()) { + Widget::keyPressEvent(event); + } +} + +void WebContent::keyReleaseEvent(QKeyEvent * event) +{ + d->page->event(event); + + if (!event->isAccepted()) { + Widget::keyPressEvent(event); + } +} + +void WebContent::focusInEvent(QFocusEvent * event) +{ + d->page->event(event); + Widget::focusInEvent(event); +} + +void WebContent::focusOutEvent(QFocusEvent * event) +{ + d->page->event(event); + Widget::focusOutEvent(event); +} + +void WebContent::dragEnterEvent(QGraphicsSceneDragDropEvent * event) +{ + QDragEnterEvent de(event->pos().toPoint(), event->possibleActions(), event->mimeData(), + event->buttons(), event->modifiers()); + d->page->event(&de); + + if (de.isAccepted()) { + event->accept(); + } +} + +void WebContent::dragLeaveEvent(QGraphicsSceneDragDropEvent * event) +{ + QDragLeaveEvent de; + d->page->event(&de); + + if (de.isAccepted()) { + event->accept(); + } +} + +void WebContent::dragMoveEvent(QGraphicsSceneDragDropEvent * event) +{ + // Ok, so the docs say "don't make a QDragMoveEvent yourself" but we're just + // replicating it here, not really creating a new one. hopefully we get away with it ;) + QDragMoveEvent de(event->pos().toPoint(), event->possibleActions(), event->mimeData(), + event->buttons(), event->modifiers()); + d->page->event(&de); + + if (de.isAccepted()) { + event->accept(); + } +} + +void WebContent::dropEvent(QGraphicsSceneDragDropEvent * event) +{ + QDragMoveEvent de(event->pos().toPoint(), event->possibleActions(), event->mimeData(), + event->buttons(), event->modifiers()); + d->page->event(&de); + + if (de.isAccepted()) { + event->accept(); + } +} + +void WebContent::setGeometry(const QRectF &geometry) +{ + Widget::setGeometry(geometry); + d->page->setViewportSize(geometry.size().toSize()); +} + +void WebContent::loadingComplete(bool success) +{ + d->loaded = success; + emit loadDone(success); +} + +} // namespace Plasma + +#include "webcontent.moc" +