ginebra2/PageItem.cpp
changeset 5 0f2326c2a325
child 6 1c3b8676e58c
equal deleted inserted replaced
1:b0dd75e285d2 5:0f2326c2a325
       
     1 /*
       
     2 * Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
       
     3 * All rights reserved.
       
     4 *
       
     5 * This program is free software: you can redistribute it and/or modify
       
     6 * it under the terms of the GNU Lesser General Public License as published by
       
     7 * the Free Software Foundation, version 2.1 of the License.
       
     8 *
       
     9 * This program is distributed in the hope that it will be useful,
       
    10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
       
    11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
       
    12 * GNU Lesser General Public License for more details.
       
    13 *
       
    14 * You should have received a copy of the GNU Lesser General Public License
       
    15 * along with this program.  If not,
       
    16 * see "http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html/".
       
    17 *
       
    18 * Description:
       
    19 *
       
    20 */
       
    21 
       
    22 #include "PageItem.h"
       
    23 #include "GWebTouchNavigation.h"
       
    24 #include "Utilities.h"
       
    25 #include "GWebPage.h"
       
    26 #include "ChromeWidget.h"
       
    27 
       
    28 #include <QGraphicsWebView>
       
    29 #include <QTimer>
       
    30 
       
    31 namespace GVA {
       
    32 
       
    33 /// Helper web view class that disables the default context menu.
       
    34 class PageItemWebView : public QGraphicsWebView {
       
    35 public:
       
    36     PageItemWebView(QGraphicsItem * parent = 0)
       
    37         : QGraphicsWebView(parent)
       
    38     {}
       
    39     void contextMenuEvent(QGraphicsSceneContextMenuEvent* event) {
       
    40         // Do nothing.
       
    41         event->accept();
       
    42     }
       
    43 };
       
    44 
       
    45 // ---------------------------------
       
    46 
       
    47 PageItem::PageItem(ChromeSnippet * snippet, ChromeWidget* chrome)
       
    48   : NativeChromeItem(snippet, chrome),
       
    49     m_webView(0),
       
    50     m_touchNavigation(0),
       
    51     m_superPage(0),
       
    52     m_page(0),
       
    53     m_chrome(chrome),
       
    54     m_cleanupTimer(0),
       
    55     m_isInstantiated(false)
       
    56 {
       
    57     setVisible(false);
       
    58 }
       
    59 
       
    60 PageItem::~PageItem() {
       
    61     if (!m_isInstantiated) return;
       
    62     cleanUp();
       
    63 }
       
    64 
       
    65 void PageItem::instantiate() {
       
    66     if (m_isInstantiated) {
       
    67         m_cleanupTimer->stop(); // make sure cleanup not scheduled
       
    68         return;
       
    69     }
       
    70 
       
    71     qDebug() << "PageItem::instantiate";
       
    72 
       
    73     // Create the web page.
       
    74     m_page = new WebPageWrapper(this, "Page snippet javascript error");
       
    75     m_page->mainFrame()->setScrollBarPolicy(Qt::Horizontal, Qt::ScrollBarAlwaysOff);
       
    76     m_page->mainFrame()->setScrollBarPolicy(Qt::Vertical, Qt::ScrollBarAlwaysOff);
       
    77 
       
    78     // Change page item base brush to transparent -
       
    79     // this allows HTML to set the background color.
       
    80     QPalette pagePalette = palette();
       
    81     pagePalette.setBrush(QPalette::Base, Qt::transparent);
       
    82     m_page->setPalette(pagePalette);
       
    83 
       
    84     // Use a super page here because they know how to inject our javascript objects
       
    85     // into their javascript engines.
       
    86     m_superPage = new GSuperWebPage(m_page, m_chrome);
       
    87 
       
    88     // Create the web view.
       
    89     m_webView = new PageItemWebView(this);
       
    90     m_webView->setPage(m_page);
       
    91     safe_connect(m_webView, SIGNAL(loadFinished(bool)), this, SLOT(onLoadFinished(bool)));
       
    92 
       
    93     m_touchNavigation = new GWebTouchNavigation(m_page, m_webView);
       
    94 
       
    95     // create and setup timer to delay cleanup
       
    96     m_cleanupTimer = new QTimer();
       
    97     m_cleanupTimer->setSingleShot(true);
       
    98     m_cleanupTimer->setInterval(0);
       
    99     connect(m_cleanupTimer, SIGNAL(timeout()), this, SLOT(cleanUp()));
       
   100 
       
   101     if (!m_url.isEmpty())
       
   102         m_webView->setUrl(m_url);
       
   103     else if (!m_html.isEmpty()) {
       
   104         m_webView->setHtml(m_html);
       
   105         m_html = QString::null;
       
   106     }
       
   107 
       
   108     m_isInstantiated = true;
       
   109 }
       
   110 
       
   111 void PageItem::cleanUpOnTimer() {
       
   112     if (!m_isInstantiated) return;
       
   113 
       
   114     m_cleanupTimer->start();
       
   115 }
       
   116 
       
   117 void PageItem::cleanUp() {   // slot
       
   118     qDebug() << "PageItem::cleanUp";
       
   119     delete m_cleanupTimer;
       
   120     m_cleanupTimer = 0;
       
   121     delete m_touchNavigation;
       
   122     m_touchNavigation = 0;
       
   123     delete m_webView;
       
   124     m_webView = 0;
       
   125     delete m_superPage;
       
   126     m_superPage = 0;
       
   127     m_isInstantiated = false;
       
   128 }
       
   129 
       
   130 void PageItem::resizeEvent(::QGraphicsSceneResizeEvent *event) {
       
   131     qDebug() << "PageItem::resizeEvent: " << event->newSize();
       
   132     setWebViewSize(event->newSize());
       
   133 }
       
   134 
       
   135 void PageItem::setSize(const QSizeF &size) {
       
   136     resize(size);
       
   137     setWebViewSize(size);
       
   138 }
       
   139 
       
   140 void PageItem::setWebViewSize(const QSizeF &size) {
       
   141     if (m_webView) {
       
   142         m_webView->resize(size);
       
   143         m_webView->page()->setViewportSize(size.toSize());
       
   144     }
       
   145 }
       
   146 
       
   147 void PageItem::showEvent(QShowEvent *event) {
       
   148     instantiate();
       
   149     NativeChromeItem::showEvent(event);
       
   150 }
       
   151 
       
   152 void PageItem::setUrl(const QString &value) {
       
   153     m_url = value;
       
   154     if (m_webView)
       
   155         m_webView->setUrl(value);
       
   156 }
       
   157 
       
   158 QString PageItem::url() const {
       
   159     if (m_webView) {
       
   160         return m_webView->url().toString();
       
   161     }
       
   162     return QString();
       
   163 }
       
   164 
       
   165 void PageItem::setHtml(const QString &value) {
       
   166     if (m_webView)
       
   167         m_webView->setHtml(value);
       
   168     else
       
   169         m_html = value;
       
   170 }
       
   171 
       
   172 QString PageItem::html() const {
       
   173     if (m_webView) {
       
   174         QWebFrame *frame = m_webView->page()->mainFrame();
       
   175         if (frame)
       
   176             return frame->toHtml();
       
   177     }
       
   178     return QString();
       
   179 }
       
   180 
       
   181 //void PageItem::paint(QPainter* painter, const QStyleOptionGraphicsItem* opt, QWidget* widget) {
       
   182 //    Q_UNUSED(opt)
       
   183 //    Q_UNUSED(widget)
       
   184 //
       
   185 //    // Paint the background.
       
   186 //    painter->fillRect(QRectF(0,0, geometry().width(), geometry().height()), Qt::blue);
       
   187 //}
       
   188 
       
   189 QVariant PageItem::evaluateJavaScript(const QString &expression) {
       
   190     qDebug() << "PageItem::evaluateJavaScript: " << expression;
       
   191     if (m_webView) {
       
   192         QWebFrame *frame = m_webView->page()->mainFrame();
       
   193         if (frame)
       
   194             return frame->evaluateJavaScript(expression);
       
   195     }
       
   196     return QVariant();
       
   197 }
       
   198 
       
   199 void PageItem::onLoadFinished(bool ok) {   // slot
       
   200     qDebug() << "PageItem::onLoadFinished: " << ok;
       
   201 }
       
   202 
       
   203 } // GVA namespace