diff -r 6a20128ce557 -r ebfee66fde93 messagingapp/msgui/conversationview/src/msgconversationwidget.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/messagingapp/msgui/conversationview/src/msgconversationwidget.cpp Fri Jun 04 10:25:39 2010 +0100 @@ -0,0 +1,771 @@ +/* + * 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 "msgconversationwidget.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "debugtraces.h" + +#include "convergedmessage.h" +#include "conversationsengine.h" + +// Icons +const QString MSG_HIGH_PRIORITY_ICON("qtg_small_priority_high"); +const QString MSG_LOW_PRIORITY_ICON("qtg_small_priority_low"); +const QString MSG_ATTACH_ICON("qtg_small_attachment"); +const QString MSG_AUDIO_ICON("qtg_large_music_player"); +const QString MSG_VIDEO_ICON("qtg_large_video_player"); +const QString MSG_AUDIO_PLAY_ICON("qtg_large_music_player"); + + +// Frames +const QString CV_RECEIVED_NORMAL_FR("qtg_fr_convlist_received_normal"); +const QString CV_RECEIVED_PRESSED_FR("qtg_fr_convlist_received_pressed"); +const QString CV_RECEIVED_HIGHLIGHT_FR("qtg_fr_convlist_received_highlight"); +const QString CV_SENT_NORMAL_FR("qtg_fr_convlist_sent_normal"); +const QString CV_SENT_PRESSED_FR("qtg_fr_convlist_sent_pressed"); +const QString CV_SENT_HIGHLIGHT_FR("qtg_fr_convlist_sent_highlight"); +const QString NEW_ITEM_FRAME("qtg_fr_list_new_item"); + +//selecet preview-icon query +_LIT(KSelectPreviewIconStmt,"SELECT message_id, preview_icon FROM conversation_messages WHERE message_id = :message_id "); + +//--------------------------------------------------------------- +// MsgConversationWidget::MsgConversationWidget +// @see header file +//--------------------------------------------------------------- +MsgConversationWidget::MsgConversationWidget(QGraphicsItem *parent) : + HbWidget(parent), + mHasAttachment(false), + mHasImage(false), + mHasAudio(false), + mHasVideo(false), + mIsPlayable(false), + mIncoming(false), + mUnread(false), + mIsMMS(false), + mIsMMSNotification(false), + mPriority(0), + mSendingState(Unknown), + mNotificationState(0), + mNewFrameItem(NULL), + mBubbleFrameItem(NULL), + mSubjectTextItem(NULL), + mBodyTextItem(NULL), + mTimeStampTextItem(NULL), + mPriorityIconItem(NULL), + mAttachmentIconItem(NULL), + mAudioIconItem(NULL), + mVideoIconItem(NULL), + mPlayIconItem(NULL), + mPreviewIconItem(NULL) + + +{ + init(); +} + +//--------------------------------------------------------------- +// MsgConversationWidget::~MsgConversationWidget +// @see header file +//--------------------------------------------------------------- +MsgConversationWidget::~MsgConversationWidget() +{ + +} + +//--------------------------------------------------------------- +// MsgConversationWidget::init +// @see header file +//--------------------------------------------------------------- +void MsgConversationWidget::init() +{ + // Common to SMS/MMS + + mBubbleFrameItem = new HbFrameItem(this); + mBubbleFrameItem->frameDrawer().setFrameType(HbFrameDrawer::NinePieces); + HbStyle::setItemName(mBubbleFrameItem, "bubble"); + + mNewFrameItem = new HbFrameItem(this); + mNewFrameItem->frameDrawer().setFrameType(HbFrameDrawer::ThreePiecesVertical); + HbStyle::setItemName(mNewFrameItem, "newItemIcon"); + + } + +//--------------------------------------------------------------- +// MsgConversationWidget::setSubject +// @see header file +//--------------------------------------------------------------- +void MsgConversationWidget::setSubject(const QString &subject) +{ + if (!mSubjectTextItem) + { + mSubjectTextItem = new HbTextItem(this); + mSubjectTextItem->setTextWrapping(Hb::TextWordWrap); + } + HbStyle::setItemName(mSubjectTextItem, "subject"); + mSubjectTextItem->setText(subject); + mSubjectTextItem->show(); +} + +//--------------------------------------------------------------- +// MsgConversationWidget::setBodyText +// @see header file +//--------------------------------------------------------------- +void MsgConversationWidget::setBodyText(const QString &body) +{ + if (!mBodyTextItem) + { + mBodyTextItem = new HbTextItem(this); + mBodyTextItem->setTextWrapping(Hb::TextWordWrap); + } + HbStyle::setItemName(mBodyTextItem, "bodyText"); + + mBodyTextItem->setText(body); + mBodyTextItem->show(); +} + +//--------------------------------------------------------------- +// MsgConversationWidget::setPreviewIconPath +// @see header file +//--------------------------------------------------------------- +void MsgConversationWidget::setPreviewIconPath(const QString &filePath,int msgId) +{ + if (!mPreviewIconItem) + { + mPreviewIconItem = new HbIconItem(this); + mPreviewIconItem->setAlignment(Qt::AlignHCenter | Qt::AlignTop); + } + + HbStyle::setItemName(mPreviewIconItem, "preview"); + //sql query to get preview-icon from DB + TBool isOpen = EFalse; + bool imagePreviewed = false; + + //get DB handle and check if it is open + RSqlDatabase& sqlDb = ConversationsEngine::instance()->getDBHandle(isOpen); + if (isOpen) + { + RSqlStatement sqlSelectPreviewIconStmt; + TInt err = sqlSelectPreviewIconStmt.Prepare(sqlDb, + KSelectPreviewIconStmt); + + QCRITICAL_WRITE_FORMAT("Error from Prepare()", err) + + if (err == KErrNone) + { + //msg_id + TInt msgIdIndex = sqlSelectPreviewIconStmt.ParameterIndex( + _L(":message_id")); + sqlSelectPreviewIconStmt.BindInt(msgIdIndex, msgId); + + // get preview-icon from DB + err = sqlSelectPreviewIconStmt.Next(); + QCRITICAL_WRITE_FORMAT("Error from Next()", err) + + if (err == KSqlAtRow) + { + TInt previewIconIndex = sqlSelectPreviewIconStmt.ColumnIndex( + _L("preview_icon")); + + RSqlColumnReadStream stream; + + //Get data from binary column BLOB + err = stream.ColumnBinary(sqlSelectPreviewIconStmt, + previewIconIndex); + + QCRITICAL_WRITE_FORMAT("Error from ColumnBinary()", err) + + if (err == KErrNone) + { + CFbsBitmap *bitmap = new CFbsBitmap; + TRAPD(err,bitmap->InternalizeL(stream)); + QCRITICAL_WRITE_FORMAT("Error from bitmap InternalizeL()", err) + + //convert bitmap to pixmap + if (err == KErrNone) + { + TSize size = bitmap->SizeInPixels(); + int bytesPerLine = bitmap->ScanLineLength(size.iWidth, + bitmap->DisplayMode()); + const uchar* dataPtr = + (const uchar*) bitmap->DataAddress(); + + QPixmap pixmap = QPixmap::fromImage(QImage(dataPtr, + size.iWidth, size.iHeight, bytesPerLine, + QImage::Format_RGB16)); + + mPreviewIconItem->setIcon(HbIcon(pixmap)); + mPreviewIconItem->setPreferredSize(pixmap.size()); + mPreviewIconItem->setEnabled(true); + mPreviewIconItem->show(); + imagePreviewed = true; + + QCRITICAL_WRITE("Bitmap Conversion completed") + } + //remove bitmap + delete bitmap; + } + //close stream + stream.Close(); + } + } + sqlSelectPreviewIconStmt.Close(); + } + + // if not found in db, set from file path + if(!imagePreviewed) + { + QPixmap pixmap(filePath); + QPixmap scaledPixmap =pixmap.scaled(100,100,Qt::IgnoreAspectRatio); + mPreviewIconItem->setIcon(HbIcon(scaledPixmap)); + mPreviewIconItem->setPreferredSize(scaledPixmap.size()); + mPreviewIconItem->setEnabled(true); + mPreviewIconItem->show(); + } + + QCRITICAL_WRITE("MsgConversationWidget::setPreviewIconPath end.") + +} + +//--------------------------------------------------------------- +// MsgConversationWidget::setPriority +// @see header file +//--------------------------------------------------------------- +void MsgConversationWidget::setPriority(int priority) +{ + mPriority = priority; + + if (priority) + { + if (!mPriorityIconItem) + { + mPriorityIconItem = new HbIconItem(this); + } + HbStyle::setItemName(mPriorityIconItem, "priority"); + if (ConvergedMessage::Low == priority) + { + mPriorityIconItem->setIcon(HbIcon(MSG_LOW_PRIORITY_ICON)); + } + else if (ConvergedMessage::High == priority) + { + mPriorityIconItem->setIcon(HbIcon(MSG_HIGH_PRIORITY_ICON)); + } + mPriorityIconItem->show(); + } +} + +//--------------------------------------------------------------- +// MsgConversationWidget::priority +// @see header file +//--------------------------------------------------------------- +int MsgConversationWidget::priority() +{ + return mPriority; +} + +//--------------------------------------------------------------- +// MsgConversationWidget::setAttachment +// @see header file +//--------------------------------------------------------------- +void MsgConversationWidget::setAttachment(bool attachment) +{ + mHasAttachment = attachment; + + if (attachment) + { + if (!mAttachmentIconItem) + { + mAttachmentIconItem = new HbIconItem(this); + } + HbStyle::setItemName(mAttachmentIconItem, "attachment"); + mAttachmentIconItem->setIcon(HbIcon(MSG_ATTACH_ICON)); + mAttachmentIconItem->show(); + } +} + +//--------------------------------------------------------------- +// MsgConversationWidget::hasAttachment +// @see header file +//--------------------------------------------------------------- +bool MsgConversationWidget::hasAttachment() +{ + return mHasAttachment; +} + +//--------------------------------------------------------------- +// MsgConversationWidget::setImage +// @see header file +//--------------------------------------------------------------- +void MsgConversationWidget::setImage(bool image) +{ + mHasImage = image; +} + +//--------------------------------------------------------------- +// MsgConversationWidget::hasImage +// @see header file +//--------------------------------------------------------------- +bool MsgConversationWidget::hasImage() +{ + return mHasImage; +} + +//--------------------------------------------------------------- +// MsgConversationWidget::setAudio +// @see header file +//--------------------------------------------------------------- +void MsgConversationWidget::setAudio(bool audio) +{ + mHasAudio = audio; +} + +//--------------------------------------------------------------- +// MsgConversationWidget::hasAudio +// @see header file +//--------------------------------------------------------------- +bool MsgConversationWidget::hasAudio() +{ + return mHasAudio; +} + +//--------------------------------------------------------------- +// MsgConversationWidget::displayAudioIcon +// @see header file +//--------------------------------------------------------------- +void MsgConversationWidget::displayAudioIcon(const QString &iconPath) +{ + if (hasAudio()) + { + if (hasImage()) + { + if (!mPlayIconItem) + { + mPlayIconItem = new HbIconItem(this); + } + HbStyle::setItemName(mPlayIconItem, "playIcon"); + mPlayIconItem->setIconName(iconPath.isEmpty() ? MSG_AUDIO_PLAY_ICON : iconPath); + mPlayIconItem->show(); + } + else + { + if (!mAudioIconItem) + { + mAudioIconItem = new HbIconItem(this); + } + HbStyle::setItemName(mAudioIconItem, "audioIcon"); + mAudioIconItem->setIconName(iconPath.isEmpty() ? MSG_AUDIO_PLAY_ICON : iconPath); + mAudioIconItem->show(); + + } + } +} + +//--------------------------------------------------------------- +// MsgConversationWidget::setVideo +// @see header file +//--------------------------------------------------------------- +void MsgConversationWidget::setVideo(bool video) +{ + mHasVideo = video; + + if (video) + { + if (!mVideoIconItem) + { + mVideoIconItem = new HbIconItem(this); + } + HbStyle::setItemName(mVideoIconItem, "video"); + mVideoIconItem->setIcon(HbIcon(MSG_VIDEO_ICON)); + mVideoIconItem->show(); + + } +} + +//--------------------------------------------------------------- +// MsgConversationWidget::hasVideo +// @see header file +//--------------------------------------------------------------- +bool MsgConversationWidget::hasVideo() +{ + return mHasVideo; +} + +//--------------------------------------------------------------- +// MsgConversationWidget::setPlayable +// @see header file +//--------------------------------------------------------------- +void MsgConversationWidget::setPlayable(bool playable) +{ + mIsPlayable = playable; +} + +//--------------------------------------------------------------- +// MsgConversationWidget::isPlayable +// @see header file +//--------------------------------------------------------------- +bool MsgConversationWidget::isPlayable() +{ + return mIsPlayable; +} + +//--------------------------------------------------------------- +// MsgConversationWidget::setIncoming +// @see header file +//--------------------------------------------------------------- +void MsgConversationWidget::setIncoming(bool incoming) +{ + mIncoming = incoming; +} + +//--------------------------------------------------------------- +// MsgConversationWidget::isIncoming +// @see header file +//--------------------------------------------------------------- +bool MsgConversationWidget::isIncoming() +{ + return mIncoming; +} + +//--------------------------------------------------------------- +// MsgConversationWidget::setUnread +// @see header file +//--------------------------------------------------------------- +void MsgConversationWidget::setUnread(bool unread) +{ + mUnread = unread; +} + +//--------------------------------------------------------------- +// MsgConversationWidget::isUnread +// @see header file +//--------------------------------------------------------------- +bool MsgConversationWidget::isUnread() +{ + return mUnread; +} + +//--------------------------------------------------------------- +// MsgConversationWidget::setMMS +// @see header file +//--------------------------------------------------------------- +void MsgConversationWidget::setMMS(bool isMMS) +{ + mIsMMS = isMMS; +} + +//--------------------------------------------------------------- +// MsgConversationWidget::isMMS +// @see header file +//--------------------------------------------------------------- +bool MsgConversationWidget::isMMS() +{ + return mIsMMS; +} + +//--------------------------------------------------------------- +// MsgConversationWidget::setMMSNotification +// @see header file +//--------------------------------------------------------------- +void MsgConversationWidget::setMMSNotification(bool isMMSNotification) +{ + mIsMMSNotification = isMMSNotification; +} + +//--------------------------------------------------------------- +// MsgConversationWidget::isMMS +// @see header file +//--------------------------------------------------------------- +bool MsgConversationWidget::isMMSNotification() +{ + return mIsMMSNotification; +} + +//--------------------------------------------------------------- +// MsgConversationWidget::setSendingState +// @see header file +//--------------------------------------------------------------- +void MsgConversationWidget::setSendingState(int state) +{ + switch (state) + { + case ConvergedMessage::SentState: + { + mSendingState = Sent; + break; + } + case ConvergedMessage::Sending: + { + mSendingState = Sending; + break; + } + case ConvergedMessage::Suspended: + case ConvergedMessage::Resend: + { + mSendingState = Pending; + break; + } + case ConvergedMessage::Failed: + { + mSendingState = Failed; + break; + } + default: + { + mSendingState = Unknown; + break; + } + } +} + +//--------------------------------------------------------------- +// MsgConversationWidget::sendingState +// @see header file +//--------------------------------------------------------------- +MsgConversationWidget::SendingState MsgConversationWidget::sendingState() +{ + return mSendingState; +} + +//--------------------------------------------------------------- +// MsgConversationWidget::setNotificationState +// @see header file +//--------------------------------------------------------------- +void MsgConversationWidget::setNotificationState(int state) +{ + switch (state) + { + case ConvergedMessage::NotifFailed: + { + mNotificationState = NotifFailed; + break; + } + case ConvergedMessage::NotifReadyForFetching: + { + mNotificationState = NotifReadyForFetching; + break; + } + case ConvergedMessage::NotifRetrieving: + case ConvergedMessage::NotifWaiting: + { + mNotificationState = NotifRetrieving; + break; + } + case ConvergedMessage::NotifExpired: + { + mNotificationState = NotifExpired; + break; + } + default: + { + mNotificationState = NotifUnknown; + break; + } + } +} + +//--------------------------------------------------------------- +// MsgConversationWidget::notificationState +// @see header file +//--------------------------------------------------------------- +int MsgConversationWidget::notificationState() +{ + return mNotificationState; +} + +//--------------------------------------------------------------- +// MsgConversationWidget::setTimeStamp +// @see header file +//--------------------------------------------------------------- +void MsgConversationWidget::setTimeStamp(const QString &timeStamp) +{ + if(!mTimeStampTextItem) + { + mTimeStampTextItem = new HbTextItem(this); + } + HbStyle::setItemName(mTimeStampTextItem, "timeStamp"); + + mTimeStampTextItem->setText(timeStamp); + mTimeStampTextItem->show(); + +} + +//--------------------------------------------------------------- +// MsgConversationWidget::drawNewItemFrame +// @see header file +//--------------------------------------------------------------- +void MsgConversationWidget::drawNewItemFrame() +{ + if (mUnread) + { + mNewFrameItem->frameDrawer().setFrameGraphicsName(NEW_ITEM_FRAME); + } + else + { + mNewFrameItem->frameDrawer().setFrameGraphicsName(QString()); + } +} + +//--------------------------------------------------------------- +// MsgConversationWidget::drawBubbleFrame +// @see header file +//--------------------------------------------------------------- +void MsgConversationWidget::drawBubbleFrame() +{ + if(isIncoming()) + { + if (mIsMMSNotification && (mNotificationState == NotifUnknown + || mNotificationState == NotifRetrieving )) + { + mBubbleFrameItem->frameDrawer().setFrameGraphicsName( + CV_RECEIVED_HIGHLIGHT_FR); + //Inactive state bubble + } + else + { + mBubbleFrameItem->frameDrawer().setFrameGraphicsName(CV_RECEIVED_NORMAL_FR); + } + } + else + { + if(mSendingState == Sending || mSendingState == Pending || + mSendingState == Unknown || mSendingState == Failed) + { + mBubbleFrameItem->frameDrawer().setFrameGraphicsName(CV_SENT_HIGHLIGHT_FR); + } + else + { + mBubbleFrameItem->frameDrawer().setFrameGraphicsName(CV_SENT_NORMAL_FR); + } + } +} + +//--------------------------------------------------------------- +// MsgConversationWidget::drawPressedBubbleFrame +// @see header file +//--------------------------------------------------------------- +void MsgConversationWidget::drawPressedBubbleFrame() +{ + if(isIncoming()) + { + mBubbleFrameItem->frameDrawer().setFrameGraphicsName(CV_RECEIVED_PRESSED_FR); + } + else + { + mBubbleFrameItem->frameDrawer().setFrameGraphicsName(CV_SENT_PRESSED_FR); + } +} + +//--------------------------------------------------------------- +// MsgConversationWidget::pressStateChanged +// @see header file +//--------------------------------------------------------------- +void MsgConversationWidget::pressStateChanged(bool pressed, bool animate) +{ + Q_UNUSED(animate) + + if (mBubbleFrameItem) { + (pressed) ? drawPressedBubbleFrame() : drawBubbleFrame(); + } +} + + void MsgConversationWidget::resetProperties() + { + mHasAttachment = false; + mHasImage = false; + mHasAudio = false; + mHasVideo = false; + mIsPlayable =false; + mIncoming =false; + mUnread =false; + mIsMMS = false; + mIsMMSNotification= false; + mPriority = 0; + mSendingState =Unknown; + mNotificationState =0; + + if(mBodyTextItem){ + mBodyTextItem->setText(QString()); + mBodyTextItem->hide(); + HbStyle::setItemName(mBodyTextItem, ""); + } + + if(mSubjectTextItem){ + mSubjectTextItem->setText(QString()); + mSubjectTextItem->hide(); + HbStyle::setItemName(mSubjectTextItem, ""); + } + + if(mTimeStampTextItem){ + mTimeStampTextItem->setText(QString()); + mTimeStampTextItem->hide(); + HbStyle::setItemName(mTimeStampTextItem, ""); + } + + if(mAttachmentIconItem){ + mAttachmentIconItem->hide(); + HbStyle::setItemName(mAttachmentIconItem, ""); + } + + if(mPriorityIconItem){ + HbStyle::setItemName(mPriorityIconItem, ""); + mPriorityIconItem->hide(); + } + + if(mAudioIconItem){ + HbStyle::setItemName(mAudioIconItem, ""); + mAudioIconItem->hide(); + } + + if(mVideoIconItem){ + HbStyle::setItemName(mVideoIconItem, ""); + mVideoIconItem->hide(); + } + + if(mPlayIconItem){ + HbStyle::setItemName(mPlayIconItem, ""); + mPlayIconItem->hide(); + } + + if(mPreviewIconItem){ + HbStyle::setItemName(mPreviewIconItem, ""); + mPreviewIconItem->hide(); + } + } + + void MsgConversationWidget::repolishWidget() + { + QCoreApplication::postEvent(this, new HbEvent(HbEvent::ThemeChanged)); + repolish(); + } + +// EOF