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 */ |
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 |
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); |
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 |