diff -r fa1df4b99609 -r ebe688cedc25 messagingapp/msgui/conversationview/src/msgconversationviewitem.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/messagingapp/msgui/conversationview/src/msgconversationviewitem.cpp Tue Aug 31 15:11:31 2010 +0300 @@ -0,0 +1,586 @@ +/* + * 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 +#include +#include +#include + +// USER INCLUDES +#include "msgconversationwidget.h" +#include "msgviewdefines.h" +#include "msgviewutils.h" +#include "convergedmessage.h" +#include "conversationsenginedefines.h" + +// LOCAL CONSTANTS +static const char MSG_OUTBOX_ICON[] = "qtg_small_outbox"; +static const char MSG_FAIL_ICON[] = "qtg_small_fail"; +static const char ANIMATION_FILE[] = ":/qtg_anim_loading.axml"; +static const char ANIMATION_ICON_NAME[] = "qtg_anim_loading"; +static const char VCARD_ICON[] = "qtg_large_mycard"; +static const char IMAGE_ICON[] = "qtg_small_image"; +static const char CORRUPTED_ICON[] = "qtg_small_corrupted"; +static const char MSG_VIDEO_ICON[] = "qtg_small_video"; + +// @see hbi18ndef.h +static const char DATE_FORMAT[] = r_qtn_date_short_with_zero; +static const char TIME_FORMAT[] = r_qtn_time_usual_with_zero; + +// 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("txt_messaging_list_resend_at_time") + +//--------------------------------------------------------------- +// MsgConversationViewItem::MsgConversationViewItem +// Constructor +//--------------------------------------------------------------- +MsgConversationViewItem::MsgConversationViewItem(QGraphicsItem* parent) : + HbListViewItem(parent), mIncoming(false), mConversation(0), + mIncomingMsgStateIconItem(0), mOutgoingMsgStateIconItem(0) +{ +} + +//--------------------------------------------------------------- +// MsgConversationViewItem::MsgConversationViewItem +// Destructor +//--------------------------------------------------------------- +MsgConversationViewItem::~MsgConversationViewItem() +{ +} + +//--------------------------------------------------------------- +// MsgConversationViewItem::createItem +// Create a new decorator item. +//--------------------------------------------------------------- +MsgConversationViewItem* MsgConversationViewItem::createItem() +{ + MsgConversationViewItem *item = new MsgConversationViewItem(*this); + item->init(); + return item; +} + +//--------------------------------------------------------------- +// MsgConversationViewItem::updateChildItems +// +//--------------------------------------------------------------- +void MsgConversationViewItem::updateChildItems() +{ + 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) +{ + + mIncoming = false; + mConversation->resetProperties(); + + int direction = index.data(Direction).toInt(); + + if (direction == ConvergedMessage::Incoming) + { + setIncoming(true); + mConversation->setIncoming(true); + + mIncomingMsgStateIconItem->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 : ""); + + HbExtendedLocale locale = HbExtendedLocale::system(); + QString date = locale.format(dateTime.date(), DATE_FORMAT); + QString time = locale.format(dateTime.time(), TIME_FORMAT); + + if (dateTime.date() == QDateTime::currentDateTime().date()) { + mConversation->setTimeStamp(resendStateNote % time); + } + else { + mConversation->setTimeStamp(resendStateNote % date); + } + + 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->setBodyText(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 + { + mIncomingMsgStateIconItem->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 : ""); + + HbExtendedLocale locale = HbExtendedLocale::system(); + QString date = locale.format(dateTime.date(), DATE_FORMAT); + QString time = locale.format(dateTime.time(), TIME_FORMAT); + + if (dateTime.date() == QDateTime::currentDateTime().date()) { + mConversation->setTimeStamp(resendStateNote % time); + } + else { + mConversation->setTimeStamp(resendStateNote % date); + } + + 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) + { + mConversation->setImage(true); + HbIcon previewIcon; + if (msgProperty & EPreviewProtectedImage) + { + previewIcon = HbIcon(IMAGE_ICON); + } + else if (msgProperty & EPreviewCorruptedImage) + { + // TODO: Change to official icon. + previewIcon = HbIcon(CORRUPTED_ICON); + } + else + { + QVariant previewData = index.data(PreviewIcon); + previewIcon = qvariant_cast (previewData); + } + mConversation->setPreviewIcon(previewIcon); + } + + bool hasVideo = (msgProperty & EPreviewVideo) ? true : false; + if (hasVideo) + { + mConversation->setVideo(true); + HbIcon videoPreviewIcon; + if (msgProperty & EPreviewProtectedVideo) + { + videoPreviewIcon = HbIcon(MSG_VIDEO_ICON); + } + else if (msgProperty & EPreviewCorruptedVideo) + { + videoPreviewIcon = HbIcon(CORRUPTED_ICON); + } + else + { + videoPreviewIcon = HbIcon(MSG_VIDEO_ICON); + } + mConversation->setPreviewIcon(videoPreviewIcon); + } + bool hasAudio = (msgProperty & EPreviewAudio) ? true : false; + if (hasAudio) + { + mConversation->setAudio(true); + if (msgProperty & EPreviewProtectedAudio) + { + mConversation->displayAudioIcon(); + } + else if (msgProperty & EPreviewCorruptedAudio) + { + mConversation->displayAudioIcon(CORRUPTED_ICON); + } + else + { + 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); + mConversation->setBodyText(bodyText); + } + 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; + + if (mIncoming) + { + HbStyle::setItemName(mOutgoingMsgStateIconItem, ""); + mOutgoingMsgStateIconItem->setVisible(false); + HbStyle::setItemName(mIncomingMsgStateIconItem, "msgStateIconIncoming"); + mIncomingMsgStateIconItem->setIcon(HbIcon()); + mIncomingMsgStateIconItem->setVisible(false); + } + else + { + HbStyle::setItemName(mIncomingMsgStateIconItem, ""); + mIncomingMsgStateIconItem->setVisible(false); + HbStyle::setItemName(mOutgoingMsgStateIconItem, "msgStateIconOutgoing"); + mOutgoingMsgStateIconItem->setIcon(HbIcon()); + mOutgoingMsgStateIconItem->setVisible(false); + } +} + +//--------------------------------------------------------------- +// MsgConversationViewItem::isIncoming +// @see header file +//--------------------------------------------------------------- +bool MsgConversationViewItem::isIncoming() +{ + return mIncoming; +} + +//--------------------------------------------------------------- +// MsgConversationViewItem::setMessageStateIcon +// @see header file +//--------------------------------------------------------------- +void MsgConversationViewItem::setMessageStateIcon(int messageState) +{ + HbIconAnimator& iconAnimator = mOutgoingMsgStateIconItem->animator(); + + switch (messageState) + { + case ConvergedMessage::Waiting: + case ConvergedMessage::Scheduled: + case ConvergedMessage::Sending: + { + HbIconAnimationManager::global()->addDefinitionFile(ANIMATION_FILE); + mOutgoingMsgStateIconItem->setIconName(ANIMATION_ICON_NAME); + mOutgoingMsgStateIconItem->setVisible(true); + iconAnimator.startAnimation(); + break; + } + case ConvergedMessage::Suspended: + case ConvergedMessage::Resend: + { + iconAnimator.stopAnimation(); + mOutgoingMsgStateIconItem->setIconName(MSG_OUTBOX_ICON); + mOutgoingMsgStateIconItem->setVisible(true); + break; + } + case ConvergedMessage::Failed: + { + iconAnimator.stopAnimation(); + mOutgoingMsgStateIconItem->setIconName(MSG_FAIL_ICON); + mOutgoingMsgStateIconItem->setVisible(true); + break; + } + case ConvergedMessage::Unknown: + default: + { + iconAnimator.stopAnimation(); + mOutgoingMsgStateIconItem->setVisible(false); + break; + } + } +} + +//--------------------------------------------------------------- +// MsgConversationViewItem::setNotificationStateIcon +// @see header file +//--------------------------------------------------------------- + +void MsgConversationViewItem::setNotificationStateIcon(int notificationState) +{ + HbIconAnimator& iconAnimator = mIncomingMsgStateIconItem->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 = mIncomingMsgStateIconItem->size(); + mIncomingMsgStateIconItem->setIcon(animIcon); + mIncomingMsgStateIconItem->setVisible(true); + iconAnimator.startAnimation(); + break; + } + default: + { + iconAnimator.stopAnimation(); + mIncomingMsgStateIconItem->setVisible(false); + break; + } + } +} + +//--------------------------------------------------------------- +// MsgConversationViewItem::pressStateChanged +// @see header file +//--------------------------------------------------------------- +void MsgConversationViewItem::pressStateChanged (bool pressed, bool animate) +{ + mConversation->pressStateChanged(pressed, animate); +} + +//--------------------------------------------------------------- +// MsgConversationViewItem::init +// @see header file +//--------------------------------------------------------------- +void MsgConversationViewItem::init() +{ + mConversation = new MsgConversationWidget(this); + HbStyle::setItemName(mConversation, "msgconvwidget"); + + mIncomingMsgStateIconItem = new HbIconItem(this); + HbStyle::setItemName(mIncomingMsgStateIconItem, "msgStateIconIncoming"); + + mOutgoingMsgStateIconItem = new HbIconItem(this); + HbStyle::setItemName(mOutgoingMsgStateIconItem, "msgStateIconOutgoing"); + + HbMainWindow *mainWindow = hbInstance->allMainWindows()[0]; + + connect(mainWindow, SIGNAL(orientationChanged(Qt::Orientation)), this, + SLOT(orientationchanged(Qt::Orientation)), Qt::UniqueConnection); + + // Force polish to get all the sub-item properties right. + polishEvent(); +} + +//--------------------------------------------------------------- +// MsgConversationViewItem::orientationchanged +// @see header file +//--------------------------------------------------------------- +void MsgConversationViewItem::orientationchanged(Qt::Orientation orientation) +{ + Q_UNUSED(orientation) + QDEBUG_WRITE("MsgConversationViewItem:orientationchanged start.") + + repolish(); + + QDEBUG_WRITE("MsgConversationViewItem:orientationchanged end.") +} + +// EOF