diff -r 6a20128ce557 -r ebfee66fde93 messagingapp/msgui/conversationview/src/msgconversationviewitem.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/messagingapp/msgui/conversationview/src/msgconversationviewitem.cpp Fri Jun 04 10:25:39 2010 +0100 @@ -0,0 +1,504 @@ +/* + * 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: + * + */ + +#include "msgconversationviewitem.h" + +// SYSTEM INCLUDES +#include +#include "debugtraces.h" +#include +#include +#include +#include +#include +#include +#include + +// USER INCLUDES +#include "msgconversationwidget.h" +#include "msgviewdefines.h" +#include "msgviewutils.h" +#include "convergedmessage.h" +#include "conversationsenginedefines.h" + +// LOCAL CONSTANTS +const QString MSG_OUTBOX_ICON("qtg_small_outbox"); +const QString MSG_FAIL_ICON("qtg_small_fail"); +const QString ANIMATION_FILE(":/qtg_anim_loading.axml"); +const QString ANIMATION_ICON_NAME("qtg_anim_loading"); +const QString VCARD_ICON("qtg_large_mycard"); + +// LOCALIZATION +#define LOC_RINGING_TONE hbTrId("txt_messaging_dpopinfo_ringing_tone") +#define LOC_BUSINESS_CARD hbTrId("txt_messaging_list_business_card") +#define LOC_CALENDAR_EVENT hbTrId("txt_messaging_list_calendar_event") +#define LOC_UNSUPPORTED_MSG_TYPE hbTrId("txt_messaging_list_listview_unsupported_message_type") +#define LOC_RESEND_AT hbTrId("Resend at ") + +//--------------------------------------------------------------- +// MsgConversationViewItem::MsgConversationViewItem +// Constructor +//--------------------------------------------------------------- +MsgConversationViewItem::MsgConversationViewItem(QGraphicsItem* parent) : + HbListViewItem(parent), mIncoming(false), mConversation(0), + mMessageStateIconItem(0) +{ +} + +//--------------------------------------------------------------- +// MsgConversationViewItem::MsgConversationViewItem +// Destructor +//--------------------------------------------------------------- +MsgConversationViewItem::~MsgConversationViewItem() +{ +} + +//--------------------------------------------------------------- +// MsgConversationViewItem::createItem +// Create a new decorator item. +//--------------------------------------------------------------- +MsgConversationViewItem* MsgConversationViewItem::createItem() + { + return new MsgConversationViewItem(*this); + } + +//--------------------------------------------------------------- +// MsgConversationViewItem::updateChildItems +// +//--------------------------------------------------------------- +void MsgConversationViewItem::updateChildItems() + { + + if (!mMessageStateIconItem) + { + mMessageStateIconItem = new HbIconItem(this); + HbStyle::setItemName(mMessageStateIconItem, "msgStateIcon"); + } + + QModelIndex index = modelIndex(); + +#ifdef _DEBUG_TRACES_ + qCritical() << "START MsgConversationViewItem::updateChildItems: " + << index.data(ConvergedMsgId).toInt(); +#endif + + int messageType = index.data(MessageType).toInt(); + int messageSubType = index.data(MessageSubType).toInt(); + + + if (messageType == ConvergedMessage::Sms) + { + updateSmsTypeItem(index); + } + else if (messageType == ConvergedMessage::Mms || messageType + == ConvergedMessage::MmsNotification || messageType + == ConvergedMessage::BT) + { + updateMmsTypeItem(index, messageType, messageSubType); + } + else if (messageType == ConvergedMessage::BioMsg) + { + if (messageSubType == ConvergedMessage::VCard || messageSubType + == ConvergedMessage::RingingTone) + { + updateMmsTypeItem(index, messageType, messageSubType); + } + else + { + updateSmsTypeItem(index, messageSubType); + } + } + +#ifdef _DEBUG_TRACES_ + qCritical() << "END MsgConversationViewItem::updateChildItems: " + << index.data(ConvergedMsgId).toInt(); +#endif + + repolish(); + HbListViewItem::updateChildItems(); + } + +//--------------------------------------------------------------- +// MsgConversationViewItem::updateSmsTypeItem +// @see header file +//--------------------------------------------------------------- +void MsgConversationViewItem::updateSmsTypeItem(const QModelIndex& index, int messageSubType) + { + + if (!mConversation) + { + mConversation = new MsgConversationWidget(this); + HbStyle::setItemName(mConversation, "msgconvwidget"); + } + mIncoming = false; + mConversation->resetProperties(); + + int direction = index.data(Direction).toInt(); + + if (direction == ConvergedMessage::Incoming) + { + setIncoming(true); + mConversation->setIncoming(true); + + mMessageStateIconItem->setVisible(false); + } + else if (direction == ConvergedMessage::Outgoing) + { + setIncoming(false); + mConversation->setIncoming(false); + + int sendingState = index.data(SendingState).toInt(); + mConversation->setSendingState(sendingState); + setMessageStateIcon(sendingState); + } + + bool unreadStatus = index.data(UnReadStatus).toBool(); + mConversation->setUnread(unreadStatus); + + mConversation->drawBubbleFrame(); + mConversation->drawNewItemFrame(); + + QDateTime dateTime; + dateTime.setTime_t(index.data(TimeStamp).toUInt()); + QString resendStateNote((index.data(SendingState).toInt() + == ConvergedMessage::Resend) ? LOC_RESEND_AT : ""); + if (dateTime.date() == QDateTime::currentDateTime().date()) + { + + mConversation->setTimeStamp(resendStateNote + dateTime.toString( + TIME_FORMAT)); + } + else + { + mConversation->setTimeStamp(resendStateNote + dateTime.toString( + DATE_FORMAT)); + } + + if (messageSubType == ConvergedMessage::VCal) + { + mConversation->setSubject(LOC_UNSUPPORTED_MSG_TYPE); + } + else + { + QString bodyText = index.data(BodyText).toString(); + bodyText.replace(QChar::ParagraphSeparator, QChar::LineSeparator); + bodyText.replace('\r', QChar::LineSeparator); + mConversation->setSubject(bodyText); + } + + //repolish + mConversation->repolishWidget(); + } + +//--------------------------------------------------------------- +// MsgConversationViewItem::updateMmsTypeItem +// @see header file +//--------------------------------------------------------------- +void MsgConversationViewItem::updateMmsTypeItem(const QModelIndex& index, + int messageType, int messageSubType) + { + // create widget + if (!mConversation) + { + mConversation = new MsgConversationWidget(this); + HbStyle::setItemName(mConversation, "msgconvwidget"); + } + mIncoming = false; + mConversation->resetProperties(); + + mConversation->setMMS(true); + int direction = index.data(Direction).toInt(); + QString bodyText = index.data(BodyText).toString(); + + if (direction == ConvergedMessage::Incoming) + { + setIncoming(true); + mConversation->setIncoming(true); + + if (messageType == ConvergedMessage::MmsNotification) + { + mConversation->setMMSNotification(true); + int notificationState = index.data(NotificationStatus).toInt(); + mConversation->setNotificationState(notificationState); + setNotificationStateIcon(notificationState); + } + else + { + mMessageStateIconItem->setVisible(false); + } + } + else if (direction == ConvergedMessage::Outgoing) + { + setIncoming(false); + mConversation->setIncoming(false); + + int sendingState = index.data(SendingState).toInt(); + mConversation->setSendingState(sendingState); + setMessageStateIcon(sendingState); + } + + bool unreadStatus = index.data(UnReadStatus).toBool(); + mConversation->setUnread(unreadStatus); + + mConversation->drawBubbleFrame(); + mConversation->drawNewItemFrame(); + + QDateTime dateTime; + dateTime.setTime_t(index.data(TimeStamp).toUInt()); + QString resendStateNote((index.data(SendingState).toInt() + == ConvergedMessage::Resend) ? LOC_RESEND_AT : ""); + if (dateTime.date() == QDateTime::currentDateTime().date()) + { + + mConversation->setTimeStamp(resendStateNote + dateTime.toString( + TIME_FORMAT)); + } + else + { + mConversation->setTimeStamp(resendStateNote + dateTime.toString( + DATE_FORMAT)); + } + + if (messageType == ConvergedMessage::Mms) + { + //preview path + QString previewPath = index.data(Attachments).toString(); + QString subject = index.data(Subject).toString(); + + int msgProperty = index.data(MessageProperty).toInt(); + bool hasAttachments = (msgProperty & EPreviewAttachment) ? true : false; + + if (hasAttachments) + { + mConversation->setAttachment(); + } + else + { + mConversation->setAttachment(false); + } + + // Now set the media contents + + //preview image + bool hasImage = (msgProperty & EPreviewImage) ? true : false; + + if (hasImage) + { + int msgId = index.data(ConvergedMsgId).toInt(); + mConversation->setPreviewIconPath(previewPath, msgId); + mConversation->setImage(true); + } + + bool hasVideo = (msgProperty & EPreviewVideo) ? true : false; + + if (hasVideo) + { + mConversation->setVideo(true); + } + + bool hasAudio = (msgProperty & EPreviewAudio) ? true : false; + if (hasAudio) + { + mConversation->setAudio(true); + } + + mConversation->displayAudioIcon(); + + int priority = index.data(MessagePriority).toInt(); + mConversation->setPriority(priority); + mConversation->setSubject(subject); + mConversation->setBodyText(bodyText); + } + else if (messageType == ConvergedMessage::BioMsg) + { + if (messageSubType == ConvergedMessage::RingingTone) + { + mConversation->setImage(false); + mConversation->setAudio(true); + mConversation->displayAudioIcon(); + mConversation->setSubject(LOC_RINGING_TONE); + } + else if (messageSubType == ConvergedMessage::VCard) + { + mConversation->setImage(false); + mConversation->setAudio(true); + mConversation->displayAudioIcon(VCARD_ICON); + mConversation->setSubject(LOC_BUSINESS_CARD); + mConversation->setBodyText(bodyText); + } + } + else if (messageType == ConvergedMessage::BT) + { + QString deviceName = index.data(ConversationAddress).toString(); + mConversation->setSubject(deviceName); + QString blueToothBody; + if (messageSubType == ConvergedMessage::VCard) + { + mConversation->setImage(false); + mConversation->setAudio(true); + mConversation->displayAudioIcon(VCARD_ICON); + blueToothBody.append(LOC_BUSINESS_CARD); + blueToothBody.append(QChar::LineSeparator); + blueToothBody.append(bodyText); + } + else + { + blueToothBody.append(bodyText); + } + mConversation->setBodyText(blueToothBody); + } + else if (messageType == ConvergedMessage::MmsNotification) + { + QString subject = index.data(Subject).toString(); + int priority = index.data(MessagePriority).toInt(); + mConversation->setPriority(priority); + mConversation->setSubject(subject); + mConversation->setBodyText(bodyText); + } + + //repolish widget + mConversation->repolishWidget(); + } + +//--------------------------------------------------------------- +// MsgConversationViewItem::containsPoint +// +//--------------------------------------------------------------- +bool MsgConversationViewItem::containsPoint(const QPointF& point) +{ + return mConversation->boundingRect(). + contains(mConversation->mapFromScene(point)); +} + +//--------------------------------------------------------------- +// MsgConversationViewItem::setIncoming +// @see header file +//--------------------------------------------------------------- +void MsgConversationViewItem::setIncoming(bool incoming) +{ + mIncoming = incoming; +} + +//--------------------------------------------------------------- +// MsgConversationViewItem::isIncoming +// @see header file +//--------------------------------------------------------------- +bool MsgConversationViewItem::isIncoming() +{ + return mIncoming; +} + +//--------------------------------------------------------------- +// MsgConversationViewItem::setMessageStateIcon +// @see header file +//--------------------------------------------------------------- +void MsgConversationViewItem::setMessageStateIcon(int messageState) +{ + HbIconAnimator& iconAnimator = mMessageStateIconItem->animator(); + HbIconAnimationManager* iconAnimationManager = HbIconAnimationManager::global(); + switch (messageState) + { + case ConvergedMessage::Waiting: + case ConvergedMessage::Scheduled: + case ConvergedMessage::Sending: + { + bool defined = iconAnimationManager->addDefinitionFile(ANIMATION_FILE); + HbIcon animIcon; + animIcon.setIconName(ANIMATION_ICON_NAME); + QSizeF size = mMessageStateIconItem->size(); + mMessageStateIconItem->setIcon(animIcon); + mMessageStateIconItem->setVisible(true); + iconAnimator.startAnimation(); + repolish(); + break; + } + case ConvergedMessage::Suspended: + { + iconAnimator.stopAnimation(); + mMessageStateIconItem->setIcon(MSG_OUTBOX_ICON); + mMessageStateIconItem->setVisible(true); + break; + + } + case ConvergedMessage::Resend: + { + iconAnimator.stopAnimation(); + mMessageStateIconItem->setIcon(MSG_OUTBOX_ICON); + mMessageStateIconItem->setVisible(true); + break; + } + case ConvergedMessage::Failed: + { + iconAnimator.stopAnimation(); + mMessageStateIconItem->setIcon(MSG_FAIL_ICON); + mMessageStateIconItem->setVisible(true); + break; + } + case ConvergedMessage::Unknown: + default: + { + iconAnimator.stopAnimation(); + mMessageStateIconItem->setVisible(false); + break; + } + } +} + +//--------------------------------------------------------------- +// MsgConversationViewItem::setNotificationStateIcon +// @see header file +//--------------------------------------------------------------- + +void MsgConversationViewItem::setNotificationStateIcon(int notificationState) +{ + HbIconAnimator& iconAnimator = mMessageStateIconItem->animator(); + HbIconAnimationManager* iconAnimationManager = HbIconAnimationManager::global(); + switch (notificationState) + { + case ConvergedMessage::NotifRetrieving: + case ConvergedMessage::NotifWaiting: + { + //TODO: Temp icon until official icons are received + bool defined = iconAnimationManager->addDefinitionFile(ANIMATION_FILE); + HbIcon animIcon; + animIcon.setIconName(ANIMATION_ICON_NAME); + QSizeF size = mMessageStateIconItem->size(); + mMessageStateIconItem->setIcon(animIcon); + mMessageStateIconItem->setVisible(true); + iconAnimator.startAnimation(); + repolish(); + break; + } + default: + { + iconAnimator.stopAnimation(); + mMessageStateIconItem->setVisible(false); + break; + } + } +} + +//--------------------------------------------------------------- +// MsgConversationViewItem::pressStateChanged +// @see header file +//--------------------------------------------------------------- +void MsgConversationViewItem::pressStateChanged (bool pressed, bool animate) +{ + mConversation->pressStateChanged(pressed, animate); +} + +// EOF