ginebra2/PageItem.cpp
changeset 5 0f2326c2a325
child 6 1c3b8676e58c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ginebra2/PageItem.cpp	Wed Jun 23 17:59:43 2010 +0300
@@ -0,0 +1,203 @@
+/*
+* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+*
+* This program is free software: you can redistribute it and/or modify
+* it under the terms of the GNU Lesser General Public License as published by
+* the Free Software Foundation, version 2.1 of the License.
+*
+* 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 Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public License
+* along with this program.  If not,
+* see "http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html/".
+*
+* Description:
+*
+*/
+
+#include "PageItem.h"
+#include "GWebTouchNavigation.h"
+#include "Utilities.h"
+#include "GWebPage.h"
+#include "ChromeWidget.h"
+
+#include <QGraphicsWebView>
+#include <QTimer>
+
+namespace GVA {
+
+/// Helper web view class that disables the default context menu.
+class PageItemWebView : public QGraphicsWebView {
+public:
+    PageItemWebView(QGraphicsItem * parent = 0)
+        : QGraphicsWebView(parent)
+    {}
+    void contextMenuEvent(QGraphicsSceneContextMenuEvent* event) {
+        // Do nothing.
+        event->accept();
+    }
+};
+
+// ---------------------------------
+
+PageItem::PageItem(ChromeSnippet * snippet, ChromeWidget* chrome)
+  : NativeChromeItem(snippet, chrome),
+    m_webView(0),
+    m_touchNavigation(0),
+    m_superPage(0),
+    m_page(0),
+    m_chrome(chrome),
+    m_cleanupTimer(0),
+    m_isInstantiated(false)
+{
+    setVisible(false);
+}
+
+PageItem::~PageItem() {
+    if (!m_isInstantiated) return;
+    cleanUp();
+}
+
+void PageItem::instantiate() {
+    if (m_isInstantiated) {
+        m_cleanupTimer->stop(); // make sure cleanup not scheduled
+        return;
+    }
+
+    qDebug() << "PageItem::instantiate";
+
+    // Create the web page.
+    m_page = new WebPageWrapper(this, "Page snippet javascript error");
+    m_page->mainFrame()->setScrollBarPolicy(Qt::Horizontal, Qt::ScrollBarAlwaysOff);
+    m_page->mainFrame()->setScrollBarPolicy(Qt::Vertical, Qt::ScrollBarAlwaysOff);
+
+    // Change page item base brush to transparent -
+    // this allows HTML to set the background color.
+    QPalette pagePalette = palette();
+    pagePalette.setBrush(QPalette::Base, Qt::transparent);
+    m_page->setPalette(pagePalette);
+
+    // Use a super page here because they know how to inject our javascript objects
+    // into their javascript engines.
+    m_superPage = new GSuperWebPage(m_page, m_chrome);
+
+    // Create the web view.
+    m_webView = new PageItemWebView(this);
+    m_webView->setPage(m_page);
+    safe_connect(m_webView, SIGNAL(loadFinished(bool)), this, SLOT(onLoadFinished(bool)));
+
+    m_touchNavigation = new GWebTouchNavigation(m_page, m_webView);
+
+    // create and setup timer to delay cleanup
+    m_cleanupTimer = new QTimer();
+    m_cleanupTimer->setSingleShot(true);
+    m_cleanupTimer->setInterval(0);
+    connect(m_cleanupTimer, SIGNAL(timeout()), this, SLOT(cleanUp()));
+
+    if (!m_url.isEmpty())
+        m_webView->setUrl(m_url);
+    else if (!m_html.isEmpty()) {
+        m_webView->setHtml(m_html);
+        m_html = QString::null;
+    }
+
+    m_isInstantiated = true;
+}
+
+void PageItem::cleanUpOnTimer() {
+    if (!m_isInstantiated) return;
+
+    m_cleanupTimer->start();
+}
+
+void PageItem::cleanUp() {   // slot
+    qDebug() << "PageItem::cleanUp";
+    delete m_cleanupTimer;
+    m_cleanupTimer = 0;
+    delete m_touchNavigation;
+    m_touchNavigation = 0;
+    delete m_webView;
+    m_webView = 0;
+    delete m_superPage;
+    m_superPage = 0;
+    m_isInstantiated = false;
+}
+
+void PageItem::resizeEvent(::QGraphicsSceneResizeEvent *event) {
+    qDebug() << "PageItem::resizeEvent: " << event->newSize();
+    setWebViewSize(event->newSize());
+}
+
+void PageItem::setSize(const QSizeF &size) {
+    resize(size);
+    setWebViewSize(size);
+}
+
+void PageItem::setWebViewSize(const QSizeF &size) {
+    if (m_webView) {
+        m_webView->resize(size);
+        m_webView->page()->setViewportSize(size.toSize());
+    }
+}
+
+void PageItem::showEvent(QShowEvent *event) {
+    instantiate();
+    NativeChromeItem::showEvent(event);
+}
+
+void PageItem::setUrl(const QString &value) {
+    m_url = value;
+    if (m_webView)
+        m_webView->setUrl(value);
+}
+
+QString PageItem::url() const {
+    if (m_webView) {
+        return m_webView->url().toString();
+    }
+    return QString();
+}
+
+void PageItem::setHtml(const QString &value) {
+    if (m_webView)
+        m_webView->setHtml(value);
+    else
+        m_html = value;
+}
+
+QString PageItem::html() const {
+    if (m_webView) {
+        QWebFrame *frame = m_webView->page()->mainFrame();
+        if (frame)
+            return frame->toHtml();
+    }
+    return QString();
+}
+
+//void PageItem::paint(QPainter* painter, const QStyleOptionGraphicsItem* opt, QWidget* widget) {
+//    Q_UNUSED(opt)
+//    Q_UNUSED(widget)
+//
+//    // Paint the background.
+//    painter->fillRect(QRectF(0,0, geometry().width(), geometry().height()), Qt::blue);
+//}
+
+QVariant PageItem::evaluateJavaScript(const QString &expression) {
+    qDebug() << "PageItem::evaluateJavaScript: " << expression;
+    if (m_webView) {
+        QWebFrame *frame = m_webView->page()->mainFrame();
+        if (frame)
+            return frame->evaluateJavaScript(expression);
+    }
+    return QVariant();
+}
+
+void PageItem::onLoadFinished(bool ok) {   // slot
+    qDebug() << "PageItem::onLoadFinished: " << ok;
+}
+
+} // GVA namespace