diff -r 99bcbff212ad -r c2d07d913565 emailuis/nmailui/src/nmeditorview.cpp --- a/emailuis/nmailui/src/nmeditorview.cpp Fri May 28 13:56:43 2010 +0300 +++ b/emailuis/nmailui/src/nmeditorview.cpp Thu Jun 10 16:14:05 2010 +0300 @@ -67,6 +67,8 @@ setObjectName("NmEditorView"); // Set mailbox name to title pane setMailboxName(); + // call the createToolBar on load view layout + createToolBar(); // Load view layout loadViewLayout(); } @@ -102,6 +104,14 @@ delete mAttachmentPicker; mAttaManager.clearObserver(); mAttaManager.cancelFetch(); + + // make sure virtual keyboard is closed + QInputContext *ic = qApp->inputContext(); + if (ic) { + QEvent *closeEvent = new QEvent(QEvent::CloseSoftwareInputPanel); + ic->filterEvent(closeEvent); + delete closeEvent; + } } /*! @@ -135,9 +145,13 @@ mHeaderWidget = mContentWidget->header(); // Set default color for user - entered text if editor is in re/reAll/fw mode - NmUiEditorStartMode mode = mStartParam->editorStartMode(); - if (mode == NmUiEditorReply || mode == NmUiEditorReplyAll || mode == NmUiEditorForward) { - mEditWidget->setCustomTextColor(true, Qt::blue); + if (mStartParam) { + NmUiEditorStartMode mode = mStartParam->editorStartMode(); + if (mode == NmUiEditorReply + || mode == NmUiEditorReplyAll + || mode == NmUiEditorForward) { + mEditWidget->setCustomTextColor(true, Qt::blue); + } } // the rest of the view initialization is done in viewReady() @@ -164,7 +178,7 @@ // editor with new start parameters. // .. // Reload editor with new message data - fetchMessageIfNeeded(); + fetchMessageIfNeeded(*mStartParam); } else { NM_ERROR(1,"nmailui: Invalid editor start parameter"); @@ -280,6 +294,9 @@ // The first action in dialogs action list is for the "Yes"-button. if (action == dlg->actions().at(0)) { + // Update draft message with content. + updateMessageWithEditorContents(); + // Save message to drafts QList preliminaryOperations; if (mAddAttachmentOperation && mAddAttachmentOperation->isRunning()) { @@ -318,7 +335,7 @@ mRemoveAttachmentOperation->cancelOperation(); } - if (mMessage) { // this is NULL if sending is started + if (mMessage) { // this is NULL if sending or saving is started // Delete message from drafts mUiEngine.removeDraftMessage(mMessage); mMessage = NULL; @@ -342,9 +359,6 @@ connect(mContentWidget->header(), SIGNAL(recipientFieldsHaveContent(bool)), this, SLOT(setButtonsDimming(bool)) ); - // call the createToolBar on load view layout - createToolBar(); - // Set dimensions adjustViewDimensions(); @@ -352,11 +366,17 @@ connect(mApplication.mainWindow(), SIGNAL(orientationChanged(Qt::Orientation)), this, SLOT(orientationChanged(Qt::Orientation))); // Signal for handling the attachment list selection + connect(mHeaderWidget, SIGNAL(attachmentShortPressed(NmId)), + this, SLOT(openAttachmentTriggered(NmId))); connect(mHeaderWidget, SIGNAL(attachmentLongPressed(NmId, QPointF)), this, SLOT(attachmentLongPressed(NmId, QPointF))); - // Set message data - fetchMessageIfNeeded(); + if (mStartParam) { + fetchMessageIfNeeded(*mStartParam); + } + else { // execution cannot proceed without start param + QMetaObject::invokeMethod(&mApplication, "popView", Qt::QueuedConnection); + } } /*! @@ -364,24 +384,24 @@ to check that we have all message parts fetched. Also show dialog for fetching progress. */ -void NmEditorView::fetchMessageIfNeeded() +void NmEditorView::fetchMessageIfNeeded(NmUiStartParam &startParam) { NM_FUNCTION; - if (mStartParam->editorStartMode() == NmUiEditorForward || - mStartParam->editorStartMode() == NmUiEditorReply || - mStartParam->editorStartMode() == NmUiEditorReplyAll) { + if (startParam.editorStartMode() == NmUiEditorForward + || startParam.editorStartMode()== NmUiEditorReply + || startParam.editorStartMode() == NmUiEditorReplyAll) { fetchProgressDialogShow(); mAttaManager.clearObserver(); mAttaManager.setObserver(this); mAttaManager.fetchAllMessageParts( - mStartParam->mailboxId(), - mStartParam->folderId(), - mStartParam->messageId()); + startParam.mailboxId(), + startParam.folderId(), + startParam.messageId()); } else { - startMessageCreation(mStartParam->editorStartMode()); + startMessageCreation(startParam); } } @@ -403,11 +423,23 @@ { NM_FUNCTION; - if (result == NmNoError) { - startMessageCreation(mStartParam->editorStartMode()); + if (result == NmNoError && mStartParam) { + startMessageCreation(*mStartParam); } else { mWaitDialog->close(); + + // Show fetching failed note + HbNotificationDialog *note = new HbNotificationDialog(); + note->setIcon(HbIcon(QLatin1String("note_warning"))); + QString noteText = hbTrId("txt_mail_dpopinfo_loading_failed"); + note->setTitle(noteText); + note->setTitleTextWrapping(Hb::TextWordWrap); + note->setDismissPolicy(HbPopup::TapAnywhere); + note->setAttribute(Qt::WA_DeleteOnClose); + note->setSequentialShow(true); + note->show(); + QMetaObject::invokeMethod(&mApplication, "popView", Qt::QueuedConnection); } } @@ -442,13 +474,14 @@ QMetaObject::invokeMethod(&mApplication, "popView", Qt::QueuedConnection); } -void NmEditorView::startMessageCreation(NmUiEditorStartMode startMode) +void NmEditorView::startMessageCreation(NmUiStartParam &startParam) { NM_FUNCTION; - NmId mailboxId = mStartParam->mailboxId(); - NmId folderId = mStartParam->folderId(); - NmId msgId = mStartParam->messageId(); + NmUiEditorStartMode startMode = startParam.editorStartMode(); + NmId mailboxId = startParam.mailboxId(); + NmId folderId = startParam.folderId(); + NmId msgId = startParam.messageId(); if (mMessageCreationOperation && mMessageCreationOperation->isRunning()) { mMessageCreationOperation->cancelOperation(); @@ -463,6 +496,14 @@ msgId, startMode == NmUiEditorReplyAll); } + else if (startMode == NmUiEditorFromDrafts) { + // Draft opened, so reload message and fill editor with message data. + mMessage = mUiEngine.message( + mStartParam->mailboxId(), + mStartParam->folderId(), + mStartParam->messageId()); + fillEditorWithMessageContents(); + } else { mMessageCreationOperation = mUiEngine.createNewMessage(mailboxId); } @@ -542,7 +583,8 @@ // If sending is started as a service, progress dialog needs to be shown // so long that sending is finished otherwise we can close pop current view. - if (service && mUiEngine.isSendingMessage()) { + if (service && mStartParam && mStartParam->service() && + mUiEngine.isSendingMessage()) { connect(&mUiEngine, SIGNAL(sendOperationCompleted()), this, SLOT(handleSendOperationCompleted()), Qt::UniqueConnection); @@ -599,7 +641,7 @@ mWaitDialog->close(); } - if (result == NmNoError && mMessageCreationOperation) { + if (result == NmNoError && mStartParam && mMessageCreationOperation) { NmUiEditorStartMode startMode = mStartParam->editorStartMode(); // get message "again" from engine to update the message contents @@ -674,21 +716,18 @@ { NM_FUNCTION; - if (!mMessage || !mContentWidget) { + if (!mStartParam || !mMessage || !mContentWidget) { return; } NmMessageEnvelope messageEnvelope(mMessage->envelope()); - NmUiEditorStartMode editorStartMode = NmUiEditorCreateNew; bool useStartParam(false); - if (mStartParam) { - editorStartMode = mStartParam->editorStartMode(); + NmUiEditorStartMode editorStartMode = mStartParam->editorStartMode(); - if (editorStartMode == NmUiEditorMailto) { - // Retrieve the message header data e.g. recipients from mStartParam. - useStartParam = true; - } + if (editorStartMode == NmUiEditorMailto) { + // Retrieve the message header data e.g. recipients from mStartParam. + useStartParam = true; } // Set recipients (to, cc and bcc). @@ -737,7 +776,8 @@ // Set the message body. if (editorStartMode==NmUiEditorReply|| editorStartMode==NmUiEditorReplyAll|| - editorStartMode==NmUiEditorForward){ + editorStartMode==NmUiEditorForward|| + editorStartMode==NmUiEditorFromDrafts){ // Use the body from the original message. NmMessage *originalMessage = mUiEngine.message(mStartParam->mailboxId(), @@ -763,7 +803,12 @@ *htmlPart); } - mContentWidget->setMessageData(*originalMessage); + if (editorStartMode==NmUiEditorFromDrafts) { + mContentWidget->setMessageData(*originalMessage, false); + } + else { + mContentWidget->setMessageData(*originalMessage); + } } delete originalMessage; @@ -781,18 +826,13 @@ attachments[i]->partId()); } - if (mStartParam) { - // Attach passed files to the message. - QStringList *fileList = mStartParam->attachmentList(); + // Attach passed files to the message. + QStringList *fileList = mStartParam->attachmentList(); - if (fileList) { - addAttachments(*fileList); - } + if (fileList) { + addAttachments(*fileList); } - // TODO Switch the following arbitrary (magic number) timeout to a - // meaningful constant, please! - QTimer::singleShot(200, mHeaderWidget, SLOT(sendHeaderHeightChanged())); } @@ -909,8 +949,6 @@ mCcBccFieldVisible = true; } mHeaderWidget->setFieldVisibility( mCcBccFieldVisible ); - - QTimer::singleShot(NmOrientationTimer, this, SLOT(sendHeaderHeightChanged())); } /*! @@ -948,7 +986,7 @@ break; } case NmActionResponseCommandOpenAttachment: { - openAttachmentTriggered(); + openAttachmentTriggered(mSelectedAttachment); break; } default: @@ -962,13 +1000,6 @@ */ void NmEditorView::sendProgressDialogCancelled() { - // Needs to be called before closing the application otherwise nmail panics - // in destruction. - QGraphicsScene *graphicsScene = scene(); - if (graphicsScene) { - graphicsScene->clearFocus(); - } - // Must use delayed editor view destruction so that dialog // gets time to complete, closes also nmail. QMetaObject::invokeMethod(&mApplication, "popView", Qt::QueuedConnection); @@ -1017,6 +1048,10 @@ { NM_FUNCTION; + if (!mStartParam) { + return; + } + NmActionRequest request(this, NmActionVKB, NmActionContextViewEditor, NmActionContextDataNone, mStartParam->mailboxId(), mStartParam->folderId() ); NmUiExtensionManager &extMngr = mApplication.extManager(); @@ -1137,6 +1172,8 @@ void NmEditorView::onAttachmentsFetchError(int errorCode, const QString& errorMessage) { NM_FUNCTION; + Q_UNUSED(errorCode); + Q_UNUSED(errorMessage); NM_COMMENT(QString("Error code: %1").arg(errorCode)); NM_COMMENT(QString("Error message: %1").arg(errorMessage)); } @@ -1155,14 +1192,6 @@ if (mServiceSendingDialog) { mServiceSendingDialog->close(); } - - // Needs to be called before closing the application otherwise nmail panics - // in destruction. - QGraphicsScene *graphicsScene = scene(); - if (graphicsScene) { - graphicsScene->clearFocus(); - } - // Must use delayed editor view destruction so that dialog // gets time to complete, closes also nmail. QMetaObject::invokeMethod(&mApplication, "popView", Qt::QueuedConnection); @@ -1429,11 +1458,20 @@ /*! This slot is called when 'open' is selected from attachment list context menu. */ -void NmEditorView::openAttachmentTriggered() +void NmEditorView::openAttachmentTriggered(NmId attachmentId) { NM_FUNCTION; - - mHeaderWidget->launchAttachment(mSelectedAttachment); + NmId mailboxId = mMessage->envelope().mailboxId(); + NmId folderId = mMessage->envelope().folderId(); + NmId msgId = mMessage->envelope().messageId(); + + XQSharableFile file = mUiEngine.messagePartFile(mailboxId, folderId, + msgId, attachmentId); + int error = NmUtilities::openFile(file); + file.close(); + if ( error == NmNotFoundError ) { + NmUtilities::displayErrorNote(hbTrId("txt_mail_dialog_unable_to_open_attachment_file_ty")); + } } /*!