diff -r 6aeb7a756187 -r 3c88a81ff781 ginebra2/ContentViews/WebContentViewWidget.cpp --- 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 #include #include +#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