emailuis/nmailui/src/nmviewerview.cpp
changeset 23 2dc6caa42ec3
parent 20 ecc8def7944a
child 27 9ba4404ef423
equal deleted inserted replaced
20:ecc8def7944a 23:2dc6caa42ec3
    24 static const char *NMUI_MESSAGE_VIEWER_SCROLL_AREA_CONTENTS = "viewerScrollAreaContents";
    24 static const char *NMUI_MESSAGE_VIEWER_SCROLL_AREA_CONTENTS = "viewerScrollAreaContents";
    25 static const char *NMUI_MESSAGE_VIEWER_HEADER = "viewerHeader";
    25 static const char *NMUI_MESSAGE_VIEWER_HEADER = "viewerHeader";
    26 static const char *NMUI_MESSAGE_VIEWER_ATTALIST = "viewerAttaList";
    26 static const char *NMUI_MESSAGE_VIEWER_ATTALIST = "viewerAttaList";
    27 static const char *NMUI_MESSAGE_VIEWER_SCROLL_WEB_VIEW = "viewerWebView";
    27 static const char *NMUI_MESSAGE_VIEWER_SCROLL_WEB_VIEW = "viewerWebView";
    28 
    28 
    29 static const int nmViewLoadTimer=10;
    29 static const int NmOrientationTimer = 100;
    30 static const int nmOrientationTimer=100;
    30 static const int NmHeaderMargin = 3;
    31 
    31 
    32 static const QString NmParamTextHeightSecondary = "hb-param-text-height-secondary";
    32 static const QString NmParamTextHeightSecondary = "hb-param-text-height-secondary";
    33 
    33 
    34 /*!
    34 /*!
    35 	\class NmViewerView
    35 	\class NmViewerView
    36 	\brief Mail viewer class
    36 	\brief Mail viewer class
    37 */ 
    37 */
    38 
    38 
    39 /*!
    39 /*!
    40     Constructor
    40     Constructor
    41 */
    41 */
    42 NmViewerView::NmViewerView(
    42 NmViewerView::NmViewerView(
    43     NmApplication &application,
    43     NmApplication &application,
    44     NmUiStartParam* startParam,
    44     NmUiStartParam* startParam,
    45     NmUiEngine &uiEngine,
    45     NmUiEngine &uiEngine,
    46     HbMainWindow *mainWindow,
    46     HbMainWindow *mainWindow,
    47     bool toolbar,
    47     NmAttachmentManager &attaManager,
       
    48     bool toolbarEnabled,
    48     QGraphicsItem *parent)
    49     QGraphicsItem *parent)
    49 :NmBaseView(startParam, parent),
    50 :NmBaseView(startParam, parent),
    50 mApplication(application),
    51 mApplication(application),
    51 mUiEngine(uiEngine),
    52 mUiEngine(uiEngine),
    52 mMainWindow(mainWindow),
    53 mMainWindow(mainWindow),
    53 mToolbar(toolbar),
    54 mAttaManager(attaManager),
       
    55 mToolbarEnabled(toolbarEnabled),
    54 mMessage(NULL),
    56 mMessage(NULL),
    55 mScrollArea(NULL),
    57 mScrollArea(NULL),
    56 mViewerContent(NULL),
    58 mViewerContent(NULL),
    57 mWebView(NULL),
    59 mWebView(NULL),
    58 mHeaderWidget(NULL),
    60 mHeaderWidget(NULL),
    62 mDocumentLoader(NULL),
    64 mDocumentLoader(NULL),
    63 mScrollAreaContents(NULL),
    65 mScrollAreaContents(NULL),
    64 mViewerHeaderContainer(NULL),
    66 mViewerHeaderContainer(NULL),
    65 mScreenSize(QSize(0,0)),
    67 mScreenSize(QSize(0,0)),
    66 mWaitDialog(NULL),
    68 mWaitDialog(NULL),
    67 loadingCompleted(false),
    69 webFrameloadingCompleted(false),
    68 mLatestLoadingSize(QSize(0,0)),
    70 mLatestLoadingSize(QSize(0,0)),
    69 mFetchOperation(NULL),
       
    70 mAttaIndexUnderFetch(NmNotFoundError),
    71 mAttaIndexUnderFetch(NmNotFoundError),
    71 mAttaWidget(NULL)
    72 mAttaWidget(NULL),
       
    73 mViewReady(false),
       
    74 mWaitNoteCancelled(false),
       
    75 mOkAction(NULL),
       
    76 mCancelAction(NULL)
    72     {
    77     {
    73     // Create documentloader
    78     // Create documentloader
    74     mDocumentLoader = new NmUiDocumentLoader(mMainWindow);
    79     mDocumentLoader = new NmUiDocumentLoader(mMainWindow);
    75     // Get screensize
    80     // Get screensize
    76     mScreenSize = mApplication.screenSize();
    81     mScreenSize = mApplication.screenSize();
       
    82     // Connect external delete handling to uiengine signal
       
    83     connect(&mUiEngine,
       
    84             SIGNAL(messageDeleted(const NmId &, const NmId &, const NmId &)),
       
    85             this, SLOT(messageDeleted(const NmId &, const NmId &, const NmId &)),
       
    86             Qt::UniqueConnection);
    77     // Fetch message
    87     // Fetch message
    78     loadMessage();
    88     loadMessage();
    79     // Load view layout
    89     // Load view layout
    80     loadViewLayout();
    90     loadViewLayout();
    81     // Set message data
       
    82     QTimer::singleShot(nmViewLoadTimer, this, SLOT(fetchMessage()));
       
    83 }
    91 }
    84 
    92 
    85 /*!
    93 /*!
    86     Destructor
    94     Destructor
    87 */
    95 */
    88 NmViewerView::~NmViewerView()
    96 NmViewerView::~NmViewerView()
    89 {
    97 {
    90     delete mWebView;
    98     delete mWebView;
    91     mWebView=NULL;
    99     mWebView = NULL;
    92     delete mMessage;
   100     delete mMessage;
    93     mMessage = NULL;
   101     mMessage = NULL;
    94     delete mDocumentLoader;
   102     delete mDocumentLoader;
    95     mDocumentLoader = NULL;
   103     mDocumentLoader = NULL;
    96     mWidgetList.clear();
   104     mWidgetList.clear();
    97     delete mWaitDialog;
   105     delete mWaitDialog;
    98     mWaitDialog = NULL;
   106     mWaitDialog = NULL;
    99     delete mFetchOperation;
   107     // remove view from osbserving atta manager events
   100     mFetchOperation = NULL;
   108     mAttaManager.clearObserver();
       
   109     mAttaManager.cancelFetch();
       
   110     delete mOkAction;
       
   111     mOkAction = NULL;
       
   112     delete mCancelAction;
       
   113     mCancelAction = NULL;
       
   114 }
       
   115 
       
   116 /*!
       
   117     View is about to exit
       
   118 */
       
   119 void NmViewerView::aboutToExitView()
       
   120 {
       
   121     // View is about to exit, for safety, stop 
       
   122     // loading of content before closing the view
       
   123     if (mWebView){
       
   124         mWebView->stop();
       
   125         if (mWebView->page()){
       
   126             mWebView->page()->deleteLater();
       
   127         }
       
   128     }
   101 }
   129 }
   102 
   130 
   103 /*!
   131 /*!
   104     View layout loading from XML
   132     View layout loading from XML
   105 */
   133 */
   118     }
   146     }
   119     int widgetCount = mWidgetList.count();
   147     int widgetCount = mWidgetList.count();
   120     if (ok == true && widgetCount)
   148     if (ok == true && widgetCount)
   121     {
   149     {
   122         // Create content and content layout
   150         // Create content and content layout
       
   151         // qobject_cast not work in this case, using reinterpret_cast
   123         mViewerContent = reinterpret_cast<HbWidget *>(
   152         mViewerContent = reinterpret_cast<HbWidget *>(
   124                 mDocumentLoader->findObject(NMUI_MESSAGE_VIEWER_CONTENT));
   153                 mDocumentLoader->findObject(NMUI_MESSAGE_VIEWER_CONTENT));
   125         // Find scroll area
   154         // Find scroll area
   126         mScrollArea = reinterpret_cast<NmBaseViewScrollArea *>(
   155         mScrollArea = reinterpret_cast<NmBaseViewScrollArea *>(
   127                 mDocumentLoader->findObject(NMUI_MESSAGE_VIEWER_SCROLL_AREA));
   156                 mDocumentLoader->findObject(NMUI_MESSAGE_VIEWER_SCROLL_AREA));
   128         if (mScrollArea){
   157         if (mScrollArea) {
   129             mScrollArea->setParentItem(this);
   158             mScrollArea->setParentItem(this);
   130             mScrollArea->setScrollDirections(Qt::Vertical | Qt::Horizontal);
   159             mScrollArea->setScrollDirections(Qt::Vertical | Qt::Horizontal);
   131             connect(mScrollArea, SIGNAL(scrollPositionChanged(QPointF)),
   160             connect(mScrollArea, SIGNAL(scrollPositionChanged(QPointF)),
   132                 this, SLOT(contentScrollPositionChanged(QPointF)));
   161                 this, SLOT(contentScrollPositionChanged(QPointF)));
   133             connect(mScrollArea, SIGNAL(handleMousePressEvent(QGraphicsSceneMouseEvent*)),
   162             connect(mScrollArea, SIGNAL(handleMousePressEvent(QGraphicsSceneMouseEvent*)),
   140                     mDocumentLoader->findObject(NMUI_MESSAGE_VIEWER_SCROLL_AREA_CONTENTS));
   169                     mDocumentLoader->findObject(NMUI_MESSAGE_VIEWER_SCROLL_AREA_CONTENTS));
   141             if (mScrollAreaContents->layout()){
   170             if (mScrollAreaContents->layout()){
   142                 mScrollAreaContents->layout()->setContentsMargins(0,0,0,0);
   171                 mScrollAreaContents->layout()->setContentsMargins(0,0,0,0);
   143             }
   172             }
   144 
   173 
   145             // Set white pixmap to backgrounditem
   174             // Set white pixmap to backgrounditem 
   146             QPixmap whitePixmap(10,10);
   175             QPixmap whitePixmap(10,10);
   147             whitePixmap.fill(Qt::white);
   176             whitePixmap.fill(Qt::white);
   148             QGraphicsPixmapItem *pixmapItem = new QGraphicsPixmapItem(whitePixmap);
   177             QGraphicsPixmapItem *pixmapItem = new QGraphicsPixmapItem(whitePixmap);
   149             mScrollAreaContents->setBackgroundItem(pixmapItem);
   178             mScrollAreaContents->setBackgroundItem(pixmapItem);
   150 
   179 
   159             }
   188             }
   160 
   189 
   161             // Load webview
   190             // Load webview
   162             mWebView = reinterpret_cast<NmMailViewerWK *>(
   191             mWebView = reinterpret_cast<NmMailViewerWK *>(
   163                     mDocumentLoader->findObject(QString(NMUI_MESSAGE_VIEWER_SCROLL_WEB_VIEW)));
   192                     mDocumentLoader->findObject(QString(NMUI_MESSAGE_VIEWER_SCROLL_WEB_VIEW)));
   164             if (mWebView){
   193             if (mWebView) {
   165                 mWebView->setParentView(this);
   194                 mWebView->setParentView(this);
       
   195                 // Set auto load images and private browsing(no history) attributes
       
   196                 mWebView->settings()->setAttribute(QWebSettings::AutoLoadImages, true);
       
   197                 mWebView->settings()->setAttribute(QWebSettings::PrivateBrowsingEnabled, true);                                
   166                 HbEditorInterface editorInterface(mWebView);
   198                 HbEditorInterface editorInterface(mWebView);
   167                 editorInterface.setConstraints(HbEditorConstraintIgnoreFocus);
   199                 editorInterface.setInputConstraints(HbEditorConstraintIgnoreFocus);
   168                 mWebView->setAcceptedMouseButtons(Qt::NoButton);
   200                 mWebView->setAcceptedMouseButtons(Qt::NoButton);
   169                 if (mWebView->page()){
   201                 if (mWebView->page()){
   170                     mWebView->page()->mainFrame()->setScrollBarPolicy(Qt::Vertical, 
   202                     mWebView->page()->mainFrame()->setScrollBarPolicy(Qt::Vertical,
   171                                                                       Qt::ScrollBarAlwaysOff);
   203                                                                       Qt::ScrollBarAlwaysOff);
   172                     mWebView->page()->mainFrame()->setScrollBarPolicy(Qt::Horizontal, 
   204                     mWebView->page()->mainFrame()->setScrollBarPolicy(Qt::Horizontal,
   173                                                                       Qt::ScrollBarAlwaysOff);         
   205                                                                       Qt::ScrollBarAlwaysOff);
   174                     bool connectOk = connect(mWebView->page()->mainFrame(), 
   206                     connect(mWebView->page()->mainFrame(),
   175                             SIGNAL(contentsSizeChanged(const QSize&)),
   207                             SIGNAL(contentsSizeChanged(const QSize&)),
   176                         this, SLOT(scaleWebViewWhenLoading(const QSize&)));                                       
   208                         this, SLOT(scaleWebViewWhenLoading(const QSize&)));
   177                 }
   209                 }
   178              }
   210              }
   179         } 
   211         }
   180         if(!mToolbar) {
   212     }
   181 			// Connect options menu about to show to create options menu function
   213 }
   182 			QObject::connect(menu(), SIGNAL(aboutToShow()),
   214  
   183 					this, SLOT(createOptionsMenu()));
   215 /*!
   184 			
   216     Lazy loading when view layout has been loaded
   185 			// Menu needs one dummy item so that aboutToShow signal is emitted.
   217 */
   186 			NmAction *dummy = new NmAction(0);
   218 void NmViewerView::viewReady()
   187 			menu()->addAction(dummy);
   219 {
   188         }
   220     if (!mViewReady){
   189     }
   221         // Set mailbox name to title
   190     if(mStartParam){
   222         setMailboxName();
   191         connect(&mUiEngine.messageListModel(mStartParam->mailboxId(), mStartParam->folderId()), 
   223         // Create toolbar if needed
   192                 SIGNAL(removeMessage(const NmId&)), this, SLOT(externalDelete(const NmId &)));
   224         if (mToolbarEnabled) {
   193     }
   225             createToolBar();
   194     
   226         }
   195     if(mToolbar) {
   227         else {
   196 		// call the createToolBar on load view layout
   228             // Connect options menu about to show to create options menu function
   197 		createToolBar(); 
   229             QObject::connect(menu(), SIGNAL(aboutToShow()),
   198     }
   230                     this, SLOT(createOptionsMenu())); 
   199     // Set mailbox name to title
   231             // Menu needs one dummy item so that aboutToShow signal is emitted.
   200     setMailboxName();
   232             NmAction *dummy = new NmAction(0);
       
   233             menu()->addAction(dummy);
       
   234         }
       
   235         
       
   236         
       
   237         if (mHeaderWidget){
       
   238             QPointF contentWidgetPos = mScrollArea->pos();
       
   239             qreal headerHeight = mHeaderWidget->geometry().height();
       
   240             if(mMainWindow->orientation()==Qt::Horizontal) {
       
   241                 const QPointF pointToWebView(contentWidgetPos.x(), headerHeight+NmHeaderMargin);
       
   242                 mScrollArea->scrollContentsTo(pointToWebView,0);
       
   243             }
       
   244         }
       
   245         
       
   246         // Run fetchmessage in queue
       
   247         QMetaObject::invokeMethod(this, "fetchMessage", Qt::QueuedConnection);
       
   248         // Set view ready
       
   249         mViewReady=true;
       
   250     }
   201 }
   251 }
   202 
   252 
   203 /*!
   253 /*!
   204     Function fecthes message data based on parameters
   254     Function fecthes message data based on parameters
   205 */
   255 */
   239         }
   289         }
   240         // try to fetch if body missing or fetched size is smaller than content size
   290         // try to fetch if body missing or fetched size is smaller than content size
   241         // if body missing it might mean that only header is fetched or message has no body
   291         // if body missing it might mean that only header is fetched or message has no body
   242         if (!body || (body && (body->fetchedSize() < body->size()))) {
   292         if (!body || (body && (body->fetchedSize() < body->size()))) {
   243             // start fetching operation
   293             // start fetching operation
       
   294             if (mMessageFetchingOperation && mMessageFetchingOperation->isRunning()) { 
       
   295                 mMessageFetchingOperation->cancelOperation();
       
   296             }
       
   297             mMessageFetchingOperation = mUiEngine.fetchMessage(mailboxId, folderId, msgId);
       
   298 
   244             if (mMessageFetchingOperation) {
   299             if (mMessageFetchingOperation) {
   245                 mMessageFetchingOperation->cancelOperation();
       
   246                 delete mMessageFetchingOperation;
       
   247                 mMessageFetchingOperation = NULL;
       
   248             }
       
   249             mMessageFetchingOperation = mUiEngine.fetchMessage(mailboxId, folderId, msgId);
       
   250 
       
   251             if (mMessageFetchingOperation) {
       
   252                 // QObject handles deletion
       
   253                 mMessageFetchingOperation->setParent(this);
       
   254                 connect(mMessageFetchingOperation,
   300                 connect(mMessageFetchingOperation,
   255                         SIGNAL(operationCompleted(int)),
   301                         SIGNAL(operationCompleted(int)),
   256                         this,
   302                         this,
   257                         SLOT(messageFetched(int)));
   303                         SLOT(messageFetched(int)));
   258                 
   304 
   259                 delete mWaitDialog;
   305                 delete mWaitDialog;
   260                 mWaitDialog = NULL;
   306                 mWaitDialog = NULL;
   261                 // Create new wait dialog and set it to me modal with dimmed background
   307                 // Create new wait dialog and set it to me modal with dimmed background
   262                 mWaitDialog = new HbProgressDialog(HbProgressDialog::WaitDialog);
   308                 mWaitDialog = new HbProgressDialog(HbProgressDialog::WaitDialog);
   263                 mWaitDialog->setModal(true);
   309                 mWaitDialog->setModal(true);
   284  */
   330  */
   285 void NmViewerView::messageFetched(int result)
   331 void NmViewerView::messageFetched(int result)
   286 {
   332 {
   287     delete mWaitDialog;
   333     delete mWaitDialog;
   288     mWaitDialog = NULL;
   334     mWaitDialog = NULL;
   289     
   335 
   290     if (result == NmNoError && mMessageFetchingOperation) {
   336     if (result == NmNoError && mMessageFetchingOperation) {
   291         if (mMessage) {
   337         if (mMessage) {
   292             delete mMessage;
   338             delete mMessage;
   293             mMessage = NULL;
   339             mMessage = NULL;
   294         }
   340         }
   295         NmId mailboxId;
   341         NmId mailboxId;
   296         NmId folderId;
   342         NmId folderId;
   297         NmId msgId;
   343         NmId msgId;
   298         // Read start params and message object
   344         // Read start params and message object
   299         if (mStartParam){
   345         if (mStartParam) {
   300             mailboxId = mStartParam->mailboxId();
   346             mailboxId = mStartParam->mailboxId();
   301             folderId = mStartParam->folderId();
   347             folderId = mStartParam->folderId();
   302             msgId = mStartParam->messageId();
   348             msgId = mStartParam->messageId();
   303             mMessage = mUiEngine.message(mailboxId, folderId, msgId);
   349             mMessage = mUiEngine.message(mailboxId, folderId, msgId);
   304         }
   350         }
   305         setMessageData();
   351         setMessageData();
   306         // Update header message data
   352         // Update header message data
   307 		if (mHeaderWidget){
   353 		if (mHeaderWidget){
   308         	mHeaderWidget->updateMessageData(mMessage);		
   354         	mHeaderWidget->updateMessageData(mMessage);
   309 		}
   355 		}
   310     }
   356     }
   311 }
   357 }
   312 
   358 
   313 
   359 
   314 /*!
   360 /*!
   315     This is signalled by mWaitDialog when the note is cancelled
   361     This is signalled by mWaitDialog when the note is cancelled
   316  */
   362  */
   317 void NmViewerView::waitNoteCancelled()
   363 void NmViewerView::waitNoteCancelled()
   318 {
   364 {
   319     if (mMessageFetchingOperation) {
   365     if (!mWaitNoteCancelled) {
   320         mMessageFetchingOperation->cancelOperation();
   366         if (mMessageFetchingOperation && mMessageFetchingOperation->isRunning()) { 
   321     }
   367 	        mMessageFetchingOperation->cancelOperation();
   322     QTimer::singleShot(nmViewLoadTimer, &mApplication, SLOT(popView()));
   368         }
       
   369         mWaitNoteCancelled = true;
       
   370         QMetaObject::invokeMethod(&mApplication, "popView", Qt::QueuedConnection);
       
   371     }
   323 }
   372 }
   324 
   373 
   325 
   374 
   326 /*!
   375 /*!
   327     Function sets message data to web view and header
   376     Function sets message data to web view and header
   339     }
   388     }
   340     if (page){
   389     if (page){
   341         // Set custom network access manager for embedded image handling
   390         // Set custom network access manager for embedded image handling
   342         NmViewerViewNetManager &netMngr = mApplication.networkAccessManager();
   391         NmViewerViewNetManager &netMngr = mApplication.networkAccessManager();
   343         netMngr.setView(this);
   392         netMngr.setView(this);
   344         page->setNetworkAccessManager(&netMngr);        
   393         page->setNetworkAccessManager(&netMngr);
   345             
   394 
   346         connect(page, SIGNAL(loadFinished(bool)),
   395         connect(page, SIGNAL(loadFinished(bool)),
   347                     this, SLOT(webFrameLoaded(bool)));
   396                     this, SLOT(webFrameLoaded(bool)));
   348         page->setLinkDelegationPolicy(QWebPage::DelegateAllLinks);
   397         page->setLinkDelegationPolicy(QWebPage::DelegateAllLinks);
   349         page->setContentEditable(false);
   398         page->setContentEditable(false);
   350     }
   399     }
   371 {
   420 {
   372     // Load headerwidget
   421     // Load headerwidget
   373     mAttaWidget = qobject_cast<NmAttachmentListWidget *>(
   422     mAttaWidget = qobject_cast<NmAttachmentListWidget *>(
   374             mDocumentLoader->findObject(NMUI_MESSAGE_VIEWER_ATTALIST));
   423             mDocumentLoader->findObject(NMUI_MESSAGE_VIEWER_ATTALIST));
   375     if (mMessage && mAttaWidget) {
   424     if (mMessage && mAttaWidget) {
       
   425         // connect atta widget to listen progress value events
       
   426         QObject::connect(this, SIGNAL(progressValueChanged(int, int)),
       
   427                 mAttaWidget, SLOT(setProgressBarValue(int, int)));
   376         // Set atta widget text color black since header has static white bg.
   428         // Set atta widget text color black since header has static white bg.
   377         mAttaWidget->setTextColor(Qt::black);
   429         mAttaWidget->setTextColor(Qt::black);
   378         // Set attawidget minimum & maximum size
   430         // Set attawidget minimum & maximum size
   379         mAttaWidget->setMinimumWidth(mScreenSize.width());
   431         mAttaWidget->setMinimumWidth(mScreenSize.width());
   380         mAttaWidget->setMaximumWidth(mScreenSize.width());   
   432         mAttaWidget->setMaximumWidth(mScreenSize.width());
   381         bool inserted = false; 
   433         bool inserted = false;
   382         QList<NmMessagePart*> messageParts;
   434         QList<NmMessagePart*> messageParts;
   383         mMessage->attachmentList(messageParts);
   435         mMessage->attachmentList(messageParts);
   384         for (int i = 0; i < messageParts.count();i++) {
   436         for (int i = 0; i < messageParts.count();i++) {
   385             NmMessagePart *part = messageParts[i];           
   437             NmMessagePart *part = messageParts[i];
   386             if (part && 
   438             if (part &&
   387                 part->contentDisposition().compare("inline", Qt::CaseInsensitive) && 
   439                 ((part->contentDisposition().trimmed().startsWith("inline", Qt::CaseInsensitive)==false) ||
   388                 !(part->contentType().startsWith("image", Qt::CaseInsensitive))) {
   440                  (part->contentType().trimmed().startsWith("image", Qt::CaseInsensitive)==false))) {
   389                 QString fileName = part->attachmentName();
   441                 QString fileName = part->attachmentName();
   390                 // index starts from zero, next index is same as count
   442                 // index starts from zero, next index is same as count
   391                 int attaIndex = mAttaWidget->count();
   443                 int attaIndex = mAttaWidget->count();
   392                 mAttaWidget->insertAttachment(attaIndex, fileName, 
   444                 mAttaWidget->insertAttachment(attaIndex, fileName,
   393                                               NmUtilities::attachmentSizeString(part->size()));
   445                                               NmUtilities::attachmentSizeString(part->size()));
   394                 mAttaIdList.insert(attaIndex, part->id());
   446                 mAttaIdList.insert(attaIndex, part->partId());
       
   447                 // check is part under fetch, add progress value to attachment widget
       
   448                 if (mAttaManager.isFetching() && 
       
   449                         mAttaManager.partIdUnderFetch() == part->partId()) {
       
   450                     mAttaIndexUnderFetch = attaIndex;
       
   451                 }
   395                 inserted = true;
   452                 inserted = true;
   396             }
   453             }
   397         }
   454         }
   398         if (inserted) { 
   455         if (inserted) {
   399             QObject::connect(mAttaWidget, SIGNAL(itemActivated(int)),
   456             QObject::connect(mAttaWidget, SIGNAL(itemActivated(int)),
   400                     this, SLOT(openAttachment(int)));
   457                     this, SLOT(openAttachment(int)));
   401         }
   458         }
   402         else {
   459         else {
   403             // No attachments, set height to 0
   460             // No attachments, set height to 0
   404             mAttaWidget->setMinimumHeight(0);
   461             mAttaWidget->setMinimumHeight(0);
   405             mAttaWidget->setMaximumHeight(0);             
   462             mAttaWidget->setMaximumHeight(0);
   406             }
   463         }
       
   464         // set this as a observer for attachment manager
       
   465         mAttaManager.setObserver(this);
   407     }
   466     }
   408 }
   467 }
   409 
   468 
   410 /*!
   469 /*!
   411 
   470 
   412 */
   471 */
   413 void NmViewerView::openAttachment(int index)
   472 void NmViewerView::openAttachment(int index)
   414 {
   473 {
   415     // fetch operation should not be running
   474     NmId attaId = mAttaIdList.at(index);
   416     if (mAttaIndexUnderFetch == NmNotFoundError) {
   475     // reload message to get updates part sizes
   417         NmId attaId = mAttaIdList.at(index);
   476     loadMessage();
   418         // reload message to get updates part sizes
   477     QList<NmMessagePart*> messageParts;
   419         loadMessage();
   478     mMessage->attachmentList(messageParts);
   420         QList<NmMessagePart*> messageParts;
   479     for (int i = 0; i < messageParts.count(); i++) {
   421         mMessage->attachmentList(messageParts);
   480         // message part found have to found
   422         for (int i = 0; i < messageParts.count(); i++) {
   481         // and its fetched size is smaller than size, then start part fetch
   423             // if message part found and its fetched size is smaller than size start part fetch
   482         if (messageParts[i]->partId() == attaId &&
   424             if (messageParts[i]->id() == attaId &&
   483             messageParts[i]->size() > messageParts[i]->fetchedSize()) {
   425                 messageParts[i]->size() > messageParts[i]->fetchedSize()) {
   484             // do not start if there's already ongoing fetch
   426                 // delete old message fetch operation
   485             if (mAttaIndexUnderFetch == NmNotFoundError) {
   427                 if (mFetchOperation) {
   486                 mAttaIndexUnderFetch = index;
   428                     delete mFetchOperation;
   487                 mAttaManager.fetchAttachment(
   429                     mFetchOperation = NULL;
   488                         mMessage->envelope().mailboxId(),
   430                 }
   489                         mMessage->envelope().folderId(),
   431                 // can return null
   490                         mMessage->envelope().messageId(),
   432                 mFetchOperation = mUiEngine.fetchMessagePart(
       
   433                         mMessage->mailboxId(),
       
   434                         mMessage->parentId(),
       
   435                         mMessage->envelope().id(),
       
   436                         attaId);
   491                         attaId);
   437                 if (mFetchOperation) {
   492             }
   438                     mAttaIndexUnderFetch = index;
   493         }
   439                     QObject::connect(mFetchOperation, SIGNAL(operationCompleted(int)),
   494         // attachment is fetched, open file
   440                             this, SLOT(attachmentFetchCompleted(int)));
   495         else if (messageParts[i]->partId() == attaId) {
   441                     QObject::connect(mFetchOperation, SIGNAL(operationProgressChanged(int)),
   496             XQSharableFile file = mUiEngine.messagePartFile(
   442                             this, SLOT(changeProgress(int)));
   497                     mMessage->envelope().mailboxId(),
   443                     QObject::connect(this, SIGNAL(progressValueChanged(int, int)),
   498                     mMessage->envelope().folderId(),
   444                             mAttaWidget, SLOT(setProgressBarValue(int, int)));
   499                     mMessage->envelope().messageId(),
   445                     // emit signal, set progress to 5% when started
   500                     attaId);
   446                     progressValueChanged(index, 5);
   501             NmUtilities::openFile(file);
   447                 }
   502             file.close();
   448             }
   503         }
   449             // attachment is fetched, open file
   504     }
   450             else if (messageParts[i]->id() == attaId) {
   505 }
   451                 XQSharableFile file = mUiEngine.messagePartFile(
   506 
   452                         mMessage->mailboxId(),
   507 /*!
   453                         mMessage->parentId(),
   508     Function formats message based on actual data
   454                         mMessage->envelope().id(),
       
   455                         attaId);
       
   456                 NmUtilities::openFile(file);
       
   457                 file.close();
       
   458             }
       
   459         }
       
   460     }
       
   461 }
       
   462 
       
   463 /*!
       
   464 
       
   465 */
       
   466 void NmViewerView::changeProgress(int progressValue)
       
   467 {
       
   468     // find running
       
   469    if (mAttaIndexUnderFetch != NmNotFoundError) {
       
   470        // emit signal
       
   471        if (mAttaWidget && mAttaWidget->progressValue(mAttaIndexUnderFetch) < progressValue) {
       
   472            progressValueChanged(mAttaIndexUnderFetch, progressValue);
       
   473        }
       
   474    }
       
   475 }
       
   476 
       
   477 /*!
       
   478 
       
   479 */
       
   480 void NmViewerView::attachmentFetchCompleted(int result)
       
   481 {
       
   482     Q_UNUSED(result);
       
   483     if (mAttaWidget && mAttaIndexUnderFetch != NmNotFoundError) {
       
   484         mAttaWidget->setProgressBarValue(mAttaIndexUnderFetch, 100);
       
   485         mAttaIndexUnderFetch = NmNotFoundError;
       
   486     }
       
   487 }
       
   488 
       
   489 /*!
       
   490     Function formats message based on actual data 
       
   491 */
   509 */
   492 QString NmViewerView::formatMessage()
   510 QString NmViewerView::formatMessage()
   493 {
   511 {
   494     QString msg = "";
   512     QString msg = "";
   495     // null pointer check for mMessage is done before calling this function
   513     // null pointer check for mMessage is done before calling this function
   501             NmMessagePart *child = parts[i];
   519             NmMessagePart *child = parts[i];
   502             // Browse through embedded image parts and add those
   520             // Browse through embedded image parts and add those
   503             // the web view.
   521             // the web view.
   504             quint32 fetchedSize = child->fetchedSize();
   522             quint32 fetchedSize = child->fetchedSize();
   505             quint32 size = child->size();
   523             quint32 size = child->size();
   506             if (fetchedSize >= size && 
   524             if (fetchedSize >= size &&
   507                     child->contentType().startsWith("image", Qt::CaseInsensitive)) {
   525                     child->contentType().startsWith("image", Qt::CaseInsensitive)) {
   508                 QString contentId = child->contentId();
   526                 QString contentId = child->contentId();
   509                 int ret = mUiEngine.contentToMessagePart(
   527                 int ret = mUiEngine.contentToMessagePart(
   510                         mMessage->mailboxId(),
   528                         mMessage->envelope().mailboxId(),
   511                         mMessage->parentId(),
   529                         mMessage->envelope().folderId(),
   512                         mMessage->envelope().id(),
   530                         mMessage->envelope().messageId(),
   513                         *child);
   531                         *child);
   514                 if (ret == NmNoError) {
   532                 if (ret == NmNoError) {
   515                   mWebView->addContent(contentId, QVariant::fromValue(child->binaryContent()));
   533                   mWebView->addContent(contentId, QVariant::fromValue(child->binaryContent()));
   516                 }
   534                 }
   517             }
   535             }
   518         }
   536         }
   519         int ret = mUiEngine.contentToMessagePart(
   537         int ret = mUiEngine.contentToMessagePart(
   520                 mMessage->mailboxId(),
   538                 mMessage->envelope().mailboxId(),
   521                 mMessage->parentId(),
   539                 mMessage->envelope().folderId(),
   522                 mMessage->envelope().id(),
   540                 mMessage->envelope().messageId(),
   523                 *html);
   541                 *html);
   524         if (ret == NmNoError) {
   542         if (ret == NmNoError) {
   525             msg = html->textContent();
   543             msg = html->textContent();
   526         }
   544         }
   527     }
   545     }
   528     else {
   546     else {
   529         NmMessagePart *plain = mMessage->plainTextBodyPart();
   547         NmMessagePart *plain = mMessage->plainTextBodyPart();
   530         if (plain) {
   548         if (plain) {
   531             int ret = mUiEngine.contentToMessagePart(
   549             int ret = mUiEngine.contentToMessagePart(
   532                     mMessage->mailboxId(),
   550                     mMessage->envelope().mailboxId(),
   533                     mMessage->parentId(),
   551                     mMessage->envelope().folderId(),
   534                     mMessage->envelope().id(),
   552                     mMessage->envelope().messageId(),
   535                     *plain);
   553                     *plain);
   536             if (ret == NmNoError) {            
   554             if (ret == NmNoError) {
   537                 QTextDocument doku;
   555                 QTextDocument doku;
   538                 // set font
   556                 // set font
   539                 QFont currentFont = doku.defaultFont();
   557                 QFont currentFont = doku.defaultFont();
   540                 currentFont.setWeight(QFont::Normal);
   558                 currentFont.setWeight(QFont::Normal);
   541                 qreal secondarySize;
   559                 qreal secondarySize;
   542                 HbStyle myStyle;
   560                 HbStyle myStyle;
   543                 bool found = myStyle.parameter(NmParamTextHeightSecondary, secondarySize);
   561                 bool found = myStyle.parameter(NmParamTextHeightSecondary, secondarySize);
   544                 if (found) {                
   562                 if (found) {
   545                     HbFontSpec fontSpec(HbFontSpec::Secondary);
   563                     HbFontSpec fontSpec(HbFontSpec::Secondary);
   546                     fontSpec.setTextHeight(secondarySize);
   564                     fontSpec.setTextHeight(secondarySize);
   547                     currentFont.setPixelSize(fontSpec.font().pixelSize());                    
   565                     currentFont.setPixelSize(fontSpec.font().pixelSize());
   548                 }
   566                 }
   549                 doku.setDefaultFont(currentFont);  
   567                 doku.setDefaultFont(currentFont);
   550                 // convert to html
   568                 // convert to html
   551                 doku.setPlainText(plain->textContent());                                 
   569                 doku.setPlainText(plain->textContent());
   552                 msg = doku.toHtml();
   570                 msg = doku.toHtml();
   553 
   571 
   554                 if (qApp->layoutDirection()==Qt::RightToLeft){                
   572                 if (qApp->layoutDirection()==Qt::RightToLeft){
   555                     // add right alignment to document css section
   573                     // add right alignment to document css section
   556                     QRegExp rx("(<style type=\"text/css\">)(.+)(</style>)", Qt::CaseInsensitive);                   
   574                     QRegExp rx("(<style type=\"text/css\">)(.+)(</style>)", Qt::CaseInsensitive);
   557                     rx.setMinimal(true);
   575                     rx.setMinimal(true);
   558                     int pos = rx.indexIn(msg);
   576                     int pos = rx.indexIn(msg);
   559                     if (pos > -1) {
   577                     if (pos > -1) {
   560                         QString newStr = rx.cap(1);
   578                         QString newStr = rx.cap(1);
   561                         newStr.append(rx.cap(2));
   579                         newStr.append(rx.cap(2));
   609     Scale web view width
   627     Scale web view width
   610 */
   628 */
   611 void NmViewerView::webFrameLoaded(bool loaded)
   629 void NmViewerView::webFrameLoaded(bool loaded)
   612 {
   630 {
   613     if (loaded){
   631     if (loaded){
   614         loadingCompleted = true;
   632         webFrameloadingCompleted = true;
   615         // Scale web view after loading the
   633         // Scale web view after loading the
   616         // complete contents, including images
   634         // complete contents, including images
   617         QTimer::singleShot(nmViewLoadTimer, this, SLOT(scaleWebViewWhenLoaded()));
   635         QMetaObject::invokeMethod(this, "scaleWebViewWhenLoaded", Qt::QueuedConnection);       
   618     }
   636     }
   619 } 
   637 }
   620 
   638 
   621 /*!
   639 /*!
   622     Scale web view width when loading is ongoing
   640     Scale web view width when loading is ongoing
   623 */
   641 */
   624 void NmViewerView::scaleWebViewWhenLoading(const QSize &size)
   642 void NmViewerView::scaleWebViewWhenLoading(const QSize &size)
   625 {
   643 {
   626     // Try to scale web view while mainframe is being loaded. 
   644     // Try to scale web view while mainframe is being loaded.
   627     // So that screen is scrollable even before images are fully loaded
   645     // So that screen is scrollable even before images are fully loaded
   628     // First check that new size is different than previous, no need to react if
   646     // First check that new size is different than previous, no need to react if
   629     // same size value is received more than once.
   647     // same size value is received more than once.
   630     if (size!=mLatestLoadingSize){
   648     if (size!=mLatestLoadingSize){
   631         if (!loadingCompleted&&mWebView&&mWebView->page()&&
   649         if (!webFrameloadingCompleted&&mWebView&&mWebView->page()&&
   632             (size.width()>mScreenSize.width()||size.height()>mScreenSize.height())) {
   650             (size.width()>mScreenSize.width()||size.height()>mScreenSize.height())) {
   633             int width = (int)size.width();
   651             int width = (int)size.width();
   634             int height = (int)size.height();
   652             int height = (int)size.height();
   635             // Set content (webview) width
   653             // Set content (webview) width
   636             if (mDisplayingPlainText){
   654             if (mDisplayingPlainText){
   637                 mWebView->setMaximumWidth(mScreenSize.width());
   655                 mWebView->setMaximumWidth(mScreenSize.width());
   638                 mWebView->setMinimumWidth(mScreenSize.width());
   656                 mWebView->setMinimumWidth(mScreenSize.width());
   639                 mWebView->setPreferredWidth(mScreenSize.width()); 
   657                 mWebView->setPreferredWidth(mScreenSize.width());
   640             }
   658             }
   641             else {
   659             else {
   642                  mWebView->setMaximumWidth(width);
   660                  mWebView->setMaximumWidth(width);
   643                  mWebView->setMinimumWidth(width);
   661                  mWebView->setMinimumWidth(width);
   644                  mWebView->setPreferredWidth(width);                
   662                  mWebView->setPreferredWidth(width);
   645             }
   663             }
   646             mWebView->setMinimumHeight(height);
   664             mWebView->setMinimumHeight(height);
   647             mWebView->setPreferredHeight(height);
   665             mWebView->setPreferredHeight(height);
   648         }    
   666         }
   649     }
   667     }
   650     mLatestLoadingSize=size;
   668     mLatestLoadingSize=size;
   651 }
   669 }
   652 
   670 
   653 /*!
   671 /*!
   654     Scale web view width when loading is completed
   672     Scale web view width when loading is completed
   655 */
   673 */
   656 void NmViewerView::scaleWebViewWhenLoaded()
   674 void NmViewerView::scaleWebViewWhenLoaded()
   657 {
   675 {
   658     if (mWebView&&mWebView->page()) {
   676     if (mWebView&&mWebView->page()) {
   659         QSizeF contentSize = mWebView->page()->mainFrame()->contentsSize(); 
   677         QSizeF contentSize = mWebView->page()->mainFrame()->contentsSize();
   660         int width = (int)contentSize.width();
   678         int width = (int)contentSize.width();
   661         int height = (int)contentSize.height();
   679         int height = (int)contentSize.height();
   662         // Set content (webview) width
   680         // Set content (webview) width
   663         if (mDisplayingPlainText){
   681         if (mDisplayingPlainText){
   664             mWebView->page()->setPreferredContentsSize(mScreenSize);
   682             mWebView->page()->setPreferredContentsSize(mScreenSize);
   684             }
   702             }
   685             else{
   703             else{
   686                 mWebView->setMinimumHeight(height);
   704                 mWebView->setMinimumHeight(height);
   687                 mWebView->setMaximumHeight(height);
   705                 mWebView->setMaximumHeight(height);
   688                 mWebView->setPreferredHeight(height);
   706                 mWebView->setPreferredHeight(height);
   689             }                
   707             }
   690         }
   708         }
   691     }
   709     }
   692 }
   710 }
   693 
   711 
   694 
   712 
   704         mHeaderWidget->rescaleHeader(mScreenSize);
   722         mHeaderWidget->rescaleHeader(mScreenSize);
   705     }
   723     }
   706     if (mAttaWidget){
   724     if (mAttaWidget){
   707         // Set attawidget minimum & maximum size
   725         // Set attawidget minimum & maximum size
   708         mAttaWidget->setMinimumWidth(mScreenSize.width());
   726         mAttaWidget->setMinimumWidth(mScreenSize.width());
   709         mAttaWidget->setMaximumWidth(mScreenSize.width());   
   727         mAttaWidget->setMaximumWidth(mScreenSize.width());
   710     }
   728     }
   711  
   729 
   712     // Scale web view and its contens
   730     // Scale web view and its contens
   713     if (mWebView){
   731     if (mWebView){
   714         if (mDisplayingPlainText){
   732         if (mDisplayingPlainText){
   715             mWebView->setMaximumWidth((int)mScreenSize.width());
   733             mWebView->setMaximumWidth((int)mScreenSize.width());
   716             mWebView->page()->setPreferredContentsSize(QSize((int)mScreenSize.width(),
   734             mWebView->page()->setPreferredContentsSize(QSize((int)mScreenSize.width(),
   717                                            (int)mScreenSize.height()));  
   735                                            (int)mScreenSize.height()));
   718         }
   736         }
   719         else{
   737         else{
   720             // Check whether contentsize fits to screen
   738             // Check whether contentsize fits to screen
   721             // and if not, set preferred size again to allow panning
   739             // and if not, set preferred size again to allow panning
   722             QSizeF contentSize = mWebView->page()->mainFrame()->contentsSize();
   740             QSizeF contentSize = mWebView->page()->mainFrame()->contentsSize();
   727             }
   745             }
   728             else{
   746             else{
   729                 mWebView->setMaximumWidth((int)mScreenSize.width());
   747                 mWebView->setMaximumWidth((int)mScreenSize.width());
   730                 mWebView->page()->setPreferredContentsSize(QSize((int)mScreenSize.width(),
   748                 mWebView->page()->setPreferredContentsSize(QSize((int)mScreenSize.width(),
   731                                                (int)mScreenSize.height()));
   749                                                (int)mScreenSize.height()));
   732             }        
   750             }
   733         }
   751         }
   734     }
   752     }
   735 
   753 
   736     if(mToolbar) {
   754     if (mToolbarEnabled) {
   737 		// Re-create toolbar in orientation switch
   755 		// Re-create toolbar in orientation switch
   738 		createToolBar();
   756 		createToolBar();
   739     }
   757     }
   740 }
   758 }
   741 
   759 
   746    be wrapped again.
   764    be wrapped again.
   747 */
   765 */
   748 void NmViewerView::orientationChanged(Qt::Orientation orientation)
   766 void NmViewerView::orientationChanged(Qt::Orientation orientation)
   749 {
   767 {
   750     Q_UNUSED(orientation);
   768     Q_UNUSED(orientation);
   751     QTimer::singleShot(nmOrientationTimer, this, SLOT(adjustViewDimensions()));
   769     QTimer::singleShot(NmOrientationTimer, this, SLOT(adjustViewDimensions()));
   752 }
   770 }
   753 
   771 
   754 /*!
   772 /*!
   755    Link clicked callback
   773    Link clicked callback
   756 */
   774 */
   849 */
   867 */
   850 void NmViewerView::changeMessageReadStatus(bool read)
   868 void NmViewerView::changeMessageReadStatus(bool read)
   851 {
   869 {
   852     QList<const NmMessageEnvelope*> envelopeList;
   870     QList<const NmMessageEnvelope*> envelopeList;
   853     NmMessageEnvelope *envelope = &mMessage->envelope();
   871     NmMessageEnvelope *envelope = &mMessage->envelope();
   854     NmStoreEnvelopesOperation* op = NULL;
   872     QPointer<NmStoreEnvelopesOperation> op(NULL);
   855     if (envelope){
   873     if (envelope){
   856         if ( read != envelope->isRead() ){
   874         if ( read != envelope->isRead() ){
   857             if (read){
   875             if (read){
   858                 envelope->setRead(true);
   876                 envelope->setRead(true);
   859                 envelopeList.append(envelope);
   877                 envelopeList.append(envelope);
   871                     mStartParam->folderId(),
   889                     mStartParam->folderId(),
   872                     MarkAsUnread,
   890                     MarkAsUnread,
   873                     envelopeList);
   891                     envelopeList);
   874             }
   892             }
   875         }
   893         }
   876         if(op){
       
   877             mUiEngine.storeOperation(op);
       
   878             }
       
   879     }
   894     }
   880 }
   895 }
   881 
   896 
   882 /*!
   897 /*!
   883     Set mailbox name to title
   898     Set mailbox name to title
   944     createOptionsMenu. Functions asks menu commands from extension
   959     createOptionsMenu. Functions asks menu commands from extension
   945     to be added to options menu.
   960     to be added to options menu.
   946 */
   961 */
   947 void NmViewerView::createOptionsMenu()
   962 void NmViewerView::createOptionsMenu()
   948 {
   963 {
   949 	HbMenu *optionsMenu = menu(); 
   964 	HbMenu *optionsMenu = menu();
   950 	NmUiExtensionManager &extMngr = mApplication.extManager();
   965 	NmUiExtensionManager &extMngr = mApplication.extManager();
   951 	if (optionsMenu && &extMngr && mStartParam) {
   966 	if (optionsMenu && &extMngr && mStartParam) {
   952 		optionsMenu->clearActions();
   967 		optionsMenu->clearActions();
   953 		NmActionRequest request(this, NmActionOptionsMenu, NmActionContextViewViewer,
   968 		NmActionRequest request(this, NmActionOptionsMenu, NmActionContextViewViewer,
   954 				NmActionContextDataNone, mStartParam->mailboxId(), mStartParam->folderId() );
   969 				NmActionContextDataNone, mStartParam->mailboxId(), mStartParam->folderId() );
   955 		
   970 
   956 		QList<NmAction*> list;
   971 		QList<NmAction*> list;
   957 		extMngr.getActions(request, list);
   972 		extMngr.getActions(request, list);
   958 		for (int i=0;i<list.count();i++) {
   973 		for (int i=0;i<list.count();i++) {
   959 			optionsMenu->addAction(list[i]);
   974 			optionsMenu->addAction(list[i]);
   960 		}
   975 		}
   966     call to handle menu command in the UI.
   981     call to handle menu command in the UI.
   967 */
   982 */
   968 void NmViewerView::handleActionCommand(NmActionResponse &actionResponse)
   983 void NmViewerView::handleActionCommand(NmActionResponse &actionResponse)
   969 {
   984 {
   970     bool showSendInProgressNote = false;
   985     bool showSendInProgressNote = false;
   971     
   986 
   972     // Handle options menu or toolbar
   987     // Handle options menu or toolbar
   973     if (actionResponse.menuType() == NmActionOptionsMenu || 
   988     if (actionResponse.menuType() == NmActionOptionsMenu ||
   974     	actionResponse.menuType() == NmActionToolbar) {
   989     	actionResponse.menuType() == NmActionToolbar) {
   975         switch (actionResponse.responseCommand()) {
   990         switch (actionResponse.responseCommand()) {
   976             case NmActionResponseCommandReply: {
   991             case NmActionResponseCommandReply: {
   977                 if (mUiEngine.isSendingMessage()) {
   992                 if (mUiEngine.isSendingMessage()) {
   978                     showSendInProgressNote = true;
   993                     showSendInProgressNote = true;
  1008             break;
  1023             break;
  1009             case NmActionResponseCommandDeleteMail: {
  1024             case NmActionResponseCommandDeleteMail: {
  1010                 HbMessageBox *messageBox = new HbMessageBox(HbMessageBox::MessageTypeQuestion);
  1025                 HbMessageBox *messageBox = new HbMessageBox(HbMessageBox::MessageTypeQuestion);
  1011                 messageBox->setText(hbTrId("txt_mail_dialog_delete_mail"));
  1026                 messageBox->setText(hbTrId("txt_mail_dialog_delete_mail"));
  1012                 messageBox->setTimeout(HbMessageBox::NoTimeout);
  1027                 messageBox->setTimeout(HbMessageBox::NoTimeout);
  1013                     
  1028 
       
  1029                 mOkAction = new HbAction(tr("Ok"),messageBox);
       
  1030                 mCancelAction = new HbAction(tr("Cancel"),messageBox);
       
  1031                 messageBox->addAction(mOkAction);
       
  1032                 messageBox->addAction(mCancelAction);
       
  1033                 
  1014                 // Read user selection
  1034                 // Read user selection
  1015                 HbAction *action = messageBox->exec(); 
  1035                 messageBox->open(this, SLOT(deleteButton(HbAction*)));
  1016                 if((action == messageBox->primaryAction())){
  1036               }
  1017                     QList<NmId> messageList;
       
  1018                     messageList.append(mStartParam->messageId());
       
  1019 
       
  1020                     int err = mUiEngine.deleteMessages(mStartParam->mailboxId(),
       
  1021                                                        mStartParam->folderId(),
       
  1022                                                        messageList);
       
  1023                     
       
  1024                     messageList.clear();
       
  1025                     if (NmNoError != err) {
       
  1026                         // Failed to delete the messages!
       
  1027                         NMLOG(QString("NmViewerView::handleActionCommand(): failed err=%1").arg(err));
       
  1028                     }
       
  1029                 }
       
  1030                 delete messageBox;
       
  1031                 messageBox = NULL;
       
  1032             }
       
  1033             break;
  1037             break;
  1034             default:
  1038             default:
  1035                 break;
  1039                 break;
  1036         }
  1040         }
  1037     }
  1041     }
  1038     
  1042 
  1039     if (showSendInProgressNote) {
  1043     if (showSendInProgressNote) {
  1040         QString noteText = hbTrId("txt_mail_dialog_still_sending");
  1044         QString noteText = hbTrId("txt_mail_dialog_still_sending");
  1041         
  1045 
  1042         // get message subject from the message being sent
  1046         // get message subject from the message being sent
  1043         const NmMessage *message = mUiEngine.messageBeingSent();
  1047         const NmMessage *message = mUiEngine.messageBeingSent();
  1044         if (message) {
  1048         if (message) {
  1045             noteText = noteText.arg(NmUtilities::truncate(message->envelope().subject(), 20));
  1049             noteText = noteText.arg(NmUtilities::truncate(message->envelope().subject(), 20));
  1046         }
  1050         }
  1047         HbMessageBox::warning(noteText);
  1051         HbMessageBox::warning(noteText);
  1048     }
  1052     }
  1049 }
  1053 }
  1050 
  1054 
  1051 /*!
  1055 /*!
  1052     externalDelete. From NmMessageListModel, handles viewer shutdown when current message is deleted. 
  1056     Slot. Signaled when delete button is pressed
  1053 */
  1057 */
  1054 void NmViewerView::externalDelete(const NmId &messageId)
  1058 void NmViewerView::deleteButton(HbAction* result)
  1055 {
  1059 {
  1056     if ((mStartParam->viewId()==NmUiViewMessageViewer) && 
  1060      if (result == mOkAction ) {
  1057         (mStartParam->messageId()==messageId)){
  1061         QList<NmId> messageList;
       
  1062         messageList.append(mStartParam->messageId());
       
  1063 
       
  1064         int err = mUiEngine.deleteMessages(mStartParam->mailboxId(),
       
  1065                                            mStartParam->folderId(),
       
  1066                                            messageList);
       
  1067 
       
  1068         messageList.clear();
       
  1069         if (NmNoError != err) {
       
  1070             // Failed to delete the messages!
       
  1071             NMLOG(QString("NmViewerView::handleActionCommand(): failed err=%1").arg(err));
       
  1072         }
       
  1073     }
       
  1074 
       
  1075     mCancelAction = NULL;
       
  1076     mOkAction = NULL;
       
  1077 }
       
  1078 
       
  1079 
       
  1080 /*!
       
  1081     Slot. Signaled when attachment fetch progress changes
       
  1082 */
       
  1083 void NmViewerView::progressChanged(int value)
       
  1084 {
       
  1085     if (mAttaIndexUnderFetch != NmNotFoundError) {
       
  1086         // emit signal
       
  1087         if (mAttaWidget && mAttaWidget->progressValue(mAttaIndexUnderFetch) < value) {
       
  1088             progressValueChanged(mAttaIndexUnderFetch, value);
       
  1089         }
       
  1090     }
       
  1091 }
       
  1092 
       
  1093 /*!
       
  1094     Slot. Signaled when attachment fetch is completed
       
  1095 */
       
  1096 void NmViewerView::fetchCompleted(int result)
       
  1097 {
       
  1098     if (mAttaWidget && mAttaIndexUnderFetch != NmNotFoundError) {
       
  1099         if (result == NmNoError) {
       
  1100             progressValueChanged(mAttaIndexUnderFetch, 100);
       
  1101         }
       
  1102         else {
       
  1103             mAttaWidget->hideProgressBar(mAttaIndexUnderFetch);
       
  1104         }
       
  1105     }
       
  1106     mAttaIndexUnderFetch = NmNotFoundError;
       
  1107 }
       
  1108 
       
  1109 /*!
       
  1110     externalDelete. From NmMessageListModel, handles viewer shutdown when current message is deleted.
       
  1111 */
       
  1112 void NmViewerView::messageDeleted(const NmId &mailboxId, const NmId &folderId, const NmId &messageId)
       
  1113 {
       
  1114     NMLOG("NmViewerView::messageDeleted");
       
  1115     if ((mStartParam->viewId() == NmUiViewMessageViewer)
       
  1116         && (mStartParam->mailboxId()== mailboxId)
       
  1117         && (mStartParam->folderId()== folderId)
       
  1118         && (mStartParam->messageId()== messageId)){
  1058         mApplication.popView();
  1119         mApplication.popView();
  1059     }
  1120     }
  1060 }
  1121 }
  1061 
  1122