WebKit2/UIProcess/API/qt/qgraphicswkview.cpp
changeset 0 4f2f89ce4247
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/WebKit2/UIProcess/API/qt/qgraphicswkview.cpp	Fri Sep 17 09:02:29 2010 +0300
@@ -0,0 +1,253 @@
+/*
+ * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies)
+ *
+ * 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 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this program; 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 "qgraphicswkview.h"
+
+#include "ChunkedUpdateDrawingAreaProxy.h"
+#include "IntSize.h"
+#include "RunLoop.h"
+#include "WKAPICast.h"
+#include "WebPageNamespace.h"
+#include "qwkpage.h"
+#include "qwkpage_p.h"
+#include <QGraphicsSceneMouseEvent>
+#include <QGraphicsView>
+#include <QPainter>
+#include <QScrollBar>
+#include <QStyleOptionGraphicsItem>
+#include <QtDebug>
+#include <WebCore/PlatformString.h>
+#include <WebKit2/WKRetainPtr.h>
+#include <wtf/RefPtr.h>
+
+using namespace WebKit;
+using namespace WebCore;
+
+struct QGraphicsWKViewPrivate {
+    QGraphicsWKViewPrivate(QGraphicsWKView* view);
+    WKPageRef pageRef() const { return page->pageRef(); }
+
+    QGraphicsWKView* q;
+    QWKPage* page;
+};
+
+QGraphicsWKView::QGraphicsWKView(WKPageNamespaceRef pageNamespaceRef, BackingStoreType backingStoreType, QGraphicsItem* parent)
+    : QGraphicsWidget(parent)
+    , d(new QGraphicsWKViewPrivate(this))
+{
+    setFocusPolicy(Qt::StrongFocus);
+    setAcceptHoverEvents(true);
+    DrawingAreaProxy* drawingAreaProxy = new ChunkedUpdateDrawingAreaProxy(this);
+
+    d->page = new QWKPage(pageNamespaceRef);
+    d->page->d->init(size().toSize(), drawingAreaProxy);
+    connect(d->page, SIGNAL(titleChanged(QString)), this, SIGNAL(titleChanged(QString)));
+    connect(d->page, SIGNAL(loadStarted()), this, SIGNAL(loadStarted()));
+    connect(d->page, SIGNAL(loadFinished(bool)), this, SIGNAL(loadFinished(bool)));
+    connect(d->page, SIGNAL(loadProgress(int)), this, SIGNAL(loadProgress(int)));
+    connect(d->page, SIGNAL(initialLayoutCompleted()), this, SIGNAL(initialLayoutCompleted()));
+    connect(d->page, SIGNAL(urlChanged(const QUrl&)), this, SIGNAL(urlChanged(const QUrl&)));
+}
+
+QGraphicsWKView::~QGraphicsWKView()
+{
+    delete d->page;
+    delete d;
+}
+
+QWKPage* QGraphicsWKView::page() const
+{
+    return d->page;
+}
+
+void QGraphicsWKView::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget*)
+{
+    page()->d->paint(painter, option->exposedRect.toAlignedRect());
+}
+
+void QGraphicsWKView::setGeometry(const QRectF& rect)
+{
+    QGraphicsWidget::setGeometry(rect);
+
+    // NOTE: call geometry() as setGeometry ensures that
+    // the geometry is within legal bounds (minimumSize, maximumSize)
+    page()->setViewportSize(geometry().size().toSize());
+}
+
+void QGraphicsWKView::load(const QUrl& url)
+{
+    page()->load(url);
+}
+
+void QGraphicsWKView::setUrl(const QUrl& url)
+{
+    page()->setUrl(url);
+}
+
+QUrl QGraphicsWKView::url() const
+{
+    return page()->url();
+}
+
+QString QGraphicsWKView::title() const
+{
+    return page()->title();
+}
+
+void QGraphicsWKView::triggerPageAction(QWKPage::WebAction action, bool checked)
+{
+    page()->triggerAction(action, checked);
+}
+
+void QGraphicsWKView::back()
+{
+    page()->triggerAction(QWKPage::Back);
+}
+
+void QGraphicsWKView::forward()
+{
+    page()->triggerAction(QWKPage::Forward);
+}
+
+void QGraphicsWKView::reload()
+{
+    page()->triggerAction(QWKPage::Reload);
+}
+
+void QGraphicsWKView::stop()
+{
+    page()->triggerAction(QWKPage::Stop);
+}
+
+/*! \reimp
+*/
+QVariant QGraphicsWKView::itemChange(GraphicsItemChange change, const QVariant& value)
+{
+    // Here so that it can be reimplemented without breaking ABI.
+    return QGraphicsWidget::itemChange(change, value);
+}
+
+/*! \reimp
+*/
+bool QGraphicsWKView::event(QEvent* event)
+{
+    // Here so that it can be reimplemented without breaking ABI.
+    return QGraphicsWidget::event(event);
+}
+
+/*! \reimp
+*/
+QSizeF QGraphicsWKView::sizeHint(Qt::SizeHint which, const QSizeF& constraint) const
+{
+    if (which == Qt::PreferredSize)
+        return QSizeF(800, 600);
+    return QGraphicsWidget::sizeHint(which, constraint);
+}
+
+/*! \reimp
+*/
+QVariant QGraphicsWKView::inputMethodQuery(Qt::InputMethodQuery query) const
+{
+    // implement
+    return QVariant();
+}
+
+/*! \reimp
+*/
+void QGraphicsWKView::keyPressEvent(QKeyEvent* ev)
+{
+    page()->d->keyPressEvent(ev);
+}
+
+/*! \reimp
+*/
+void QGraphicsWKView::keyReleaseEvent(QKeyEvent* ev)
+{
+    page()->d->keyReleaseEvent(ev);
+}
+
+void QGraphicsWKView::hoverMoveEvent(QGraphicsSceneHoverEvent* ev)
+{
+    QGraphicsSceneMouseEvent me(QEvent::GraphicsSceneMouseMove);
+    me.setPos(ev->pos());
+    me.setScreenPos(ev->screenPos());
+
+    page()->d->mouseMoveEvent(&me);
+
+    if (!ev->isAccepted())
+        QGraphicsItem::hoverMoveEvent(ev);
+}
+
+void QGraphicsWKView::mouseMoveEvent(QGraphicsSceneMouseEvent* ev)
+{
+    page()->d->mouseMoveEvent(ev);
+    if (!ev->isAccepted())
+        QGraphicsItem::mouseMoveEvent(ev);
+}
+
+void QGraphicsWKView::mousePressEvent(QGraphicsSceneMouseEvent* ev)
+{
+    page()->d->mousePressEvent(ev);
+    if (!ev->isAccepted())
+        QGraphicsItem::mousePressEvent(ev);
+}
+
+void QGraphicsWKView::mouseReleaseEvent(QGraphicsSceneMouseEvent* ev)
+{
+    page()->d->mouseReleaseEvent(ev);
+    if (!ev->isAccepted())
+        QGraphicsItem::mouseReleaseEvent(ev);
+}
+
+void QGraphicsWKView::mouseDoubleClickEvent(QGraphicsSceneMouseEvent* ev)
+{
+    page()->d->mouseDoubleClickEvent(ev);
+    if (!ev->isAccepted())
+        QGraphicsItem::mouseReleaseEvent(ev);
+}
+
+void QGraphicsWKView::wheelEvent(QGraphicsSceneWheelEvent* ev)
+{
+    page()->d->wheelEvent(ev);
+    if (!ev->isAccepted())
+        QGraphicsItem::wheelEvent(ev);
+}
+
+QGraphicsWKViewPrivate::QGraphicsWKViewPrivate(QGraphicsWKView* view)
+    : q(view)
+{
+}
+
+QRectF QGraphicsWKView::visibleRect() const
+{
+    if (!scene())
+        return QRectF();
+
+    QList<QGraphicsView*> views = scene()->views();
+    if (views.isEmpty())
+        return QRectF();
+
+    QGraphicsView* graphicsView = views.at(0);
+    int xOffset = graphicsView->horizontalScrollBar()->value();
+    int yOffset = graphicsView->verticalScrollBar()->value();
+    return mapRectFromScene(QRectF(QPointF(xOffset, yOffset), graphicsView->viewport()->size()));
+}
+
+#include "moc_qgraphicswkview.cpp"