messagingapp/msgui/conversationview/src/msgconversationwidget.cpp
changeset 31 ebfee66fde93
child 34 84197e66a4bd
--- /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 <HbTextItem>
+#include <HbFrameItem>
+#include <HbFrameDrawer>
+#include <HbIconItem>
+#include <QPainter>
+#include <QPixmap>
+#include <QImageReader>
+#include <QDir>
+#include <HbEffect>
+#include <s32strm.h>
+#include <s32mem.h>
+#include <fbs.h>
+#include <sqldb.h>
+#include <QBool>
+#include <QCoreApplication>
+#include <HbEvent>
+
+#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