ginebra2/ContentViews/WebContentViewWidget.cpp
changeset 16 3c88a81ff781
parent 9 b39122337a00
equal deleted inserted replaced
14:6aeb7a756187 16:3c88a81ff781
    20 */
    20 */
    21 
    21 
    22 #include "WebContentViewWidget.h"
    22 #include "WebContentViewWidget.h"
    23 
    23 
    24 #include "ScrollableWebContentView.h"
    24 #include "ScrollableWebContentView.h"
    25 #include "WebContentAnimationItem.h"
       
    26 #include "webpagecontroller.h"
    25 #include "webpagecontroller.h"
    27 #include "WebView.h"
    26 #include "WebView.h"
    28 #include "wrtbrowsercontainer.h"
    27 #include "wrtbrowsercontainer.h"
    29 #include "ZoomMetaData.h"
    28 #include "webpagedata.h"
       
    29 
       
    30 #ifdef Q_WS_MAEMO_5
       
    31 #include "ContentViewContextMenu.h"
       
    32 #endif
       
    33 #include "GWebContentView.h"
    30 
    34 
    31 #include <QGraphicsLinearLayout>
    35 #include <QGraphicsLinearLayout>
    32 #include <QStyleOptionGraphicsItem>
    36 #include <QStyleOptionGraphicsItem>
    33 #include <QWebFrame>
    37 #include <QWebFrame>
       
    38 #include "QWebHistoryItem"
    34 
    39 
    35 namespace GVA {
    40 namespace GVA {
    36 
    41 
    37 WebContentViewWidget::WebContentViewWidget(QObject* parent, QWebPage* page)
    42 WebContentViewWidget::WebContentViewWidget(QObject* parent, GWebContentView* view, QWebPage* page): 
    38     : m_webViewportProxy(new WebContentAnimationItem())
    43 	m_webContentView(view)
    39 {
    44 {
    40     setFlag(QGraphicsItem::ItemUsesExtendedStyleOption, true);
    45     setFlag(QGraphicsItem::ItemUsesExtendedStyleOption, true);
    41     setParent(parent);
    46     setParent(parent);
    42 
    47 
    43     m_webViewport = new ScrollableWebContentView(m_webViewportProxy, this);
       
    44 
       
    45     m_webView = new WebView();
    48     m_webView = new WebView();
       
    49     m_webViewport = new ScrollableWebContentView(m_webView, this);
    46 
    50 
    47     if (page)
    51     if (page)
    48         setPage(page);
    52         setPage(page);
    49 
    53 
    50     m_webViewportProxy->setWebView(m_webView);
    54     //updatePreferredContentSize();
    51     updatePreferredContentSize();
       
    52     m_webViewportProxy->setPos(QPointF(0,0));
       
    53 
    55 
    54     //FIX ME : Should we have to delete layout??
    56     //FIX ME : Should we have to delete layout??
    55     QGraphicsLinearLayout* layout = new QGraphicsLinearLayout(Qt::Vertical, this);
    57     QGraphicsLinearLayout* layout = new QGraphicsLinearLayout(Qt::Vertical, this);
    56     layout->setContentsMargins(0,0,0,0);
    58     layout->setContentsMargins(0,0,0,0);
    57     layout->setSpacing(0.);
    59     layout->setSpacing(0.);
    58     layout->addItem(m_webViewport);
    60     layout->addItem(m_webViewport);
    59 
    61 
    60     connect(m_webViewportProxy
    62     connect(m_webViewport
    61             , SIGNAL(updateZoomActions(bool,bool))
    63             , SIGNAL(updateZoomActions(bool,bool))
    62             , this
    64             , this
    63             , SIGNAL(updateZoomActions(bool,bool)));
    65             , SIGNAL(updateZoomActions(bool,bool)));
    64     connect(m_webViewport
    66     #ifdef Q_WS_MAEMO_5
    65             , SIGNAL(contextEventObject(QWebHitTestResult*))
    67     connect(m_webViewport
    66             , this
    68             , SIGNAL(contextEventObject(QWebHitTestResult*, QPointF))
    67             , SIGNAL(contextEventObject(QWebHitTestResult*)));
    69             , this
    68 
    70             , SLOT(onContextEventObject(QWebHitTestResult*, QPointF)));
       
    71     #else
       
    72     connect(m_webViewport
       
    73             , SIGNAL(contextEventObject(QWebHitTestResult*, QPointF))
       
    74             , this
       
    75             , SIGNAL(contextEventObject(QWebHitTestResult*, QPointF)));
       
    76     #endif
    69     connect(m_webViewport
    77     connect(m_webViewport
    70             , SIGNAL(viewScrolled(QPoint&, QPoint&))
    78             , SIGNAL(viewScrolled(QPoint&, QPoint&))
    71             , this
    79             , this
    72             , SIGNAL(viewScrolled(QPoint&, QPoint&)));
    80             , SIGNAL(viewScrolled(QPoint&, QPoint&)));
    73 
    81 
    74     connect(m_webViewport
    82     connect(m_webViewport
    75             , SIGNAL(mouseEvent(QEvent::Type))
    83             , SIGNAL(contentViewMouseEvent(QEvent::Type))
    76             , this
    84             , this
    77             , SIGNAL(mouseEvent(QEvent::Type)));
    85             , SIGNAL(mouseEvent(QEvent::Type)));
       
    86 
       
    87     //To speed up painting.
       
    88     setFlag(QGraphicsItem::ItemHasNoContents, true);
       
    89     setAttribute(Qt::WA_OpaquePaintEvent, true);
    78 }
    90 }
    79 
    91 
    80 WebContentViewWidget::~WebContentViewWidget()
    92 WebContentViewWidget::~WebContentViewWidget()
    81 {
    93 {
    82     delete m_webView;
    94     delete m_webView;
    83     delete m_webViewportProxy;
       
    84     delete m_webViewport;
    95     delete m_webViewport;
    85 }
    96 }
    86 
    97 
       
    98 
       
    99 bool WebContentViewWidget::event(QEvent * e) 
       
   100 {
       
   101     if (e->type() == QEvent::Gesture) {
       
   102         return  m_webViewport->event(e);
       
   103     }
       
   104     return QGraphicsWidget::event(e);
       
   105 }
       
   106 
    87 void WebContentViewWidget::resizeEvent(QGraphicsSceneResizeEvent* event)
   107 void WebContentViewWidget::resizeEvent(QGraphicsSceneResizeEvent* event)
    88 {
   108 {
    89     QGraphicsWidget::resizeEvent(event);
   109     QGraphicsWidget::resizeEvent(event);
    90 
   110 
    91     setGeometry(QRectF(pos(), size()));
   111     // WTF? setGeometry(QRectF(pos(), size()));
    92     setPreferredSize(size());
   112     setPreferredSize(size());
    93 }
   113     QSizeF vpSize = m_webViewport->size();
       
   114     if(vpSize.width() > size().width()) vpSize.setWidth(size().height());
       
   115     if(vpSize.height() > size().height()) vpSize.setHeight(size().height());
       
   116 
       
   117     QPointF vpPos = m_webViewport->pos();
       
   118     if(vpPos.x() + vpSize.width() > geometry().right())
       
   119         vpPos.setX(geometry().right() - vpSize.width());
       
   120     if(vpPos.y() + vpSize.height() > geometry().bottom())
       
   121         vpPos.setY(geometry().bottom() - vpSize.height());
       
   122 
       
   123     QRectF vpGeom(vpPos,vpSize);
       
   124     if(vpGeom != m_webViewport->geometry()) {
       
   125         // Should we center it here?
       
   126         m_webViewport->setGeometry(vpGeom);
       
   127     }
       
   128 }
       
   129 
       
   130 #ifdef Q_WS_MAEMO_5
       
   131 void WebContentViewWidget::onContextEventObject(QWebHitTestResult* hitTest, QPointF position) {
       
   132     if(m_webContentView->currentPageIsSuperPage()) {
       
   133         // Let the superpage handle the event.
       
   134         ::WebViewEventContext *context = new ::WebViewEventContext(view()->type(), *hitTest);
       
   135         m_webContentView->currentSuperPage()->onContextEvent(context);
       
   136     }
       
   137     else {
       
   138         ContentViewContextMenu menu(hitTest, 0);
       
   139         menu.exec(position.toPoint());
       
   140     }
       
   141 }
       
   142 #endif
    94 
   143 
    95 QWebPage* WebContentViewWidget::page()
   144 QWebPage* WebContentViewWidget::page()
    96 {
   145 {
    97     return m_webView->page();
   146     return m_webView->page();
    98 }
   147 }
    99 
   148 
   100 void WebContentViewWidget::setPage(QWebPage* page)
   149 void WebContentViewWidget::setPage(QWebPage* page)
   101 {
   150 {
   102     m_webView->setPage(page);
   151     QWebPage* oldPage = this->page(); 
       
   152     if(oldPage) {
       
   153         disconnect(this->page()->mainFrame(), SIGNAL(initialLayoutCompleted()), m_webViewport, SLOT(reset()));
       
   154         disconnect(this->page(), SIGNAL(restoreFrameStateRequested(QWebFrame*)), this, SLOT(restoreViewportFromHistory(QWebFrame*)));
       
   155         disconnect(this->page(), SIGNAL(saveFrameStateRequested(QWebFrame*,QWebHistoryItem*)), this, SLOT(saveViewportToHistory(QWebFrame*,QWebHistoryItem*)));
       
   156         disconnect(this->page()->mainFrame(), SIGNAL(contentsSizeChanged(const QSize &)), m_webViewport, SLOT(contentsSizeChanged(const QSize&)));
       
   157         disconnect(this->page(), SIGNAL(loadStarted()), m_webViewport, SLOT(pageLoadStarted()));
       
   158         disconnect(this->page(), SIGNAL(loadProgress(int)), m_webViewport, SLOT(pageLoadProgress(int)));
       
   159         disconnect(this->page(), SIGNAL(loadFinished(bool)), m_webViewport, SLOT(pageLoadFinished(bool)));
       
   160     }
       
   161     
       
   162     m_webViewport->setPage(page);
   103 
   163 
   104     connect(this->page()->mainFrame(), SIGNAL(initialLayoutCompleted()), m_webViewport, SLOT(reset()));
   164     connect(this->page()->mainFrame(), SIGNAL(initialLayoutCompleted()), m_webViewport, SLOT(reset()));
       
   165     connect(this->page(), SIGNAL(restoreFrameStateRequested(QWebFrame*)), this, SLOT(restoreViewportFromHistory(QWebFrame*)));
       
   166     connect(this->page(), SIGNAL(saveFrameStateRequested(QWebFrame*,QWebHistoryItem*)), this, SLOT(saveViewportToHistory(QWebFrame*,QWebHistoryItem*)));
   105     connect(this->page()->mainFrame(), SIGNAL(contentsSizeChanged(const QSize &)), m_webViewport, SLOT(contentsSizeChanged(const QSize&)));
   167     connect(this->page()->mainFrame(), SIGNAL(contentsSizeChanged(const QSize &)), m_webViewport, SLOT(contentsSizeChanged(const QSize&)));
   106     connect(this->page()->mainFrame(), SIGNAL(loadFinished(bool)), m_webViewport, SLOT(pageLoadFinished(bool)));
   168     connect(this->page(), SIGNAL(loadStarted()), m_webViewport, SLOT(pageLoadStarted()));
   107 }
   169     connect(this->page(), SIGNAL(loadProgress(int)), m_webViewport, SLOT(pageLoadProgress(int)));
   108 
   170     connect(this->page(), SIGNAL(loadFinished(bool)), m_webViewport, SLOT(pageLoadFinished(bool)));
   109 QGraphicsWebView* WebContentViewWidget::webView()
   171 }
       
   172 
       
   173 QGraphicsWebView* WebContentViewWidget::webView() const
   110 {
   174 {
   111     return m_webView;
   175     return m_webView;
   112 }
   176 }
   113 
   177 
   114 ZoomMetaData WebContentViewWidget::currentPageInfo()
   178 QGraphicsWidget* WebContentViewWidget::viewPort() const
   115 {
   179 {
   116     return m_webViewport->currentPageInfo();
   180     return m_webViewport;
   117 }
   181 }
   118 
   182 
   119 void WebContentViewWidget::setCurrentPageInfo(ZoomMetaData data)
   183 WebPageData WebContentViewWidget::pageDataFromViewportInfo()
   120 {
   184 {
   121     m_webViewport->setCurrentPageInfo(data);
   185     return m_webViewport->pageDataFromViewportInfo();
   122 }
   186 }
   123 
   187 
   124 ZoomMetaData WebContentViewWidget::defaultZoomData()
   188 void WebContentViewWidget::setPageDataToViewportInfo(const WebPageData& data)
       
   189 {
       
   190     m_webViewport->setPageDataToViewportInfo(data);
       
   191 }
       
   192 
       
   193 WebPageData WebContentViewWidget::defaultZoomData()
   125 {
   194 {
   126     return m_webViewport->defaultZoomData();
   195     return m_webViewport->defaultZoomData();
   127 }
   196 }
   128 
   197 
   129 void WebContentViewWidget::setPageZoom(bool zoomIn)
   198 void WebContentViewWidget::setPageZoom(bool zoomIn)
   130 {
   199 {
   131     Q_ASSERT(m_webViewport);
   200     Q_ASSERT(m_webViewport);
   132     m_webViewport->zoomToScreenCenter(zoomIn);
   201     m_webViewport->toggleZoom(zoomIn);
   133 }
   202 }
   134 
   203 
   135 void WebContentViewWidget::showPage(bool isSuperPage)
   204 void WebContentViewWidget::showPage(bool isSuperPage)
   136 {
   205 {
   137     if (!isSuperPage) {
   206     if (!isSuperPage) {
   146 void WebContentViewWidget::updatePreferredContentSize()
   215 void WebContentViewWidget::updatePreferredContentSize()
   147 {
   216 {
   148     m_webViewport->updatePreferredContentSize();
   217     m_webViewport->updatePreferredContentSize();
   149 }
   218 }
   150 
   219 
       
   220 
   151 void WebContentViewWidget::setGesturesEnabled(bool value)
   221 void WebContentViewWidget::setGesturesEnabled(bool value)
   152 {
   222 {
   153     m_webViewport->setGesturesEnabled(value);
   223     m_webViewport->setGesturesEnabled(value);
   154 }
   224 }
   155     
   225     
   156 bool WebContentViewWidget::gesturesEnabled()
   226 bool WebContentViewWidget::gesturesEnabled()
   157 {
   227 {
   158     return m_webViewport->gesturesEnabled();
   228     return m_webViewport->gesturesEnabled();
   159 }
   229 }
   160 
   230 
       
   231 void WebContentViewWidget::restoreViewportFromHistory(QWebFrame* frame)
       
   232 {
       
   233     WRT::WrtBrowserContainer* wbc = WebPageController::getSingleton()->currentPage();
       
   234     if(wbc->pageZoomMetaData()->isValid() && wbc->mainFrame() == frame) {
       
   235         WebPageData* d = wbc->pageZoomMetaData();
       
   236         m_webViewport->setPageDataToViewportInfo(*d);
       
   237     }
       
   238 }
       
   239 
       
   240 void WebContentViewWidget::saveViewportToHistory(QWebFrame* frame, QWebHistoryItem* item)
       
   241 {
       
   242     WRT::WrtBrowserContainer* wbc = WebPageController::getSingleton()->currentPage();
       
   243     if(wbc->mainFrame() == frame) {
       
   244         WebPageData d = m_webViewport->pageDataFromViewportInfo();
       
   245         if(d.isValid())
       
   246             item->setUserData(QVariant::fromValue(d));
       
   247     }
       
   248 }
       
   249 
   161 } // namespace GVA
   250 } // namespace GVA