125 /*! |
131 /*! |
126 View layout loading from XML |
132 View layout loading from XML |
127 */ |
133 */ |
128 void NmViewerView::loadViewLayout() |
134 void NmViewerView::loadViewLayout() |
129 { |
135 { |
|
136 NM_FUNCTION; |
|
137 |
130 // Use document loader to load the view |
138 // Use document loader to load the view |
131 bool ok = false; |
139 bool ok = false; |
132 setObjectName(QString(NMUI_MESSAGE_VIEWER_VIEW)); |
140 setObjectName(QString(NMUI_MESSAGE_VIEWER_VIEW)); |
133 QObjectList objectList; |
141 QObjectList objectList; |
134 objectList.append(this); |
142 objectList.append(this); |
135 // Pass the view to documentloader. Document loader uses this view |
143 // Pass the view to documentloader. Document loader uses this view |
136 // when docml is parsed, instead of creating new view. |
144 // when docml is parsed, instead of creating new view. |
137 if (mDocumentLoader) { |
145 // documentloader is created in constructor |
138 mDocumentLoader->setObjectTree(objectList); |
146 mDocumentLoader->setObjectTree(objectList); |
139 mWidgetList = mDocumentLoader->load(NMUI_MESSAGE_VIEWER_XML, &ok); |
147 mWidgetList = mDocumentLoader->load(NMUI_MESSAGE_VIEWER_XML, &ok); |
140 } |
|
141 int widgetCount = mWidgetList.count(); |
148 int widgetCount = mWidgetList.count(); |
142 if (ok == true && widgetCount) |
149 if (ok == true && widgetCount) |
143 { |
150 { |
144 // Create content and content layout |
151 // Create content and content layout |
145 // qobject_cast not work in this case, using reinterpret_cast |
152 // qobject_cast not work in this case, using reinterpret_cast |
159 this, SLOT(handleMouseReleaseEvent(QGraphicsSceneMouseEvent*))); |
166 this, SLOT(handleMouseReleaseEvent(QGraphicsSceneMouseEvent*))); |
160 |
167 |
161 // Get scroll area contents and set layout margins |
168 // Get scroll area contents and set layout margins |
162 mScrollAreaContents = qobject_cast<HbWidget *>( |
169 mScrollAreaContents = qobject_cast<HbWidget *>( |
163 mDocumentLoader->findObject(NMUI_MESSAGE_VIEWER_SCROLL_AREA_CONTENTS)); |
170 mDocumentLoader->findObject(NMUI_MESSAGE_VIEWER_SCROLL_AREA_CONTENTS)); |
164 if (mScrollAreaContents->layout()){ |
171 if (mScrollAreaContents) { |
165 mScrollAreaContents->layout()->setContentsMargins(0,0,0,0); |
172 QGraphicsLayout *layout = mScrollAreaContents->layout(); |
166 } |
173 if (layout){ |
167 |
174 layout->setContentsMargins(0,0,0,0); |
168 // Set white pixmap to backgrounditem |
175 } |
169 QPixmap whitePixmap(10,10); |
176 // Set white pixmap to backgrounditem |
170 whitePixmap.fill(Qt::white); |
177 QPixmap whitePixmap(10,10); |
171 QGraphicsPixmapItem *pixmapItem = new QGraphicsPixmapItem(whitePixmap); |
178 whitePixmap.fill(Qt::white); |
172 mScrollAreaContents->setBackgroundItem(pixmapItem); |
179 QGraphicsPixmapItem *pixmapItem = new QGraphicsPixmapItem(whitePixmap); |
|
180 mScrollAreaContents->setBackgroundItem(pixmapItem); |
|
181 } |
173 |
182 |
174 // Load headerwidget |
183 // Load headerwidget |
175 mHeaderWidget = qobject_cast<NmViewerHeader *>( |
184 mHeaderWidget = qobject_cast<NmViewerHeader *>( |
176 mDocumentLoader->findObject(NMUI_MESSAGE_VIEWER_HEADER)); |
185 mDocumentLoader->findObject(NMUI_MESSAGE_VIEWER_HEADER)); |
177 if (mHeaderWidget) { |
186 if (mHeaderWidget) { |
185 mWebView = reinterpret_cast<NmMailViewerWK *>( |
194 mWebView = reinterpret_cast<NmMailViewerWK *>( |
186 mDocumentLoader->findObject(QString(NMUI_MESSAGE_VIEWER_SCROLL_WEB_VIEW))); |
195 mDocumentLoader->findObject(QString(NMUI_MESSAGE_VIEWER_SCROLL_WEB_VIEW))); |
187 if (mWebView) { |
196 if (mWebView) { |
188 mWebView->setParentView(this); |
197 mWebView->setParentView(this); |
189 // Set auto load images and private browsing(no history) attributes |
198 // Set auto load images and private browsing(no history) attributes |
190 mWebView->settings()->setAttribute(QWebSettings::AutoLoadImages, true); |
199 QWebSettings *settings = mWebView->settings(); |
191 mWebView->settings()->setAttribute(QWebSettings::PrivateBrowsingEnabled, true); |
200 if (settings) { |
|
201 settings->setAttribute(QWebSettings::AutoLoadImages, true); |
|
202 settings->setAttribute(QWebSettings::PrivateBrowsingEnabled, true); |
|
203 } |
192 HbEditorInterface editorInterface(mWebView); |
204 HbEditorInterface editorInterface(mWebView); |
193 editorInterface.setInputConstraints(HbEditorConstraintIgnoreFocus); |
205 editorInterface.setInputConstraints(HbEditorConstraintIgnoreFocus); |
194 mWebView->setAcceptedMouseButtons(Qt::NoButton); |
206 mWebView->setAcceptedMouseButtons(Qt::NoButton); |
195 if (mWebView->page()){ |
207 QWebPage *page = mWebView->page(); |
196 mWebView->page()->mainFrame()->setScrollBarPolicy(Qt::Vertical, |
208 if (page) { |
197 Qt::ScrollBarAlwaysOff); |
209 QWebFrame *frame = page->mainFrame(); |
198 mWebView->page()->mainFrame()->setScrollBarPolicy(Qt::Horizontal, |
210 if (frame) { |
199 Qt::ScrollBarAlwaysOff); |
211 frame->setScrollBarPolicy(Qt::Vertical,Qt::ScrollBarAlwaysOff); |
200 connect(mWebView->page()->mainFrame(), |
212 frame->setScrollBarPolicy(Qt::Horizontal, Qt::ScrollBarAlwaysOff); |
201 SIGNAL(contentsSizeChanged(const QSize&)), |
213 connect(mWebView->page()->mainFrame(), |
202 this, SLOT(scaleWebViewWhenLoading(const QSize&))); |
214 SIGNAL(contentsSizeChanged(const QSize&)), |
|
215 this, SLOT(scaleWebViewWhenLoading(const QSize&))); |
|
216 } |
203 } |
217 } |
204 } |
218 } |
205 } |
219 } |
206 } |
220 } |
207 } |
221 } |
208 |
222 |
209 /*! |
223 /*! |
210 Lazy loading when view layout has been loaded |
224 Lazy loading when view layout has been loaded |
211 */ |
225 */ |
212 void NmViewerView::viewReady() |
226 void NmViewerView::viewReady() |
213 { |
227 { |
|
228 NM_FUNCTION; |
|
229 |
214 if (!mViewReady){ |
230 if (!mViewReady){ |
215 // Set mailbox name to title |
231 // Set mailbox name to title |
216 setMailboxName(); |
232 setMailboxName(); |
217 // Create toolbar if needed |
233 // Create toolbar if needed |
218 if (mToolbarEnabled) { |
234 if (mToolbarEnabled) { |
219 createToolBar(); |
235 createToolBar(); |
220 } |
236 } else { |
221 else { |
|
222 // Connect options menu about to show to create options menu function |
237 // Connect options menu about to show to create options menu function |
223 QObject::connect(menu(), SIGNAL(aboutToShow()), |
238 QObject::connect(menu(), SIGNAL(aboutToShow()), |
224 this, SLOT(createOptionsMenu())); |
239 this, SLOT(createOptionsMenu())); |
225 // Menu needs one dummy item so that aboutToShow signal is emitted. |
240 // Menu needs one dummy item so that aboutToShow signal is emitted. |
226 NmAction *dummy = new NmAction(0); |
241 NmAction *dummy = new NmAction(0); |
227 menu()->addAction(dummy); |
242 menu()->addAction(dummy); |
228 } |
243 } |
229 |
244 |
230 |
245 if (mHeaderWidget) { |
231 if (mHeaderWidget){ |
|
232 QPointF contentWidgetPos = mScrollArea->pos(); |
246 QPointF contentWidgetPos = mScrollArea->pos(); |
233 qreal headerHeight = mHeaderWidget->geometry().height(); |
247 qreal headerHeight = mHeaderWidget->geometry().height(); |
234 if(mMainWindow->orientation()==Qt::Horizontal) { |
248 if (mMainWindow->orientation() == Qt::Horizontal) { |
235 const QPointF pointToWebView(contentWidgetPos.x(), headerHeight+NmHeaderMargin); |
249 const QPointF pointToWebView(contentWidgetPos.x(), headerHeight+NmHeaderMargin); |
236 mScrollArea->scrollContentsTo(pointToWebView,0); |
250 mScrollArea->scrollContentsTo(pointToWebView,0); |
237 } |
251 } |
238 } |
252 } |
239 |
253 |
240 // Run fetchmessage in queue |
254 // Run fetchmessage in queue |
241 QMetaObject::invokeMethod(this, "fetchMessage", Qt::QueuedConnection); |
255 QMetaObject::invokeMethod(this, "fetchMessage", Qt::QueuedConnection); |
242 // Set view ready |
256 // Set view ready |
243 mViewReady=true; |
257 mViewReady = true; |
244 } |
258 } |
245 } |
259 } |
246 |
260 |
247 /*! |
261 /*! |
248 Function fecthes message data based on parameters |
262 Function fecthes message data based on parameters |
249 */ |
263 */ |
250 void NmViewerView::loadMessage() |
264 void NmViewerView::loadMessage() |
251 { |
265 { |
|
266 NM_FUNCTION; |
|
267 |
252 if (mMessage) { |
268 if (mMessage) { |
253 delete mMessage; |
269 delete mMessage; |
254 mMessage = NULL; |
270 mMessage = NULL; |
255 } |
271 } |
256 NmId mailboxId; |
|
257 NmId folderId; |
|
258 NmId msgId; |
|
259 // Read start params and message object |
272 // Read start params and message object |
260 if (mStartParam){ |
273 if (mStartParam){ |
261 mailboxId = mStartParam->mailboxId(); |
274 NmId mailboxId = mStartParam->mailboxId(); |
262 folderId = mStartParam->folderId(); |
275 NmId folderId = mStartParam->folderId(); |
263 msgId = mStartParam->messageId(); |
276 NmId msgId = mStartParam->messageId(); |
264 mMessage = mUiEngine.message(mailboxId, folderId, msgId); |
277 mMessage = mUiEngine.message(mailboxId, folderId, msgId); |
265 } |
278 } |
266 } |
279 } |
267 |
280 |
268 /*! |
281 /*! |
269 Function fecthes message data based on parameters. Returns false if message is available, |
282 Function fecthes message data based on parameters. Returns false if message is available, |
270 true if message have to be fetched |
283 true if message have to be fetched |
271 */ |
284 */ |
272 void NmViewerView::fetchMessage() |
285 void NmViewerView::fetchMessage() |
273 { |
286 { |
274 #ifdef Q_OS_SYMBIAN |
287 NM_FUNCTION; |
|
288 |
275 if (mMessage) { |
289 if (mMessage) { |
276 NmId mailboxId = mStartParam->mailboxId(); |
290 NmId mailboxId = mStartParam->mailboxId(); |
277 NmId folderId = mStartParam->folderId(); |
291 NmId folderId = mStartParam->folderId(); |
278 NmId msgId = mStartParam->messageId(); |
292 NmId msgId = mStartParam->messageId(); |
279 const NmMessagePart *body = mMessage->htmlBodyPart(); |
293 const NmMessagePart *body = mMessage->htmlBodyPart(); |
293 if (mMessageFetchingOperation) { |
307 if (mMessageFetchingOperation) { |
294 connect(mMessageFetchingOperation, |
308 connect(mMessageFetchingOperation, |
295 SIGNAL(operationCompleted(int)), |
309 SIGNAL(operationCompleted(int)), |
296 this, |
310 this, |
297 SLOT(messageFetched(int))); |
311 SLOT(messageFetched(int))); |
298 |
312 createAndShowWaitDialog(); |
299 delete mWaitDialog; |
313 } |
300 mWaitDialog = NULL; |
314 } else { |
301 // Create new wait dialog and set it to me modal with dimmed background |
|
302 mWaitDialog = new HbProgressDialog(HbProgressDialog::WaitDialog); |
|
303 mWaitDialog->setModal(true); |
|
304 mWaitDialog->setBackgroundFaded(true); |
|
305 connect(mWaitDialog, SIGNAL(cancelled()), this, SLOT(waitNoteCancelled())); |
|
306 mWaitDialog->setText(hbTrId("txt_mail_dialog_loading_mail_content")); |
|
307 // Display wait dialog |
|
308 mWaitDialog->show(); |
|
309 } |
|
310 } |
|
311 else { |
|
312 // message is fetched |
315 // message is fetched |
313 setMessageData(); |
316 setMessageData(); |
314 } |
317 } |
315 |
318 } |
316 } |
|
317 #else |
|
318 setMessageData(); |
|
319 #endif |
|
320 } |
319 } |
321 |
320 |
322 /*! |
321 /*! |
323 This is signalled by mMessageFetchingOperation when the original message is fetched. |
322 This is signalled by mMessageFetchingOperation when the original message is fetched. |
324 */ |
323 */ |
325 void NmViewerView::messageFetched(int result) |
324 void NmViewerView::messageFetched(int result) |
326 { |
325 { |
|
326 NM_FUNCTION; |
|
327 |
327 mWaitDialog->close(); |
328 mWaitDialog->close(); |
328 |
329 |
329 if (result == NmNoError && mMessageFetchingOperation) { |
330 if (result == NmNoError && mMessageFetchingOperation) { |
330 if (mMessage) { |
331 if (mMessage) { |
331 delete mMessage; |
332 delete mMessage; |
332 mMessage = NULL; |
333 mMessage = NULL; |
333 } |
334 } |
334 NmId mailboxId; |
|
335 NmId folderId; |
|
336 NmId msgId; |
|
337 // Read start params and message object |
335 // Read start params and message object |
338 if (mStartParam) { |
336 if (mStartParam) { |
339 mailboxId = mStartParam->mailboxId(); |
337 NmId mailboxId = mStartParam->mailboxId(); |
340 folderId = mStartParam->folderId(); |
338 NmId folderId = mStartParam->folderId(); |
341 msgId = mStartParam->messageId(); |
339 NmId msgId = mStartParam->messageId(); |
342 mMessage = mUiEngine.message(mailboxId, folderId, msgId); |
340 mMessage = mUiEngine.message(mailboxId, folderId, msgId); |
343 } |
341 } |
344 setMessageData(); |
342 setMessageData(); |
345 // Update header message data |
343 // Update header message data |
346 if (mHeaderWidget){ |
344 if (mHeaderWidget){ |
462 /*! |
466 /*! |
463 |
467 |
464 */ |
468 */ |
465 void NmViewerView::openAttachment(int index) |
469 void NmViewerView::openAttachment(int index) |
466 { |
470 { |
|
471 NM_FUNCTION; |
|
472 |
467 NmId attaId = mAttaIdList.at(index); |
473 NmId attaId = mAttaIdList.at(index); |
468 // reload message to get updates part sizes |
474 // reload message to get updates part sizes |
469 loadMessage(); |
475 loadMessage(); |
470 QList<NmMessagePart*> messageParts; |
476 QList<NmMessagePart*> messageParts; |
471 mMessage->attachmentList(messageParts); |
477 mMessage->attachmentList(messageParts); |
|
478 NmId mailboxId = mMessage->envelope().mailboxId(); |
|
479 NmId folderId = mMessage->envelope().folderId(); |
|
480 NmId messageId = mMessage->envelope().messageId(); |
472 for (int i = 0; i < messageParts.count(); i++) { |
481 for (int i = 0; i < messageParts.count(); i++) { |
473 // message part found have to found |
482 // message part found have to found |
474 // and its fetched size is smaller than size, then start part fetch |
483 // and its fetched size is smaller than size, then start part fetch |
475 if (messageParts[i]->partId() == attaId && |
484 if (messageParts[i]->partId() == attaId && |
476 messageParts[i]->size() > messageParts[i]->fetchedSize()) { |
485 messageParts[i]->size() > messageParts[i]->fetchedSize()) { |
477 // do not start if there's already ongoing fetch |
486 // do not start if there's already ongoing fetch |
478 if (mAttaIndexUnderFetch == NmNotFoundError) { |
487 if (mAttaIndexUnderFetch == NmNotFoundError) { |
479 mAttaIndexUnderFetch = index; |
488 mAttaIndexUnderFetch = index; |
480 mAttaManager.fetchAttachment( |
489 mAttaManager.fetchAttachment(mailboxId, folderId, |
481 mMessage->envelope().mailboxId(), |
490 messageId, attaId); |
482 mMessage->envelope().folderId(), |
|
483 mMessage->envelope().messageId(), |
|
484 attaId); |
|
485 } |
491 } |
486 } |
492 } |
487 // attachment is fetched, open file |
493 // attachment is fetched, open file |
488 else if (messageParts[i]->partId() == attaId) { |
494 else if (messageParts[i]->partId() == attaId) { |
489 XQSharableFile file = mUiEngine.messagePartFile( |
495 XQSharableFile file = mUiEngine.messagePartFile(mailboxId, folderId, |
490 mMessage->envelope().mailboxId(), |
496 messageId, attaId); |
491 mMessage->envelope().folderId(), |
|
492 mMessage->envelope().messageId(), |
|
493 attaId); |
|
494 NmUtilities::openFile(file); |
497 NmUtilities::openFile(file); |
495 file.close(); |
498 file.close(); |
496 } |
499 } |
497 } |
500 } |
498 } |
501 } |
500 /*! |
503 /*! |
501 Function formats message based on actual data |
504 Function formats message based on actual data |
502 */ |
505 */ |
503 QString NmViewerView::formatMessage() |
506 QString NmViewerView::formatMessage() |
504 { |
507 { |
|
508 NM_FUNCTION; |
|
509 |
505 QString msg = ""; |
510 QString msg = ""; |
506 // null pointer check for mMessage is done before calling this function |
511 // null pointer check for mMessage is done before calling this function |
|
512 NmId mailboxId = mMessage->envelope().mailboxId(); |
|
513 NmId folderId = mMessage->envelope().folderId(); |
|
514 NmId messageId = mMessage->envelope().messageId(); |
507 NmMessagePart *html = mMessage->htmlBodyPart(); |
515 NmMessagePart *html = mMessage->htmlBodyPart(); |
508 if (html) { |
516 if (html) { |
509 QList<NmMessagePart*> parts; |
517 QList<NmMessagePart*> parts; |
510 mMessage->attachmentList(parts); |
518 mMessage->attachmentList(parts); |
511 for (int i=0; i < parts.count(); i++) { |
519 for (int i=0; i < parts.count(); i++) { |
512 NmMessagePart *child = parts[i]; |
520 NmMessagePart *child = parts[i]; |
513 // Browse through embedded image parts and add those |
521 // Browse through embedded image parts and add those |
514 // the web view. |
522 // the web view. |
515 quint32 fetchedSize = child->fetchedSize(); |
523 bool isFetched = child->fetchedSize() >= child->size(); |
516 quint32 size = child->size(); |
524 if (child->contentType().startsWith("image", Qt::CaseInsensitive)) { |
517 if (fetchedSize >= size && |
|
518 child->contentType().startsWith("image", Qt::CaseInsensitive)) { |
|
519 QString contentId = child->contentId(); |
525 QString contentId = child->contentId(); |
520 int ret = mUiEngine.contentToMessagePart( |
526 if (isFetched) { |
521 mMessage->envelope().mailboxId(), |
527 int ret = mUiEngine.contentToMessagePart( |
522 mMessage->envelope().folderId(), |
528 mailboxId, folderId, messageId, *child); |
523 mMessage->envelope().messageId(), |
529 if (ret == NmNoError) { |
524 *child); |
530 mWebView->addContent(contentId, QVariant::fromValue(child->binaryContent()), |
525 if (ret == NmNoError) { |
531 child->partId(), isFetched); |
526 mWebView->addContent(contentId, QVariant::fromValue(child->binaryContent())); |
532 } |
527 } |
533 } |
528 } |
534 else { |
529 } |
535 mWebView->addContent(contentId, QVariant::fromValue(QByteArray()), |
530 int ret = mUiEngine.contentToMessagePart( |
536 child->partId(), isFetched); |
531 mMessage->envelope().mailboxId(), |
537 } |
532 mMessage->envelope().folderId(), |
538 } |
533 mMessage->envelope().messageId(), |
539 } |
534 *html); |
540 int ret = mUiEngine.contentToMessagePart(mailboxId, folderId, messageId, *html); |
535 if (ret == NmNoError) { |
541 if (ret == NmNoError) { |
536 msg = html->textContent(); |
542 msg = html->textContent(); |
537 } |
543 } |
538 } |
544 } |
539 else { |
545 else { |
540 NmMessagePart *plain = mMessage->plainTextBodyPart(); |
546 NmMessagePart *plain = mMessage->plainTextBodyPart(); |
541 if (plain) { |
547 if (plain) { |
542 int ret = mUiEngine.contentToMessagePart( |
548 int ret = mUiEngine.contentToMessagePart(mailboxId, folderId, |
543 mMessage->envelope().mailboxId(), |
549 messageId, *plain); |
544 mMessage->envelope().folderId(), |
|
545 mMessage->envelope().messageId(), |
|
546 *plain); |
|
547 if (ret == NmNoError) { |
550 if (ret == NmNoError) { |
548 QTextDocument doku; |
551 QTextDocument document; |
549 // set font |
552 // set font |
550 QFont currentFont = doku.defaultFont(); |
553 QFont currentFont = document.defaultFont(); |
551 currentFont.setWeight(QFont::Normal); |
554 currentFont.setWeight(QFont::Normal); |
552 qreal secondarySize; |
555 qreal secondarySize; |
553 HbStyle myStyle; |
556 HbStyle myStyle; |
554 bool found = myStyle.parameter(NmParamTextHeightSecondary, secondarySize); |
557 bool found = myStyle.parameter(NmParamTextHeightSecondary, secondarySize); |
555 if (found) { |
558 if (found) { |
556 HbFontSpec fontSpec(HbFontSpec::Secondary); |
559 HbFontSpec fontSpec(HbFontSpec::Secondary); |
557 fontSpec.setTextHeight(secondarySize); |
560 fontSpec.setTextHeight(secondarySize); |
558 currentFont.setPixelSize(fontSpec.font().pixelSize()); |
561 currentFont.setPixelSize(fontSpec.font().pixelSize()); |
559 } |
562 } |
560 doku.setDefaultFont(currentFont); |
563 document.setDefaultFont(currentFont); |
561 // convert to html |
564 // convert to html |
562 doku.setPlainText(plain->textContent()); |
565 document.setPlainText(plain->textContent()); |
563 msg = doku.toHtml(); |
566 msg = document.toHtml(); |
564 |
567 |
565 if (qApp->layoutDirection()==Qt::RightToLeft){ |
568 if (qApp->layoutDirection()==Qt::RightToLeft){ |
566 // add right alignment to document css section |
569 // add right alignment to document css section |
567 QRegExp rx("(<style type=\"text/css\">)(.+)(</style>)", Qt::CaseInsensitive); |
570 QRegExp rx("(<style type=\"text/css\">)(.+)(</style>)", Qt::CaseInsensitive); |
568 rx.setMinimal(true); |
571 rx.setMinimal(true); |
632 /*! |
641 /*! |
633 Scale web view width when loading is ongoing |
642 Scale web view width when loading is ongoing |
634 */ |
643 */ |
635 void NmViewerView::scaleWebViewWhenLoading(const QSize &size) |
644 void NmViewerView::scaleWebViewWhenLoading(const QSize &size) |
636 { |
645 { |
|
646 NM_FUNCTION; |
|
647 |
637 // Try to scale web view while mainframe is being loaded. |
648 // Try to scale web view while mainframe is being loaded. |
638 // So that screen is scrollable even before images are fully loaded |
649 // So that screen is scrollable even before images are fully loaded |
639 // First check that new size is different than previous, no need to react if |
650 // First check that new size is different than previous, no need to react if |
640 // same size value is received more than once. |
651 // same size value is received more than once. |
641 if (size!=mLatestLoadingSize){ |
652 if (size != mLatestLoadingSize) { |
642 if (!webFrameloadingCompleted&&mWebView&&mWebView->page()&& |
653 if (!webFrameloadingCompleted && mWebView && mWebView->page() && |
643 (size.width()>mScreenSize.width()||size.height()>mScreenSize.height())) { |
654 (size.width() > mScreenSize.width() || size.height() > mScreenSize.height())) { |
644 int width = (int)size.width(); |
655 int width = (int)size.width(); |
645 int height = (int)size.height(); |
656 int height = (int)size.height(); |
646 // Set content (webview) width |
657 // Set content (webview) width |
647 if (mDisplayingPlainText){ |
658 if (mDisplayingPlainText){ |
648 mWebView->setMaximumWidth(mScreenSize.width()); |
659 setWebViewWidth(mScreenSize.width()); |
649 mWebView->setMinimumWidth(mScreenSize.width()); |
|
650 mWebView->setPreferredWidth(mScreenSize.width()); |
|
651 } |
660 } |
652 else { |
661 else { |
653 mWebView->setMaximumWidth(width); |
662 setWebViewWidth(width); |
654 mWebView->setMinimumWidth(width); |
|
655 mWebView->setPreferredWidth(width); |
|
656 } |
663 } |
657 mWebView->setMinimumHeight(height); |
664 mWebView->setMinimumHeight(height); |
658 mWebView->setPreferredHeight(height); |
665 mWebView->setPreferredHeight(height); |
659 } |
666 } |
660 } |
667 } |
661 mLatestLoadingSize=size; |
668 mLatestLoadingSize = size; |
662 } |
669 } |
663 |
670 |
664 /*! |
671 /*! |
665 Scale web view width when loading is completed |
672 Scale web view width when loading is completed |
666 */ |
673 */ |
667 void NmViewerView::scaleWebViewWhenLoaded() |
674 void NmViewerView::scaleWebViewWhenLoaded() |
668 { |
675 { |
|
676 NM_FUNCTION; |
|
677 |
669 if (mWebView&&mWebView->page()) { |
678 if (mWebView&&mWebView->page()) { |
670 QSizeF contentSize = mWebView->page()->mainFrame()->contentsSize(); |
679 QSizeF contentSize = mWebView->page()->mainFrame()->contentsSize(); |
671 int width = (int)contentSize.width(); |
680 int width = (int)contentSize.width(); |
672 int height = (int)contentSize.height(); |
681 int height = (int)contentSize.height(); |
673 // Set content (webview) width |
682 // Set content (webview) width |
674 if (mDisplayingPlainText){ |
683 if (mDisplayingPlainText) { |
675 mWebView->page()->setPreferredContentsSize(mScreenSize); |
684 mWebView->page()->setPreferredContentsSize(mScreenSize); |
676 mWebView->setMinimumWidth(mScreenSize.width()); |
685 setWebViewWidth(mScreenSize.width()); |
677 mWebView->setMaximumWidth(mScreenSize.width()); |
686 } else { |
678 mWebView->setPreferredWidth(mScreenSize.width()); |
687 setWebViewWidth(width); |
679 } |
|
680 else { |
|
681 mWebView->setMinimumWidth(width); |
|
682 mWebView->setMaximumWidth(width); |
|
683 mWebView->setPreferredWidth(width); |
|
684 } |
688 } |
685 // Set content (webview) height |
689 // Set content (webview) height |
686 if (mScrollAreaContents){ |
690 if (mScrollAreaContents){ |
687 QRectF contentRect = mScrollAreaContents->geometry(); |
691 QRectF contentRect = mScrollAreaContents->geometry(); |
688 if (contentRect.height()<geometry().height()){ |
692 if (contentRect.height()<geometry().height()){ |
689 contentRect.setHeight(geometry().height()); |
693 contentRect.setHeight(geometry().height()); |
690 mViewerContent->setPreferredHeight(contentRect.height()); |
694 mViewerContent->setPreferredHeight(contentRect.height()); |
691 qreal webViewHeight = geometry().height()-mHeaderWidget->geometry().height(); |
695 qreal webViewHeight = geometry().height()-mHeaderWidget->geometry().height(); |
692 mWebView->setMinimumHeight(webViewHeight); |
696 setWebViewHeighth(webViewHeight); |
693 mWebView->setMaximumHeight(webViewHeight); |
697 } else { |
694 mWebView->setPreferredHeight(webViewHeight); |
698 setWebViewHeighth(height); |
695 } |
|
696 else{ |
|
697 mWebView->setMinimumHeight(height); |
|
698 mWebView->setMaximumHeight(height); |
|
699 mWebView->setPreferredHeight(height); |
|
700 } |
699 } |
701 } |
700 } |
702 } |
701 } |
703 } |
702 } |
704 |
703 |
792 /*! |
796 /*! |
793 Send mouse release event to web view |
797 Send mouse release event to web view |
794 */ |
798 */ |
795 void NmViewerView::handleMouseReleaseEvent(QGraphicsSceneMouseEvent *event) |
799 void NmViewerView::handleMouseReleaseEvent(QGraphicsSceneMouseEvent *event) |
796 { |
800 { |
797 NmMailViewerWK* view = webView(); |
801 NM_FUNCTION; |
798 if (event&& view && mHeaderWidget && mScrollAreaContents) { |
802 handleMouseEvent(event, false); |
799 QPointF lastReleasePoint = event->pos(); |
803 |
800 QPointF contentWidgetPos = mScrollAreaContents->pos(); |
|
801 qreal headerHeight = mHeaderWidget->geometry().height(); |
|
802 qreal y = lastReleasePoint.y()-headerHeight; |
|
803 y -= contentWidgetPos.y(); |
|
804 qreal x = lastReleasePoint.x()-contentWidgetPos.x(); |
|
805 const QPointF pointToWebView(x, y); |
|
806 event->setPos(pointToWebView); |
|
807 event->setAccepted(true); |
|
808 view->sendMouseReleaseEvent(event); |
|
809 } |
|
810 } |
804 } |
811 |
805 |
812 /*! |
806 /*! |
813 Send mouse press event |
807 Send mouse press event |
814 */ |
808 */ |
815 void NmViewerView::handleMousePressEvent(QGraphicsSceneMouseEvent *event) |
809 void NmViewerView::handleMousePressEvent(QGraphicsSceneMouseEvent *event) |
816 { |
810 { |
817 NmMailViewerWK* view = webView(); |
811 NM_FUNCTION; |
818 if (event&& view && mHeaderWidget && mScrollAreaContents) { |
812 handleMouseEvent(event, true); |
819 QPointF lastPressPoint = event->pos(); |
|
820 QPointF contentWidgetPos = mScrollAreaContents->pos(); |
|
821 qreal headerHeight = mHeaderWidget->geometry().height(); |
|
822 qreal y = lastPressPoint.y()-headerHeight; |
|
823 y -= contentWidgetPos.y(); |
|
824 qreal x = lastPressPoint.x()-contentWidgetPos.x(); |
|
825 const QPointF pointToWebView(x, y); |
|
826 event->setPos(pointToWebView); |
|
827 event->setAccepted(true); |
|
828 view->sendMousePressEvent(event); |
|
829 } |
|
830 } |
813 } |
831 |
814 |
832 /*! |
815 /*! |
833 Function can be used to check whether mouse event has |
816 Function can be used to check whether mouse event has |
834 occured on top of header area. |
817 occured on top of header area. |
835 */ |
818 */ |
836 bool NmViewerView::eventOnTopOfHeaderArea(QGraphicsSceneMouseEvent *event) |
819 bool NmViewerView::eventOnTopOfHeaderArea(QGraphicsSceneMouseEvent *event) |
837 { |
820 { |
|
821 NM_FUNCTION; |
|
822 |
838 bool ret(false); |
823 bool ret(false); |
839 if (event && mHeaderWidget){ |
824 if (event && mHeaderWidget) { |
840 QPointF lastReleasePoint = event->lastPos(); |
825 QPointF lastReleasePoint = event->lastPos(); |
841 QPointF contentWidgetPos = mScrollAreaContents->pos(); |
826 QPointF contentWidgetPos = mScrollAreaContents->pos(); |
842 int headerHeight = (int)mHeaderWidget->geometry().height(); |
827 int headerHeight = (int)mHeaderWidget->geometry().height(); |
843 if (lastReleasePoint.y()<headerHeight+contentWidgetPos.y()){ |
828 if (lastReleasePoint.y()<headerHeight+contentWidgetPos.y()) { |
844 ret=true; |
829 ret=true; |
845 } |
830 } |
846 } |
831 } |
847 return ret; |
832 return ret; |
848 } |
833 } |
905 Function reacts to scroll position change events and sets |
904 Function reacts to scroll position change events and sets |
906 header to correct position |
905 header to correct position |
907 */ |
906 */ |
908 void NmViewerView::contentScrollPositionChanged(const QPointF &newPosition) |
907 void NmViewerView::contentScrollPositionChanged(const QPointF &newPosition) |
909 { |
908 { |
|
909 NM_FUNCTION; |
|
910 |
910 if (mWebView&&mHeaderWidget){ |
911 if (mWebView&&mHeaderWidget){ |
911 QRectF webViewRect = mWebView->geometry(); |
912 QRectF webViewRect = mWebView->geometry(); |
912 QTransform tr; |
913 QTransform tr; |
913 qreal leftMovementThreshold(webViewRect.width()-mHeaderWidget->geometry().width()); |
914 qreal leftMovementThreshold(webViewRect.width()-mHeaderWidget->geometry().width()); |
914 if (newPosition.x()<0){ |
915 if (newPosition.x()<0) { |
915 tr.translate(webViewRect.topLeft().x() ,0); |
916 tr.translate(webViewRect.topLeft().x() ,0); |
916 } |
917 } |
917 else if (newPosition.x()>=0 && newPosition.x()<leftMovementThreshold){ |
918 else if (newPosition.x()>=0 && newPosition.x()<leftMovementThreshold) { |
918 tr.translate(mHeaderStartScenePos.x()+newPosition.x() ,0); |
919 tr.translate(mHeaderStartScenePos.x()+newPosition.x() ,0); |
919 } |
920 } |
920 else { |
921 else { |
921 tr.translate(webViewRect.topLeft().x()+leftMovementThreshold ,0); |
922 tr.translate(webViewRect.topLeft().x()+leftMovementThreshold ,0); |
922 } |
923 } |
923 mHeaderWidget->setTransform(tr); |
924 mHeaderWidget->setTransform(tr); |
924 if (mAttaWidget){ |
925 if (mAttaWidget) { |
925 mAttaWidget->setTransform(tr); |
926 mAttaWidget->setTransform(tr); |
926 } |
927 } |
927 } |
928 } |
928 mLatestScrollPos = newPosition; |
929 mLatestScrollPos = newPosition; |
929 } |
930 } |
1037 HbMessageBox::warning(noteText); |
1041 HbMessageBox::warning(noteText); |
1038 } |
1042 } |
1039 } |
1043 } |
1040 |
1044 |
1041 /*! |
1045 /*! |
1042 Slot. Signaled when delete button is pressed |
1046 Deletes the currently open message |
1043 */ |
1047 */ |
1044 void NmViewerView::deleteButton(HbAction* result) |
1048 void NmViewerView::deleteMessage() |
1045 { |
1049 { |
1046 HbMessageBox *dlg = static_cast<HbMessageBox*>(sender()); |
1050 NM_FUNCTION; |
1047 if(result == dlg->actions().at(0)) |
1051 |
1048 { |
1052 QList<NmId> messageList; |
1049 QList<NmId> messageList; |
1053 messageList.append(mStartParam->messageId()); |
1050 messageList.append(mStartParam->messageId()); |
1054 |
1051 |
1055 int err = mUiEngine.deleteMessages(mStartParam->mailboxId(), |
1052 int err = mUiEngine.deleteMessages(mStartParam->mailboxId(), |
1056 mStartParam->folderId(), |
1053 mStartParam->folderId(), |
1057 messageList); |
1054 messageList); |
1058 |
1055 |
1059 messageList.clear(); |
1056 messageList.clear(); |
1060 if (NmNoError != err) { |
1057 if (NmNoError != err) { |
1061 // Failed to delete the messages! |
1058 // Failed to delete the messages! |
1062 NMLOG(QString("NmViewerView::handleActionCommand(): failed err=%1").arg(err)); |
1059 NMLOG(QString("NmViewerView::handleActionCommand(): failed err=%1").arg(err)); |
|
1060 } |
|
1061 } |
1063 } |
1062 } |
1064 } |
1063 |
1065 |
1064 |
1066 |
1065 /*! |
1067 /*! |
1066 This is called when attachment fetch progress changes |
1068 This is called when attachment fetch progress changes |
1067 */ |
1069 */ |
1068 void NmViewerView::progressChanged(int value) |
1070 void NmViewerView::progressChanged(int value) |
1069 { |
1071 { |
|
1072 NM_FUNCTION; |
|
1073 |
1070 if (mAttaIndexUnderFetch != NmNotFoundError) { |
1074 if (mAttaIndexUnderFetch != NmNotFoundError) { |
1071 // emit signal |
1075 // emit signal |
1072 if (mAttaWidget && mAttaWidget->progressValue(mAttaIndexUnderFetch) < value) { |
1076 if (mAttaWidget && mAttaWidget->progressValue(mAttaIndexUnderFetch) < value) { |
1073 progressValueChanged(mAttaIndexUnderFetch, value); |
1077 progressValueChanged(mAttaIndexUnderFetch, value); |
1074 } |
1078 } |
1095 /*! |
1100 /*! |
1096 externalDelete. From NmMessageListModel, handles viewer shutdown when current message is deleted. |
1101 externalDelete. From NmMessageListModel, handles viewer shutdown when current message is deleted. |
1097 */ |
1102 */ |
1098 void NmViewerView::messageDeleted(const NmId &mailboxId, const NmId &folderId, const NmId &messageId) |
1103 void NmViewerView::messageDeleted(const NmId &mailboxId, const NmId &folderId, const NmId &messageId) |
1099 { |
1104 { |
1100 NMLOG("NmViewerView::messageDeleted"); |
1105 NM_FUNCTION; |
|
1106 |
1101 if ((mStartParam->viewId() == NmUiViewMessageViewer) |
1107 if ((mStartParam->viewId() == NmUiViewMessageViewer) |
1102 && (mStartParam->mailboxId()== mailboxId) |
1108 && (mStartParam->mailboxId()== mailboxId) |
1103 && (mStartParam->folderId()== folderId) |
1109 && (mStartParam->folderId()== folderId) |
1104 && (mStartParam->messageId()== messageId)){ |
1110 && (mStartParam->messageId()== messageId)) { |
1105 mApplication.prepareForPopView(); |
1111 mApplication.prepareForPopView(); |
1106 } |
1112 } |
1107 } |
1113 } |
1108 |
1114 |
|
1115 /*! |
|
1116 Helper function for wait dialog creation. |
|
1117 */ |
|
1118 void NmViewerView::createAndShowWaitDialog() |
|
1119 { |
|
1120 NM_FUNCTION; |
|
1121 |
|
1122 delete mWaitDialog; |
|
1123 mWaitDialog = NULL; |
|
1124 // Create new wait dialog and set it to me modal with dimmed background |
|
1125 mWaitDialog = new HbProgressDialog(HbProgressDialog::WaitDialog); |
|
1126 mWaitDialog->setModal(true); |
|
1127 mWaitDialog->setBackgroundFaded(true); |
|
1128 connect(mWaitDialog, SIGNAL(cancelled()), this, SLOT(waitNoteCancelled())); |
|
1129 mWaitDialog->setText(hbTrId("txt_mail_dialog_loading_mail_content")); |
|
1130 // Display wait dialog |
|
1131 mWaitDialog->show(); |
|
1132 } |
|
1133 |
|
1134 /*! |
|
1135 Helper function for width. |
|
1136 */ |
|
1137 void NmViewerView::setWebViewWidth(int width) |
|
1138 { |
|
1139 NM_FUNCTION; |
|
1140 |
|
1141 // null pointer check for mWebView in calling function |
|
1142 mWebView->setMinimumWidth(width); |
|
1143 mWebView->setMaximumWidth(width); |
|
1144 mWebView->setPreferredWidth(width); |
|
1145 } |
|
1146 |
|
1147 /*! |
|
1148 Helper function for heigth. |
|
1149 */ |
|
1150 void NmViewerView::setWebViewHeighth(int height) |
|
1151 { |
|
1152 NM_FUNCTION; |
|
1153 |
|
1154 // null pointer check for mWebView in calling function |
|
1155 mWebView->setMinimumHeight(height); |
|
1156 mWebView->setMaximumHeight(height); |
|
1157 mWebView->setPreferredHeight(height); |
|
1158 } |
|
1159 |
|
1160 /*! |
|
1161 Helper function for mouse events. |
|
1162 */ |
|
1163 void NmViewerView::handleMouseEvent(QGraphicsSceneMouseEvent *event, bool pressed) |
|
1164 { |
|
1165 NM_FUNCTION; |
|
1166 NmMailViewerWK* view = webView(); |
|
1167 if (event && view && mHeaderWidget && mScrollAreaContents) { |
|
1168 QPointF lastReleasePoint = event->pos(); |
|
1169 QPointF contentWidgetPos = mScrollAreaContents->pos(); |
|
1170 qreal headerHeight = mHeaderWidget->geometry().height(); |
|
1171 qreal y = lastReleasePoint.y()-headerHeight; |
|
1172 y -= contentWidgetPos.y(); |
|
1173 qreal x = lastReleasePoint.x()-contentWidgetPos.x(); |
|
1174 const QPointF pointToWebView(x, y); |
|
1175 event->setPos(pointToWebView); |
|
1176 event->setAccepted(true); |
|
1177 if (pressed) { |
|
1178 view->sendMousePressEvent(event); |
|
1179 } else { |
|
1180 view->sendMouseReleaseEvent(event); |
|
1181 } |
|
1182 } |
|
1183 } |