ginebra2/ContentViews/WebContentViewWidget.cpp
changeset 16 3c88a81ff781
parent 9 b39122337a00
--- a/ginebra2/ContentViews/WebContentViewWidget.cpp	Thu Sep 23 15:32:11 2010 -0400
+++ b/ginebra2/ContentViews/WebContentViewWidget.cpp	Fri Oct 15 17:30:59 2010 -0400
@@ -22,34 +22,36 @@
 #include "WebContentViewWidget.h"
 
 #include "ScrollableWebContentView.h"
-#include "WebContentAnimationItem.h"
 #include "webpagecontroller.h"
 #include "WebView.h"
 #include "wrtbrowsercontainer.h"
-#include "ZoomMetaData.h"
+#include "webpagedata.h"
+
+#ifdef Q_WS_MAEMO_5
+#include "ContentViewContextMenu.h"
+#endif
+#include "GWebContentView.h"
 
 #include <QGraphicsLinearLayout>
 #include <QStyleOptionGraphicsItem>
 #include <QWebFrame>
+#include "QWebHistoryItem"
 
 namespace GVA {
 
-WebContentViewWidget::WebContentViewWidget(QObject* parent, QWebPage* page)
-    : m_webViewportProxy(new WebContentAnimationItem())
+WebContentViewWidget::WebContentViewWidget(QObject* parent, GWebContentView* view, QWebPage* page): 
+	m_webContentView(view)
 {
     setFlag(QGraphicsItem::ItemUsesExtendedStyleOption, true);
     setParent(parent);
 
-    m_webViewport = new ScrollableWebContentView(m_webViewportProxy, this);
-
     m_webView = new WebView();
+    m_webViewport = new ScrollableWebContentView(m_webView, this);
 
     if (page)
         setPage(page);
 
-    m_webViewportProxy->setWebView(m_webView);
-    updatePreferredContentSize();
-    m_webViewportProxy->setPos(QPointF(0,0));
+    //updatePreferredContentSize();
 
     //FIX ME : Should we have to delete layout??
     QGraphicsLinearLayout* layout = new QGraphicsLinearLayout(Qt::Vertical, this);
@@ -57,41 +59,88 @@
     layout->setSpacing(0.);
     layout->addItem(m_webViewport);
 
-    connect(m_webViewportProxy
+    connect(m_webViewport
             , SIGNAL(updateZoomActions(bool,bool))
             , this
             , SIGNAL(updateZoomActions(bool,bool)));
+    #ifdef Q_WS_MAEMO_5
     connect(m_webViewport
-            , SIGNAL(contextEventObject(QWebHitTestResult*))
+            , SIGNAL(contextEventObject(QWebHitTestResult*, QPointF))
             , this
-            , SIGNAL(contextEventObject(QWebHitTestResult*)));
-
+            , SLOT(onContextEventObject(QWebHitTestResult*, QPointF)));
+    #else
+    connect(m_webViewport
+            , SIGNAL(contextEventObject(QWebHitTestResult*, QPointF))
+            , this
+            , SIGNAL(contextEventObject(QWebHitTestResult*, QPointF)));
+    #endif
     connect(m_webViewport
             , SIGNAL(viewScrolled(QPoint&, QPoint&))
             , this
             , SIGNAL(viewScrolled(QPoint&, QPoint&)));
 
     connect(m_webViewport
-            , SIGNAL(mouseEvent(QEvent::Type))
+            , SIGNAL(contentViewMouseEvent(QEvent::Type))
             , this
             , SIGNAL(mouseEvent(QEvent::Type)));
+
+    //To speed up painting.
+    setFlag(QGraphicsItem::ItemHasNoContents, true);
+    setAttribute(Qt::WA_OpaquePaintEvent, true);
 }
 
 WebContentViewWidget::~WebContentViewWidget()
 {
     delete m_webView;
-    delete m_webViewportProxy;
     delete m_webViewport;
 }
 
+
+bool WebContentViewWidget::event(QEvent * e) 
+{
+    if (e->type() == QEvent::Gesture) {
+        return  m_webViewport->event(e);
+    }
+    return QGraphicsWidget::event(e);
+}
+
 void WebContentViewWidget::resizeEvent(QGraphicsSceneResizeEvent* event)
 {
     QGraphicsWidget::resizeEvent(event);
 
-    setGeometry(QRectF(pos(), size()));
+    // WTF? setGeometry(QRectF(pos(), size()));
     setPreferredSize(size());
+    QSizeF vpSize = m_webViewport->size();
+    if(vpSize.width() > size().width()) vpSize.setWidth(size().height());
+    if(vpSize.height() > size().height()) vpSize.setHeight(size().height());
+
+    QPointF vpPos = m_webViewport->pos();
+    if(vpPos.x() + vpSize.width() > geometry().right())
+        vpPos.setX(geometry().right() - vpSize.width());
+    if(vpPos.y() + vpSize.height() > geometry().bottom())
+        vpPos.setY(geometry().bottom() - vpSize.height());
+
+    QRectF vpGeom(vpPos,vpSize);
+    if(vpGeom != m_webViewport->geometry()) {
+        // Should we center it here?
+        m_webViewport->setGeometry(vpGeom);
+    }
 }
 
+#ifdef Q_WS_MAEMO_5
+void WebContentViewWidget::onContextEventObject(QWebHitTestResult* hitTest, QPointF position) {
+    if(m_webContentView->currentPageIsSuperPage()) {
+        // Let the superpage handle the event.
+        ::WebViewEventContext *context = new ::WebViewEventContext(view()->type(), *hitTest);
+        m_webContentView->currentSuperPage()->onContextEvent(context);
+    }
+    else {
+        ContentViewContextMenu menu(hitTest, 0);
+        menu.exec(position.toPoint());
+    }
+}
+#endif
+
 QWebPage* WebContentViewWidget::page()
 {
     return m_webView->page();
@@ -99,29 +148,49 @@
 
 void WebContentViewWidget::setPage(QWebPage* page)
 {
-    m_webView->setPage(page);
+    QWebPage* oldPage = this->page(); 
+    if(oldPage) {
+        disconnect(this->page()->mainFrame(), SIGNAL(initialLayoutCompleted()), m_webViewport, SLOT(reset()));
+        disconnect(this->page(), SIGNAL(restoreFrameStateRequested(QWebFrame*)), this, SLOT(restoreViewportFromHistory(QWebFrame*)));
+        disconnect(this->page(), SIGNAL(saveFrameStateRequested(QWebFrame*,QWebHistoryItem*)), this, SLOT(saveViewportToHistory(QWebFrame*,QWebHistoryItem*)));
+        disconnect(this->page()->mainFrame(), SIGNAL(contentsSizeChanged(const QSize &)), m_webViewport, SLOT(contentsSizeChanged(const QSize&)));
+        disconnect(this->page(), SIGNAL(loadStarted()), m_webViewport, SLOT(pageLoadStarted()));
+        disconnect(this->page(), SIGNAL(loadProgress(int)), m_webViewport, SLOT(pageLoadProgress(int)));
+        disconnect(this->page(), SIGNAL(loadFinished(bool)), m_webViewport, SLOT(pageLoadFinished(bool)));
+    }
+    
+    m_webViewport->setPage(page);
 
     connect(this->page()->mainFrame(), SIGNAL(initialLayoutCompleted()), m_webViewport, SLOT(reset()));
+    connect(this->page(), SIGNAL(restoreFrameStateRequested(QWebFrame*)), this, SLOT(restoreViewportFromHistory(QWebFrame*)));
+    connect(this->page(), SIGNAL(saveFrameStateRequested(QWebFrame*,QWebHistoryItem*)), this, SLOT(saveViewportToHistory(QWebFrame*,QWebHistoryItem*)));
     connect(this->page()->mainFrame(), SIGNAL(contentsSizeChanged(const QSize &)), m_webViewport, SLOT(contentsSizeChanged(const QSize&)));
-    connect(this->page()->mainFrame(), SIGNAL(loadFinished(bool)), m_webViewport, SLOT(pageLoadFinished(bool)));
+    connect(this->page(), SIGNAL(loadStarted()), m_webViewport, SLOT(pageLoadStarted()));
+    connect(this->page(), SIGNAL(loadProgress(int)), m_webViewport, SLOT(pageLoadProgress(int)));
+    connect(this->page(), SIGNAL(loadFinished(bool)), m_webViewport, SLOT(pageLoadFinished(bool)));
 }
 
-QGraphicsWebView* WebContentViewWidget::webView()
+QGraphicsWebView* WebContentViewWidget::webView() const
 {
     return m_webView;
 }
 
-ZoomMetaData WebContentViewWidget::currentPageInfo()
+QGraphicsWidget* WebContentViewWidget::viewPort() const
 {
-    return m_webViewport->currentPageInfo();
+    return m_webViewport;
 }
 
-void WebContentViewWidget::setCurrentPageInfo(ZoomMetaData data)
+WebPageData WebContentViewWidget::pageDataFromViewportInfo()
 {
-    m_webViewport->setCurrentPageInfo(data);
+    return m_webViewport->pageDataFromViewportInfo();
 }
 
-ZoomMetaData WebContentViewWidget::defaultZoomData()
+void WebContentViewWidget::setPageDataToViewportInfo(const WebPageData& data)
+{
+    m_webViewport->setPageDataToViewportInfo(data);
+}
+
+WebPageData WebContentViewWidget::defaultZoomData()
 {
     return m_webViewport->defaultZoomData();
 }
@@ -129,7 +198,7 @@
 void WebContentViewWidget::setPageZoom(bool zoomIn)
 {
     Q_ASSERT(m_webViewport);
-    m_webViewport->zoomToScreenCenter(zoomIn);
+    m_webViewport->toggleZoom(zoomIn);
 }
 
 void WebContentViewWidget::showPage(bool isSuperPage)
@@ -148,6 +217,7 @@
     m_webViewport->updatePreferredContentSize();
 }
 
+
 void WebContentViewWidget::setGesturesEnabled(bool value)
 {
     m_webViewport->setGesturesEnabled(value);
@@ -158,4 +228,23 @@
     return m_webViewport->gesturesEnabled();
 }
 
+void WebContentViewWidget::restoreViewportFromHistory(QWebFrame* frame)
+{
+    WRT::WrtBrowserContainer* wbc = WebPageController::getSingleton()->currentPage();
+    if(wbc->pageZoomMetaData()->isValid() && wbc->mainFrame() == frame) {
+        WebPageData* d = wbc->pageZoomMetaData();
+        m_webViewport->setPageDataToViewportInfo(*d);
+    }
+}
+
+void WebContentViewWidget::saveViewportToHistory(QWebFrame* frame, QWebHistoryItem* item)
+{
+    WRT::WrtBrowserContainer* wbc = WebPageController::getSingleton()->currentPage();
+    if(wbc->mainFrame() == frame) {
+        WebPageData d = m_webViewport->pageDataFromViewportInfo();
+        if(d.isValid())
+            item->setUserData(QVariant::fromValue(d));
+    }
+}
+
 } // namespace GVA