diff -r 64e38f08e49c -r 47d84de1c893 emailuis/nmailui/src/nmeditorview.cpp --- a/emailuis/nmailui/src/nmeditorview.cpp Fri Sep 17 08:27:21 2010 +0300 +++ b/emailuis/nmailui/src/nmeditorview.cpp Mon Oct 04 00:05:37 2010 +0300 @@ -19,6 +19,8 @@ // Layout file and view static const char *NMUI_EDITOR_VIEW_XML = ":/docml/nmeditorview.docml"; static const char *NMUI_EDITOR_VIEW = "editorview"; +static const char *NMUI_EDITOR_VIEW_ATTACHMENT_EXTENSION = + "attachmentTypeToolbarExtension"; // extension list item frame. static const QString NmPopupListFrame = "qtg_fr_popup_list_normal"; @@ -27,13 +29,17 @@ static const QString NmPriorityNormal("normal"); static const QString NmPriorityHigh("high"); +static const QString NmMimeTypeHtml("text/html"); + + /*! \class NmEditorView \brief Mail editor view */ + /*! - Constructor + Class constructor. */ NmEditorView::NmEditorView( NmApplication &application, @@ -41,78 +47,93 @@ NmUiEngine &uiEngine, NmAttachmentManager &attaManager, QGraphicsItem *parent) - : NmBaseView(startParam, application, parent), - mApplication(application), - mUiEngine(uiEngine), - mAttaManager(attaManager), - mDocumentLoader(NULL), - mHeaderWidget(NULL), - mMessage(NULL), - mContent(NULL), - mAttachmentListContextMenu(NULL), - mMessageCreationOperation(NULL), - mAddAttachmentOperation(NULL), - mRemoveAttachmentOperation(NULL), - mWaitDialog(NULL), - mQueryDialog(NULL), - mAttachmentPicker(NULL), - mCcBccFieldVisible(false), - mServiceSendingDialog(NULL), - mHiddenPriorityName(NmPriorityNormal) +: NmBaseView(startParam, application, parent), + mApplication(application), + mUiEngine(uiEngine), + mAttaManager(attaManager), + mDocumentLoader(NULL), + mHeaderWidget(NULL), + mMessage(NULL), + mContent(NULL), + mAttachmentListContextMenu(NULL), + mMessageCreationOperation(NULL), + mAddAttachmentOperation(NULL), + mRemoveAttachmentOperation(NULL), + mWaitDialog(NULL), + mQueryDialog(NULL), + mAttachmentPicker(NULL), + mCcBccFieldVisible(false), + mServiceSendingDialog(NULL), + mTBExtnContentWidget(NULL), + mHiddenPriorityName(NmPriorityNormal) { NM_FUNCTION; - - mDocumentLoader = new NmUiDocumentLoader( mApplication.mainWindow() ); - // Set object name - setObjectName("NmEditorView"); - // call the createToolBar on load view layout + + mDocumentLoader = new NmUiDocumentLoader(mApplication.mainWindow()); + + // Set the object name. + setObjectName(QString(NMUI_EDITOR_VIEW)); + + // Load the view layout. + loadViewLayout(); + + // Create the toolbar. createToolBar(); - // Load view layout - loadViewLayout(); } + /*! - Destructor + Class destructor. */ NmEditorView::~NmEditorView() { NM_FUNCTION; - + if (mRemoveAttachmentOperation && mRemoveAttachmentOperation->isRunning()) { mRemoveAttachmentOperation->cancelOperation(); } + if (mAddAttachmentOperation && mAddAttachmentOperation->isRunning()) { mAddAttachmentOperation->cancelOperation(); } + if (mMessageCreationOperation && mMessageCreationOperation->isRunning()) { mMessageCreationOperation->cancelOperation(); } + delete mMessage; mWidgetList.clear(); delete mDocumentLoader; delete mPrioritySubMenu; - + if (mAttachmentListContextMenu) { mAttachmentListContextMenu->clearActions(); delete mAttachmentListContextMenu; } + delete mWaitDialog; delete mQueryDialog; - delete mAttachmentPicker; + 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; } + + if (!mTBExtnContentWidget->parent()) { + delete mTBExtnContentWidget; + } } + /*! - View layout loading from XML + Loads the view layout from XML. */ void NmEditorView::loadViewLayout() { @@ -120,39 +141,46 @@ mPrioritySubMenu = NULL; - // Use document loader to load the view - bool ok(false); - - setObjectName(QString(NMUI_EDITOR_VIEW)); + // Use the document loader to load the view. QObjectList objectList; objectList.append(this); - // Pass the view to documentloader. Document loader uses this view - // when docml is parsed, instead of creating new view. - // documentloader is created in constructor + + // Pass the view to documentloader. Document loader uses this view when + // docml is parsed, instead of creating new view. The document loader is + // created in the constructor. mDocumentLoader->setObjectTree(objectList); + bool ok(false); mWidgetList = mDocumentLoader->load(NMUI_EDITOR_VIEW_XML, &ok); if (ok) { - mContent = new NmEditorContent(this, mDocumentLoader, - mApplication.networkAccessManager(), mApplication); + mContent = new NmEditorContent(this, mDocumentLoader, + mApplication.networkAccessManager(), + mApplication); - mHeaderWidget = mContent->header(); + mHeaderWidget = mContent->header(); + + // Set default color for user - entered text if editor is in re/reAll/fw + // mode. + if (mStartParam) { + NmUiEditorStartMode mode = mStartParam->editorStartMode(); - // Set default color for user - entered text if editor is in re/reAll/fw mode - if (mStartParam) { - NmUiEditorStartMode mode = mStartParam->editorStartMode(); - if (mode == NmUiEditorReply - || mode == NmUiEditorReplyAll - || mode == NmUiEditorForward) { - mContent->editor()->setCustomTextColor(true, Qt::blue); - } - } + if (mode == NmUiEditorReply || + mode == NmUiEditorReplyAll || + mode == NmUiEditorForward) { + mContent->editor()->setCustomTextColor(true, Qt::blue); + } + } - // the rest of the view initialization is done in viewReady() + // Get the toolbar extension for adding attachments. + mTBExtnContentWidget = qobject_cast( + mDocumentLoader->findWidget(NMUI_EDITOR_VIEW_ATTACHMENT_EXTENSION)); + + // The rest of the view initialization is done in viewReady(). } } + /*! Reload view contents with new start parameters Typically when view is already open and external view activation occurs @@ -161,7 +189,7 @@ void NmEditorView::reloadViewContents(NmUiStartParam* startParam) { NM_FUNCTION; - + // Check start parameter validity. if (startParam&&startParam->viewId()==NmUiViewMessageEditor) { // Delete existing start parameter data @@ -191,9 +219,9 @@ void NmEditorView::orientationChanged(Qt::Orientation orientation) { NM_FUNCTION; - + Q_UNUSED(orientation); - + // content widget height needs to be set according to the new orientation to get the scroll // area work correctly mHeaderWidget->sendDelayedHeaderHeightChanged(); @@ -205,7 +233,7 @@ */ void NmEditorView::vkbOpened() { - showChrome(false); + showChrome(false); } /*! @@ -237,7 +265,7 @@ NmUiViewId NmEditorView::nmailViewId() const { NM_FUNCTION; - + return NmUiViewMessageEditor; } @@ -247,9 +275,9 @@ void NmEditorView::okToExitView() { NM_FUNCTION; - + bool okToExit(true); - + if (mContent) { NmEditorHeader *header = mContent->header(); // show the query if the message has not been sent @@ -259,14 +287,14 @@ if (header->subjectEdit()) { subjectLength = header->subjectEdit()->text().length(); } - + QList attachmentList; mMessage->attachmentList(attachmentList); - + if (mContent->editor()) { - okToExit = (subjectLength == 0 && mContent->editor()->document()->isEmpty()); + okToExit = (subjectLength == 0 && mContent->editor()->document()->isEmpty()); } - + // content exists, verify exit from user if (!okToExit) { if (mQueryDialog) { @@ -274,14 +302,14 @@ mQueryDialog = 0; } // Launch query dialog. - mQueryDialog = + mQueryDialog = NmUtilities::displayQuestionNote(hbTrId("txt_mail_dialog_save_message_to_drafts"), this, SLOT(okToExitQuery(HbAction*))); } - } + } } - + // no need to query anything, just exit. if(okToExit) { QMetaObject::invokeMethod(&mApplication, @@ -296,13 +324,13 @@ void NmEditorView::okToExitQuery(HbAction *action) { NM_FUNCTION; - + HbMessageBox *dlg = static_cast(sender()); // The first action in dialogs action list is for the "Yes"-button. if (action == dlg->actions().at(0)) { safeToDraft(); - } - + } + // Close the view QMetaObject::invokeMethod(&mApplication, "popView", @@ -340,7 +368,7 @@ void NmEditorView::aboutToExitView() { NM_FUNCTION; - + // These operations need to be stopped before message can be deleted if (mAddAttachmentOperation && mAddAttachmentOperation->isRunning()) { mAddAttachmentOperation->cancelOperation(); @@ -365,7 +393,7 @@ // Set mailbox name to title pane setMailboxName(); - + // Connect options menu about to show to create options menu function // Menu needs to be create "just-in-time" connect(menu(), SIGNAL(aboutToShow()), this, SLOT(createOptionsMenu())); @@ -373,13 +401,13 @@ menu()->addAction(dummy); mVkbHost = new HbShrinkingVkbHost(this); - + initializeVKB(); - + //start to listen VKB open and close signals for hiding the chrome. connect(mVkbHost, SIGNAL(keypadOpened()), this, SLOT(vkbOpened())); connect(mVkbHost, SIGNAL(keypadClosed()), this, SLOT(vkbClosed())); - + connect(mContent->header(), SIGNAL(recipientFieldsHaveContent(bool)), this, SLOT(setButtonsDimming(bool)) ); @@ -391,16 +419,16 @@ this, SLOT(openAttachmentTriggered(NmId))); connect(mHeaderWidget, SIGNAL(attachmentLongPressed(NmId, QPointF)), this, SLOT(attachmentLongPressed(NmId, QPointF))); - + if (mStartParam) { fetchMessageIfNeeded(*mStartParam); } - else { // execution cannot proceed without start param + else { // execution cannot proceed without start param QMetaObject::invokeMethod(&mApplication, "popView", Qt::QueuedConnection); } - + // Adjust the header width according to the current screen width. - mHeaderWidget->adjustHeaderWidth(); + mHeaderWidget->adjustHeaderWidth(); } /*! @@ -411,11 +439,11 @@ void NmEditorView::fetchMessageIfNeeded(NmUiStartParam &startParam) { NM_FUNCTION; - + if (startParam.editorStartMode() == NmUiEditorForward || startParam.editorStartMode()== NmUiEditorReply || startParam.editorStartMode() == NmUiEditorReplyAll) { - + fetchProgressDialogShow(); mAttaManager.clearObserver(); mAttaManager.setObserver(this); @@ -435,45 +463,45 @@ void NmEditorView::progressChanged(int value) { NM_FUNCTION; - + Q_UNUSED(value); } /*! Slot. Called when attachments fetch is completed. We can start - message creation. + message creation. */ void NmEditorView::fetchCompleted(int result) { NM_FUNCTION; - + if (result == NmNoError && mStartParam) { startMessageCreation(*mStartParam); } else { // Close "Loading mail content" dialog mWaitDialog->close(); - + // Show a fetching failed note when the failure is not caused by a Device/System failure. - if (result != NmNoError && + if (result != NmNoError && result != NmNotFoundError && result != NmGeneralError && result != NmCancelError && result != NmAuthenticationError && result != NmServerConnectionError && - result != NmConnectionError) { - HbNotificationDialog *note = new HbNotificationDialog(); + result != NmConnectionError) { + HbNotificationDialog *note = new HbNotificationDialog(); bool enalbeAttribute(true); - note->setAttribute(Qt::WA_DeleteOnClose, enalbeAttribute); - note->setIcon(HbIcon(QLatin1String("note_warning"))); + note->setAttribute(Qt::WA_DeleteOnClose, enalbeAttribute); + note->setIcon(HbIcon(QLatin1String("note_warning"))); note->setTitle(hbTrId("txt_mail_dpopinfo_loading_failed")); - note->setTitleTextWrapping(Hb::TextWordWrap); + note->setTitleTextWrapping(Hb::TextWordWrap); note->setDismissPolicy(HbNotificationDialog::TapAnywhere); - note->setTimeout(HbNotificationDialog::StandardTimeout); + note->setTimeout(HbNotificationDialog::StandardTimeout); note->setSequentialShow(true); note->show(); } - + // Go back to Viewer view QMetaObject::invokeMethod(&mApplication, "popView", Qt::QueuedConnection); } @@ -482,7 +510,7 @@ void NmEditorView::fetchProgressDialogShow() { NM_FUNCTION; - + delete mWaitDialog; mWaitDialog = NULL; // Create new wait dialog and set it to me modal with dimmed background @@ -501,12 +529,12 @@ void NmEditorView::fetchProgressDialogCancelled() { NM_FUNCTION; - - if (mAttaManager.isFetching()) { + + if (mAttaManager.isFetching()) { mAttaManager.cancelFetch(); mAttaManager.clearObserver(); } - else { + else { // For those email has no attachment or attachment has fetched. // Go back to Viewer view. QMetaObject::invokeMethod(&mApplication, "popView", Qt::QueuedConnection); @@ -516,44 +544,45 @@ void NmEditorView::startMessageCreation(NmUiStartParam &startParam) { NM_FUNCTION; + NM_TIMESTAMP("Start editor."); NmUiEditorStartMode startMode = startParam.editorStartMode(); NmId mailboxId = startParam.mailboxId(); NmId folderId = startParam.folderId(); NmId msgId = startParam.messageId(); - + if (mMessageCreationOperation && mMessageCreationOperation->isRunning()) { mMessageCreationOperation->cancelOperation(); } - + // original message is now fetched so start message creation if (startMode == NmUiEditorForward) { mMessageCreationOperation = mUiEngine.createForwardMessage(mailboxId, msgId); } else if (startMode == NmUiEditorReply || startMode == NmUiEditorReplyAll) { - mMessageCreationOperation = mUiEngine.createReplyMessage(mailboxId, - msgId, + mMessageCreationOperation = mUiEngine.createReplyMessage(mailboxId, + 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->mailboxId(), + mStartParam->folderId(), mStartParam->messageId()); fillEditorWithMessageContents(); } else { mMessageCreationOperation = mUiEngine.createNewMessage(mailboxId); } - + // operation continues in messageCreated() once it finishes ok if (mMessageCreationOperation) { connect(mMessageCreationOperation, SIGNAL(operationCompleted(int)), this, SLOT(messageCreated(int))); - } + } } /*! @@ -562,25 +591,25 @@ void NmEditorView::startSending() { NM_FUNCTION; - + // The message contents should be verified updateMessageWithEditorContents(); - + // verify addresses before sending QList invalidAddresses; if (mMessage) { NmUtilities::getRecipientsFromMessage(*mMessage, invalidAddresses, NmUtilities::NmInvalidAddress); } - + if (invalidAddresses.count() > 0) { - + // Invalid addresses found, verify send from user. // Set the first failing address to the note. - QString noteText = + QString noteText = HbParameterLengthLimiter( "txt_mail_dialog_invalid_mail_address_send" ).arg(invalidAddresses.at(0).address()); - + if (mQueryDialog) { delete mQueryDialog; mQueryDialog = 0; @@ -602,7 +631,7 @@ void NmEditorView::finalizeSending() { NM_FUNCTION; - + QList preliminaryOperations; if (mAddAttachmentOperation && mAddAttachmentOperation->isRunning()) { preliminaryOperations.append(mAddAttachmentOperation); @@ -620,7 +649,7 @@ // 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 && mStartParam && mStartParam->service() && + if (service && mStartParam && mStartParam->service() && mUiEngine.isSendingMessage()) { connect(&mUiEngine, SIGNAL(sendOperationCompleted()), this, SLOT(handleSendOperationCompleted()), Qt::UniqueConnection); @@ -667,9 +696,9 @@ void NmEditorView::resizeEvent(QGraphicsSceneResizeEvent *event) { NM_FUNCTION; - + NmBaseView::resizeEvent(event); - + emit sizeChanged(); } @@ -679,6 +708,7 @@ void NmEditorView::messageCreated(int result) { NM_FUNCTION; + NM_TIMESTAMP("Editor opened."); delete mMessage; mMessage = NULL; @@ -687,17 +717,17 @@ if (mWaitDialog) { mWaitDialog->close(); } - + if (result == NmNoError && mStartParam && mMessageCreationOperation) { NmUiEditorStartMode startMode = mStartParam->editorStartMode(); - - // get message "again" from engine to update the message contents + + // get message "again" from engine to update the message contents mMessage = mUiEngine.message( - mStartParam->mailboxId(), - mStartParam->folderId(), + mStartParam->mailboxId(), + mStartParam->folderId(), mMessageCreationOperation->getMessageId()); - - fillEditorWithMessageContents(); + + fillEditorWithMessageContents(); } } @@ -707,7 +737,7 @@ void NmEditorView::updateMessageWithEditorContents() { NM_FUNCTION; - + if (mMessage) { if (mContent && mContent->editor()) { NmMessagePart* bodyPart = mMessage->htmlBodyPart(); @@ -731,7 +761,7 @@ // This verification of zero length string isn't needed // after list of addresses if (toFieldText.length() > 0) { - mMessage->envelope().setToRecipients(mContent->header()->toEdit()->emailAddressList()); + mMessage->envelope().setToRecipients(mContent->header()->toEdit()->emailAddressList()); } } if (mContent->header()->ccEdit()) { @@ -739,7 +769,7 @@ mContent->header()->ccEdit()->text(); if (ccFieldText.length() > 0) { - mMessage->envelope().setCcRecipients(mContent->header()->ccEdit()->emailAddressList()); + mMessage->envelope().setCcRecipients(mContent->header()->ccEdit()->emailAddressList()); } } if (mContent->header()->bccEdit()) { @@ -747,7 +777,7 @@ mContent->header()->bccEdit()->text(); if (bccFieldText.length() > 0) { - mMessage->envelope().setBccRecipients(mContent->header()->bccEdit()->emailAddressList()); + mMessage->envelope().setBccRecipients(mContent->header()->bccEdit()->emailAddressList()); } } } @@ -762,7 +792,7 @@ void NmEditorView::fillEditorWithMessageContents() { NM_FUNCTION; - + if (!mStartParam || !mMessage || !mContent) { return; } @@ -774,18 +804,26 @@ if (editorStartMode == NmUiEditorMailto) { // Retrieve the message header data e.g. recipients from mStartParam. - useStartParam = true; + useStartParam = true; } - + // Set recipients (to, cc and bcc). QString toAddressesString; QString ccAddressesString; QString bccAddressesString; if (useStartParam) { - toAddressesString = addressListToString(mStartParam->mailtoAddressList()); - ccAddressesString = addressListToString(mStartParam->ccAddressList()); - bccAddressesString = addressListToString(mStartParam->bccAddressList()); + QList toAddressList = mStartParam->mailtoAddressList(); + QList ccAddressList = mStartParam->ccAddressList(); + QList bccAddressList = mStartParam->bccAddressList(); + toAddressesString = addressListToString(toAddressList); + ccAddressesString = addressListToString(ccAddressList); + bccAddressesString = addressListToString(bccAddressList); + // Also add recipients added for example from send service + // interface to recipient line edits. + mContent->header()->toEdit()->addContacts(toAddressList); + mContent->header()->ccEdit()->addContacts(ccAddressList); + mContent->header()->bccEdit()->addContacts(bccAddressList); } else { toAddressesString = addressListToString(messageEnvelope.toRecipients()); @@ -824,9 +862,9 @@ setPriority(NmActionResponseCommandNone); } mHeaderWidget->setPriority(messageEnvelope.priority()); - + NmMessage *originalMessage = NULL; - + // Set the message body. if (editorStartMode==NmUiEditorReply|| editorStartMode==NmUiEditorReplyAll|| @@ -834,8 +872,8 @@ editorStartMode==NmUiEditorFromDrafts){ // Use the body from the original message. - originalMessage = mUiEngine.message(mStartParam->mailboxId(), - mStartParam->folderId(), + originalMessage = mUiEngine.message(mStartParam->mailboxId(), + mStartParam->folderId(), mStartParam->messageId()); if (originalMessage) { @@ -860,11 +898,11 @@ } } - + QString *signature = NULL; // return value is not relevant here mUiEngine.getSignature(mStartParam->mailboxId(), signature); - + mContent->setBodyContent(editorStartMode, originalMessage, signature); delete signature; @@ -891,12 +929,21 @@ addAttachments(*fileList); } + if (mStartParam->bodyText().length()) { + // If the content is not HTML, use it as plain text + if (mStartParam->bodyMimeType().compare(NmMimeTypeHtml, Qt::CaseInsensitive)) { + mContent->editor()->setPlainText(mStartParam->bodyText()); + } + else { + mContent->editor()->setHtml(mStartParam->bodyText()); + } + } } /*! - createToolBar. Function asks menu commands from extension - to be added to toolbar owned by the HbView. + Constructs the toolbar according to the actions received from the extension + manager. */ void NmEditorView::createToolBar() { @@ -904,59 +951,67 @@ HbToolBar *tb = toolBar(); NmUiExtensionManager &extMngr = mApplication.extManager(); - if (tb && &extMngr && mStartParam) { - tb->clearActions(); - NmActionRequest request(this, NmActionToolbar, NmActionContextViewEditor, - NmActionContextDataNone, mStartParam->mailboxId(), mStartParam->folderId() ); - QList list; - extMngr.getActions(request, list); - for (int i = 0; i < list.count(); i++) { - tb->addAction(list[i]); - // If action has NmSendable condition, it is shown only when send action - // is available, i.e. when at least one recipient field has data. - if( list[i]->availabilityCondition() == NmAction::NmSendable ) { - list[i]->setEnabled(false); - } - else if (list[i]->availabilityCondition() == NmAction::NmAttachable) { - HbToolBarExtension* extension = new HbToolBarExtension(); - mAttachmentPicker = new NmAttachmentPicker(this); - - if (extension && mAttachmentPicker) { - connect(mAttachmentPicker, SIGNAL(attachmentsFetchOk(const QVariant &)), - this, SLOT(onAttachmentReqCompleted(const QVariant &))); - - connect(this, SIGNAL(titleChanged(QString)), mAttachmentPicker, - SLOT(setTitle(QString))); + + if (!tb || !mStartParam) { + return; + } + + tb->clearActions(); + + NmActionRequest request(this, + NmActionToolbar, + NmActionContextViewEditor, + NmActionContextDataNone, + mStartParam->mailboxId(), + mStartParam->folderId()); + QList list; + extMngr.getActions(request, list); + + for (int i = 0; i < list.count(); i++) { + tb->addAction(list[i]); - list[i]->setToolBarExtension(extension); - - //content widget to get the items to a list - mTBExtnContentWidget = new HbListWidget(); - mTBExtnContentWidget->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed); - - mTBExtnContentWidget->addItem(hbTrId("txt_mail_list_photo")); - mTBExtnContentWidget->addItem(hbTrId("txt_mail_list_sound")); - mTBExtnContentWidget->addItem(hbTrId("txt_mail_list_video")); - mTBExtnContentWidget->addItem(hbTrId("txt_mail_list_other")); - mTBExtnContentWidget->addItem(hbTrId("txt_mail_list_new_photo")); - mTBExtnContentWidget->addItem(hbTrId("txt_mail_list_new_video")); - HbListViewItem *listView = mTBExtnContentWidget->listItemPrototype(); - HbFrameBackground frame(NmPopupListFrame, HbFrameDrawer::NinePieces); - listView->setDefaultFrame(frame); - - connect(mTBExtnContentWidget, SIGNAL(activated(HbListWidgetItem*)), - mAttachmentPicker, SLOT (selectFetcher(HbListWidgetItem*))); + // If action has NmSendable condition, it is shown only when send + // action is available, i.e. when at least one recipient field has + // data. + if (list[i]->availabilityCondition() == NmAction::NmSendable) { + list[i]->setEnabled(false); + } + else if (list[i]->availabilityCondition() == NmAction::NmAttachable && + mTBExtnContentWidget) { + // Setup the toolbar extension for attachments. + HbToolBarExtension* extension = new HbToolBarExtension(); + extension->setParent(this); + list[i]->setToolBarExtension(extension); + + mTBExtnContentWidget->addItem(hbTrId("txt_mail_list_photo")); + mTBExtnContentWidget->addItem(hbTrId("txt_mail_list_sound")); + mTBExtnContentWidget->addItem(hbTrId("txt_mail_list_video")); + mTBExtnContentWidget->addItem(hbTrId("txt_mail_list_other")); + mTBExtnContentWidget->addItem(hbTrId("txt_mail_list_new_photo")); + mTBExtnContentWidget->addItem(hbTrId("txt_mail_list_new_video")); + + HbListViewItem *listView = mTBExtnContentWidget->listItemPrototype(); + HbFrameBackground frame(NmPopupListFrame, HbFrameDrawer::NinePieces); + listView->setDefaultFrame(frame); - connect(mTBExtnContentWidget, SIGNAL(activated(HbListWidgetItem*)), - extension, SLOT(close())); - - extension->setContentWidget(mTBExtnContentWidget); - } - } - } - } + extension->setContentWidget(mTBExtnContentWidget); + + connect(mTBExtnContentWidget, SIGNAL(activated(HbListWidgetItem*)), + extension, SLOT(close())); + + mAttachmentPicker = new NmAttachmentPicker(this); + + connect(mAttachmentPicker, SIGNAL(attachmentsFetchOk(const QVariant &)), + this, SLOT(onAttachmentReqCompleted(const QVariant &))); + connect(this, SIGNAL(titleChanged(QString)), + mAttachmentPicker, SLOT(setTitle(QString))); + connect(mTBExtnContentWidget, SIGNAL(activated(HbListWidgetItem*)), + mAttachmentPicker, SLOT (selectFetcher(HbListWidgetItem*))); + } + } // for () } + /*! createOptionsMenu. Functions asks menu commands from extension to be added to options menu. @@ -964,7 +1019,7 @@ void NmEditorView::createOptionsMenu() { NM_FUNCTION; - + menu()->clearActions(); // Create CC/BCC options menu object @@ -1003,7 +1058,7 @@ void NmEditorView::switchCcBccFieldVisibility() { NM_FUNCTION; - + if (mCcBccFieldVisible) { mCcBccFieldVisible = false; } @@ -1020,9 +1075,9 @@ void NmEditorView::handleActionCommand(NmActionResponse &actionResponse) { NM_FUNCTION; - + NmActionResponseCommand responseCommand = actionResponse.responseCommand(); - + // Handle options menu if (actionResponse.menuType() == NmActionOptionsMenu) { setPriority(responseCommand); @@ -1074,7 +1129,7 @@ void NmEditorView::setButtonsDimming(bool enabled) { NM_FUNCTION; - + // Set the toolbar action states HbToolBar *tb = toolBar(); if (tb) { @@ -1109,11 +1164,11 @@ void NmEditorView::initializeVKB() { NM_FUNCTION; - + if (!mStartParam) { return; } - + NmActionRequest request(this, NmActionVKB, NmActionContextViewEditor, NmActionContextDataNone, mStartParam->mailboxId(), mStartParam->folderId() ); NmUiExtensionManager &extMngr = mApplication.extManager(); @@ -1152,7 +1207,7 @@ void NmEditorView::setMailboxName() { NM_FUNCTION; - + if (mStartParam){ NmMailboxMetaData *meta = mUiEngine.mailboxById(mStartParam->mailboxId()); if (meta){ @@ -1162,28 +1217,28 @@ } /*! - Adds a prefix to the subject for reply or forward. + Adds a prefix to the subject for reply or forward. Strips other occurrences of the prefix from the beginning. */ QString NmEditorView::addSubjectPrefix( NmUiEditorStartMode startMode, const QString &subject ) { NM_FUNCTION; - + QString newSubject(subject.trimmed()); - - if (startMode == NmUiEditorReply || startMode == NmUiEditorReplyAll || + + if (startMode == NmUiEditorReply || startMode == NmUiEditorReplyAll || startMode == NmUiEditorForward) { - QString rePrefix(hbTrId("txt_nmailui_reply_subject_prefix")); - QString fwPrefix(hbTrId("txt_nmailui_forward_subject_prefix")); - + QString rePrefix(hbTrId("txt_mail_reply_subject_prefix")); + QString fwPrefix(hbTrId("txt_mail_forward_subject_prefix")); + // strip extra prefixes from beginning int rePrefixLength(rePrefix.length()); int fwPrefixLength(fwPrefix.length()); - + bool startswithRe(newSubject.startsWith(rePrefix, Qt::CaseInsensitive)); bool startswithFw(newSubject.startsWith(fwPrefix, Qt::CaseInsensitive)); - - while (startswithRe || startswithFw) { + + while (startswithRe || startswithFw) { if (startswithRe) { newSubject.remove(0,rePrefixLength); newSubject = newSubject.trimmed(); @@ -1195,7 +1250,7 @@ startswithRe = newSubject.startsWith(rePrefix, Qt::CaseInsensitive); startswithFw = newSubject.startsWith(fwPrefix, Qt::CaseInsensitive); } - + if (startMode == NmUiEditorReply || startMode == NmUiEditorReplyAll) { newSubject = rePrefix + " " + newSubject; } @@ -1203,19 +1258,19 @@ newSubject = fwPrefix + " " + newSubject; } } - + return newSubject; } /*! This slot is called when 'attachment picker' request has been performed succesfully - Parameter 'value' contains file currently one file name but later list of the files. + Parameter 'value' contains file currently one file name but later list of the files. */ void NmEditorView::onAttachmentReqCompleted(const QVariant &value) { NM_FUNCTION; - + //temporary fix for music picker back button: //it shouldn't emit requestOk signal when nothing is selected if (value.canConvert()) { @@ -1242,7 +1297,7 @@ /*! Closes the wait dialog if one exists. - + This slot is called if the mail application has been started as a service and is about to close. Closing the application while still sending a message may cause unwanted cancelling of the operation. @@ -1262,9 +1317,10 @@ /*! Add list of attachments */ -void NmEditorView::addAttachments(const QStringList& fileNames) +void NmEditorView::addAttachments(const QStringList& fileNames) { NM_FUNCTION; + NM_TIMESTAMP("Add attachments."); // Add attachment name into UI foreach (QString fileName, fileNames) { @@ -1289,7 +1345,7 @@ SIGNAL(operationPartCompleted(const QString &, const NmId &, int)), this, SLOT(oneAttachmentAdded(const QString &, const NmId &, int))); - + // Signal to inform the completion of the whole operation connect(mAddAttachmentOperation, SIGNAL(operationCompleted(int)), @@ -1305,11 +1361,11 @@ void NmEditorView::attachmentLongPressed(NmId attachmentPartId, QPointF point) { NM_FUNCTION; - + // Store id of the attachment to be removed into member. // It is used by removeAttachmentTriggered later if 'remove' selected. mSelectedAttachment = attachmentPartId; - + if (!mAttachmentListContextMenu) { mAttachmentListContextMenu = new HbMenu(); } @@ -1339,17 +1395,17 @@ void NmEditorView::oneAttachmentAdded(const QString &fileName, const NmId &msgPartId, int result) { NM_FUNCTION; - + if (result == NmNoError && mMessage) { // Need to get the message again because new attachment part has been added. NmId mailboxId = mMessage->envelope().mailboxId(); NmId folderId = mMessage->envelope().folderId(); NmId msgId = mMessage->envelope().messageId(); - NmMessagePriority messagePriority = mMessage->envelope().priority(); - + NmMessagePriority messagePriority = mMessage->envelope().priority(); + delete mMessage; mMessage = NULL; - + mMessage = mUiEngine.message(mailboxId, folderId, msgId); if (mMessage) { @@ -1358,7 +1414,7 @@ // Get attachment list from the message QList attachmentList; mMessage->attachmentList(attachmentList); - + // Search newly added attachment from the list for (int i=0; ipartId() == msgPartId) { @@ -1385,6 +1441,7 @@ void NmEditorView::allAttachmentsAdded(int result) { NM_FUNCTION; + NM_TIMESTAMP("All attachments added."); enableToolBarAttach(true); if (result != NmNoError) { @@ -1393,18 +1450,18 @@ } /*! - Sets priority for the message object that is being edited + Sets priority for the message object that is being edited */ void NmEditorView::setPriority(NmActionResponseCommand priority) { NM_FUNCTION; - + mHeaderWidget->setPriority(priority); if (mMessage) { NmMessagePriority messagePriority = NmMessagePriorityNormal; mHiddenPriorityName = NmPriorityNormal; - + if (priority == NmActionResponseCommandPriorityHigh) { messagePriority = NmMessagePriorityHigh; mHiddenPriorityName = NmPriorityHigh; @@ -1428,17 +1485,24 @@ QString NmEditorView::addressListToString(const QList &list) const { NM_FUNCTION; - + QString addressesString; QList::const_iterator i = list.constBegin(); - + while (i != list.constEnd() && *i) { - if (i > list.constBegin()) { - // Add the delimiter. + // Prioritize display name. Add the delimiter in the end also if + // address list ends to display name. + if ((*i)->displayName().length() > 0) { + addressesString += (*i)->displayName(); addressesString += NmDelimiter; } - - addressesString += (*i)->address(); + else { + if (i > list.constBegin()) { + // Add the delimiter. + addressesString += NmDelimiter; + } + addressesString += (*i)->address(); + } ++i; } @@ -1456,10 +1520,10 @@ QString NmEditorView::addressListToString(const QList &list) const { NM_FUNCTION; - + QString addressesString; QList::const_iterator i = list.constBegin(); - + while (i != list.constEnd()) { if (i > list.constBegin()) { // Add the delimiter. @@ -1479,7 +1543,7 @@ void NmEditorView::removeAttachmentTriggered() { NM_FUNCTION; - + // Cancel will delete previous operation if (mRemoveAttachmentOperation) { if (!mRemoveAttachmentOperation->isRunning()) { @@ -1506,26 +1570,26 @@ void NmEditorView::attachmentRemoved(int result) { NM_FUNCTION; - + // It is not desided yet what to do if operation fails Q_UNUSED(result); - + if (mMessage) { // Reload message because one attachment has been removed NmId mailboxId = mMessage->envelope().mailboxId(); NmId folderId = mMessage->envelope().folderId(); NmId msgId = mMessage->envelope().messageId(); - NmMessagePriority messagePriority = mMessage->envelope().priority(); + NmMessagePriority messagePriority = mMessage->envelope().priority(); delete mMessage; mMessage = NULL; - + mMessage = mUiEngine.message(mailboxId, folderId, msgId); - + if(mMessage) { // Set the correct priority - mMessage->envelope().setPriority(messagePriority); - + mMessage->envelope().setPriority(messagePriority); + // If there is no more attachments in the message, set the correct value QList attachmentList; mMessage->attachmentList(attachmentList); @@ -1552,7 +1616,7 @@ file.close(); if ( error == NmNotFoundError ) { HbMessageBox *box = NmUtilities::displayWarningNote(hbTrId("txt_mail_dialog_unable_to_open_attachment_file_ty")); - box->setAttribute(Qt::WA_DeleteOnClose); + box->setAttribute(Qt::WA_DeleteOnClose); } } @@ -1562,7 +1626,7 @@ void NmEditorView::enableToolBarAttach(bool enable) { NM_FUNCTION; - + HbToolBar *tb = toolBar(); if (tb) { QList toolbarList = tb->actions();