browsercore/appfw/Api/Views/WindowView.cpp
changeset 3 0954f5dd2cd0
parent 0 1450b09d0cfd
child 12 afcd8e6d025b
--- a/browsercore/appfw/Api/Views/WindowView.cpp	Fri May 14 15:40:36 2010 +0300
+++ b/browsercore/appfw/Api/Views/WindowView.cpp	Tue Jun 29 00:46:29 2010 -0400
@@ -1,70 +1,64 @@
 /*
 * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
 * All rights reserved.
-* This component and the accompanying materials are made available
-* under the terms of "Eclipse Public License v1.0"
-* which accompanies this distribution, and is available
-* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* 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.
 *
-* Initial Contributors:
-* Nokia Corporation - initial contribution.
+* 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.
 *
-* Contributors:
+* 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: 
+* Description:
 *
 */
 
 
-
-#include "WrtPageManager.h"
+#include "webpagecontroller.h"
 #include "FlowInterface.h"
 #include "WindowView_p.h"
 #include "WindowView.h"
 
-#include "qwebhistory.h"
-#include "qwebframe.h"
+#include <QWebHistory>
+#include <QWebFrame>
 #include "wrtbrowsercontainer.h"
-#include "webcontentview.h"
 #include "webpagedata.h"
 
 #include <QDebug>
 
+#define WINDOWVIEW_TIME_TO_TRANSITION 200
+#define WINDOWVIEW_TIME_TO_ADD_NEXTPAGE 100
 #define WINDOWVIEW_MAX_NUM_WINDOWS 5
 namespace WRT {
 
 
-WindowViewPrivate::WindowViewPrivate(WrtPageManager * pageMgr,
+WindowViewPrivate::WindowViewPrivate(WebPageController * pageMgr,
                                        QWidget* parent) :
     m_flowInterface(0),
     m_widgetParent(parent),
     m_graphicsWidgetParent(0),
     m_pageManager(pageMgr),
-    m_activePage(0),
-    m_state(0),
-    m_animateTimer(0),
-    m_animateCount(0),
-    m_newCenterPage(NULL),
-    m_newPageIndex(-1),
-    m_blankWindowImg(NULL)
+    m_mode(0),
+    m_state(0)
 {
     Q_ASSERT(m_pageManager);
     init();
 }
 
-WindowViewPrivate::WindowViewPrivate(WrtPageManager * pageMgr,
+WindowViewPrivate::WindowViewPrivate(WebPageController * pageMgr,
                                        QGraphicsWidget* parent) :
     m_flowInterface(0),
     m_widgetParent(0),
     m_graphicsWidgetParent(parent),
     m_pageManager(pageMgr),
-    m_activePage(0),
-    m_state(0),
-    m_animateTimer(0),
-    m_animateCount(0),
-    m_newCenterPage(NULL),
-    m_newPageIndex(-1),
-    m_blankWindowImg(NULL)
+    m_mode(0),
+    m_state(0)
 {
     Q_ASSERT(m_pageManager);
     init();
@@ -72,33 +66,34 @@
 
 WindowViewPrivate::~WindowViewPrivate()
 {
-
+    delete m_transTimer;
 }
 
 void WindowViewPrivate::init()
 {
     // create the view's actions
-    m_actionForward = new QAction("Forward", m_widgetParent);
+    m_actionForward = new QAction("Forward", m_graphicsWidgetParent);
     m_actionForward->setObjectName("Forward");
 
-    m_actionBack = new QAction("Back", m_widgetParent);
+    m_actionBack = new QAction("Back", m_graphicsWidgetParent);
     m_actionBack->setObjectName("Back");
 
-    m_actionOK = new QAction("OK", m_widgetParent);
+    m_actionOK = new QAction("OK", m_graphicsWidgetParent);
     m_actionOK->setObjectName("OK");
 
-    m_actionCancel = new QAction("Cancel", m_widgetParent);
+    m_actionCancel = new QAction("Cancel", m_graphicsWidgetParent);
     m_actionCancel->setObjectName("Cancel");
 
-    m_actionAddWindow = new QAction("addWindow", m_widgetParent);
+    m_actionGoBack = new QAction("goBack", m_graphicsWidgetParent);
+    m_actionGoBack->setObjectName("goBack");
+    m_actionGoBack->setEnabled(true);
+
+    m_actionAddWindow = new QAction("addWindow", m_graphicsWidgetParent);
     m_actionAddWindow->setObjectName("addWindow");
 
-    m_actionDelWindow = new QAction("delWindow", m_widgetParent);
+    m_actionDelWindow = new QAction("delWindow", m_graphicsWidgetParent);
     m_actionDelWindow->setObjectName("delWindow");
 
-    // create animate timer, not single shot
-    m_animateTimer = new QTimer(m_widgetParent);
-
 }
 
 /*!
@@ -107,7 +102,7 @@
  * \brief The base class for the WindowViews
  *
  * This class provides the basic routines to enable navigation amoung multiple pages
- * known by WrtPageManager.
+ * known by WebPageController.
  *
  * Derived classes (such as WindowFlowView, and WindowLiteView) supply
  * the exact "FlowInterface" to be used, and rely on much of the base-class functionality
@@ -119,10 +114,10 @@
   Basic WindowView constructor requires a PageManager to manage the pages
   and a parent QWidget
 
-  @param mgr : WrtPageManager handle for this class
+  @param mgr : WebPageController handle for this class
   @param parent : Widget parent for this class
 */
-WindowView::WindowView(WrtPageManager * pageMgr,
+WindowView::WindowView(WebPageController * pageMgr,
                          QWidget* parent) :
     d(new WindowViewPrivate(pageMgr, parent))
 {
@@ -134,11 +129,11 @@
   and a parent QGraphicsWidget
 
   Note: This functionality is not yet tested
-  @param mgr : WrtPageManager handle for this class
+  @param mgr : WebPageController handle for this class
   @param parent : Graphics Widget parent for this class
-  @see  WrtPageManager
+  @see  WebPageController
 */
-WindowView::WindowView(WrtPageManager * pageMgr,
+WindowView::WindowView(WebPageController * pageMgr,
                          QGraphicsWidget* parent) :
     d(new WindowViewPrivate(pageMgr, parent))
 {
@@ -152,9 +147,9 @@
 }
 
 /*!
-  Retrieve the WrtPageManager assigned to this view
+  Retrieve the WebPageController assigned to this view
 */
-WrtPageManager* WindowView::wrtPageManager()
+WebPageController* WindowView::webPageController()
 {
     return d->m_pageManager;
 }
@@ -243,7 +238,7 @@
         {
             QString pagetitle(d->m_pageList->at(centerIndex)->mainFrame()->title());
             if(pagetitle.isEmpty())
-                title += qtTrId("txt_browser_windows_blank");
+                title += qtTrId("txt_browser_windows_new_window");
             else
                 title += pagetitle;
         }
@@ -274,6 +269,7 @@
     contextList <<
         d->m_actionForward <<
         d->m_actionBack <<
+        d->m_actionGoBack <<
         d->m_actionOK <<
         d->m_actionCancel <<
         d->m_actionAddWindow <<
@@ -303,6 +299,13 @@
     connect(d->m_flowInterface, SIGNAL(cancel()), this, SIGNAL(cancel()));
     connect(d->m_flowInterface, SIGNAL(centerIndexChanged(int)), this, SLOT(changedCenterIndex(int)));
     connect(d->m_flowInterface, SIGNAL(removed(int)), this, SLOT(delPage(int)));
+    connect(d->m_transTimer, SIGNAL(timeout()), this, SLOT(endAnimation()));
+
+    if (d->m_mode ==  WindowViewModeTransition ) {
+
+        //qDebug() << "Connect to pageCreated " ;
+        connect(d->m_pageManager, SIGNAL(creatingPage(WRT::WrtBrowserContainer*)), this, SLOT(onPageCreated(WRT::WrtBrowserContainer*)));
+    }
 
     // FIXME: temporal fix the resize & performance issue caused by the new QGraphicsItem architecture
     widget()->installEventFilter(this);
@@ -319,6 +322,7 @@
 */
 void WindowView::deactivate()
 {
+    //qDebug() << "deactivate " << d->m_mode;
     Q_ASSERT(d->m_state == WindowViewActive);
 
     if(!d->m_flowInterface)
@@ -331,7 +335,13 @@
     // internally process the index change signal as well
     disconnect(d->m_flowInterface, SIGNAL(centerIndexChanged(int)), this, SLOT(changedCenterIndex(int)));
     disconnect(d->m_flowInterface, SIGNAL(removed(int)), this, SLOT(delPage(int)));
+    disconnect(d->m_transTimer, SIGNAL(timeout()), this, SLOT(endAnimation()));
 
+    if (d->m_mode ==  WindowViewModeTransition ) {
+        //qDebug() << "========Disconnect pageCreated ";
+        disconnect(d->m_pageManager, SIGNAL(creatingPage(WRT::WrtBrowserContainer*)), this, SLOT(onPageCreated(WRT::WrtBrowserContainer*)));
+        // Check if new pages list is empty  - assert  d->m_newPages.count()
+    }
     widget()->removeEventFilter(this);
 
     // Hide and delete flowinterface later when told
@@ -347,11 +357,15 @@
     d->m_flowInterface->deleteLater();
     d->m_flowInterface = NULL;
 
+    d->m_mode =  WindowViewModeNormal;
     d->m_state = WindowViewNotActive;
+
 }
 
 void WindowView::init()
 {
+    d->m_transTimer = new QTimer(this);
+
     // auto-link relevant actions to slots
     connect(d->m_actionForward, SIGNAL(triggered()), this, SLOT(forward()));
     connect(d->m_actionBack, SIGNAL(triggered()), this, SLOT(back()));
@@ -361,6 +375,11 @@
     connect(d->m_actionDelWindow, SIGNAL(triggered()), this, SLOT(delPage()));
 }
 
+void WindowView::setMode(Mode m)
+{
+    d->m_mode = m;
+}
+
 void WindowView::setSize(QSize& size)
 {
     d->m_windowViewSize = size;
@@ -418,6 +437,16 @@
          QWebHistoryItem item = window->history()->currentItem();
          WebPageData data = item.userData().value<WebPageData>();
          QImage img = data.m_thumbnail;
+
+         QSize size = window->webWidget()->size().toSize();
+         QSize imgSize = img.size();
+         float ratio = (float)size.width() / (float)size.height();
+         float imgRatio = (float)imgSize.width() / (float)imgSize.height();
+         if (imgRatio != ratio) {
+             size.scale(imgSize, Qt::KeepAspectRatio);
+             img = img.copy(0, 0, size.width(), size.height());
+         }
+
          d->m_flowInterface->addSlide(img, title);
      }
      setCenterIndex(d->m_pageManager->currentPage());
@@ -488,13 +517,19 @@
 
 void WindowView::indexChangeInActiveState(int index)
 {
-    WrtBrowserContainer* page = d->m_pageList->at(index);
-    d->m_pageManager->setCurrentPage(page);
+    if (d->m_mode ==  WindowViewModeNormal ) {
+        WrtBrowserContainer* page = d->m_pageList->at(index);
+        d->m_pageManager->setCurrentPage(page);
+
+        /* Set the new page as the center page */
+        emit centerIndexChanged(index);
 
-    /* Set the new page as the center page */
-    emit centerIndexChanged(index);
-
-    updateActions();
+        updateActions();
+    }
+    else {
+        //qDebug() << "Start Adding pages " << "Pages in list" <<  d->m_newPages.count() << "Page added " << d->m_newPages.at(0);
+        addPage(d->m_newPages.takeFirst());
+    }
 }
 
 
@@ -544,29 +579,34 @@
     }
 }
 
-void WindowView::pageLoadCplt(bool ok)
-{
-}
-
-void WindowView::addPage()
+void WindowView::addPage(WrtBrowserContainer* pg)
 {
     Q_ASSERT(d->m_flowInterface);
 
-    //if (d->m_widgetParent) {
-    if (d->m_flowInterface->slideAnimationOngoing() || d->m_state == WindowViewAddPage)
+    //qDebug() << "WindowView::addPage: COUNT "<< d->m_newPages.count();
+    if (d->m_flowInterface->slideAnimationOngoing() || (d->m_mode ==  WindowViewModeNormal && d->m_state == WindowViewAddPage))
         return;
 
-    if (d->m_pageList->count() >= WINDOWVIEW_MAX_NUM_WINDOWS) {
-        return;
-    }
-
     d->m_state = WindowViewAddPage;
 
     // insert an empty image after index
-    // the insert function will activate the add-page animation which is build-in in FilmstripFlow
-    QImage emptyImage;
+    // the insert function will activate the add-page animation which is built-in in FilmstripFlow
+    QImage img;
+    QString title= "";
+    if (pg && !pg->mainFrame()->requestedUrl().isEmpty() ) {
+         if (!pg->mainFrame()->title().isEmpty())
+             title = pg->mainFrame()->title();
+         else  if (!pg->mainFrame()->url().isEmpty() )
+             title = d->m_pageManager->partialUrl(pg->mainFrame()->url());
+         else
+             title = d->m_pageManager->partialUrl(pg->mainFrame()->requestedUrl());
+
+         //qDebug() << "WindowView::addPage - Title " << pg->mainFrame()->title() << "Url : "<<  pg->mainFrame()->url().toString()<< "Requested Url : " << pg->mainFrame()->requestedUrl().toString()  ;
+    }
+
     int index = d->m_flowInterface->centerIndex();
-    d->m_flowInterface->insert(index + 1, emptyImage, "");
+    d->m_flowInterface->insert(index + 1, img, title);
+
     updateActions();
 }
 
@@ -575,20 +615,59 @@
     /* Adding a new page is completed when the index reaches the newly added index*/
     Q_ASSERT(d->m_state == WindowViewAddPage);
 
-    connect(d->m_flowInterface, SIGNAL(endAnimationCplt()), this, SLOT(addPageCplt()));
+
+    //qDebug() << " WindowView::addPageCplt: index " << index << "add new page" << d->m_newPages.count();
+    /* If new pages were added, show them before transitioning back to content view */
+    if (d->m_newPages.count() ) {
+
+        //qDebug() << " WindowView::addPageCplt: index " << index << "add new page" << d->m_newPages.count();
+        QTimer::singleShot(WINDOWVIEW_TIME_TO_ADD_NEXTPAGE, this, SLOT(addNextPage()));
+
+    }
+    else {
+        connect(d->m_flowInterface, SIGNAL(endAnimationCplt()), this, SLOT(addPageCplt()));
+
+        // Start a timer so that the new blank window is shown before transition starts
+        d->m_transTimer->start(WINDOWVIEW_TIME_TO_TRANSITION);
+
+    }
+
+    emit pageAdded();
+}
+
+void WindowView::addNextPage()
+{
+    //qDebug() << " WindowView::addNextPage " << d->m_newPages.count() << "Added Page " << d->m_newPages.at(0);
+    addPage(d->m_newPages.takeFirst());
+}
+
+void WindowView::endAnimation()
+{
+
+    //qDebug() << "WindowView::endAnimation ";
+    d->m_transTimer->stop();
     d->m_flowInterface->runEndAnimation();
+
 }
 
 void WindowView::addPageCplt()
 {
-    // open a new page
-    QWebPage* pg = d->m_pageManager->openPage();
+    //qDebug() << "WindowView::addPageCplt() " << d->m_newPages.count();
+    if (d->m_mode ==  WindowViewModeNormal ) {
+        // open a new page
+        WRT::WrtBrowserContainer* pg = d->m_pageManager->openPage();
+    }
     int index = d->m_flowInterface->centerIndex();
     emit centerIndexChanged(index);
 
     disconnect(d->m_flowInterface, SIGNAL(endAnimationCplt()), this, SLOT(addPageCplt()));
     d->m_state = WindowViewActive;
     updateActions();
+
+    if (d->m_mode ==  WindowViewModeTransition ) {
+        emit newWindowTransitionComplete();
+    }
+
     emit addPageComplete();
 }
 
@@ -630,70 +709,35 @@
     emit centerIndexChanged(d->m_flowInterface->centerIndex());
 }
 
-QRect WindowView::centralRect()
-{
-    if(!d->m_flowInterface)
-        return QRect();
+
+void WindowView::onPageCreated(WRT::WrtBrowserContainer *pg) {
 
-    return d->m_flowInterface->centralRect();
+    //qDebug() << "WindowView::onPageCreated" << pg << "Trans Timer active " <<  d->m_transTimer->isActive();
+    if (d->m_transTimer->isActive()) {
+        // Stop that timer and add the new page
+        d->m_transTimer->stop();
+        addPage(pg);
+    }
+    else {
+
+        d->m_newPages.append(pg);
+    }
+}
+int WindowView::pageCount() {
+
+    return (d->m_flowInterface->slideCount());
 }
 
-QImage WindowView::currentSlide()
-{
-    QImage img;
-    if ( d->m_flowInterface) {
-        img =  d->m_flowInterface->slide(d->m_flowInterface->centerIndex());
-    }
-    return img;
-}
+int WindowView::currentPageIndex() {
 
-void WindowView::setBlankWindowImg(QImage * img)
-{
-    d->m_blankWindowImg = img;
-}
-
-void WindowView::hideWidget()
-{
-    d->m_flowInterface->hide();
-    d->m_flowInterface->deleteLater();
-    d->m_flowInterface = NULL;
-}
-
-void WindowView::showWidget()
-{
-    d->m_flowInterface->show();
+    return (d->m_flowInterface->centerIndex());
 }
 
 WindowViewJSObject:: WindowViewJSObject(WindowView* view, QWebFrame* webFrame, const QString& objectName)
   : ControllableViewJSObject(view, webFrame, objectName)
 {
-    connect(view,SIGNAL(ok(WrtBrowserContainer*)),this,SLOT(ok(WrtBrowserContainer*)));
-    connect(view,SIGNAL(addPageComplete()),this,SLOT(addPageComplete()));
-    connect(view,SIGNAL(centerIndexChanged(int)),this,SLOT(changedCenterIndex(int)));
-
-}
-
-WindowViewJSObject::~WindowViewJSObject()
-{
-    disconnect(windowView(),SIGNAL(ok(WrtBrowserContainer*)),this,SLOT(ok(WrtBrowserContainer*)));
-    disconnect(windowView(),SIGNAL(addPageComplete()),this,SLOT(addPageComplete()));
-    disconnect(windowView(),SIGNAL(centerIndexChanged(int)),this,SLOT(changedCenterIndex(int)));
-
-}
+    connect(view,SIGNAL(pageAdded()),this,SIGNAL(pageAdded()));
 
-void WindowViewJSObject::addPageComplete()
-{
-     emit pageAdded();
-}
-
-void WindowViewJSObject::changedCenterIndex(int index)
-{
-    emit centerIndexChanged(index);
-}
-
-void WindowViewJSObject::ok(WrtBrowserContainer * page)
-{
-     emit done(page);
 }
 
 /*!