messagingapp/msgui/unifiededitor/src/msgunieditorview.cpp
changeset 23 238255e8b033
child 25 84d9eb65b26f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/messagingapp/msgui/unifiededitor/src/msgunieditorview.cpp	Fri Apr 16 14:56:15 2010 +0300
@@ -0,0 +1,924 @@
+/*
+ * 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 <HbWidget>
+#include <HbMenu>
+#include <HbAction>
+#include <HbToolBar>
+#include <QGraphicsLinearLayout>
+#include <HbGroupBox>
+#include <HbScrollArea>
+#include <QDateTime>
+#include <QDir>
+
+// USER INCLUDES
+#include "debugtraces.h"
+#include "msgunieditorview.h"
+#include "msgunieditoraddress.h"
+#include "msgunieditorsubject.h"
+#include "msgunieditorbody.h"
+#include "msgtypenotifier.h"
+#include "msgmonitor.h"
+#include "msgattachmentcontainer.h"
+#include "msguiutilsmanager.h"
+#include "convergedmessageaddress.h"
+#include "matchphnumberutil.h"
+#include "unieditorgenutils.h"
+#include "unieditorpluginloader.h"
+#include "unieditorplugininterface.h"
+
+// Constants
+const QString SEND_ICON(":/qtg_mono_send.svg");
+const QString ATTACH_ICON(":/qtg_mono_attach.svg");
+
+const int INVALID_MSGID = -1;
+
+// LOCALIZED CONSTANTS
+#define LOC_TO hbTrId("txt_messaging_formlabel_to")
+#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")
+#define LOC_SENDING_OPTIONS hbTrId("txt_messaging_opt_sending_options")
+
+#define LOC_DELETE_MESSAGE hbTrId("txt_messaging_opt_delete_message")
+#define LOC_CC hbTrId("txt_messaging_formlabel_cc")
+#define LOC_BCC hbTrId("txt_messaging_formlabel_bcc")
+#define LOC_OTHER_RECIPIENTS hbTrId("txt_messaging_group_title_ln_other_recipients")
+
+#define LOC_PHOTO hbTrId("txt_messaging_button_photo")
+#define LOC_VIDEO hbTrId("txt_messaging_button_video")
+#define LOC_SOUND hbTrId("txt_messaging_button_sound")
+#define LOC_MORE hbTrId("txt_messaging_button_more")
+
+//---------------------------------------------------------------
+// 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),
+mPrioritySubMenu(0),
+mContentWidget(0),
+mNotifier(0),
+mMsgMonitor(0),
+mUtilsManager(0),
+mAttachmentContainer(0),
+mPluginLoader(0)
+{
+    addMenu();
+    addToolBar();
+
+    HbScrollArea* scrollArea = new HbScrollArea(this);
+    this->setWidget(scrollArea);
+
+    mContentWidget = new HbWidget(this);
+    scrollArea->setContentWidget(mContentWidget);
+
+    mPluginPath = pluginPath();
+
+    mMainLayout = new QGraphicsLinearLayout(Qt::Vertical, mContentWidget);
+    mMainLayout->setContentsMargins(0,0,0,0);
+
+    //Adding suitable spacing between the Custom Widgets
+    qreal vItemSpacing = 0.0;
+    style()->parameter("hb-param-margin-gene-middle-vertical",vItemSpacing);
+    mMainLayout->setSpacing(vItemSpacing);
+
+    // notifier for recording msg type transitions between sms & mms
+    mNotifier = new MsgTypeNotifier(this);
+    mMsgMonitor = new MsgMonitor(this);
+    mUtilsManager = new MsgUiUtilsManager(this);
+
+    mToField = new MsgUnifiedEditorAddress( LOC_TO, mPluginPath, mContentWidget );
+    mBody = new MsgUnifiedEditorBody(mPluginPath, mContentWidget);
+
+    mMainLayout->addItem(mToField);
+    mMainLayout->addItem(mBody);
+ 
+    //Set the invalid msg id
+    mOpenedMessageId.setId(-1);
+    
+    connect(mToField, SIGNAL(sendMessage()), this, SLOT(send()));
+    connect(mBody, SIGNAL(sendMessage()), this, SLOT(send()));
+    connect(mBody, SIGNAL(mmContentAdded(bool)),
+                     mNotifier, SLOT(onMMContentAdded(bool)));
+    connect(mBody, SIGNAL(sizeChanged(int)),
+                     mMsgMonitor, SLOT(onSizeChanged(int)));
+    connect(mUtilsManager, SIGNAL(imagesFetched(const QVariant&)),
+                     this, SLOT(imagesFetched(const QVariant&)));
+    connect(mUtilsManager, SIGNAL(audiosFetched(const QVariant&)),
+                     this, SLOT(audiosFetched(const QVariant&)));
+}
+
+//---------------------------------------------------------------
+// MsgUnifiedEditorView::~MsgUnifiedEditorView
+// @see header file
+//---------------------------------------------------------------
+MsgUnifiedEditorView::~MsgUnifiedEditorView()
+{
+}
+
+void MsgUnifiedEditorView::addMenu()
+{
+    //Create Menu Options
+    HbMenu* mainMenu = new HbMenu();
+
+    //TODO:These 2 should be submenu option to Add
+    mSubjectAction = mainMenu->addAction(tr("Add Subject"));
+    mCcBccAction = mainMenu->addAction(tr("Add Cc/Bcc"));
+    
+    mPrioritySubMenu = mainMenu->addMenu(tr("Add Priority"));
+
+    HbAction* highPriorityAction = mPrioritySubMenu->addAction(LOC_HIGH);
+    highPriorityAction->setData(ConvergedMessage::High);
+
+    HbAction* normalPriorityAction = mPrioritySubMenu->addAction(LOC_NORMAL);
+    normalPriorityAction->setData(ConvergedMessage::Normal);
+
+    HbAction* lowPriorityAction = mPrioritySubMenu->addAction(LOC_LOW);
+    lowPriorityAction->setData(ConvergedMessage::Low);
+
+    HbAction* sendOptionsAction = mainMenu->addAction(LOC_SENDING_OPTIONS);
+    HbAction* deleteMsgAction = mainMenu->addAction(LOC_DELETE_MESSAGE);
+    HbAction* helpAction = mainMenu->addAction(tr("Help"));
+
+    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()));
+    connect(helpAction,SIGNAL(triggered()),this, SLOT(launchHelp()));
+
+    setMenu(mainMenu);
+}
+
+void MsgUnifiedEditorView::openDraftsMessage(ConvergedMessageId& messageId,
+    ConvergedMessage::MessageType messageType )
+{
+    if(!mPluginLoader)
+    {
+        mPluginLoader = new UniEditorPluginLoader(this);
+        mPluginLoader->loadPlugins();
+    }
+    
+    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
+        populateDraftsContent(*msg);
+        delete msg;
+    }
+}
+
+void MsgUnifiedEditorView::populateContent(const ConvergedMessage& messageDetails, int editorFields)
+{
+    mToField->setAddresses(messageDetails.toAddressList());
+    QString bodyTxt = messageDetails.bodyText();
+    mBody->setText(bodyTxt);
+
+    int attachmentCount = messageDetails.attachments().count();
+    if(attachmentCount == 1)
+    {
+        int imageSize=0;
+        QString mimeType;
+        TMsgMediaType mediaType = EMsgMediaUnknown;
+        QString filePath = messageDetails.attachments().at(0)->filePath();
+        UniEditorGenUtils* genUtils = new UniEditorGenUtils;
+        TRAP_IGNORE(genUtils->getFileInfoL(filePath,imageSize,
+                                           mimeType,mediaType));
+        delete genUtils;
+        switch(mediaType)
+        {
+            case EMsgMediaImage:
+            {
+                mBody->setImage(filePath);
+                break;
+            }
+            case EMsgMediaVideo:
+            {
+                mBody->setVideo(filePath);
+                break;
+            }
+            case EMsgMediaAudio:
+            {
+                mBody->setAudio(filePath);
+                break;
+            }
+            case EMsgMediaUnknown:
+            case EMsgMediaText:
+            default:
+            {
+                addAttachment(filePath);
+                break;
+            }
+        }
+        
+        addSubject();
+	}
+	else if(attachmentCount > 1)
+	{
+		for(int i=0; i<attachmentCount; i++)
+		{
+		    QString filePath = messageDetails.attachments().at(i)->filePath();
+		    //TODO: put size checks and show size exceeded msg when appropriate
+		    addAttachment(filePath);
+		}
+		
+		addSubject();
+	}
+
+	if(editorFields & MsgBaseView::ADD_RECIPIENTS)
+	{
+		addCcBcc();
+	}
+	else if(editorFields & MsgBaseView::ADD_SUBJECT)
+  {
+		addSubject();
+	}    
+}
+
+void MsgUnifiedEditorView::populateDraftsContent(
+    const ConvergedMessage& messageDetails)
+{
+    // skip first-time MMS type switch note for draft
+    mNotifier->setSkipNote();
+    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;
+                       
+    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 EMsgMediaVideo:
+                {
+                    mBody->setVideo(filePath);
+                    break;
+                }
+                case EMsgMediaAudio:
+                {
+                    mBody->setAudio(filePath);
+                    break;
+                }
+                case EMsgMediaUnknown:
+                case EMsgMediaText:
+                default:
+                {
+                    addAttachment(filePath);
+                    break;
+                }
+            }
+        }
+        else
+        {
+            addAttachment(filePath);
+        }
+    }    
+    delete genUtils;
+}
+
+void MsgUnifiedEditorView::addToolBar()
+{
+    //Create Tool Bar
+    HbToolBar *toolBar = new HbToolBar();
+    toolBar->setOrientation(Qt::Horizontal);
+
+    //Add Action to the toolbar and show toolbar
+    HbAction* attachToolButton = toolBar->addAction(HbIcon(ATTACH_ICON), QString());
+    HbAction* sendToolButton = toolBar->addAction(HbIcon(SEND_ICON), QString());
+
+    connect(attachToolButton, SIGNAL(triggered()), this, SLOT(showAttachmentPopup()));
+    connect(sendToolButton, SIGNAL(triggered()), this, SLOT(send()));
+
+    setToolBar(toolBar);
+}
+
+void MsgUnifiedEditorView::addSubject()
+{
+    if(mSubjectField)
+    { // do nothing if already present
+        return;
+    }
+    // remove mainmenu's "Add Subject" action
+    HbMenu* mainMenu = this->menu();
+    mainMenu->removeAction(mSubjectAction);
+    mSubjectAction->setParent(NULL);
+    delete mSubjectAction;
+
+    int index =0;
+    int offset = 1;
+    if(mAttachmentContainer)
+    {
+        ++offset;
+    }
+    index = mMainLayout->count() - offset;
+
+    mSubjectField = new MsgUnifiedEditorSubject(mPluginPath, mContentWidget);
+    mMainLayout->insertItem(index,mSubjectField);
+    connect(mSubjectField, SIGNAL(mmContentAdded(bool)),
+                     mNotifier, SLOT(onMMContentAdded(bool)));
+    connect(mSubjectField, SIGNAL(sizeChanged(int)),
+                     mMsgMonitor, SLOT(onSizeChanged(int)));
+}
+
+void MsgUnifiedEditorView::addCcBcc()
+{
+    if(mCcField && mBccField)
+    { // do nothing if already present
+        return;
+    }
+
+    // remove mainmenu's "Add Cc/Bcc" & "Add Subject" actions
+    HbMenu* mainmenu = this->menu();
+    mainmenu->removeAction(mCcBccAction);
+    mCcBccAction->setParent(NULL);
+    delete mCcBccAction;
+
+    mCcField    = new MsgUnifiedEditorAddress( LOC_CC, mPluginPath, mContentWidget );
+    mBccField   = new MsgUnifiedEditorAddress( LOC_BCC, mPluginPath, mContentWidget );
+
+    connect(mCcField, SIGNAL(sendMessage()), this, SLOT(send()));
+    connect(mCcField, SIGNAL(mmContentAdded(bool)), mNotifier, SLOT(onMMContentAdded(bool)));
+    connect(mBccField, SIGNAL(sendMessage()), this, SLOT(send()));
+    connect(mBccField, SIGNAL(mmContentAdded(bool)), mNotifier, SLOT(onMMContentAdded(bool)));
+
+    HbWidget* groupWidget = new HbWidget(mContentWidget);
+    groupWidget->setContentsMargins(0,0,0,0);
+    QGraphicsLinearLayout* ccBccLayout = new QGraphicsLinearLayout(Qt::Vertical, groupWidget);
+    ccBccLayout->addItem(mCcField);
+    ccBccLayout->addItem(mBccField);
+
+    HbGroupBox* groupBox = new HbGroupBox(mContentWidget);
+    groupBox->setCollapsable(true);
+    groupBox->setContentWidget(groupWidget);
+    groupBox->setHeading(tr("Other recipients"));    
+    connect(groupBox, SIGNAL(toggled(bool)), this, SLOT(updateOtherRecipientCount(bool)));
+
+    mMainLayout->insertItem(1,groupBox);
+    // add subject field too
+    addSubject();
+}
+
+void MsgUnifiedEditorView::updateOtherRecipientCount(bool state)
+{
+    HbGroupBox* groupBox = qobject_cast<HbGroupBox*>(sender());
+    if(groupBox)
+    {
+        if(!state)
+        {
+            groupBox->setHeading(tr("Other recipients"));
+        }
+        else
+        {
+            int addrCount = mCcField->addressCount();
+            addrCount += mBccField->addressCount();
+            QString str;
+            str = QString(tr("%1 Other recipients")).arg(addrCount);
+            groupBox->setHeading(str);
+        }
+    }
+}
+
+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);
+    if(priority != ConvergedMessage::Normal)
+    {
+		mPrioritySubMenu->setTitle("Change Priority");
+	}
+   else
+   {
+       mPrioritySubMenu->setTitle("Add Priority");
+   }
+}
+
+void MsgUnifiedEditorView::sendingOptions()
+{
+}
+
+void MsgUnifiedEditorView::deleteMessage()
+{
+}
+
+void MsgUnifiedEditorView::launchHelp()
+{
+}
+
+void MsgUnifiedEditorView::showAttachmentPopup()
+{
+    HbMenu* attachMenu = new HbMenu();
+    attachMenu->deleteLater();
+    attachMenu->setFrameType(HbPopup::Strong);
+
+    HbAction* attachPhoto = attachMenu->addAction(LOC_PHOTO,mUtilsManager,SLOT(fetchImages()));
+    HbAction* attachVideo = attachMenu->addAction(LOC_VIDEO,mUtilsManager,SLOT(fetchVideo()));
+    HbAction* attachAudio = attachMenu->addAction(LOC_SOUND,mUtilsManager,SLOT(fetchAudio()));
+    HbAction* attachOther = attachMenu->addAction(LOC_MORE,mUtilsManager,SLOT(fetchOther()));
+    attachMenu->exec(QPoint());
+    delete attachMenu;
+}
+
+void MsgUnifiedEditorView::removeAttachmentContainer()
+{
+    if(mAttachmentContainer)
+    {
+        mMainLayout->removeItem(mAttachmentContainer);
+        mAttachmentContainer->setParent(NULL);
+        delete mAttachmentContainer;
+        mAttachmentContainer = NULL;
+    }
+}
+
+void MsgUnifiedEditorView::addAttachment(const QString& filepath)
+{
+    if(!mAttachmentContainer)
+    {
+        mAttachmentContainer = new MsgAttachmentContainer(mPluginPath, mContentWidget);
+        connect(mAttachmentContainer, SIGNAL(emptyAttachmentContainer()),
+                this, SLOT(removeAttachmentContainer()));
+        connect(mAttachmentContainer, SIGNAL(mmContentAdded(bool)),
+                mNotifier, SLOT(onMMContentAdded(bool)));
+        connect(mAttachmentContainer, SIGNAL(sizeChanged(int)),
+                         mMsgMonitor, SLOT(onSizeChanged(int)));
+        int index = mMainLayout->count() - 1;
+        mMainLayout->insertItem(index,mAttachmentContainer);
+    }
+    mAttachmentContainer->addAttachment(filepath);
+}
+
+void MsgUnifiedEditorView::imagesFetched(const QVariant& result )
+    {
+    if(result.canConvert<QStringList>())
+        {
+        QStringList fileList = result.value<QStringList>();
+        if ( fileList.size()>0 )
+            {
+            QString filepath(fileList.at(0));
+            mBody->setImage(filepath);
+            addSubject();
+            }
+        }
+    }
+
+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);
+            addSubject();
+            }
+        }
+    }
+
+QString MsgUnifiedEditorView::pluginPath()
+{
+    QString pluginPath;
+    #ifdef Q_OS_WIN
+    #define PLUGINPATH "../unifiededitorplugin/debug/unifiededitorplugind.dll"
+    #endif
+    #ifdef Q_OS_SYMBIAN
+    #define PLUGINPATH "unifiededitorplugin.dll"
+    #endif
+    pluginPath.append(PLUGINPATH);
+    return pluginPath;
+}
+
+void MsgUnifiedEditorView::send()
+{
+    mUtilsManager->activateInputBlocker(this);
+
+    // converged msg for sending
+    ConvergedMessage msg;
+    ConvergedMessage::MessageType messageType = mNotifier->messageType();
+    msg.setMessageType(messageType);
+
+    ConvergedMessageAddressList addresses = mToField->addresses();
+    if(messageType == ConvergedMessage::Sms &&
+       addresses.isEmpty())
+    {
+        // no recipient specified for sms, do not send msg
+        mUtilsManager->deactivateInputBlocker();
+        return;
+    }
+
+    ConvergedMessageAddressList ccAddresses;
+    ConvergedMessageAddressList bccAddresses;
+    if(mCcField)
+    {
+        ccAddresses = mCcField->addresses();
+    }
+    if(mBccField)
+    {
+        bccAddresses = mBccField->addresses();
+    }
+    if( messageType == ConvergedMessage::Mms &&
+            addresses.isEmpty() &&
+            ccAddresses.isEmpty() &&
+            bccAddresses.isEmpty())
+    {
+        // no recipient specified for mms, do not send msg
+        mUtilsManager->deactivateInputBlocker();
+        return;
+    }
+
+    packMessage(msg);
+
+    int sendResult = mUtilsManager->send(msg);
+    
+    // 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);
+                mPluginLoader->loadPlugins();
+            }
+
+            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
+        }
+        mUtilsManager->deactivateInputBlocker();
+    emit switchView(params);
+    }
+    else
+    {
+        mUtilsManager->deactivateInputBlocker();
+        if(sendResult == KErrNotFound)
+        {
+            QVariantList params;
+            params << MsgBaseView::MSGSETTINGS;// target view
+            params << MsgBaseView::UNIEDITOR; // source view
+            emit switchView(params);
+        }
+    }
+}
+
+void MsgUnifiedEditorView::packMessage(ConvergedMessage &msg)
+{
+    ConvergedMessage::MessageType messageType = mNotifier->messageType();
+    msg.setMessageType(messageType);
+
+    ConvergedMessageAddressList addresses = mToField->addresses();
+    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();
+        }
+
+        if(mBccField)
+        {
+            bccAddresses = mBccField->addresses();
+        }
+
+        int matchDigitsCount = MatchPhNumberUtil::matchDigits();
+        //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);
+        }
+}
+
+bool MsgUnifiedEditorView::saveContentToDrafts()
+{
+    mUtilsManager->activateInputBlocker(this);
+    ConvergedMessage::MessageType messageType = mNotifier->messageType();
+
+    ConvergedMessageAddressList addresses = mToField->addresses();
+
+    UniEditorPluginInterface* pluginInterface = NULL;
+    
+    if( mOpenedMessageId.getId() != -1)
+    {    
+        if(!mPluginLoader)
+        {
+            mPluginLoader = new UniEditorPluginLoader(this);
+            mPluginLoader->loadPlugins();
+        }
+
+        pluginInterface =
+            mPluginLoader->getUniEditorPlugin(messageType);
+    }
+
+    if(messageType == ConvergedMessage::Sms &&
+            addresses.isEmpty() && MsgMonitor::bodySize() <= 0)
+    {
+        if(mOpenedMessageId.getId() != -1)
+        {
+        pluginInterface->deleteDraftsEntry(mOpenedMessageId.getId());
+        }
+
+        // no recipient specified for sms, do not send msg
+        mUtilsManager->deactivateInputBlocker();
+        return false;
+    }
+
+    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());
+        }
+        // no recipient specified for mms, do not send msg
+        mUtilsManager->deactivateInputBlocker();
+        return false;
+    }
+    ConvergedMessage msg;
+    packMessage(msg);
+    
+    int msgId = mUtilsManager->saveToDrafts(msg);
+
+    //After saving the new content to drafts chk if the msg 
+    //was originally opened from drafts and delete the opened entry
+    if(mOpenedMessageId.getId() != -1)
+    {
+        pluginInterface->deleteDraftsEntry(mOpenedMessageId.getId());
+        mOpenedMessageId.setId(INVALID_MSGID);
+    }
+    
+    mUtilsManager->deactivateInputBlocker();
+
+    return ((msgId > INVALID_MSGID)? true : false);
+}
+
+void MsgUnifiedEditorView::resizeEvent( QGraphicsSceneResizeEvent * event )
+{
+ Q_UNUSED(event)
+ #ifdef _DEBUG_TRACES_
+ qDebug()<<"resize event";
+#endif
+
+ mContentWidget->resize(this->rect().width(),this->rect().height()+1);
+}
+
+//EOF