emailuis/nmailui/src/nmviewerview.cpp
changeset 43 99bcbff212ad
parent 40 2c62ef3caffd
child 44 c2d07d913565
equal deleted inserted replaced
42:139d4b7b2938 43:99bcbff212ad
    71 mAttaIndexUnderFetch(NmNotFoundError),
    71 mAttaIndexUnderFetch(NmNotFoundError),
    72 mAttaWidget(NULL),
    72 mAttaWidget(NULL),
    73 mViewReady(false),
    73 mViewReady(false),
    74 mWaitNoteCancelled(false)
    74 mWaitNoteCancelled(false)
    75     {
    75     {
       
    76     NM_FUNCTION;
       
    77     
    76     // Create documentloader
    78     // Create documentloader
    77     mDocumentLoader = new NmUiDocumentLoader(mMainWindow);
    79     mDocumentLoader = new NmUiDocumentLoader(mMainWindow);
    78     // Get screensize
    80     // Get screensize
    79     mScreenSize = mApplication.screenSize();
    81     mScreenSize = mApplication.screenSize();
    80     // Connect external delete handling to uiengine signal
    82     // Connect external delete handling to uiengine signal
    91 /*!
    93 /*!
    92     Destructor
    94     Destructor
    93 */
    95 */
    94 NmViewerView::~NmViewerView()
    96 NmViewerView::~NmViewerView()
    95 {
    97 {
       
    98     NM_FUNCTION;
       
    99     
    96     delete mWebView;
   100     delete mWebView;
    97     mWebView = NULL;
   101     mWebView = NULL;
    98     delete mMessage;
   102     delete mMessage;
    99     mMessage = NULL;
   103     mMessage = NULL;
   100     delete mDocumentLoader;
   104     delete mDocumentLoader;
   110 /*!
   114 /*!
   111     View is about to exit
   115     View is about to exit
   112 */
   116 */
   113 void NmViewerView::aboutToExitView()
   117 void NmViewerView::aboutToExitView()
   114 {
   118 {
       
   119     NM_FUNCTION;
       
   120     
   115     // View is about to exit, for safety, stop 
   121     // View is about to exit, for safety, stop 
   116     // loading of content before closing the view
   122     // loading of content before closing the view
   117     if (mWebView){
   123     if (mWebView){
   118         mWebView->stop();
   124         mWebView->stop();
   119         if (mWebView->page()){
   125         if (mWebView->page()){
   125 /*!
   131 /*!
   126     View layout loading from XML
   132     View layout loading from XML
   127 */
   133 */
   128 void NmViewerView::loadViewLayout()
   134 void NmViewerView::loadViewLayout()
   129 {
   135 {
       
   136     NM_FUNCTION;
       
   137     
   130     // Use document loader to load the view
   138     // Use document loader to load the view
   131     bool ok = false;
   139     bool ok = false;
   132     setObjectName(QString(NMUI_MESSAGE_VIEWER_VIEW));
   140     setObjectName(QString(NMUI_MESSAGE_VIEWER_VIEW));
   133     QObjectList objectList;
   141     QObjectList objectList;
   134     objectList.append(this);
   142     objectList.append(this);
   135     // Pass the view to documentloader. Document loader uses this view
   143     // Pass the view to documentloader. Document loader uses this view
   136     // when docml is parsed, instead of creating new view.
   144     // when docml is parsed, instead of creating new view.
   137     if (mDocumentLoader) {
   145     // documentloader is created in constructor
   138         mDocumentLoader->setObjectTree(objectList);
   146     mDocumentLoader->setObjectTree(objectList);
   139         mWidgetList = mDocumentLoader->load(NMUI_MESSAGE_VIEWER_XML, &ok);
   147     mWidgetList = mDocumentLoader->load(NMUI_MESSAGE_VIEWER_XML, &ok);
   140     }
       
   141     int widgetCount = mWidgetList.count();
   148     int widgetCount = mWidgetList.count();
   142     if (ok == true && widgetCount)
   149     if (ok == true && widgetCount)
   143     {
   150     {
   144         // Create content and content layout
   151         // Create content and content layout
   145         // qobject_cast not work in this case, using reinterpret_cast
   152         // qobject_cast not work in this case, using reinterpret_cast
   159                 this, SLOT(handleMouseReleaseEvent(QGraphicsSceneMouseEvent*)));
   166                 this, SLOT(handleMouseReleaseEvent(QGraphicsSceneMouseEvent*)));
   160 
   167 
   161             // Get scroll area contents and set layout margins
   168             // Get scroll area contents and set layout margins
   162             mScrollAreaContents = qobject_cast<HbWidget *>(
   169             mScrollAreaContents = qobject_cast<HbWidget *>(
   163                     mDocumentLoader->findObject(NMUI_MESSAGE_VIEWER_SCROLL_AREA_CONTENTS));
   170                     mDocumentLoader->findObject(NMUI_MESSAGE_VIEWER_SCROLL_AREA_CONTENTS));
   164             if (mScrollAreaContents->layout()){
   171             if (mScrollAreaContents) {
   165                 mScrollAreaContents->layout()->setContentsMargins(0,0,0,0);
   172                 QGraphicsLayout *layout = mScrollAreaContents->layout();
   166             }
   173                 if (layout){
   167 
   174                     layout->setContentsMargins(0,0,0,0);
   168             // Set white pixmap to backgrounditem 
   175                 }
   169             QPixmap whitePixmap(10,10);
   176                 // Set white pixmap to backgrounditem 
   170             whitePixmap.fill(Qt::white);
   177                 QPixmap whitePixmap(10,10);
   171             QGraphicsPixmapItem *pixmapItem = new QGraphicsPixmapItem(whitePixmap);
   178                 whitePixmap.fill(Qt::white);
   172             mScrollAreaContents->setBackgroundItem(pixmapItem);
   179                 QGraphicsPixmapItem *pixmapItem = new QGraphicsPixmapItem(whitePixmap);
       
   180                 mScrollAreaContents->setBackgroundItem(pixmapItem);
       
   181             }
   173 
   182 
   174             // Load headerwidget
   183             // Load headerwidget
   175             mHeaderWidget = qobject_cast<NmViewerHeader *>(
   184             mHeaderWidget = qobject_cast<NmViewerHeader *>(
   176                     mDocumentLoader->findObject(NMUI_MESSAGE_VIEWER_HEADER));
   185                     mDocumentLoader->findObject(NMUI_MESSAGE_VIEWER_HEADER));
   177             if (mHeaderWidget) {
   186             if (mHeaderWidget) {
   185             mWebView = reinterpret_cast<NmMailViewerWK *>(
   194             mWebView = reinterpret_cast<NmMailViewerWK *>(
   186                     mDocumentLoader->findObject(QString(NMUI_MESSAGE_VIEWER_SCROLL_WEB_VIEW)));
   195                     mDocumentLoader->findObject(QString(NMUI_MESSAGE_VIEWER_SCROLL_WEB_VIEW)));
   187             if (mWebView) {
   196             if (mWebView) {
   188                 mWebView->setParentView(this);
   197                 mWebView->setParentView(this);
   189                 // Set auto load images and private browsing(no history) attributes
   198                 // Set auto load images and private browsing(no history) attributes
   190                 mWebView->settings()->setAttribute(QWebSettings::AutoLoadImages, true);
   199                 QWebSettings *settings = mWebView->settings();
   191                 mWebView->settings()->setAttribute(QWebSettings::PrivateBrowsingEnabled, true);                                
   200                 if (settings) {
       
   201                     settings->setAttribute(QWebSettings::AutoLoadImages, true);
       
   202                     settings->setAttribute(QWebSettings::PrivateBrowsingEnabled, true);   
       
   203                 }                             
   192                 HbEditorInterface editorInterface(mWebView);
   204                 HbEditorInterface editorInterface(mWebView);
   193                 editorInterface.setInputConstraints(HbEditorConstraintIgnoreFocus);
   205                 editorInterface.setInputConstraints(HbEditorConstraintIgnoreFocus);
   194                 mWebView->setAcceptedMouseButtons(Qt::NoButton);
   206                 mWebView->setAcceptedMouseButtons(Qt::NoButton);
   195                 if (mWebView->page()){
   207                 QWebPage *page = mWebView->page();
   196                     mWebView->page()->mainFrame()->setScrollBarPolicy(Qt::Vertical,
   208                 if (page) {
   197                                                                       Qt::ScrollBarAlwaysOff);
   209                     QWebFrame *frame = page->mainFrame();
   198                     mWebView->page()->mainFrame()->setScrollBarPolicy(Qt::Horizontal,
   210                     if (frame) {
   199                                                                       Qt::ScrollBarAlwaysOff);
   211                         frame->setScrollBarPolicy(Qt::Vertical,Qt::ScrollBarAlwaysOff);
   200                     connect(mWebView->page()->mainFrame(),
   212                         frame->setScrollBarPolicy(Qt::Horizontal, Qt::ScrollBarAlwaysOff);
   201                             SIGNAL(contentsSizeChanged(const QSize&)),
   213                         connect(mWebView->page()->mainFrame(),
   202                         this, SLOT(scaleWebViewWhenLoading(const QSize&)));
   214                                 SIGNAL(contentsSizeChanged(const QSize&)),
       
   215                             this, SLOT(scaleWebViewWhenLoading(const QSize&)));  
       
   216                     }
   203                 }
   217                 }
   204              }
   218             }
   205         }
   219         }
   206     }
   220     }
   207 }
   221 }
   208  
   222  
   209 /*!
   223 /*!
   210     Lazy loading when view layout has been loaded
   224     Lazy loading when view layout has been loaded
   211 */
   225 */
   212 void NmViewerView::viewReady()
   226 void NmViewerView::viewReady()
   213 {
   227 {
       
   228     NM_FUNCTION;
       
   229     
   214     if (!mViewReady){
   230     if (!mViewReady){
   215         // Set mailbox name to title
   231         // Set mailbox name to title
   216         setMailboxName();
   232         setMailboxName();
   217         // Create toolbar if needed
   233         // Create toolbar if needed
   218         if (mToolbarEnabled) {
   234         if (mToolbarEnabled) {
   219             createToolBar();
   235             createToolBar();
   220         }
   236         } else {
   221         else {
       
   222             // Connect options menu about to show to create options menu function
   237             // Connect options menu about to show to create options menu function
   223             QObject::connect(menu(), SIGNAL(aboutToShow()),
   238             QObject::connect(menu(), SIGNAL(aboutToShow()),
   224                     this, SLOT(createOptionsMenu())); 
   239                     this, SLOT(createOptionsMenu())); 
   225             // Menu needs one dummy item so that aboutToShow signal is emitted.
   240             // Menu needs one dummy item so that aboutToShow signal is emitted.
   226             NmAction *dummy = new NmAction(0);
   241             NmAction *dummy = new NmAction(0);
   227             menu()->addAction(dummy);
   242             menu()->addAction(dummy);
   228         }
   243         }
   229         
   244                 
   230         
   245         if (mHeaderWidget) {
   231         if (mHeaderWidget){
       
   232             QPointF contentWidgetPos = mScrollArea->pos();
   246             QPointF contentWidgetPos = mScrollArea->pos();
   233             qreal headerHeight = mHeaderWidget->geometry().height();
   247             qreal headerHeight = mHeaderWidget->geometry().height();
   234             if(mMainWindow->orientation()==Qt::Horizontal) {
   248             if (mMainWindow->orientation() == Qt::Horizontal) {
   235                 const QPointF pointToWebView(contentWidgetPos.x(), headerHeight+NmHeaderMargin);
   249                 const QPointF pointToWebView(contentWidgetPos.x(), headerHeight+NmHeaderMargin);
   236                 mScrollArea->scrollContentsTo(pointToWebView,0);
   250                 mScrollArea->scrollContentsTo(pointToWebView,0);
   237             }
   251             }
   238         }
   252         }
   239         
   253         
   240         // Run fetchmessage in queue
   254         // Run fetchmessage in queue
   241         QMetaObject::invokeMethod(this, "fetchMessage", Qt::QueuedConnection);
   255         QMetaObject::invokeMethod(this, "fetchMessage", Qt::QueuedConnection);
   242         // Set view ready
   256         // Set view ready
   243         mViewReady=true;
   257         mViewReady = true;
   244     }
   258     }
   245 }
   259 }
   246 
   260 
   247 /*!
   261 /*!
   248     Function fecthes message data based on parameters
   262     Function fecthes message data based on parameters
   249 */
   263 */
   250 void NmViewerView::loadMessage()
   264 void NmViewerView::loadMessage()
   251 {
   265 {
       
   266     NM_FUNCTION;
       
   267     
   252     if (mMessage) {
   268     if (mMessage) {
   253         delete mMessage;
   269         delete mMessage;
   254         mMessage = NULL;
   270         mMessage = NULL;
   255     }
   271     }
   256     NmId mailboxId;
       
   257     NmId folderId;
       
   258     NmId msgId;
       
   259     // Read start params and message object
   272     // Read start params and message object
   260     if (mStartParam){
   273     if (mStartParam){
   261         mailboxId = mStartParam->mailboxId();
   274         NmId mailboxId = mStartParam->mailboxId();
   262         folderId = mStartParam->folderId();
   275         NmId folderId = mStartParam->folderId();
   263         msgId = mStartParam->messageId();
   276         NmId msgId = mStartParam->messageId();
   264         mMessage = mUiEngine.message(mailboxId, folderId, msgId);
   277         mMessage = mUiEngine.message(mailboxId, folderId, msgId);
   265     }
   278     }
   266 }
   279 }
   267 
   280 
   268 /*!
   281 /*!
   269     Function fecthes message data based on parameters. Returns false if message is available,
   282     Function fecthes message data based on parameters. Returns false if message is available,
   270     true if message have to be fetched
   283     true if message have to be fetched
   271 */
   284 */
   272 void NmViewerView::fetchMessage()
   285 void NmViewerView::fetchMessage()
   273 {
   286 {
   274 #ifdef Q_OS_SYMBIAN
   287     NM_FUNCTION;
       
   288     
   275     if (mMessage) {
   289     if (mMessage) {
   276         NmId mailboxId = mStartParam->mailboxId();
   290         NmId mailboxId = mStartParam->mailboxId();
   277         NmId folderId = mStartParam->folderId();
   291         NmId folderId = mStartParam->folderId();
   278         NmId msgId = mStartParam->messageId();
   292         NmId msgId = mStartParam->messageId();
   279         const NmMessagePart *body = mMessage->htmlBodyPart();
   293         const NmMessagePart *body = mMessage->htmlBodyPart();
   293             if (mMessageFetchingOperation) {
   307             if (mMessageFetchingOperation) {
   294                 connect(mMessageFetchingOperation,
   308                 connect(mMessageFetchingOperation,
   295                         SIGNAL(operationCompleted(int)),
   309                         SIGNAL(operationCompleted(int)),
   296                         this,
   310                         this,
   297                         SLOT(messageFetched(int)));
   311                         SLOT(messageFetched(int)));
   298 
   312                 createAndShowWaitDialog();
   299                 delete mWaitDialog;
   313             }
   300                 mWaitDialog = NULL;
   314         } else {
   301                 // Create new wait dialog and set it to me modal with dimmed background
       
   302                 mWaitDialog = new HbProgressDialog(HbProgressDialog::WaitDialog);
       
   303                 mWaitDialog->setModal(true);
       
   304                 mWaitDialog->setBackgroundFaded(true);
       
   305                 connect(mWaitDialog, SIGNAL(cancelled()), this, SLOT(waitNoteCancelled()));
       
   306                 mWaitDialog->setText(hbTrId("txt_mail_dialog_loading_mail_content"));
       
   307                 // Display wait dialog
       
   308                 mWaitDialog->show();
       
   309             }
       
   310         }
       
   311         else {
       
   312             // message is fetched
   315             // message is fetched
   313             setMessageData();
   316             setMessageData();
   314         }
   317         }
   315 
   318     }
   316     }
       
   317 #else
       
   318     setMessageData();
       
   319 #endif
       
   320 }
   319 }
   321 
   320 
   322 /*!
   321 /*!
   323     This is signalled by mMessageFetchingOperation when the original message is fetched.
   322     This is signalled by mMessageFetchingOperation when the original message is fetched.
   324  */
   323  */
   325 void NmViewerView::messageFetched(int result)
   324 void NmViewerView::messageFetched(int result)
   326 {
   325 {
       
   326     NM_FUNCTION;
       
   327     
   327     mWaitDialog->close();
   328     mWaitDialog->close();
   328 
   329 
   329     if (result == NmNoError && mMessageFetchingOperation) {
   330     if (result == NmNoError && mMessageFetchingOperation) {
   330         if (mMessage) {
   331         if (mMessage) {
   331             delete mMessage;
   332             delete mMessage;
   332             mMessage = NULL;
   333             mMessage = NULL;
   333         }
   334         }
   334         NmId mailboxId;
       
   335         NmId folderId;
       
   336         NmId msgId;
       
   337         // Read start params and message object
   335         // Read start params and message object
   338         if (mStartParam) {
   336         if (mStartParam) {
   339             mailboxId = mStartParam->mailboxId();
   337             NmId mailboxId = mStartParam->mailboxId();
   340             folderId = mStartParam->folderId();
   338             NmId folderId = mStartParam->folderId();
   341             msgId = mStartParam->messageId();
   339             NmId msgId = mStartParam->messageId();
   342             mMessage = mUiEngine.message(mailboxId, folderId, msgId);
   340             mMessage = mUiEngine.message(mailboxId, folderId, msgId);
   343         }
   341         }
   344         setMessageData();
   342         setMessageData();
   345         // Update header message data
   343         // Update header message data
   346 		if (mHeaderWidget){
   344 		if (mHeaderWidget){
   353 /*!
   351 /*!
   354     This is signalled by mWaitDialog when the note is cancelled
   352     This is signalled by mWaitDialog when the note is cancelled
   355  */
   353  */
   356 void NmViewerView::waitNoteCancelled()
   354 void NmViewerView::waitNoteCancelled()
   357 {
   355 {
       
   356     NM_FUNCTION;
       
   357     
   358     if (!mWaitNoteCancelled) {
   358     if (!mWaitNoteCancelled) {
   359         if (mMessageFetchingOperation && mMessageFetchingOperation->isRunning()) { 
   359         if (mMessageFetchingOperation && mMessageFetchingOperation->isRunning()) { 
   360 	        mMessageFetchingOperation->cancelOperation();
   360 	        mMessageFetchingOperation->cancelOperation();
   361         }
   361         }
   362         mWaitNoteCancelled = true;
   362         mWaitNoteCancelled = true;
   368 /*!
   368 /*!
   369     Function sets message data to web view and header
   369     Function sets message data to web view and header
   370 */
   370 */
   371 void NmViewerView::setMessageData()
   371 void NmViewerView::setMessageData()
   372 {
   372 {
       
   373     NM_FUNCTION;
       
   374     
   373     // Connect to observe orientation change events
   375     // Connect to observe orientation change events
   374     connect(mApplication.mainWindow(), SIGNAL(orientationChanged(Qt::Orientation)),
   376     connect(mApplication.mainWindow(), SIGNAL(orientationChanged(Qt::Orientation)),
   375                 this, SLOT(orientationChanged(Qt::Orientation)));
   377                 this, SLOT(orientationChanged(Qt::Orientation)));
   376 
   378 
   377     // Set page parameters
   379     // Set page parameters
   409 /*!
   411 /*!
   410 
   412 
   411 */
   413 */
   412 void NmViewerView::setAttachmentList()
   414 void NmViewerView::setAttachmentList()
   413 {
   415 {
       
   416     NM_FUNCTION;
       
   417     
   414     // Load headerwidget
   418     // Load headerwidget
   415     mAttaWidget = qobject_cast<NmAttachmentListWidget *>(
   419     mAttaWidget = qobject_cast<NmAttachmentListWidget *>(
   416             mDocumentLoader->findObject(NMUI_MESSAGE_VIEWER_ATTALIST));
   420             mDocumentLoader->findObject(NMUI_MESSAGE_VIEWER_ATTALIST));
   417     if (mMessage && mAttaWidget) {
   421     if (mMessage && mAttaWidget) {
   418         // connect atta widget to listen progress value events
   422         // connect atta widget to listen progress value events
   462 /*!
   466 /*!
   463 
   467 
   464 */
   468 */
   465 void NmViewerView::openAttachment(int index)
   469 void NmViewerView::openAttachment(int index)
   466 {
   470 {
       
   471     NM_FUNCTION;
       
   472     
   467     NmId attaId = mAttaIdList.at(index);
   473     NmId attaId = mAttaIdList.at(index);
   468     // reload message to get updates part sizes
   474     // reload message to get updates part sizes
   469     loadMessage();
   475     loadMessage();
   470     QList<NmMessagePart*> messageParts;
   476     QList<NmMessagePart*> messageParts;
   471     mMessage->attachmentList(messageParts);
   477     mMessage->attachmentList(messageParts);
       
   478     NmId mailboxId = mMessage->envelope().mailboxId();
       
   479     NmId folderId = mMessage->envelope().folderId();
       
   480     NmId messageId = mMessage->envelope().messageId();
   472     for (int i = 0; i < messageParts.count(); i++) {
   481     for (int i = 0; i < messageParts.count(); i++) {
   473         // message part found have to found
   482         // message part found have to found
   474         // and its fetched size is smaller than size, then start part fetch
   483         // and its fetched size is smaller than size, then start part fetch
   475         if (messageParts[i]->partId() == attaId &&
   484         if (messageParts[i]->partId() == attaId &&
   476             messageParts[i]->size() > messageParts[i]->fetchedSize()) {
   485             messageParts[i]->size() > messageParts[i]->fetchedSize()) {
   477             // do not start if there's already ongoing fetch
   486             // do not start if there's already ongoing fetch
   478             if (mAttaIndexUnderFetch == NmNotFoundError) {
   487             if (mAttaIndexUnderFetch == NmNotFoundError) {
   479                 mAttaIndexUnderFetch = index;
   488                 mAttaIndexUnderFetch = index;
   480                 mAttaManager.fetchAttachment(
   489                 mAttaManager.fetchAttachment(mailboxId, folderId,
   481                         mMessage->envelope().mailboxId(),
   490                                              messageId, attaId);
   482                         mMessage->envelope().folderId(),
       
   483                         mMessage->envelope().messageId(),
       
   484                         attaId);
       
   485             }
   491             }
   486         }
   492         }
   487         // attachment is fetched, open file
   493         // attachment is fetched, open file
   488         else if (messageParts[i]->partId() == attaId) {
   494         else if (messageParts[i]->partId() == attaId) {
   489             XQSharableFile file = mUiEngine.messagePartFile(
   495             XQSharableFile file = mUiEngine.messagePartFile(mailboxId, folderId,
   490                     mMessage->envelope().mailboxId(),
   496                                                             messageId, attaId);
   491                     mMessage->envelope().folderId(),
       
   492                     mMessage->envelope().messageId(),
       
   493                     attaId);
       
   494             NmUtilities::openFile(file);
   497             NmUtilities::openFile(file);
   495             file.close();
   498             file.close();
   496         }
   499         }
   497     }
   500     }
   498 }
   501 }
   500 /*!
   503 /*!
   501     Function formats message based on actual data
   504     Function formats message based on actual data
   502 */
   505 */
   503 QString NmViewerView::formatMessage()
   506 QString NmViewerView::formatMessage()
   504 {
   507 {
       
   508     NM_FUNCTION;
       
   509     
   505     QString msg = "";
   510     QString msg = "";
   506     // null pointer check for mMessage is done before calling this function
   511     // null pointer check for mMessage is done before calling this function
       
   512     NmId mailboxId = mMessage->envelope().mailboxId();
       
   513     NmId folderId = mMessage->envelope().folderId();
       
   514     NmId messageId = mMessage->envelope().messageId();
   507     NmMessagePart *html = mMessage->htmlBodyPart();
   515     NmMessagePart *html = mMessage->htmlBodyPart();
   508     if (html) {
   516     if (html) {
   509         QList<NmMessagePart*> parts;
   517         QList<NmMessagePart*> parts;
   510         mMessage->attachmentList(parts);
   518         mMessage->attachmentList(parts);
   511         for (int i=0; i < parts.count(); i++) {
   519         for (int i=0; i < parts.count(); i++) {
   512             NmMessagePart *child = parts[i];
   520             NmMessagePart *child = parts[i];
   513             // Browse through embedded image parts and add those
   521             // Browse through embedded image parts and add those
   514             // the web view.
   522             // the web view.
   515             quint32 fetchedSize = child->fetchedSize();
   523             bool isFetched = child->fetchedSize() >= child->size();
   516             quint32 size = child->size();
   524             if (child->contentType().startsWith("image", Qt::CaseInsensitive)) {
   517             if (fetchedSize >= size &&
       
   518                     child->contentType().startsWith("image", Qt::CaseInsensitive)) {
       
   519                 QString contentId = child->contentId();
   525                 QString contentId = child->contentId();
   520                 int ret = mUiEngine.contentToMessagePart(
   526                 if (isFetched) {
   521                         mMessage->envelope().mailboxId(),
   527                     int ret = mUiEngine.contentToMessagePart(
   522                         mMessage->envelope().folderId(),
   528                             mailboxId, folderId, messageId, *child);
   523                         mMessage->envelope().messageId(),
   529                     if (ret == NmNoError) {
   524                         *child);
   530                       mWebView->addContent(contentId, QVariant::fromValue(child->binaryContent()), 
   525                 if (ret == NmNoError) {
   531                               child->partId(), isFetched);
   526                   mWebView->addContent(contentId, QVariant::fromValue(child->binaryContent()));
   532                     }
   527                 }
   533                 }
   528             }
   534                 else {
   529         }
   535                     mWebView->addContent(contentId, QVariant::fromValue(QByteArray()), 
   530         int ret = mUiEngine.contentToMessagePart(
   536                             child->partId(), isFetched);
   531                 mMessage->envelope().mailboxId(),
   537                 }
   532                 mMessage->envelope().folderId(),
   538             }
   533                 mMessage->envelope().messageId(),
   539         }
   534                 *html);
   540         int ret = mUiEngine.contentToMessagePart(mailboxId, folderId, messageId, *html);
   535         if (ret == NmNoError) {
   541         if (ret == NmNoError) {
   536             msg = html->textContent();
   542             msg = html->textContent();
   537         }
   543         }
   538     }
   544     }
   539     else {
   545     else {
   540         NmMessagePart *plain = mMessage->plainTextBodyPart();
   546         NmMessagePart *plain = mMessage->plainTextBodyPart();
   541         if (plain) {
   547         if (plain) {
   542             int ret = mUiEngine.contentToMessagePart(
   548             int ret = mUiEngine.contentToMessagePart(mailboxId, folderId,
   543                     mMessage->envelope().mailboxId(),
   549                                                      messageId, *plain);
   544                     mMessage->envelope().folderId(),
       
   545                     mMessage->envelope().messageId(),
       
   546                     *plain);
       
   547             if (ret == NmNoError) {
   550             if (ret == NmNoError) {
   548                 QTextDocument doku;
   551                 QTextDocument document;
   549                 // set font
   552                 // set font
   550                 QFont currentFont = doku.defaultFont();
   553                 QFont currentFont = document.defaultFont();
   551                 currentFont.setWeight(QFont::Normal);
   554                 currentFont.setWeight(QFont::Normal);
   552                 qreal secondarySize;
   555                 qreal secondarySize;
   553                 HbStyle myStyle;
   556                 HbStyle myStyle;
   554                 bool found = myStyle.parameter(NmParamTextHeightSecondary, secondarySize);
   557                 bool found = myStyle.parameter(NmParamTextHeightSecondary, secondarySize);
   555                 if (found) {
   558                 if (found) {
   556                     HbFontSpec fontSpec(HbFontSpec::Secondary);
   559                     HbFontSpec fontSpec(HbFontSpec::Secondary);
   557                     fontSpec.setTextHeight(secondarySize);
   560                     fontSpec.setTextHeight(secondarySize);
   558                     currentFont.setPixelSize(fontSpec.font().pixelSize());
   561                     currentFont.setPixelSize(fontSpec.font().pixelSize());
   559                 }
   562                 }
   560                 doku.setDefaultFont(currentFont);
   563                 document.setDefaultFont(currentFont);
   561                 // convert to html
   564                 // convert to html
   562                 doku.setPlainText(plain->textContent());
   565                 document.setPlainText(plain->textContent());
   563                 msg = doku.toHtml();
   566                 msg = document.toHtml();
   564 
   567 
   565                 if (qApp->layoutDirection()==Qt::RightToLeft){
   568                 if (qApp->layoutDirection()==Qt::RightToLeft){
   566                     // add right alignment to document css section
   569                     // add right alignment to document css section
   567                     QRegExp rx("(<style type=\"text/css\">)(.+)(</style>)", Qt::CaseInsensitive);
   570                     QRegExp rx("(<style type=\"text/css\">)(.+)(</style>)", Qt::CaseInsensitive);
   568                     rx.setMinimal(true);
   571                     rx.setMinimal(true);
   587     Typically when view is already open and external view activation occurs
   590     Typically when view is already open and external view activation occurs
   588     for this same view
   591     for this same view
   589 */
   592 */
   590 void NmViewerView::reloadViewContents(NmUiStartParam* startParam)
   593 void NmViewerView::reloadViewContents(NmUiStartParam* startParam)
   591 {
   594 {
       
   595     NM_FUNCTION;
       
   596     
   592     // Check start parameter validity, message view cannot
   597     // Check start parameter validity, message view cannot
   593     // be updated if given parameter is zero.
   598     // be updated if given parameter is zero.
   594     if (startParam && startParam->viewId() == NmUiViewMessageViewer &&
   599     if (startParam && startParam->viewId() == NmUiViewMessageViewer &&
   595         startParam->messageId()!= 0) {
   600         startParam->messageId()!= 0) {
   596         // Delete existing start parameter data
   601         // Delete existing start parameter data
   611 /*!
   616 /*!
   612     nmailViewId
   617     nmailViewId
   613 */
   618 */
   614 NmUiViewId NmViewerView::nmailViewId() const
   619 NmUiViewId NmViewerView::nmailViewId() const
   615 {
   620 {
       
   621     NM_FUNCTION;
       
   622     
   616     return NmUiViewMessageViewer;
   623     return NmUiViewMessageViewer;
   617 }
   624 }
   618 
   625 
   619 /*!
   626 /*!
   620     Scale web view width
   627     Scale web view width
   621 */
   628 */
   622 void NmViewerView::webFrameLoaded(bool loaded)
   629 void NmViewerView::webFrameLoaded(bool loaded)
   623 {
   630 {
       
   631     NM_FUNCTION;
       
   632     
   624     if (loaded){
   633     if (loaded){
   625         webFrameloadingCompleted = true;
   634         webFrameloadingCompleted = true;
   626         // Scale web view after loading the
   635         // Scale web view after loading the
   627         // complete contents, including images
   636         // complete contents, including images
   628         QMetaObject::invokeMethod(this, "scaleWebViewWhenLoaded", Qt::QueuedConnection);       
   637         QMetaObject::invokeMethod(this, "scaleWebViewWhenLoaded", Qt::QueuedConnection);       
   632 /*!
   641 /*!
   633     Scale web view width when loading is ongoing
   642     Scale web view width when loading is ongoing
   634 */
   643 */
   635 void NmViewerView::scaleWebViewWhenLoading(const QSize &size)
   644 void NmViewerView::scaleWebViewWhenLoading(const QSize &size)
   636 {
   645 {
       
   646     NM_FUNCTION;
       
   647     
   637     // Try to scale web view while mainframe is being loaded.
   648     // Try to scale web view while mainframe is being loaded.
   638     // So that screen is scrollable even before images are fully loaded
   649     // So that screen is scrollable even before images are fully loaded
   639     // First check that new size is different than previous, no need to react if
   650     // First check that new size is different than previous, no need to react if
   640     // same size value is received more than once.
   651     // same size value is received more than once.
   641     if (size!=mLatestLoadingSize){
   652     if (size != mLatestLoadingSize) {
   642         if (!webFrameloadingCompleted&&mWebView&&mWebView->page()&&
   653         if (!webFrameloadingCompleted && mWebView && mWebView->page() &&
   643             (size.width()>mScreenSize.width()||size.height()>mScreenSize.height())) {
   654             (size.width() > mScreenSize.width() || size.height() > mScreenSize.height())) {
   644             int width = (int)size.width();
   655             int width = (int)size.width();
   645             int height = (int)size.height();
   656             int height = (int)size.height();
   646             // Set content (webview) width
   657             // Set content (webview) width
   647             if (mDisplayingPlainText){
   658             if (mDisplayingPlainText){
   648                 mWebView->setMaximumWidth(mScreenSize.width());
   659                 setWebViewWidth(mScreenSize.width());
   649                 mWebView->setMinimumWidth(mScreenSize.width());
       
   650                 mWebView->setPreferredWidth(mScreenSize.width());
       
   651             }
   660             }
   652             else {
   661             else {
   653                  mWebView->setMaximumWidth(width);
   662                 setWebViewWidth(width);
   654                  mWebView->setMinimumWidth(width);
       
   655                  mWebView->setPreferredWidth(width);
       
   656             }
   663             }
   657             mWebView->setMinimumHeight(height);
   664             mWebView->setMinimumHeight(height);
   658             mWebView->setPreferredHeight(height);
   665             mWebView->setPreferredHeight(height);
   659         }
   666         }
   660     }
   667     }
   661     mLatestLoadingSize=size;
   668     mLatestLoadingSize = size;
   662 }
   669 }
   663 
   670 
   664 /*!
   671 /*!
   665     Scale web view width when loading is completed
   672     Scale web view width when loading is completed
   666 */
   673 */
   667 void NmViewerView::scaleWebViewWhenLoaded()
   674 void NmViewerView::scaleWebViewWhenLoaded()
   668 {
   675 {
       
   676     NM_FUNCTION;
       
   677     
   669     if (mWebView&&mWebView->page()) {
   678     if (mWebView&&mWebView->page()) {
   670         QSizeF contentSize = mWebView->page()->mainFrame()->contentsSize();
   679         QSizeF contentSize = mWebView->page()->mainFrame()->contentsSize();
   671         int width = (int)contentSize.width();
   680         int width = (int)contentSize.width();
   672         int height = (int)contentSize.height();
   681         int height = (int)contentSize.height();
   673         // Set content (webview) width
   682         // Set content (webview) width
   674         if (mDisplayingPlainText){
   683         if (mDisplayingPlainText) {
   675             mWebView->page()->setPreferredContentsSize(mScreenSize);
   684             mWebView->page()->setPreferredContentsSize(mScreenSize);
   676             mWebView->setMinimumWidth(mScreenSize.width());
   685             setWebViewWidth(mScreenSize.width());
   677             mWebView->setMaximumWidth(mScreenSize.width());
   686         } else {
   678             mWebView->setPreferredWidth(mScreenSize.width());
   687             setWebViewWidth(width);
   679         }
       
   680         else {
       
   681             mWebView->setMinimumWidth(width);
       
   682             mWebView->setMaximumWidth(width);
       
   683             mWebView->setPreferredWidth(width);
       
   684         }
   688         }
   685         // Set content (webview) height
   689         // Set content (webview) height
   686         if (mScrollAreaContents){
   690         if (mScrollAreaContents){
   687             QRectF contentRect = mScrollAreaContents->geometry();
   691             QRectF contentRect = mScrollAreaContents->geometry();
   688             if (contentRect.height()<geometry().height()){
   692             if (contentRect.height()<geometry().height()){
   689                 contentRect.setHeight(geometry().height());
   693                 contentRect.setHeight(geometry().height());
   690                 mViewerContent->setPreferredHeight(contentRect.height());
   694                 mViewerContent->setPreferredHeight(contentRect.height());
   691                 qreal webViewHeight = geometry().height()-mHeaderWidget->geometry().height();
   695                 qreal webViewHeight = geometry().height()-mHeaderWidget->geometry().height();
   692                 mWebView->setMinimumHeight(webViewHeight);
   696                 setWebViewHeighth(webViewHeight);
   693                 mWebView->setMaximumHeight(webViewHeight);
   697             } else {
   694                 mWebView->setPreferredHeight(webViewHeight);
   698                 setWebViewHeighth(height);
   695             }
       
   696             else{
       
   697                 mWebView->setMinimumHeight(height);
       
   698                 mWebView->setMaximumHeight(height);
       
   699                 mWebView->setPreferredHeight(height);
       
   700             }
   699             }
   701         }
   700         }
   702     }
   701     }
   703 }
   702 }
   704 
   703 
   706 /*!
   705 /*!
   707     Set new dimensions after orientation change.
   706     Set new dimensions after orientation change.
   708 */
   707 */
   709 void NmViewerView::adjustViewDimensions()
   708 void NmViewerView::adjustViewDimensions()
   710 {
   709 {
       
   710     NM_FUNCTION;
       
   711     
   711     // Update current screensize
   712     // Update current screensize
   712     mScreenSize = mApplication.screenSize();
   713     mScreenSize = mApplication.screenSize();
   713     // Scale header to screen width
   714     // Scale header to screen width
   714     if (mHeaderWidget){
   715     if (mHeaderWidget){
   715         mHeaderWidget->rescaleHeader(mScreenSize);
   716         mHeaderWidget->rescaleHeader(mScreenSize);
   756    landscape <-> portrait switch occurs because text needs to
   757    landscape <-> portrait switch occurs because text needs to
   757    be wrapped again.
   758    be wrapped again.
   758 */
   759 */
   759 void NmViewerView::orientationChanged(Qt::Orientation orientation)
   760 void NmViewerView::orientationChanged(Qt::Orientation orientation)
   760 {
   761 {
       
   762     NM_FUNCTION;
       
   763     
   761     Q_UNUSED(orientation);
   764     Q_UNUSED(orientation);
   762     QTimer::singleShot(NmOrientationTimer, this, SLOT(adjustViewDimensions()));
   765     QTimer::singleShot(NmOrientationTimer, this, SLOT(adjustViewDimensions()));
   763 }
   766 }
   764 
   767 
   765 /*!
   768 /*!
   766    Link clicked callback
   769    Link clicked callback
   767 */
   770 */
   768 void NmViewerView::linkClicked(const QUrl& link)
   771 void NmViewerView::linkClicked(const QUrl& link)
   769 {
   772 {
   770     NMLOG("link clicked");
   773     NM_FUNCTION;
       
   774     
   771       if (link.scheme() == "http" ||
   775       if (link.scheme() == "http" ||
   772           link.scheme() == "https" ) {
   776           link.scheme() == "https" ) {
   773           QDesktopServices::openUrl(link);
   777           QDesktopServices::openUrl(link);
   774       }
   778       }
   775       else if (link.scheme() == "mailto"){
   779       else if (link.scheme() == "mailto"){
   792 /*!
   796 /*!
   793    Send mouse release event to web view
   797    Send mouse release event to web view
   794 */
   798 */
   795 void NmViewerView::handleMouseReleaseEvent(QGraphicsSceneMouseEvent *event)
   799 void NmViewerView::handleMouseReleaseEvent(QGraphicsSceneMouseEvent *event)
   796 {
   800 {
   797     NmMailViewerWK* view = webView();
   801     NM_FUNCTION;
   798     if (event&& view && mHeaderWidget && mScrollAreaContents) {
   802     handleMouseEvent(event, false);
   799         QPointF lastReleasePoint = event->pos();
   803 
   800         QPointF contentWidgetPos = mScrollAreaContents->pos();
       
   801         qreal headerHeight = mHeaderWidget->geometry().height();
       
   802         qreal y = lastReleasePoint.y()-headerHeight;
       
   803         y -= contentWidgetPos.y();
       
   804         qreal x = lastReleasePoint.x()-contentWidgetPos.x();
       
   805         const QPointF pointToWebView(x, y);
       
   806         event->setPos(pointToWebView);
       
   807         event->setAccepted(true);
       
   808         view->sendMouseReleaseEvent(event);
       
   809     }
       
   810 }
   804 }
   811 
   805 
   812 /*!
   806 /*!
   813    Send mouse press event
   807    Send mouse press event
   814 */
   808 */
   815 void NmViewerView::handleMousePressEvent(QGraphicsSceneMouseEvent *event)
   809 void NmViewerView::handleMousePressEvent(QGraphicsSceneMouseEvent *event)
   816 {
   810 {
   817     NmMailViewerWK* view = webView();
   811     NM_FUNCTION;
   818     if (event&& view && mHeaderWidget && mScrollAreaContents) {
   812     handleMouseEvent(event, true);
   819         QPointF lastPressPoint = event->pos();
       
   820         QPointF contentWidgetPos = mScrollAreaContents->pos();
       
   821         qreal headerHeight = mHeaderWidget->geometry().height();
       
   822         qreal y = lastPressPoint.y()-headerHeight;
       
   823         y -= contentWidgetPos.y();
       
   824         qreal x = lastPressPoint.x()-contentWidgetPos.x();
       
   825         const QPointF pointToWebView(x, y);
       
   826         event->setPos(pointToWebView);
       
   827         event->setAccepted(true);
       
   828         view->sendMousePressEvent(event);
       
   829     }
       
   830 }
   813 }
   831 
   814 
   832 /*!
   815 /*!
   833    Function can be used to check whether mouse event has
   816    Function can be used to check whether mouse event has
   834    occured on top of header area.
   817    occured on top of header area.
   835 */
   818 */
   836 bool NmViewerView::eventOnTopOfHeaderArea(QGraphicsSceneMouseEvent *event)
   819 bool NmViewerView::eventOnTopOfHeaderArea(QGraphicsSceneMouseEvent *event)
   837 {
   820 {
       
   821     NM_FUNCTION;
       
   822     
   838     bool ret(false);
   823     bool ret(false);
   839     if (event && mHeaderWidget){
   824     if (event && mHeaderWidget) {
   840         QPointF lastReleasePoint = event->lastPos();
   825         QPointF lastReleasePoint = event->lastPos();
   841         QPointF contentWidgetPos = mScrollAreaContents->pos();
   826         QPointF contentWidgetPos = mScrollAreaContents->pos();
   842         int headerHeight = (int)mHeaderWidget->geometry().height();
   827         int headerHeight = (int)mHeaderWidget->geometry().height();
   843         if (lastReleasePoint.y()<headerHeight+contentWidgetPos.y()){
   828         if (lastReleasePoint.y()<headerHeight+contentWidgetPos.y()) {
   844             ret=true;
   829             ret=true;
   845         }
   830         }
   846     }
   831     }
   847     return ret;
   832     return ret;
   848 }
   833 }
   850 /*!
   835 /*!
   851    get function for content widget web view.
   836    get function for content widget web view.
   852 */
   837 */
   853 NmMailViewerWK* NmViewerView::webView()
   838 NmMailViewerWK* NmViewerView::webView()
   854 {
   839 {
       
   840     NM_FUNCTION;
       
   841     
   855     return mWebView;
   842     return mWebView;
   856 }
   843 }
   857 
   844 
   858 /*!
   845 /*!
       
   846 
       
   847 */
       
   848 NmMessage* NmViewerView::message()
       
   849 {
       
   850     return mMessage;
       
   851 }
       
   852 
       
   853 /*!
   859    Function to set message read status
   854    Function to set message read status
   860 */
   855 */
   861 void NmViewerView::changeMessageReadStatus(bool read)
   856 void NmViewerView::changeMessageReadStatus(bool read)
   862 {
   857 {
       
   858     NM_FUNCTION;
       
   859     
   863     QList<const NmMessageEnvelope*> envelopeList;
   860     QList<const NmMessageEnvelope*> envelopeList;
   864     NmMessageEnvelope *envelope = &mMessage->envelope();
   861     NmMessageEnvelope *envelope = &mMessage->envelope();
   865     QPointer<NmStoreEnvelopesOperation> op(NULL);
   862     QPointer<NmStoreEnvelopesOperation> op(NULL);
   866     if (envelope){
   863     if (envelope) {
   867         if ( read != envelope->isRead() ){
   864         if ( read != envelope->isRead() ){
   868             if (read){
   865             if (read){
   869                 envelope->setRead(true);
   866                 envelope->setRead(true);
   870                 envelopeList.append(envelope);
   867                 envelopeList.append(envelope);
   871                 op = mUiEngine.setEnvelopes(
   868                 op = mUiEngine.setEnvelopes(
   890 /*!
   887 /*!
   891     Set mailbox name to title
   888     Set mailbox name to title
   892 */
   889 */
   893 void NmViewerView::setMailboxName()
   890 void NmViewerView::setMailboxName()
   894 {
   891 {
       
   892     NM_FUNCTION;
       
   893     
   895     if (mStartParam){
   894     if (mStartParam){
   896         NmMailboxMetaData *meta = mUiEngine.mailboxById(mStartParam->mailboxId());
   895         NmMailboxMetaData *meta = mUiEngine.mailboxById(mStartParam->mailboxId());
   897         if (meta){
   896         if (meta) {
   898             setTitle(meta->name());
   897             setTitle(meta->name());
   899         }
   898         }
   900     }
   899     }
   901 }
   900 }
   902 
   901 
   905     Function reacts to scroll position change events and sets
   904     Function reacts to scroll position change events and sets
   906     header to correct position
   905     header to correct position
   907 */
   906 */
   908 void NmViewerView::contentScrollPositionChanged(const QPointF &newPosition)
   907 void NmViewerView::contentScrollPositionChanged(const QPointF &newPosition)
   909 {
   908 {
       
   909     NM_FUNCTION;
       
   910     
   910     if (mWebView&&mHeaderWidget){
   911     if (mWebView&&mHeaderWidget){
   911         QRectF webViewRect = mWebView->geometry();
   912         QRectF webViewRect = mWebView->geometry();
   912         QTransform tr;
   913         QTransform tr;
   913         qreal leftMovementThreshold(webViewRect.width()-mHeaderWidget->geometry().width());
   914         qreal leftMovementThreshold(webViewRect.width()-mHeaderWidget->geometry().width());
   914         if (newPosition.x()<0){
   915         if (newPosition.x()<0) {
   915             tr.translate(webViewRect.topLeft().x() ,0);
   916             tr.translate(webViewRect.topLeft().x() ,0);
   916         }
   917         }
   917         else if (newPosition.x()>=0 && newPosition.x()<leftMovementThreshold){
   918         else if (newPosition.x()>=0 && newPosition.x()<leftMovementThreshold) {
   918             tr.translate(mHeaderStartScenePos.x()+newPosition.x() ,0);
   919             tr.translate(mHeaderStartScenePos.x()+newPosition.x() ,0);
   919         }
   920         }
   920         else {
   921         else {
   921             tr.translate(webViewRect.topLeft().x()+leftMovementThreshold ,0);
   922             tr.translate(webViewRect.topLeft().x()+leftMovementThreshold ,0);
   922         }
   923         }
   923         mHeaderWidget->setTransform(tr);
   924         mHeaderWidget->setTransform(tr);
   924         if (mAttaWidget){
   925         if (mAttaWidget) {
   925             mAttaWidget->setTransform(tr);
   926             mAttaWidget->setTransform(tr);
   926         }
   927         }
   927     }
   928     }
   928     mLatestScrollPos = newPosition;
   929     mLatestScrollPos = newPosition;
   929 }
   930 }
   932     createToolBar. Function asks menu commands from extension
   933     createToolBar. Function asks menu commands from extension
   933     to be added to toolbar owned by the HbView.
   934     to be added to toolbar owned by the HbView.
   934 */
   935 */
   935 void NmViewerView::createToolBar()
   936 void NmViewerView::createToolBar()
   936 {
   937 {
       
   938     NM_FUNCTION;
       
   939     
   937     HbToolBar *tb = toolBar();
   940     HbToolBar *tb = toolBar();
   938     NmUiExtensionManager &extMngr = mApplication.extManager();
   941     NmUiExtensionManager &extMngr = mApplication.extManager();
   939     if (tb && &extMngr && mStartParam) {
   942     if (tb && &extMngr && mStartParam) {
   940         tb->clearActions();
   943         tb->clearActions();
   941         NmActionRequest request(this, NmActionToolbar, NmActionContextViewViewer,
   944         NmActionRequest request(this, NmActionToolbar, NmActionContextViewViewer,
   952     createOptionsMenu. Functions asks menu commands from extension
   955     createOptionsMenu. Functions asks menu commands from extension
   953     to be added to options menu.
   956     to be added to options menu.
   954 */
   957 */
   955 void NmViewerView::createOptionsMenu()
   958 void NmViewerView::createOptionsMenu()
   956 {
   959 {
       
   960     NM_FUNCTION;
       
   961     
   957 	HbMenu *optionsMenu = menu();
   962 	HbMenu *optionsMenu = menu();
   958 	NmUiExtensionManager &extMngr = mApplication.extManager();
   963 	NmUiExtensionManager &extMngr = mApplication.extManager();
   959 	if (optionsMenu && &extMngr && mStartParam) {
   964 	if (optionsMenu && &extMngr && mStartParam) {
   960 		optionsMenu->clearActions();
   965 		optionsMenu->clearActions();
   961 		NmActionRequest request(this, NmActionOptionsMenu, NmActionContextViewViewer,
   966 		NmActionRequest request(this, NmActionOptionsMenu, NmActionContextViewViewer,
   973     handleActionCommand. From NmActionObserver, extension manager calls this
   978     handleActionCommand. From NmActionObserver, extension manager calls this
   974     call to handle menu command in the UI.
   979     call to handle menu command in the UI.
   975 */
   980 */
   976 void NmViewerView::handleActionCommand(NmActionResponse &actionResponse)
   981 void NmViewerView::handleActionCommand(NmActionResponse &actionResponse)
   977 {
   982 {
       
   983     NM_FUNCTION;
       
   984     
   978     bool showSendInProgressNote = false;
   985     bool showSendInProgressNote = false;
   979 
   986 
   980     // Handle options menu or toolbar
   987     // Handle options menu or toolbar
   981     if (actionResponse.menuType() == NmActionOptionsMenu ||
   988     if (actionResponse.menuType() == NmActionOptionsMenu ||
   982     	actionResponse.menuType() == NmActionToolbar) {
   989     	actionResponse.menuType() == NmActionToolbar) {
  1013                     mStartParam->messageId(), NmUiEditorForward);
  1020                     mStartParam->messageId(), NmUiEditorForward);
  1014                 mApplication.enterNmUiView(startParam);
  1021                 mApplication.enterNmUiView(startParam);
  1015             }
  1022             }
  1016             break;
  1023             break;
  1017             case NmActionResponseCommandDeleteMail: {
  1024             case NmActionResponseCommandDeleteMail: {
  1018                 HbMessageBox *messageBox = new HbMessageBox(HbMessageBox::MessageTypeQuestion);
  1025                 deleteMessage();
  1019                 messageBox->setText(hbTrId("txt_mail_dialog_delete_mail"));
       
  1020                 messageBox->setAttribute(Qt::WA_DeleteOnClose);
       
  1021                 messageBox->open(this, SLOT(deleteButton(HbAction*)));
       
  1022                 }
  1026                 }
  1023             break;
  1027             break;
  1024             default:
  1028             default:
  1025                 break;
  1029                 break;
  1026         }
  1030         }
  1037         HbMessageBox::warning(noteText);
  1041         HbMessageBox::warning(noteText);
  1038     }
  1042     }
  1039 }
  1043 }
  1040 
  1044 
  1041 /*!
  1045 /*!
  1042     Slot. Signaled when delete button is pressed
  1046     Deletes the currently open message
  1043 */
  1047 */
  1044 void NmViewerView::deleteButton(HbAction* result)
  1048 void NmViewerView::deleteMessage()
  1045 {
  1049 {
  1046     HbMessageBox *dlg = static_cast<HbMessageBox*>(sender());
  1050     NM_FUNCTION;
  1047     if(result == dlg->actions().at(0)) 
  1051     
  1048     {
  1052     QList<NmId> messageList;
  1049         QList<NmId> messageList;
  1053     messageList.append(mStartParam->messageId());
  1050         messageList.append(mStartParam->messageId());
  1054     
  1051     
  1055     int err = mUiEngine.deleteMessages(mStartParam->mailboxId(),
  1052         int err = mUiEngine.deleteMessages(mStartParam->mailboxId(),
  1056                                        mStartParam->folderId(),
  1053                                            mStartParam->folderId(),
  1057                                        messageList);
  1054                                            messageList);
  1058     
  1055     
  1059     messageList.clear();
  1056         messageList.clear();
  1060     if (NmNoError != err) {
  1057         if (NmNoError != err) {
  1061         // Failed to delete the messages!
  1058             // Failed to delete the messages!
  1062         NMLOG(QString("NmViewerView::handleActionCommand(): failed err=%1").arg(err));
  1059             NMLOG(QString("NmViewerView::handleActionCommand(): failed err=%1").arg(err));
       
  1060         }
       
  1061     }
  1063     }
  1062 }
  1064 }
  1063 
  1065 
  1064 
  1066 
  1065 /*!
  1067 /*!
  1066     This is called when attachment fetch progress changes
  1068     This is called when attachment fetch progress changes
  1067 */
  1069 */
  1068 void NmViewerView::progressChanged(int value)
  1070 void NmViewerView::progressChanged(int value)
  1069 {
  1071 {
       
  1072     NM_FUNCTION;
       
  1073     
  1070     if (mAttaIndexUnderFetch != NmNotFoundError) {
  1074     if (mAttaIndexUnderFetch != NmNotFoundError) {
  1071         // emit signal
  1075         // emit signal
  1072         if (mAttaWidget && mAttaWidget->progressValue(mAttaIndexUnderFetch) < value) {
  1076         if (mAttaWidget && mAttaWidget->progressValue(mAttaIndexUnderFetch) < value) {
  1073             progressValueChanged(mAttaIndexUnderFetch, value);
  1077             progressValueChanged(mAttaIndexUnderFetch, value);
  1074         }
  1078         }
  1078 /*!
  1082 /*!
  1079     This is called when attachment fetch is completed
  1083     This is called when attachment fetch is completed
  1080 */
  1084 */
  1081 void NmViewerView::fetchCompleted(int result)
  1085 void NmViewerView::fetchCompleted(int result)
  1082 {
  1086 {
       
  1087     NM_FUNCTION;
       
  1088     
  1083     if (mAttaWidget && mAttaIndexUnderFetch != NmNotFoundError) {
  1089     if (mAttaWidget && mAttaIndexUnderFetch != NmNotFoundError) {
  1084         if (result == NmNoError) {
  1090         if (result == NmNoError) {
  1085             progressValueChanged(mAttaIndexUnderFetch, 100);
  1091             progressValueChanged(mAttaIndexUnderFetch, 100);
  1086             openAttachment(mAttaIndexUnderFetch);
  1092             openAttachment(mAttaIndexUnderFetch);
  1087         }
  1093         } else {
  1088         else {
       
  1089             mAttaWidget->hideProgressBar(mAttaIndexUnderFetch);
  1094             mAttaWidget->hideProgressBar(mAttaIndexUnderFetch);
  1090         }
  1095         }
  1091     }
  1096     }
  1092     mAttaIndexUnderFetch = NmNotFoundError;
  1097     mAttaIndexUnderFetch = NmNotFoundError;
  1093 }
  1098 }
  1095 /*!
  1100 /*!
  1096     externalDelete. From NmMessageListModel, handles viewer shutdown when current message is deleted.
  1101     externalDelete. From NmMessageListModel, handles viewer shutdown when current message is deleted.
  1097 */
  1102 */
  1098 void NmViewerView::messageDeleted(const NmId &mailboxId, const NmId &folderId, const NmId &messageId)
  1103 void NmViewerView::messageDeleted(const NmId &mailboxId, const NmId &folderId, const NmId &messageId)
  1099 {
  1104 {
  1100     NMLOG("NmViewerView::messageDeleted");
  1105     NM_FUNCTION;
       
  1106     
  1101     if ((mStartParam->viewId() == NmUiViewMessageViewer)
  1107     if ((mStartParam->viewId() == NmUiViewMessageViewer)
  1102         && (mStartParam->mailboxId()== mailboxId)
  1108         && (mStartParam->mailboxId()== mailboxId)
  1103         && (mStartParam->folderId()== folderId)
  1109         && (mStartParam->folderId()== folderId)
  1104         && (mStartParam->messageId()== messageId)){
  1110         && (mStartParam->messageId()== messageId)) {
  1105         mApplication.prepareForPopView();
  1111         mApplication.prepareForPopView();
  1106     }
  1112     }
  1107 }
  1113 }
  1108 
  1114 
       
  1115 /*!
       
  1116     Helper function for wait dialog creation.
       
  1117 */
       
  1118 void NmViewerView::createAndShowWaitDialog()
       
  1119 {
       
  1120     NM_FUNCTION;
       
  1121     
       
  1122     delete mWaitDialog;
       
  1123     mWaitDialog = NULL;
       
  1124     // Create new wait dialog and set it to me modal with dimmed background
       
  1125     mWaitDialog = new HbProgressDialog(HbProgressDialog::WaitDialog);
       
  1126     mWaitDialog->setModal(true);
       
  1127     mWaitDialog->setBackgroundFaded(true);
       
  1128     connect(mWaitDialog, SIGNAL(cancelled()), this, SLOT(waitNoteCancelled()));
       
  1129     mWaitDialog->setText(hbTrId("txt_mail_dialog_loading_mail_content"));
       
  1130     // Display wait dialog
       
  1131     mWaitDialog->show(); 
       
  1132 }
       
  1133 
       
  1134 /*!
       
  1135     Helper function for width.
       
  1136 */
       
  1137 void NmViewerView::setWebViewWidth(int width)
       
  1138 {
       
  1139     NM_FUNCTION;
       
  1140     
       
  1141     // null pointer check for mWebView in calling function
       
  1142     mWebView->setMinimumWidth(width);
       
  1143     mWebView->setMaximumWidth(width);
       
  1144     mWebView->setPreferredWidth(width);
       
  1145 }
       
  1146 
       
  1147 /*!
       
  1148     Helper function for heigth.
       
  1149 */
       
  1150 void NmViewerView::setWebViewHeighth(int height)
       
  1151 {
       
  1152     NM_FUNCTION;
       
  1153     
       
  1154     // null pointer check for mWebView in calling function
       
  1155     mWebView->setMinimumHeight(height);
       
  1156     mWebView->setMaximumHeight(height);
       
  1157     mWebView->setPreferredHeight(height);
       
  1158 }
       
  1159 
       
  1160 /*!
       
  1161     Helper function for mouse events.
       
  1162 */
       
  1163 void NmViewerView::handleMouseEvent(QGraphicsSceneMouseEvent *event, bool pressed)
       
  1164 {
       
  1165     NM_FUNCTION;
       
  1166     NmMailViewerWK* view = webView();
       
  1167     if (event && view && mHeaderWidget && mScrollAreaContents) {
       
  1168         QPointF lastReleasePoint = event->pos();
       
  1169         QPointF contentWidgetPos = mScrollAreaContents->pos();
       
  1170         qreal headerHeight = mHeaderWidget->geometry().height();
       
  1171         qreal y = lastReleasePoint.y()-headerHeight;
       
  1172         y -= contentWidgetPos.y();
       
  1173         qreal x = lastReleasePoint.x()-contentWidgetPos.x();
       
  1174         const QPointF pointToWebView(x, y);
       
  1175         event->setPos(pointToWebView);
       
  1176         event->setAccepted(true);
       
  1177         if (pressed) {
       
  1178             view->sendMousePressEvent(event);
       
  1179         } else {
       
  1180             view->sendMouseReleaseEvent(event);
       
  1181         }
       
  1182     }
       
  1183 }