/*
* 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: Helper class to monitor msg construction in unified editor
*
*/
// INCLUDES
#include "debugtraces.h"
#include <HbNotificationDialog>
#include <HbWidget>
// USER INCLUDES
#include "msgunieditormonitor.h"
#include "msgunieditorview.h"
#include "msgunieditoraddress.h"
#include "msgunieditorsubject.h"
#include "msgunieditorbody.h"
#include "msgunieditorattachmentcontainer.h"
#include "UniEditorGenUtils.h"
// Constants
// Define static
ConvergedMessage::MessageType MsgUnifiedEditorMonitor::mMessageType;
int MsgUnifiedEditorMonitor::mBodySize;
int MsgUnifiedEditorMonitor::mContainerSize;
int MsgUnifiedEditorMonitor::mSubjectSize;
int MsgUnifiedEditorMonitor::mMaxMmsSize;
int MsgUnifiedEditorMonitor::mMaxSmsRecipients;
int MsgUnifiedEditorMonitor::mMaxMmsRecipients;
int MsgUnifiedEditorMonitor::mMsgCurrAddressCount;
//Localized strings
#define LOC_POP_MESSAGE_CHANGE_MUL hbTrId("txt_messaging_dpopinfo_message_type_changed_to_mul")
#define LOC_POP_MESSAGE_CHANGE_TEXT hbTrId("txt_messaging_dpopinfo_message_type_changed_to_tex")
//---------------------------------------------------------------
// MsgUnifiedEditorMonitor::MsgUnifiedEditorMonitor
// @see header file
//---------------------------------------------------------------
MsgUnifiedEditorMonitor::MsgUnifiedEditorMonitor(QObject* parent) :
QObject(parent),
mSkipNote(false)
{
init();
mUniEditorGenUtils = new UniEditorGenUtils;
}
//---------------------------------------------------------------
// MsgUnifiedEditorMonitor::~MsgUnifiedEditorMonitor
// @see header file
//---------------------------------------------------------------
MsgUnifiedEditorMonitor::~MsgUnifiedEditorMonitor()
{
delete mUniEditorGenUtils;
}
//---------------------------------------------------------------
// MsgUnifiedEditorMonitor::init
// @see header file
//---------------------------------------------------------------
void MsgUnifiedEditorMonitor::init()
{
mMessageType = ConvergedMessage::Sms;
mBodySize = 0;
mContainerSize = 0;
mSubjectSize = 0;
mMsgCurrAddressCount = 0;
UniEditorGenUtils* uniEditorGenUtils = new UniEditorGenUtils;
mMaxMmsSize = KDefaultMaxSize;
TRAP_IGNORE(mMaxMmsSize = uniEditorGenUtils->MaxMmsMsgSizeL());
mMaxSmsRecipients = KDefaultSmsRecipients;
TRAP_IGNORE(mMaxSmsRecipients = uniEditorGenUtils->MaxSmsRecipientsL());
mMaxMmsRecipients = KDefaultMmsRecipients;
TRAP_IGNORE(mMaxMmsRecipients = uniEditorGenUtils->MaxMmsRecipientsL());
delete uniEditorGenUtils;
}
//---------------------------------------------------------------
// MsgUnifiedEditorMonitor::handleContentChange
// @see header file
//---------------------------------------------------------------
void MsgUnifiedEditorMonitor::handleContentChange()
{
// get the projected message type & show the type change note
ConvergedMessage::MessageType newMsgType = projectedMsgType();
if(mMessageType != newMsgType)
{
mMessageType = newMsgType;
QString noteStr;
if(newMsgType == ConvergedMessage::Sms)
{
noteStr = LOC_POP_MESSAGE_CHANGE_TEXT;
}
else
{
noteStr = LOC_POP_MESSAGE_CHANGE_MUL;
}
showPopup(noteStr);
}
HbWidget* senderWidget = qobject_cast<HbWidget*>(sender());
updateMsgInfo(senderWidget);
}
//---------------------------------------------------------------
// MsgUnifiedEditorMonitor::projectedMsgType
// @see header file
//---------------------------------------------------------------
ConvergedMessage::MessageType MsgUnifiedEditorMonitor::projectedMsgType()
{
ConvergedMessage::MessageType newMsgType = ConvergedMessage::Sms;
// check if MMS content is present in any of the editor component
if( bodyHasMMSContent() ||
subjectHasMMSContent() ||
containerHasMMSContent() ||
otherMMSCriteriaMet() )
{
newMsgType = ConvergedMessage::Mms;
}
return newMsgType;
}
//---------------------------------------------------------------
// MsgUnifiedEditorMonitor::updateMsgInfo
// @see header file
//---------------------------------------------------------------
void MsgUnifiedEditorMonitor::updateMsgInfo(HbWidget* senderWidget)
{
if(mMessageType == ConvergedMessage::Mms)
{
//Disable char counter & add subject
view()->mBody->disableCharCounter();
view()->addSubject();
}
// check if sent by body widget
MsgUnifiedEditorBody* body = NULL;
body = qobject_cast<MsgUnifiedEditorBody*>(senderWidget);
if(body)
{
mBodySize = view()->mBody->bodySize();
view()->setAttachOptionEnabled(
MsgUnifiedEditorView::TBE_PHOTO, !view()->mBody->hasImage());
view()->setAttachOptionEnabled(
MsgUnifiedEditorView::TBE_SOUND, !view()->mBody->hasAudio());
return;
}
// check if sent by subject widget
MsgUnifiedEditorSubject* subject = NULL;
subject = qobject_cast<MsgUnifiedEditorSubject*>(senderWidget);
if(subject)
{
mSubjectSize = view()->mSubjectField->subjectSize();
return;
}
// check if sent by attachment container widget
MsgAttachmentContainer* container = NULL;
container = qobject_cast<MsgAttachmentContainer*>(senderWidget);
if(container)
{
mContainerSize = view()->mAttachmentContainer->containerSize();
return;
}
// handle content change from other widgets e.g. To, Cc, Bcc address field
int totalAddressCount = view()->mToField->addressCount();
if(view()->mCcField && view()->mBccField)
{
totalAddressCount += view()->mCcField->addressCount() +
view()->mBccField->addressCount();
}
mMsgCurrAddressCount = totalAddressCount;
return;
}
//---------------------------------------------------------------
// MsgUnifiedEditorMonitor::showPopup
// @see header file
//---------------------------------------------------------------
void MsgUnifiedEditorMonitor::showPopup(const QString& text)
{
if(!mSkipNote)
{
HbNotificationDialog* dlg = new HbNotificationDialog();
dlg->setFocusPolicy(Qt::NoFocus);
dlg->setDismissPolicy(HbPopup::TapAnywhere);
dlg->setAttribute(Qt::WA_DeleteOnClose, true);
dlg->setText(text);
dlg->show();
}
// reset skip note flag
mSkipNote = false;
}
//---------------------------------------------------------------
// MsgUnifiedEditorMonitor::view
// @see header file
//---------------------------------------------------------------
MsgUnifiedEditorView* MsgUnifiedEditorMonitor::view()
{
return static_cast<MsgUnifiedEditorView*>(this->parent());
}
//---------------------------------------------------------------
// MsgUnifiedEditorMonitor::bodyHasMMSContent
// @see header file
//---------------------------------------------------------------
bool MsgUnifiedEditorMonitor::bodyHasMMSContent()
{
MsgUnifiedEditorBody* edBody = view()->mBody;
// If any media-object is present inside body
if(!edBody->mediaContent().isEmpty())
{
return true;
}
int bodyTextSize = mUniEditorGenUtils->UTF8Size(edBody->text());
int maxSmsSize = 0;
TRAP_IGNORE(maxSmsSize =
mUniEditorGenUtils->MaxSmsMsgSizeL(edBody->isUnicode()));
// If body text size exceeds sms text-size limit
if(bodyTextSize > maxSmsSize)
{
return true;
}
return false;
}
//---------------------------------------------------------------
// MsgUnifiedEditorMonitor::subjectHasMMSContent
// @see header file
//---------------------------------------------------------------
bool MsgUnifiedEditorMonitor::subjectHasMMSContent()
{
MsgUnifiedEditorSubject* edSubject = view()->mSubjectField;
ConvergedMessage::Priority priority = ConvergedMessage::Normal;
QString subjectText;
if(edSubject)
{
priority = edSubject->priority();
subjectText = edSubject->text();
}
// If priority is set to other than Normal or
// If subject has some content
if( (priority != ConvergedMessage::Normal) ||
!subjectText.isEmpty() )
{
return true;
}
return false;
}
//---------------------------------------------------------------
// MsgUnifiedEditorMonitor::containerHasMMSContent
// @see header file
//---------------------------------------------------------------
bool MsgUnifiedEditorMonitor::containerHasMMSContent()
{
QString bodyText = view()->mBody->text();
MsgAttachmentContainer* edContainer = view()->mAttachmentContainer;
bool hasMMAttachmentContent = false;
int attachmentCount = 0;
if(edContainer)
{
hasMMAttachmentContent = edContainer->hasMMContent();
attachmentCount = edContainer->count();
}
// If MM attachments are present or
// If only one non-MM attachment is present e.g. vcf along with body text
if( hasMMAttachmentContent ||
((attachmentCount == 1) && !bodyText.isEmpty()) )
{
return true;
}
return false;
}
//---------------------------------------------------------------
// MsgUnifiedEditorMonitor::otherMMSCriteriaMet
// @see header file
//---------------------------------------------------------------
bool MsgUnifiedEditorMonitor::otherMMSCriteriaMet()
{
MsgUnifiedEditorAddress* edCc = view()->mCcField;
MsgUnifiedEditorAddress* edBcc = view()->mBccField;
int ccCount = 0;
int bccCount = 0;
if(edCc && edBcc)
{
ccCount = edCc->addressCount();
bccCount = edBcc->addressCount();
}
// If CC/BCC has some content or
// If to-recipients count exceeds max sms recipient count
if( ccCount || bccCount ||
(view()->mToField->addressCount() > mMaxSmsRecipients) )
{
return true;
}
// If to-field contains an email address
bool isEmailPresent = false;
ConvergedMessageAddressList addrList = view()->mToField->addresses();
TRAP_IGNORE(isEmailPresent = mUniEditorGenUtils->VerifyEmailAddressesL(addrList));
if(isEmailPresent)
{
return true;
}
return false;
}
//EOF