--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/messagingapp/msgui/unifiededitor/src/msgunieditorview.cpp Fri Jun 04 10:25:39 2010 +0100
@@ -0,0 +1,1687 @@
+/*
+ * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:
+ *
+ */
+
+// SYSTEM INCLUDES
+#include <e32base.h>
+#include <HbMenu>
+#include <HbAction>
+#include <HbToolBar>
+#include <QGraphicsLinearLayout>
+#include <HbGroupBox>
+#include <HbScrollArea>
+#include <QDateTime>
+#include <QDir>
+#include <QBuffer>
+#include <QFile>
+#include <QFileInfo>
+#include <xqconversions.h>
+#include <HbToolBarExtension>
+#include <HbListWidget>
+#include <HbFrameBackground>
+#include <HbListViewItem>
+#include <HbListWidgetItem>
+#include <HbNotificationDialog>
+#include <HbMessageBox>
+#include <HbAbstractVkbHost>
+#include <HbMainWindow>
+#include <xqaiwrequest.h>
+#include <xqappmgr.h>
+#include <HbStyleLoader>
+// QT Mobility for fetching business card
+#include <qmobilityglobal.h>
+#include <qversitwriter.h>
+#include <qversitdocument.h>
+#include <qcontact.h>
+#include <qcontactmanager.h>
+#include <qversitcontactexporter.h>
+#include <cntservicescontact.h>
+
+
+// USER INCLUDES
+#include "debugtraces.h"
+#include "msgunieditorview.h"
+#include "msgunieditoraddress.h"
+#include "msgunieditorsubject.h"
+#include "msgunieditorbody.h"
+#include "msgmonitor.h"
+#include "msgattachmentcontainer.h"
+#include "msgsendutil.h"
+#include "convergedmessageaddress.h"
+#include "unieditorgenutils.h"
+#include "unieditorpluginloader.h"
+#include "unieditorplugininterface.h"
+#include "msgsettingsview.h"
+
+QTM_USE_NAMESPACE
+// Constants
+const QString SEND_ICON("qtg_mono_send");
+const QString ATTACH_ICON("qtg_mono_attach");
+// temporary folder for unieditor
+const QString UNIFIED_EDITOR_TEMP_FOLDER("unifiededitor");
+
+const int INVALID_MSGID = -1;
+// vcard file extn.
+const QString FILE_EXTN(".vcf");
+// Max vcards inside a msg. Using a very large number.
+// TODO: how we can avoid this?
+const int MAX_VCARDS(1000);
+
+// LOCALIZED CONSTANTS
+//To,Cc.Bcc
+#define LOC_TO hbTrId("txt_messaging_formlabel_to")
+#define LOC_CC hbTrId("txt_messaging_formlabel_cc")
+#define LOC_BCC hbTrId("txt_messaging_formlabel_bcc")
+
+//attach options
+#define LOC_PHOTO hbTrId("txt_messaging_button_photo")
+#define LOC_SOUND hbTrId("txt_messaging_button_sound")
+#define LOC_BUSINESS_CARD hbTrId("txt_messaging_button_business_card")
+
+//options menu.
+#define LOC_ADD_SUBJECT hbTrId("txt_messaging_opt_add_subject")
+#define LOC_ADD_CC_BCC hbTrId("txt_messaging_opt_add_cc_bcc")
+#define LOC_PRIORITY hbTrId("txt_messaging_setlabel_priority")
+#define LOC_SENDING_OPTIONS hbTrId("txt_messaging_opt_sending_options")
+#define LOC_DELETE_MESSAGE hbTrId("txt_messaging_opt_delete_message")
+
+//priority sub menu
+#define LOC_HIGH hbTrId("txt_messaging_setlabel_priority_val_high")
+#define LOC_NORMAL hbTrId("txt_messaging_setlabel_priority_val_normal")
+#define LOC_LOW hbTrId("txt_messaging_setlabel_priority_val_low")
+
+//group box
+#define LOC_OTHER_RECIPIENTS(n) hbTrId("txt_messaging_group_title_ln_other_recipients",n)
+
+//saved to draft note
+#define LOC_SAVED_TO_DRAFTS hbTrId("txt_messaging_dpopinfo_saved_to_drafts")
+
+//delete confermation
+#define LOC_NOTE_DELETE_MESSAGE hbTrId("txt_messaging_dialog_delete_message")
+#define LOC_BUTTON_DELETE hbTrId("txt_common_button_delete")
+#define LOC_BUTTON_CANCEL hbTrId("txt_common_button_cancel")
+#define LOC_DIALOG_OK hbTrId("txt_common_button_ok")
+
+// attachment addition failure note
+#define LOC_UNABLE_TO_ADD_ATTACHMENTS hbTrId("txt_messaging_dpopinfo_unable_to_attach_l1_of_l2")
+
+//extension list item frame.
+const QString POPUP_LIST_FRAME("qtg_fr_popup_list_normal");
+
+//settings confirmation
+#define LOC_DIALOG_SMS_SETTINGS_INCOMPLETE hbTrId("txt_messaging_dialog_sms_settings_incomplete")
+#define LOC_DIALOG_MMS_SETTINGS_INCOMPLETE hbTrId("txt_messaging_dialog_mms_settings_incomplete")
+// LOCAL FUNCTIONS
+
+//---------------------------------------------------------------
+// editorTempPath
+// @return fullPath of unified editor's temporary dir
+//---------------------------------------------------------------
+QString editorTempPath()
+{
+ QDir tempDir;
+ QString tempPath(QDir::toNativeSeparators(tempDir.tempPath()));
+ tempPath.append(QDir::separator());
+ tempPath.append(UNIFIED_EDITOR_TEMP_FOLDER);
+ tempPath.append(QDir::separator());
+ return tempPath;
+}
+
+//---------------------------------------------------------------
+// MsgUnifiedEditorView::MsgUnifiedEditorView
+// @see header file
+//---------------------------------------------------------------
+MsgUnifiedEditorView::MsgUnifiedEditorView( QGraphicsItem *parent ) :
+ MsgBaseView(parent),
+ mSubjectAction(0),
+ mCcBccAction(0),
+ mMainLayout(0),
+ mSubjectField(0),
+ mToField(0),
+ mCcField(0),
+ mBccField(0),
+ mBody(0),
+ mContentWidget(0),
+ mMsgMonitor(0),
+ mAttachmentContainer(0),
+ mPluginLoader(0),
+ mCanSaveToDrafts(true),
+ mVkbHost(NULL)
+ {
+ connect(this->mainWindow(),SIGNAL(viewReady()),this,SLOT(doDelayedConstruction()));
+
+ addToolBar();
+ initView();
+ }
+
+//---------------------------------------------------------------
+// MsgUnifiedEditorView::~MsgUnifiedEditorView
+// @see header file
+//---------------------------------------------------------------
+MsgUnifiedEditorView::~MsgUnifiedEditorView()
+{
+ // clean editor's temporary contents before exiting
+ removeTempFolder();
+}
+
+//---------------------------------------------------------------
+// MsgUnifiedEditorView::initView
+// @see header file
+//---------------------------------------------------------------
+void MsgUnifiedEditorView::initView()
+{
+ if (!HbStyleLoader::registerFilePath(":/layouts")) {
+ QDEBUG_WRITE("ERROR: MsgUnifiedEditorView -> HbStyleLoader::registerFilePath");
+ }
+ HbScrollArea* scrollArea = new HbScrollArea(this);
+ this->setWidget(scrollArea);
+
+ mContentWidget = new HbWidget(this);
+ scrollArea->setContentWidget(mContentWidget);
+
+ mMainLayout = new QGraphicsLinearLayout(Qt::Vertical, mContentWidget);
+ qreal vTopSpacing = 0.0;
+ qreal vItemSpacing = 0.0;
+ style()->parameter("hb-param-margin-gene-top",vTopSpacing);
+ style()->parameter("hb-param-margin-gene-middle-vertical",vItemSpacing);
+
+ mMainLayout->setContentsMargins(0,vTopSpacing,0,0);
+ mMainLayout->setSpacing(vItemSpacing);
+
+ mMsgMonitor = new MsgMonitor(this);
+
+ mToField = new MsgUnifiedEditorAddress( LOC_TO, mContentWidget );
+
+ mBody = new MsgUnifiedEditorBody( mContentWidget);
+
+ mMainLayout->addItem(mToField);
+ mMainLayout->addItem(mBody);
+
+ //Set the invalid msg id
+ mOpenedMessageId.setId(-1);
+
+ connect(mToField, SIGNAL(sendMessage()), this, SLOT(send()));
+ connect(mToField, SIGNAL(contentChanged()),
+ mMsgMonitor, SLOT(handleContentChange()));
+ connect(mToField, SIGNAL(contentChanged()),this,SLOT(onContentChanged()));
+
+ connect(mBody, SIGNAL(sendMessage()), this, SLOT(send()));
+ connect(mBody, SIGNAL(contentChanged()),this,SLOT(onContentChanged()));
+ connect(mBody, SIGNAL(contentChanged()),
+ mMsgMonitor, SLOT(handleContentChange()));
+
+}
+
+void MsgUnifiedEditorView::addMenu()
+{
+ //Create Menu Options
+ HbMenu* mainMenu = new HbMenu();
+ mainMenu->setFocusPolicy(Qt::NoFocus);
+
+ //if subject field / cc,bcc fields are already present don't add corresponding actions.
+ if(!mSubjectField)
+ {
+ mSubjectAction = mainMenu->addAction(LOC_ADD_SUBJECT);
+ }
+
+ if(!mCcField)
+ {
+ mCcBccAction = mainMenu->addAction(LOC_ADD_CC_BCC);
+ }
+
+ HbMenu* prioritySubMenu = mainMenu->addMenu(LOC_PRIORITY);
+
+ HbAction* highPriorityAction = prioritySubMenu->addAction(LOC_HIGH);
+ highPriorityAction->setData(ConvergedMessage::High);
+
+ HbAction* normalPriorityAction = prioritySubMenu->addAction(LOC_NORMAL);
+ normalPriorityAction->setData(ConvergedMessage::Normal);
+
+ HbAction* lowPriorityAction = prioritySubMenu->addAction(LOC_LOW);
+ lowPriorityAction->setData(ConvergedMessage::Low);
+
+ HbAction* sendOptionsAction = mainMenu->addAction(LOC_SENDING_OPTIONS);
+ HbAction* deleteMsgAction = mainMenu->addAction(LOC_DELETE_MESSAGE);
+
+ connect(mSubjectAction,SIGNAL(triggered()),this, SLOT(addSubject()));
+ connect(mCcBccAction,SIGNAL(triggered()),this, SLOT(addCcBcc()));
+ connect(highPriorityAction, SIGNAL(triggered()), this, SLOT(changePriority()));
+ connect(normalPriorityAction, SIGNAL(triggered()), this, SLOT(changePriority()));
+ connect(lowPriorityAction, SIGNAL(triggered()), this, SLOT(changePriority()));
+ connect(sendOptionsAction,SIGNAL(triggered()),this, SLOT(sendingOptions()));
+ connect(deleteMsgAction,SIGNAL(triggered()),this, SLOT(deleteMessage()));
+
+ setMenu(mainMenu);
+}
+
+void MsgUnifiedEditorView::openDraftsMessage(const QVariantList& editorData)
+{
+ // unpack editor's data
+ // first arg is convergedmessage
+ QByteArray dataArray = editorData.at(0).toByteArray();
+ ConvergedMessage* messageDetails = new ConvergedMessage;
+ QDataStream stream(&dataArray, QIODevice::ReadOnly);
+ messageDetails->deserialize(stream);
+ ConvergedMessage::MessageType messageType = messageDetails->messageType();
+ ConvergedMessageId messageId = *(messageDetails->id());
+ delete messageDetails;
+
+ if(!mPluginLoader)
+ {
+ mPluginLoader = new UniEditorPluginLoader(this);
+ }
+
+ UniEditorPluginInterface* pluginInterface =
+ mPluginLoader->getUniEditorPlugin(messageType);
+
+ mOpenedMessageId.setId(messageId.getId());
+ mmOpenedMessageType = messageType;
+
+ //Fetch the converged message from the msgId
+ ConvergedMessage* msg;
+ msg = pluginInterface->convertFrom(messageId.getId());
+
+ if( msg != NULL )
+ {
+ //Populate the content inside editor
+ populateContentIntoEditor(*msg);
+ delete msg;
+ }
+
+ mCanSaveToDrafts = false;
+}
+
+void MsgUnifiedEditorView::forwardMessage(ConvergedMessageId& messageId,
+ ConvergedMessage::MessageType messageType )
+{
+ if(!mPluginLoader)
+ {
+ mPluginLoader = new UniEditorPluginLoader(this);
+
+ }
+ UniEditorPluginInterface* pluginInterface = NULL;
+ if( messageType == ConvergedMessage::Mms )
+ {
+ pluginInterface =
+ mPluginLoader->getUniEditorPlugin(ConvergedMessage::Mms);
+ }
+ else // For sms,vcard,vcal cases
+ {
+ pluginInterface =
+ mPluginLoader->getUniEditorPlugin(ConvergedMessage::Sms);
+ }
+
+ //Fetch the converged message from the msgId
+ ConvergedMessage* msg;
+ msg = pluginInterface->convertFrom(messageId.getId(),
+ UniEditorPluginInterface::Forward);
+
+ if( msg != NULL )
+ {
+ //Populate the content inside editor
+ populateContentIntoEditor(*msg);
+ delete msg;
+ }
+}
+
+void MsgUnifiedEditorView::populateContent(const QVariantList& editorData)
+{
+ // unpack editor's data
+ // first arg is convergedmessage
+ QByteArray dataArray = editorData.at(0).toByteArray();
+ ConvergedMessage* messageDetails = new ConvergedMessage;
+ QDataStream stream(&dataArray, QIODevice::ReadOnly);
+ messageDetails->deserialize(stream);
+
+ // get next arg i.e. editor operation command
+ int editorOp = 0;
+ if(editorData.length() > 1)
+ {
+ editorOp = editorData.at(1).toInt();
+ }
+
+ // population logic based on editor Operation command
+ switch(editorOp)
+ {
+ case MsgBaseView::ADD_SUBJECT:
+ {
+ addSubject();
+ setFocus(mSubjectField);
+ }
+ break;
+ case MsgBaseView::ADD_VCARD:
+ {
+ contactsFetched(editorData.at(2));
+ }
+ break;
+ case MsgBaseView::FORWARD_MSG:
+ {
+ forwardMessage(*messageDetails->id(), messageDetails->messageType());
+ }
+ break;
+ default:
+ break;
+ }
+
+ // additional common operations for non-forwarded messages
+ if(editorOp != MsgBaseView::FORWARD_MSG)
+ {
+ if(editorOp == MsgBaseView::ADD_RECIPIENTS)
+ {
+ // CV sends contact card address as the first address
+ ConvergedMessageAddressList toAddresses =
+ messageDetails->toAddressList();
+ int addrCount = toAddresses.count();
+ if(addrCount > 0)
+ {
+ // add contact card address first
+ ConvergedMessageAddress *firstAddress =
+ new ConvergedMessageAddress();
+ firstAddress->setAlias(toAddresses.at(0)->alias());
+ firstAddress->setAddress(toAddresses.at(0)->address());
+ ConvergedMessageAddressList firstList;
+ firstList << firstAddress;
+ mToField->setAddresses(firstList);
+
+ // add remaining contacts now
+ ConvergedMessageAddressList otherList;
+ for(int i=1; i<addrCount; i++)
+ {
+ otherList << toAddresses.at(i);
+ }
+ mToField->setAddresses(otherList);
+ }
+ }
+ else
+ {
+ mToField->setAddresses(messageDetails->toAddressList());
+ }
+ QString bodyTxt = messageDetails->bodyText();
+ mBody->setText(bodyTxt);
+
+ int attachmentCount = messageDetails->attachments().count();
+ QStringList pendingAttList;
+ for(int i=0; i<attachmentCount; i++)
+ {
+ int imageSize=0;
+ QString mimeType;
+ TMsgMediaType mediaType = EMsgMediaUnknown;
+ QString filePath = messageDetails->attachments().at(i)->filePath();
+ UniEditorGenUtils* genUtils = new UniEditorGenUtils;
+ TRAP_IGNORE(genUtils->getFileInfoL(filePath,imageSize,
+ mimeType,mediaType));
+ delete genUtils;
+ switch(mediaType)
+ {
+ case EMsgMediaImage:
+ {
+ mBody->setImage(filePath);
+ }
+ break;
+ case EMsgMediaAudio:
+ {
+ mBody->setAudio(filePath);
+ }
+ break;
+ default:
+ {
+ pendingAttList << filePath;
+ }
+ break;
+ }
+ }
+ // add pending attachments in bulk
+ addAttachments(pendingAttList);
+ }
+ delete messageDetails;
+}
+
+void MsgUnifiedEditorView::populateContentIntoEditor(
+ const ConvergedMessage& messageDetails)
+{
+ // skip first-time MMS type switch note for draft
+ mMsgMonitor->setSkipNote(true);
+ mToField->skipMaxRecipientQuery(true);
+
+ mToField->setAddresses(messageDetails.toAddressList());
+ if(messageDetails.ccAddressList().count() > 0 )
+ {
+ if(!mCcField)
+ {
+ addCcBcc();
+ }
+ mCcField->setAddresses(messageDetails.ccAddressList());
+ }
+ if(messageDetails.bccAddressList().count() > 0 )
+ {
+ if(!mBccField)
+ {
+ addCcBcc();
+ }
+ mBccField->setAddresses(messageDetails.bccAddressList());
+ }
+ if(messageDetails.subject().size() > 0)
+ {
+ if(!mSubjectField)
+ {
+ addSubject();
+ }
+ mSubjectField->setText(messageDetails.subject());
+ }
+
+ if(messageDetails.priority()==ConvergedMessage::High ||
+ messageDetails.priority() == ConvergedMessage::Low)
+ {
+ if(!mSubjectField)
+ {
+ addSubject();
+ }
+ mSubjectField->setPriority(messageDetails.priority());
+ }
+
+ QString bodyTxt = messageDetails.bodyText();
+ mBody->setText(bodyTxt);
+
+ ConvergedMessageAttachmentList attachmentList =
+ messageDetails.attachments();
+ int attachmentCount = attachmentList.count();
+
+ UniEditorGenUtils* genUtils = new UniEditorGenUtils;
+
+ QStringList pendingAttList;
+ for( int i=0; i < attachmentCount; i++ )
+ {
+ QString filePath = messageDetails.attachments().at(i)->filePath();
+
+ if(attachmentList.at(i)->attachmentType() ==
+ ConvergedMessageAttachment::EInline)
+ {
+ int imageSize=0;
+ QString mimeType;
+ TMsgMediaType mediaType = EMsgMediaUnknown;
+ TRAP_IGNORE(genUtils->getFileInfoL(filePath,imageSize,
+ mimeType,mediaType));
+
+ switch(mediaType)
+ {
+ case EMsgMediaImage:
+ {
+ mBody->setImage(filePath);
+ break;
+ }
+ case EMsgMediaAudio:
+ {
+ mBody->setAudio(filePath);
+ break;
+ }
+ default:
+ {
+ pendingAttList << filePath;
+ break;
+ }
+ }
+ }
+ else
+ {
+ pendingAttList << filePath;
+ }
+ }
+ // add pending attachments to editor
+ addAttachments(pendingAttList);
+
+ delete genUtils;
+ // ensure that any msg-type change after this are shown
+ mToField->skipMaxRecipientQuery(false);
+ mMsgMonitor->setSkipNote(false);
+}
+
+void MsgUnifiedEditorView::addToolBar()
+{
+ //Create Tool Bar
+ HbToolBar *toolBar = new HbToolBar();
+ toolBar->setOrientation(Qt::Horizontal);
+
+ //tool bar extension for attach action.
+ HbToolBarExtension* attachExtension = new HbToolBarExtension();
+ HbAction *attachAction = toolBar->addExtension(attachExtension);
+ attachAction->setIcon(HbIcon(ATTACH_ICON));
+
+ mTBExtnContentWidget = new HbListWidget();
+ mTBExtnContentWidget->addItem(LOC_PHOTO);
+ mTBExtnContentWidget->addItem(LOC_SOUND);
+ mTBExtnContentWidget->addItem(LOC_BUSINESS_CARD);
+
+ HbListViewItem *prototype = mTBExtnContentWidget->listItemPrototype();
+ HbFrameBackground frame(POPUP_LIST_FRAME, HbFrameDrawer::NinePieces);
+ prototype->setDefaultFrame(frame);
+
+ connect(mTBExtnContentWidget, SIGNAL(activated(HbListWidgetItem*)),
+ this, SLOT(handleViewExtnActivated(HbListWidgetItem*)));
+ connect(mTBExtnContentWidget, SIGNAL(activated(HbListWidgetItem*)),
+ attachExtension, SLOT(close()));
+
+ attachExtension->setContentWidget(mTBExtnContentWidget);
+
+ //Add Action to the toolbar and show toolbar
+ toolBar->addAction(HbIcon(SEND_ICON),QString(),this,SLOT(send()));
+
+
+ setToolBar(toolBar);
+}
+
+void MsgUnifiedEditorView::addSubject()
+{
+ if(mSubjectField)
+ { // do nothing if already present
+ return;
+ }
+
+ int index =0;
+ int offset = 1;
+ if(mAttachmentContainer)
+ {
+ ++offset;
+ }
+ index = mMainLayout->count() - offset;
+
+ mSubjectField = new MsgUnifiedEditorSubject( mContentWidget);
+
+ mMainLayout->insertItem(index,mSubjectField);
+ connect(mSubjectField, SIGNAL(contentChanged()),
+ mMsgMonitor, SLOT(handleContentChange()));
+ connect(mSubjectField, SIGNAL(contentChanged()),this,SLOT(onContentChanged()));
+
+ //set focus to subject field.
+ HbAction* subjectAction = qobject_cast<HbAction*>(this->sender());
+ if(subjectAction)
+ {
+ setFocus(mSubjectField);
+ }
+
+ // remove mainmenu's "Add Subject" action
+ if(mSubjectAction)
+ {
+ HbMenu* mainMenu = this->menu();
+ mainMenu->removeAction(mSubjectAction);
+ mSubjectAction->setParent(NULL);
+ delete mSubjectAction;
+ }
+}
+
+void MsgUnifiedEditorView::addCcBcc()
+{
+ if(mCcField && mBccField)
+ { // do nothing if already present
+ return;
+ }
+
+ mCcField = new MsgUnifiedEditorAddress( LOC_CC, mContentWidget );
+ mBccField = new MsgUnifiedEditorAddress( LOC_BCC, mContentWidget );
+ mCcField->skipMaxRecipientQuery(true);
+ mBccField->skipMaxRecipientQuery(true);
+
+ connect(mCcField, SIGNAL(sendMessage()), this, SLOT(send()));
+ connect(mCcField, SIGNAL(contentChanged()), mMsgMonitor, SLOT(handleContentChange()));
+ connect(mCcField, SIGNAL(contentChanged()),this,SLOT(onContentChanged()));
+
+ connect(mBccField, SIGNAL(sendMessage()), this, SLOT(send()));
+ connect(mBccField, SIGNAL(contentChanged()), mMsgMonitor, SLOT(handleContentChange()));
+ connect(mBccField, SIGNAL(contentChanged()),this,SLOT(onContentChanged()));
+
+ HbWidget* groupWidget = new HbWidget(mContentWidget);
+ groupWidget->setContentsMargins(0,0,0,0);
+
+ QGraphicsLinearLayout* ccBccLayout = new QGraphicsLinearLayout(Qt::Vertical, groupWidget);
+ ccBccLayout->setContentsMargins(0,0,0,0);
+
+ qreal vItemSpacing = 0.0;
+ style()->parameter("hb-param-margin-gene-middle-vertical",vItemSpacing);
+ ccBccLayout->setSpacing(vItemSpacing);
+ ccBccLayout->addItem(mCcField);
+ ccBccLayout->addItem(mBccField);
+
+ HbGroupBox* groupBox = new HbGroupBox(0);
+ groupBox->setSizePolicy(QSizePolicy::Minimum,QSizePolicy::Preferred);
+
+ groupBox->setContentWidget(groupWidget);
+ groupBox->setHeading(LOC_OTHER_RECIPIENTS(-1));
+ mMainLayout->insertItem(1,groupBox);
+ connect(groupBox, SIGNAL(toggled(bool)), this, SLOT(updateOtherRecipientCount(bool)));
+
+ // add subject field too
+ addSubject();
+
+ //set focus to Cc field.
+ HbAction* ccBccAction = qobject_cast<HbAction*>(this->sender());
+ if(mCcBccAction)
+ {
+ setFocus(mCcField);
+ }
+
+ // remove mainmenu's "Add Cc/Bcc" & "Add Subject" actions
+ if(mCcBccAction)
+ {
+ HbMenu* mainmenu = this->menu();
+ mainmenu->removeAction(mCcBccAction);
+ mCcBccAction->setParent(NULL);
+ delete mCcBccAction;
+ }
+
+ this->updateGeometry();
+}
+
+void MsgUnifiedEditorView::updateOtherRecipientCount(bool state)
+{
+ HbGroupBox* groupBox = qobject_cast<HbGroupBox*>(sender());
+ if(groupBox)
+ {
+ if(!state)
+ {
+ groupBox->setHeading(LOC_OTHER_RECIPIENTS(-1));
+ }
+ else
+ {
+ int addrCount = mCcField->addressCount();
+ addrCount += mBccField->addressCount();
+ groupBox->setHeading(LOC_OTHER_RECIPIENTS(addrCount));
+ }
+ }
+}
+
+void MsgUnifiedEditorView::changePriority()
+{
+ HbAction* action = qobject_cast<HbAction*>(sender());
+
+ ConvergedMessage::Priority priority = ConvergedMessage::Normal;
+ if(action)
+ {
+ int data = action->data().toInt();
+ priority = ConvergedMessage::Priority(data);
+ }
+
+ addSubject();
+ mSubjectField->setPriority(priority);
+}
+
+void MsgUnifiedEditorView::sendingOptions()
+{
+}
+
+void MsgUnifiedEditorView::deleteMessage()
+{
+ HbMessageBox::question(LOC_NOTE_DELETE_MESSAGE,this,SLOT(onDialogDeleteMsg(HbAction*)),
+ LOC_BUTTON_DELETE, LOC_BUTTON_CANCEL);
+}
+
+void MsgUnifiedEditorView::removeAttachmentContainer()
+{
+ if(mAttachmentContainer)
+ {
+ mMainLayout->removeItem(mAttachmentContainer);
+ mAttachmentContainer->setParent(NULL);
+ delete mAttachmentContainer;
+ mAttachmentContainer = NULL;
+ }
+}
+
+void MsgUnifiedEditorView::addAttachments(QStringList files)
+{
+ int fcount = files.count();
+ int i=0;
+ for(i=0; i<fcount; i++)
+ {
+ int status = addAttachment(files.at(i));
+ if(status == MsgAttachmentContainer::EAddSizeExceed)
+ {
+ QString displayStr = QString(LOC_UNABLE_TO_ADD_ATTACHMENTS)
+ .arg(fcount-i).arg(fcount);
+ HbNotificationDialog::launchDialog(displayStr);
+ break;
+ }
+ }
+}
+
+int MsgUnifiedEditorView::addAttachment(const QString& filepath)
+{
+ if(!mAttachmentContainer)
+ {
+ mAttachmentContainer = new MsgAttachmentContainer( mContentWidget);
+ connect(mAttachmentContainer, SIGNAL(emptyAttachmentContainer()),
+ this, SLOT(removeAttachmentContainer()));
+ connect(mAttachmentContainer, SIGNAL(contentChanged()),
+ mMsgMonitor, SLOT(handleContentChange()));
+ connect(mAttachmentContainer, SIGNAL(contentChanged()),
+ this,SLOT(onContentChanged()));
+
+ int index = mMainLayout->count() - 1;
+ mMainLayout->insertItem(index,mAttachmentContainer);
+ }
+
+ int ret = mAttachmentContainer->addAttachment(filepath);
+ if(ret != MsgAttachmentContainer::EAddSuccess)
+ {
+ // delete container, if it is empty
+ if(mAttachmentContainer->count() == 0)
+ {
+ removeAttachmentContainer();
+ }
+ }
+ return ret;
+}
+
+void MsgUnifiedEditorView::send()
+{
+ activateInputBlocker();
+
+ // first run the address validation tests
+ if( !mToField->validateContacts() ||
+ (mCcField && !mCcField->validateContacts()) ||
+ (mBccField && !mBccField->validateContacts()) )
+ {
+ deactivateInputBlocker();
+ return;
+ }
+
+ // converged msg for sending
+ ConvergedMessage msg;
+ ConvergedMessage::MessageType messageType = MsgMonitor::messageType();
+ msg.setMessageType(messageType);
+
+ // we need to remove duplicate addresses
+ bool removeDuplicates = true;
+ ConvergedMessageAddressList addresses =
+ mToField->addresses(removeDuplicates);
+ if(messageType == ConvergedMessage::Sms &&
+ addresses.isEmpty())
+ {
+ // no recipient specified for sms, do not send msg
+ deactivateInputBlocker();
+ return;
+ }
+
+ ConvergedMessageAddressList ccAddresses;
+ ConvergedMessageAddressList bccAddresses;
+ if(mCcField)
+ {
+ ccAddresses = mCcField->addresses(removeDuplicates);
+ }
+ if(mBccField)
+ {
+ bccAddresses = mBccField->addresses(removeDuplicates);
+ }
+ if( messageType == ConvergedMessage::Mms &&
+ addresses.isEmpty() &&
+ ccAddresses.isEmpty() &&
+ bccAddresses.isEmpty())
+ {
+ // no recipient specified for mms, do not send msg
+ deactivateInputBlocker();
+ return;
+ }
+
+ //close vkb before switching view.
+ mVkbHost->closeKeypad(true);
+
+ packMessage(msg);
+
+ // send message
+ MsgSendUtil *sendUtil = new MsgSendUtil(this);
+ int sendResult = sendUtil->send(msg);
+ delete sendUtil;
+
+ // all checks and validations happen before send
+ if( sendResult == KErrNone)
+ {
+ //After sending the new content to drafts chk if the msg
+ //was originally opened from drafts and delete the opened entry
+ if( mOpenedMessageId.getId() != -1)
+ {
+
+ if(!mPluginLoader)
+ {
+ mPluginLoader = new UniEditorPluginLoader(this);
+ }
+
+ UniEditorPluginInterface* pluginInterface =
+ mPluginLoader->getUniEditorPlugin(messageType);
+ //TODO delete the entry
+ pluginInterface->deleteDraftsEntry(mOpenedMessageId.getId());
+ }
+
+ ConvergedMessageAddressList addrList = addresses;
+ QString receipient;
+
+ int recepientCount = addrList.count();
+ if(recepientCount)
+ {
+ receipient = addrList.at(0)->address();
+ }
+
+ if( mCcField && mBccField)
+ {
+ addrList = ccAddresses;
+ int ccCount = addrList.count();
+ recepientCount += ccCount;
+ if(ccCount)
+ {
+ receipient = addrList.at(0)->address();
+ }
+
+ addrList = bccAddresses;
+ int bccCount = addrList.count();
+ recepientCount += bccCount;
+ if(bccCount)
+ {
+ receipient = addrList.at(0)->address();
+ }
+ }
+
+ QVariantList params;
+
+ if(recepientCount == 1 )
+ {
+ params << MsgBaseView::CV; // target view
+ params << MsgBaseView::UNIEDITOR; // source view
+
+ params << receipient;
+ }
+ else
+ {
+ params << MsgBaseView::CLV;// target view
+ params << MsgBaseView::UNIEDITOR; // source view
+ }
+ deactivateInputBlocker();
+ emit switchView(params);
+ }
+ else
+ {
+ deactivateInputBlocker();
+ if(sendResult == KErrNotFound)
+ {
+ if (messageType == ConvergedMessage::Sms)
+ {
+ HbMessageBox::question(LOC_DIALOG_SMS_SETTINGS_INCOMPLETE,
+ this,SLOT(onDialogSmsSettings(HbAction*)),
+ LOC_DIALOG_OK,
+ LOC_BUTTON_CANCEL);
+ }
+ else
+ {
+ HbMessageBox::question(LOC_DIALOG_MMS_SETTINGS_INCOMPLETE,
+ this,SLOT(onDialogMmsSettings(HbAction*)),
+ LOC_DIALOG_OK,
+ LOC_BUTTON_CANCEL);
+ }
+ }
+ }
+}
+
+void MsgUnifiedEditorView::packMessage(ConvergedMessage &msg, bool isSave)
+{
+ ConvergedMessage::MessageType messageType = MsgMonitor::messageType();
+ msg.setMessageType(messageType);
+ // If isSave is true (save to draft usecase), then don't remove duplicates
+ // If isSave is false (send usecase), then remove duplicates
+ bool removeDuplicates = !isSave;
+ ConvergedMessageAddressList addresses =
+ mToField->addresses(removeDuplicates);
+ ConvergedMessageAddressList ccAddresses;
+ ConvergedMessageAddressList bccAddresses;
+
+ msg.addToRecipients(addresses);
+ msg.setBodyText(mBody->text());
+ msg.setDirection(ConvergedMessage::Outgoing);
+ QDateTime time = QDateTime::currentDateTime();
+ msg.setTimeStamp(time.toTime_t());
+
+ if(messageType == ConvergedMessage::Mms)
+ {
+ if(mCcField)
+ {
+ ccAddresses = mCcField->addresses(removeDuplicates);
+ }
+
+ if(mBccField)
+ {
+ bccAddresses = mBccField->addresses(removeDuplicates);
+ }
+
+ if(removeDuplicates)
+ {
+ int matchDigitsCount = MsgUnifiedEditorAddress::contactMatchDigits();
+ //comapre cc and to field,remove duplicate from cc
+ foreach(ConvergedMessageAddress *ccAddress,ccAddresses)
+ {
+ foreach(ConvergedMessageAddress *toAddress,addresses)
+ {
+ if(0 == ccAddress->address().right(matchDigitsCount).compare(toAddress->address().right(matchDigitsCount)))
+ {
+ ccAddresses.removeOne(ccAddress);
+ }
+ }
+ }
+ //comapre bcc and cc field,remove duplicate from bcc
+ foreach(ConvergedMessageAddress *bccAddress,bccAddresses)
+ {
+ foreach(ConvergedMessageAddress *ccAddress,ccAddresses)
+ {
+ if(0 == bccAddress->address().right(matchDigitsCount).compare(ccAddress->address().right(matchDigitsCount)))
+ {
+ bccAddresses.removeOne(bccAddress);
+ }
+ }
+ }
+ //comapre bcc and to field,remove duplicate from bcc
+ foreach(ConvergedMessageAddress *bccAddress,bccAddresses)
+ {
+ foreach(ConvergedMessageAddress *toAddress,addresses)
+ {
+ if(0 == bccAddress->address().right(matchDigitsCount).compare(toAddress->address().right(matchDigitsCount)))
+ {
+ bccAddresses.removeOne(bccAddress);
+ }
+ }
+ }
+ }
+
+ if(ccAddresses.count()>0)
+ {
+ msg.addCcRecipients(ccAddresses);
+ }
+ if(bccAddresses.count()>0)
+ {
+ msg.addBccRecipients(bccAddresses);
+ }
+ if(mSubjectField)
+ {
+ msg.setSubject(mSubjectField->text());
+ msg.setPriority(mSubjectField->priority());
+ }
+
+ ConvergedMessageAttachmentList mediaList;
+
+ QStringList mediafiles(mBody->mediaContent());
+ if (!mediafiles.isEmpty())
+ {
+ for (int i = 0; i < mediafiles.size(); ++i)
+ {
+ ConvergedMessageAttachment* attachment =
+ new ConvergedMessageAttachment(
+ mediafiles.at(i),
+ ConvergedMessageAttachment::EInline);
+ mediaList << attachment;
+ }
+
+ }
+ if(mediaList.count() > 0)
+ {
+ msg.addAttachments(mediaList);
+ }
+ }
+
+ // sms/mms attachment list
+ ConvergedMessageAttachmentList attachmentList;
+ if(mAttachmentContainer)
+ {
+ MsgUnifiedEditorAttachmentList editorAttachmentList =
+ mAttachmentContainer->attachmentList();
+ for (int i = 0; i < editorAttachmentList.count(); ++i)
+ {
+ ConvergedMessageAttachment* attachment =
+ new ConvergedMessageAttachment(
+ editorAttachmentList.at(i)->path(),
+ ConvergedMessageAttachment::EAttachment);
+ attachmentList << attachment;
+ }
+ }
+ if(attachmentList.count() > 0)
+ {
+ msg.addAttachments(attachmentList);
+ }
+}
+
+void MsgUnifiedEditorView::saveContentToDrafts()
+{
+ if(!mCanSaveToDrafts)
+ {
+ return;
+ }
+ activateInputBlocker();
+ ConvergedMessage::MessageType messageType = MsgMonitor::messageType();
+
+ ConvergedMessageAddressList addresses = mToField->addresses();
+
+ UniEditorPluginInterface* pluginInterface = NULL;
+
+ if( mOpenedMessageId.getId() != -1)
+ {
+ if(!mPluginLoader)
+ {
+ mPluginLoader = new UniEditorPluginLoader(this);
+ }
+
+ pluginInterface =
+ mPluginLoader->getUniEditorPlugin(messageType);
+ }
+
+ if(messageType == ConvergedMessage::Sms &&
+ addresses.isEmpty() &&
+ MsgMonitor::bodySize() <= 0 &&
+ MsgMonitor::containerSize() <= 0)
+ {
+ if(mOpenedMessageId.getId() != -1)
+ {
+ pluginInterface->deleteDraftsEntry(mOpenedMessageId.getId());
+ }
+
+ // if empty msg, do not save
+ deactivateInputBlocker();
+ return;
+ }
+
+ ConvergedMessageAddressList ccAddresses;
+ ConvergedMessageAddressList bccAddresses;
+ if(mCcField)
+ {
+ ccAddresses = mCcField->addresses();
+ }
+ if(mBccField)
+ {
+ bccAddresses = mBccField->addresses();
+ }
+ int subectSize =0;
+ if(mSubjectField)
+ {
+ subectSize = mSubjectField->text().size();
+ }
+
+ if( messageType == ConvergedMessage::Mms &&
+ addresses.isEmpty() &&
+ ccAddresses.isEmpty() &&
+ bccAddresses.isEmpty() &&
+ subectSize <= 0 &&
+ MsgMonitor::bodySize() <= 0 &&
+ MsgMonitor::containerSize() <= 0)
+ {
+ if(mOpenedMessageId.getId() != -1)
+ {
+ pluginInterface->deleteDraftsEntry(mOpenedMessageId.getId());
+ }
+ // if empty msg, do not send
+ deactivateInputBlocker();
+ return;
+ }
+ ConvergedMessage msg;
+ packMessage(msg, true);
+
+ // save to drafts
+ MsgSendUtil *sendUtil = new MsgSendUtil(this);
+ int msgId = sendUtil->saveToDrafts(msg);
+ delete sendUtil;
+
+ // If saving new msg to draft succeeded and also if the originally
+ // opened msg was from drafts, then delete the original msg entry
+ if(msgId != -1 && mOpenedMessageId.getId() != -1)
+ {
+ pluginInterface->deleteDraftsEntry(mOpenedMessageId.getId());
+ mOpenedMessageId.setId(INVALID_MSGID);
+ }
+
+ deactivateInputBlocker();
+
+ bool res = ((msgId > INVALID_MSGID)? true : false);
+
+ if(res)
+ {
+ HbNotificationDialog::launchDialog(LOC_SAVED_TO_DRAFTS);
+ }
+}
+
+void MsgUnifiedEditorView::resizeEvent( QGraphicsSceneResizeEvent * event )
+{
+ Q_UNUSED(event)
+ #ifdef _DEBUG_TRACES_
+ qDebug()<<"resize event";
+#endif
+
+ mContentWidget->resize(this->rect().width(),this->rect().height()+1);
+}
+
+//---------------------------------------------------------------
+// MsgUnifiedEditorView::createVCards
+// @see header file
+//---------------------------------------------------------------
+int MsgUnifiedEditorView::createVCards(
+ const QVariant& value, QStringList& filelist)
+{
+ // make sure that temp-folder is created for storing vcards
+ if(!createTempFolder())
+ {
+ return KErrGeneral;
+ }
+
+ // extract contact-list
+ QContactManager* contactManager = new QContactManager("symbian");
+ CntServicesContactList cntServicesContacts = qVariantValue<CntServicesContactList>(value);
+ int cntCount = cntServicesContacts.count();
+ QList<QtMobility::QContact> contactList;
+ for(int i = 0; i < cntCount; i++ )
+ {
+ contactList << contactManager->contact( cntServicesContacts.at(i).mContactId );
+ }
+ delete contactManager;
+
+ // get list of all versit-documents
+ QVersitDocument::VersitType versitType(QVersitDocument::VCard21Type);
+ QVersitContactExporter* exporter = new QVersitContactExporter();
+
+ bool ret_val = exporter->exportContacts(contactList, versitType);
+ QList<QtMobility::QVersitDocument> documentList = exporter->documents();
+
+ delete exporter;
+
+ // loop though and create a vcard for each contact
+ QVersitWriter* writer = new QVersitWriter();
+ for(int i = 0; i < cntCount; i++ )
+ {
+ // buffer to hold vcard data fetched from contacts
+ QBuffer contactsbuf;
+ contactsbuf.open(QBuffer::ReadWrite);
+ writer->setDevice( &contactsbuf );
+
+ //write document data to buffer
+ QList<QtMobility::QVersitDocument> currDoc;
+ currDoc << documentList.at(i);
+ writer->startWriting(currDoc);
+ if(writer->waitForFinished())
+ {
+ // generate file name
+ QString displayLabel = contactList.at(i).displayLabel();
+ QString filepath = generateFileName(displayLabel);
+ QFile file(filepath);
+ if(file.open(QIODevice::WriteOnly))
+ {
+ // trap ignore so that, incase of multiselection, other vcards are still created
+ QByteArray bufArr;
+ TRAP_IGNORE(
+ CBufBase* contactbufbase = CBufFlat::NewL(contactsbuf.size());
+ CleanupStack::PushL(contactbufbase);
+ contactbufbase->InsertL( contactbufbase->Size(),
+ *XQConversions::qStringToS60Desc8( contactsbuf.data() ) );
+ TPtr8 ptrbuf(contactbufbase->Ptr(0));
+ bufArr = XQConversions::s60Desc8ToQByteArray(ptrbuf);
+ CleanupStack::PopAndDestroy(contactbufbase);
+ );
+ file.write(bufArr);
+ file.close();
+ filelist << filepath;
+ }
+ }
+ }
+
+ // cleanup & return
+ delete writer;
+ return KErrNone;
+}
+
+
+//---------------------------------------------------------------
+// MsgUnifiedEditorView::generateFileName
+// @param suggestedName suggested name of the file
+// @return fullPath of the generated filename
+// @algo For multiselected 'Unnamed' contacts, the filename should
+// be synthesized as unnamed.vcf, unnamed1.vcf, unnamed2.vcf etc.
+//---------------------------------------------------------------
+QString MsgUnifiedEditorView::generateFileName(QString& suggestedName)
+{
+ QDir editorTempDir;
+ editorTempDir.cd(editorTempPath());
+
+ for(int i=0; i<MAX_VCARDS; i++)
+ {
+ QString searchFileName = suggestedName;
+ if(i>0)
+ {
+ searchFileName.append(QString::number(i));
+ }
+ searchFileName.append(FILE_EXTN);
+
+ // check if filename is already used by an attachment in container
+ bool alreadyExists = false;
+ if(mAttachmentContainer)
+ {
+ MsgUnifiedEditorAttachmentList attList =
+ mAttachmentContainer->attachmentList();
+ int attCount = attList.count();
+ for(int j=0; j<attCount; j++)
+ {
+ QFileInfo fileinfo(attList.at(j)->path());
+ if(searchFileName == fileinfo.fileName())
+ {
+ alreadyExists = true;
+ break;
+ }
+ }
+ }
+
+ if(!alreadyExists)
+ {
+ if(i>0)
+ {
+ suggestedName.append(QString::number(i));
+ }
+ break;
+ }
+ }
+ QString filepath(editorTempPath());
+ filepath.append(suggestedName);
+ filepath.append(FILE_EXTN);
+ return filepath;
+}
+
+void MsgUnifiedEditorView::handleViewExtnActivated(HbListWidgetItem* item)
+ {
+ QString itemText = item->text();
+
+ if(itemText == LOC_PHOTO)
+ {
+ //launch photo picker.
+ fetchImages();
+ }
+ else if(itemText == LOC_SOUND)
+ {
+ //launch audio picker
+ fetchAudio();
+ }
+ else if(itemText == LOC_BUSINESS_CARD)
+ {
+ //launch contact card picker.
+ fetchContacts();
+ }
+
+}
+
+//---------------------------------------------------------------
+// MsgUnifiedEditorView::fetchContacts
+// @see header file
+//---------------------------------------------------------------
+void MsgUnifiedEditorView::fetchContacts()
+{
+ QList<QVariant> args;
+ QString serviceName("com.nokia.services.phonebookservices");
+ QString operation("fetch(QString,QString,QString)");
+ XQAiwRequest* request;
+ XQApplicationManager appManager;
+ request = appManager.create(serviceName, "Fetch", operation, true); //embedded
+ if ( request == NULL )
+ {
+ QCRITICAL_WRITE("AIW-ERROR: NULL request");
+ return;
+ }
+
+ // Result handlers
+ connect (request, SIGNAL(requestOk(const QVariant&)),
+ this, SLOT(contactsFetched(const QVariant&)));
+ connect (request, SIGNAL(requestError(int,const QString&)),
+ this, SLOT(serviceRequestError(int,const QString&)));
+
+ args << QString(tr("Phonebook"));
+ args << KCntActionAll;
+ args << KCntFilterDisplayAll;
+
+ request->setArguments(args);
+ if(!request->send())
+ {
+ QDEBUG_WRITE_FORMAT("AIW-ERROR: Request Send failed:",request->lastError());
+ }
+ delete request;
+}
+
+//---------------------------------------------------------------
+// MsgUnifiedEditorView::fetchImages
+// @see header file
+//---------------------------------------------------------------
+void MsgUnifiedEditorView::fetchImages()
+{
+ QString interface("Image");
+ QString operation("fetch(QVariantMap,QVariant)");
+ XQAiwRequest* request = NULL;
+ XQApplicationManager appManager;
+ request = appManager.create(interface, operation, true);//embedded
+ request->setSynchronous(true); // synchronous
+ if(!request)
+ {
+ QCRITICAL_WRITE("AIW-ERROR: NULL request");
+ return;
+ }
+
+ connect(request, SIGNAL(requestOk(const QVariant&)),
+ this, SLOT(imagesFetched(const QVariant&)));
+ connect(request, SIGNAL(requestError(int,const QString&)),
+ this, SLOT(serviceRequestError(int,const QString&)));
+
+ // Set arguments for request
+ QList<QVariant> args;
+ args << QVariantMap();
+ args << QVariant();
+ request->setArguments(args);
+ // Make the request
+ if (!request->send())
+ {
+ QDEBUG_WRITE_FORMAT("AIW-ERROR: Request Send failed:" , request->lastError());
+ }
+ delete request;
+}
+
+//---------------------------------------------------------------
+// MsgUnifiedEditorView::fetchAudio
+// @see header file
+//---------------------------------------------------------------
+void MsgUnifiedEditorView::fetchAudio()
+{
+ QString service("musicplayer");
+ QString interface("com.nokia.symbian.IMusicFetch");
+ QString operation("fetch()");
+ XQAiwRequest* request = NULL;
+ XQApplicationManager appManager;
+ request = appManager.create(service, interface, operation, true); //embedded
+ request->setSynchronous(true); // synchronous
+ if(!request)
+ {
+ QCRITICAL_WRITE("AIW-ERROR: NULL request");
+ return;
+ }
+
+ connect(request, SIGNAL(requestOk(const QVariant&)),
+ this, SLOT(audiosFetched(const QVariant&)));
+ connect(request, SIGNAL(requestError(int,const QString&)),
+ this, SLOT(serviceRequestError(int,const QString&)));
+
+ // Make the request
+ if (!request->send())
+ {
+ QDEBUG_WRITE_FORMAT("AIW-ERROR: Request Send failed :",request->lastError());
+ }
+ delete request;
+}
+
+//---------------------------------------------------------------
+// MsgUnifiedEditorView::contactsFetched
+// @see header file
+//---------------------------------------------------------------
+void MsgUnifiedEditorView::contactsFetched(const QVariant& value)
+{
+ // create a vcard for each contact fetched and add as attachment
+ QStringList attachmentList;
+ if(createVCards(value, attachmentList) == KErrNone)
+ {
+ addAttachments(attachmentList);
+ }
+}
+
+//---------------------------------------------------------------
+// MsgUnifiedEditorView::imagesFetched
+// @see header file
+//---------------------------------------------------------------
+void MsgUnifiedEditorView::imagesFetched(const QVariant& result )
+{
+ if(result.canConvert<QStringList>())
+ {
+ QStringList fileList = result.value<QStringList>();
+ if ( fileList.size()>0 )
+ {
+ QString filepath(QDir::toNativeSeparators(fileList.at(0)));
+ mBody->setImage(filepath);
+ }
+ }
+}
+
+//---------------------------------------------------------------
+// MsgUnifiedEditorView::audiosFetched
+// @see header file
+//---------------------------------------------------------------
+void MsgUnifiedEditorView::audiosFetched(const QVariant& result )
+{
+ if(result.canConvert<QStringList>())
+ {
+ QStringList fileList = result.value<QStringList>();
+ if ( fileList.size()>0 && !fileList.at(0).isEmpty())
+ {
+ QString filepath(QDir::toNativeSeparators(fileList.at(0)));
+ QDEBUG_WRITE_FORMAT("Received audio file path = ", fileList.at(0));
+ mBody->setAudio(filepath);
+ }
+ }
+}
+
+//---------------------------------------------------------------
+// MsgUnifiedEditorView::serviceRequestError
+// @see header file
+//---------------------------------------------------------------
+void MsgUnifiedEditorView::serviceRequestError(int errorCode, const QString& errorMessage)
+{
+ QDEBUG_WRITE_FORMAT(errorMessage,errorCode);
+}
+
+//---------------------------------------------------------------
+// MsgUnifiedEditorView::activateInputBlocker
+// @see header file
+//--------------------------------------------------------------
+void MsgUnifiedEditorView::activateInputBlocker()
+{
+ this->grabMouse();
+ this->grabKeyboard();
+}
+
+//---------------------------------------------------------------
+// MsgUnifiedEditorView::deactivateInputBlocker
+// @see header file
+//--------------------------------------------------------------
+void MsgUnifiedEditorView::deactivateInputBlocker()
+{
+ this->ungrabKeyboard();
+ this->ungrabMouse();
+}
+
+//---------------------------------------------------------------
+// MsgUnifiedEditorView::setAttachOptionEnabled
+// @see header file
+//--------------------------------------------------------------
+void MsgUnifiedEditorView::setAttachOptionEnabled(
+ MsgUnifiedEditorView::TBE_AttachOption opt, bool enable)
+{
+ HbListWidgetItem* wgtItem = mTBExtnContentWidget->item(opt);
+ wgtItem->setEnabled(enable);
+}
+
+//---------------------------------------------------------------
+// MsgUnifiedEditorView::vkbOpened
+// @see header file
+//---------------------------------------------------------------
+void MsgUnifiedEditorView::vkbOpened()
+{
+ hideChrome(true);
+
+ disconnect(mVkbHost,SIGNAL(keypadOpened()),this,SLOT(vkbOpened()));
+}
+
+//---------------------------------------------------------------
+// MsgUnifiedEditorView::vkbClosed
+// @see header file
+//---------------------------------------------------------------
+void MsgUnifiedEditorView::vkbClosed()
+{
+ hideChrome(false);
+
+ connect(mVkbHost,SIGNAL(keypadOpened()),this,SLOT(vkbOpened()));
+}
+
+//---------------------------------------------------------------
+// MsgUnifiedEditorView::hideChrome
+//
+//---------------------------------------------------------------
+void MsgUnifiedEditorView::hideChrome(bool hide)
+{
+ if(hide)
+ {
+ this->setContentFullScreen(true);
+ this->hideItems(Hb::StatusBarItem | Hb::TitleBarItem);
+ }
+ else
+ {
+ this->setContentFullScreen(false);
+ this->showItems(Hb::StatusBarItem | Hb::TitleBarItem);
+ }
+}
+
+//---------------------------------------------------------------
+// MsgUnifiedEditorView::doDelayedConstruction
+//
+//---------------------------------------------------------------
+void MsgUnifiedEditorView::doDelayedConstruction()
+{
+ addMenu();
+ createTempFolder();
+
+ //Create VKB instance and listen to VKB open and close signals.
+ mVkbHost = new HbAbstractVkbHost(this);
+ connect(mVkbHost, SIGNAL(keypadOpened()), this, SLOT(vkbOpened()));
+ connect(mVkbHost, SIGNAL(keypadClosed()), this, SLOT(vkbClosed()));
+
+ disconnect(this->mainWindow(),SIGNAL(viewReady()),this,SLOT(doDelayedConstruction()));
+
+}
+
+//---------------------------------------------------------------
+// MsgUnifiedEditorView::createTempFolder
+//
+//---------------------------------------------------------------
+bool MsgUnifiedEditorView::createTempFolder()
+{
+ // create editor's temp folder
+ QDir tempDir;
+ QString tempPath(editorTempPath());
+ bool result = tempDir.mkpath(tempPath);
+ return result;
+}
+
+//---------------------------------------------------------------
+// MsgUnifiedEditorView::removeTempFolder
+//
+//---------------------------------------------------------------
+void MsgUnifiedEditorView::removeTempFolder()
+{
+ QDir tempDir;
+ QString tempPath(editorTempPath());
+ tempDir.cd(tempPath);
+ QStringList contentList(tempDir.entryList());
+
+ int contentCount = contentList.count();
+ for(int i=0; i<contentCount; i++)
+ {
+ tempDir.remove(contentList.at(i));
+ }
+
+ tempDir.cdUp();
+ tempDir.rmdir(UNIFIED_EDITOR_TEMP_FOLDER);
+}
+
+//---------------------------------------------------------------
+// MsgUnifiedEditorView::setFocus
+//
+//---------------------------------------------------------------
+void MsgUnifiedEditorView::setFocus(MsgUnifiedEditorBaseWidget* item)
+{
+ if(item)
+ {
+ item->setFocus();
+ }
+}
+
+//---------------------------------------------------------------
+// MsgUnifiedEditorView::onContentChanged
+//
+//---------------------------------------------------------------
+void MsgUnifiedEditorView::onContentChanged()
+{
+ mCanSaveToDrafts = true;
+}
+
+//---------------------------------------------------------------
+// MsgUnifiedEditorView::onDialogDeleteMsg
+//---------------------------------------------------------------
+void MsgUnifiedEditorView::onDialogDeleteMsg(HbAction* action)
+{
+ HbMessageBox *dlg = qobject_cast<HbMessageBox*> (sender());
+ if (action == dlg->actions().at(0)) {
+
+ mCanSaveToDrafts = false;
+
+ //delete if draft entry opened
+ if (mOpenedMessageId.getId() != -1) {
+ if (!mPluginLoader) {
+ mPluginLoader = new UniEditorPluginLoader(this);
+ }
+
+ UniEditorPluginInterface* pluginInterface = mPluginLoader->getUniEditorPlugin(
+ MsgMonitor::messageType());
+
+ pluginInterface->deleteDraftsEntry(mOpenedMessageId.getId());
+ }
+
+ //trigger back action.
+ HbAction* backAction = this->navigationAction();
+ if (backAction) {
+ backAction->trigger();
+ }
+
+ }
+}
+
+//---------------------------------------------------------------
+// MsgUnifiedEditorView::onDialogSmsSettings
+//---------------------------------------------------------------
+void MsgUnifiedEditorView::onDialogSmsSettings(HbAction* action)
+{
+ HbMessageBox *dlg = qobject_cast<HbMessageBox*> (sender());
+ if (action == dlg->actions().at(0)) {
+
+ QVariantList params;
+ params << MsgBaseView::MSGSETTINGS;// target view
+ params << MsgBaseView::UNIEDITOR; // source view
+ params << MsgSettingsView::SMSView;
+ emit switchView(params);
+
+ }
+}
+
+//---------------------------------------------------------------
+// MsgUnifiedEditorView::onDialogMmsSettings
+//---------------------------------------------------------------
+void MsgUnifiedEditorView::onDialogMmsSettings(HbAction* action)
+{
+ HbMessageBox *dlg = qobject_cast<HbMessageBox*> (sender());
+ if (action == dlg->actions().at(0)) {
+
+ QVariantList params;
+ params << MsgBaseView::MSGSETTINGS;// target view
+ params << MsgBaseView::UNIEDITOR; // source view
+ params << MsgSettingsView::MMSView;
+ emit switchView(params);
+ }
+}
+
+//EOF