emailuis/nmhswidget/src/nmhswidgetemailrow.cpp
branchRCL_3
changeset 63 d189ee25cf9d
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/emailuis/nmhswidget/src/nmhswidgetemailrow.cpp	Tue Aug 31 15:04:17 2010 +0300
@@ -0,0 +1,435 @@
+/*
+ * Copyright (c) 2010 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 <QGraphicsLinearLayout>
+#include <hbdocumentloader.h>
+#include <hblabel.h>
+#include <hbextendedlocale.h>
+#include <hbframedrawer.h>
+#include <hbframeitem.h>
+#include <hbcolorscheme.h>
+#include <hbevent.h>
+#include <hbtapgesture.h>
+#include <hbinstantfeedback.h>
+#include "nmicons.h"
+#include "nmcommon.h"
+#include "nmhswidgetemailrow.h"
+#include "nmhswidgetconsts.h"
+#include "emailtrace.h"
+
+NmHsWidgetEmailRow::NmHsWidgetEmailRow(QGraphicsItem *parent, Qt::WindowFlags flags) :
+    HbWidget(parent, flags), 
+    mSenderLabel(0), 
+    mSubjectLabel(0), 
+    mTimeLabel(0), 
+    mNewMailIcon(0),
+    mSeparatorIcon(0), 
+    mMessageId(0),
+    mBackgroundLayoutItem(0)
+{
+    NM_FUNCTION;
+    grabGesture(Qt::TapGesture);
+}
+
+/*!
+ Destructor
+ */
+NmHsWidgetEmailRow::~NmHsWidgetEmailRow()
+{
+    NM_FUNCTION;
+}
+
+/*!
+ Returns id of message shown
+ */
+NmId NmHsWidgetEmailRow::messageId()
+{
+    NM_FUNCTION;
+    return mMessageId;
+
+}
+
+/*
+ Setup email row ui
+  Must be called after constructor.
+   /return true if loading succeeded, otherwise false. False indicates that object is unusable.
+ */
+bool NmHsWidgetEmailRow::setupUI()
+    {
+    NM_FUNCTION;
+    
+    if(!loadDocML() || !setupGraphics()){
+        return false;
+    }
+    return true;
+    }
+
+
+
+/*!
+ Loads layout data and child items from docml file 
+  /return true if loading succeeded, otherwise false. False indicates that object is unusable.
+ */
+bool NmHsWidgetEmailRow::loadDocML()
+{
+    NM_FUNCTION;
+
+    QT_TRY{   
+        // Use document loader to load the contents
+        HbDocumentLoader loader;
+        bool ok(false);
+        loader.load(KNmHsWidgetMailRowDocML, &ok);
+        if (!ok) {
+            NM_ERROR(1,"NmHsWidgetEmailRow::loadDocML fail @ loader");
+            return false;
+        }
+    
+        QGraphicsLinearLayout *layout = new QGraphicsLinearLayout(Qt::Vertical);
+    
+        //Do the layout stuff and Set layout before next return to avoid memoryleak
+        layout->setContentsMargins(KNmHsWidgetContentsMargin, KNmHsWidgetContentsMargin,
+            KNmHsWidgetContentsMargin, KNmHsWidgetContentsMargin);
+        layout->setSpacing(KNmHsWidgetContentsMargin);
+        setLayout(layout);
+    
+        //find container widget
+        QGraphicsWidget *container = loader.findWidget(KNmHsWidgetMailRowContainer);
+        if (!container) {
+            NM_ERROR(1,"NmHsWidgetEmailRow::loadDocML fail @ container");
+            return false;
+        }
+        layout->addItem(container);
+    
+        //child items possible to update
+        //separator
+        mSeparatorIcon = static_cast<HbLabel*> (loader.findWidget(KNmHsWidgetMailSeparatorIcon));
+    
+        //labels
+        mSenderLabel = static_cast<HbLabel*> (loader.findWidget(KNmHsWidgetMailRowSenderLabel));
+        mSubjectLabel = static_cast<HbLabel*> (loader.findWidget(KNmHsWidgetMailRowSubjectLabel));
+        mTimeLabel = static_cast<HbLabel*> (loader.findWidget(KNmHsWidgetMailRowTimeLabel));
+    
+        //icons
+        mNewMailIcon = static_cast<HbWidget*> (loader.findWidget(KNmHsWidgetMailRowNewMailIcon));
+        // KNmHsWidgetMailRowLeftIcon is not yet used, because followup information is not shown in client side
+        // and thus it is not wanted to be shown in widget side
+        mStatusIcons.append(static_cast<HbLabel*> (loader.findWidget(KNmHsWidgetMailRowRightIcon)));
+        mStatusIcons.append(static_cast<HbLabel*> (loader.findWidget(KNmHsWidgetMailRowMiddleIcon)));
+        mStatusIcons.append(static_cast<HbLabel*> (loader.findWidget(KNmHsWidgetMailRowLeftIcon)));
+    
+        //Verify that items are valid
+        if (!mSenderLabel || !mSubjectLabel || !mTimeLabel || !mNewMailIcon || !mSeparatorIcon) {
+            NM_ERROR(1,"NmHsWidgetEmailRow::loadDocML fail @ labels & icons");
+            return false;
+        }
+        //Verify all mStatusIcons
+        for (int i = 0; i < mStatusIcons.length(); i++) {
+            if (!mStatusIcons.at(i)) {
+                return false;
+            }
+        }
+        
+        return true;
+    }
+    QT_CATCH(...){
+        return false;
+    }
+}
+
+/*
+ Setup graphics that cannot be loaded from docml.
+  /return true if loading succeeded, otherwise false. False indicates that object is unusable.
+ */
+bool NmHsWidgetEmailRow::setupGraphics()
+    {
+    NM_FUNCTION;
+    
+    HbFrameDrawer* newMailIconFrameDrawer = 0;
+    HbFrameItem* newMailIconFrameItem = 0;
+    HbFrameDrawer* backgroundFrameDrawer = 0;
+    QT_TRY{ 
+        //separator icon
+        HbIcon separatorIcon("qtg_graf_divider_h_thin");
+        mSeparatorIcon->setIcon(separatorIcon);
+        
+        //new email icon
+        newMailIconFrameDrawer = new HbFrameDrawer("qtg_fr_list_new_item",
+            HbFrameDrawer::ThreePiecesVertical);
+        newMailIconFrameItem = new HbFrameItem(newMailIconFrameDrawer);
+        mNewMailIcon->setBackgroundItem(newMailIconFrameItem);
+        
+        //hide all the icons first to avoid blinking
+        hideIcons();
+    
+        //pressed background
+        backgroundFrameDrawer = new HbFrameDrawer("qtg_fr_hsitems_pressed", HbFrameDrawer::NinePieces);
+        mBackgroundLayoutItem = new HbFrameItem( backgroundFrameDrawer );
+        setBackgroundItem( mBackgroundLayoutItem );
+        mBackgroundLayoutItem->hide();
+            
+        return true;
+    }
+    QT_CATCH(...){
+        if(!newMailIconFrameItem && newMailIconFrameDrawer){
+            delete newMailIconFrameDrawer;
+            newMailIconFrameDrawer = NULL;
+        }
+        if(!mBackgroundLayoutItem && backgroundFrameDrawer){
+            delete backgroundFrameDrawer;
+            backgroundFrameDrawer = NULL;
+        }
+        return false;
+    }
+}
+
+/*!
+ Sets the data provided as a parameter to the UI components
+ \param envelope message envelope representing an email
+ */
+void NmHsWidgetEmailRow::updateMailData(const NmMessageEnvelope& envelope)
+{
+    NM_FUNCTION;
+
+    mEnvelope = NmMessageEnvelope(envelope);
+    
+    //hide all icons, so no previous data is messing with the new
+    hideIcons();
+
+    mMessageId = envelope.messageId();
+    //Show sender name if it is available, otherwise show email address
+    QString senderDisplayName = envelope.sender().displayName();
+    if (!senderDisplayName.isNull() && !senderDisplayName.isEmpty()) {
+        mSenderLabel->setPlainText(senderDisplayName);
+    }
+    else {
+        mSenderLabel->setPlainText(envelope.sender().address());
+    }
+
+    //Set subject
+    mSubjectLabel->setPlainText(envelope.subject());
+    
+    mMessageSentTime = envelope.sentTime();
+    updateDateTime();
+    
+    //set new icons to widget based on the data
+    setIconsToWidget( envelope );
+    
+    //set fonts color and size
+    setFontsSize(mEnvelope.isRead());
+    setHighlighedFontsColor(false);
+    }
+
+/*!
+    updateDateTime to label using correct locale
+*/
+void NmHsWidgetEmailRow::updateDateTime()
+    {
+    NM_FUNCTION;
+    //Set Date with locale support
+    //Time shown if message is sent today, otherwise show date
+    HbExtendedLocale locale = HbExtendedLocale::system();
+    QDateTime now = QDateTime::currentDateTime();
+    //change time to locale time. mMessageSentTime is always in GMT
+    QDateTime localTime = mMessageSentTime.addSecs(locale.universalTimeOffset());
+    if ( localTime.date() == now.date() )
+        {
+        //time format specification
+        QString timeSpec = r_qtn_time_usual;
+        mTimeLabel->setPlainText( locale.format(localTime.time(), timeSpec) );
+        }
+    else
+        {
+        QString dateSpec = r_qtn_date_without_year;
+        mTimeLabel->setPlainText( locale.format(localTime.date(), dateSpec) );
+        }
+    }
+
+/*!
+ hide icons from widget
+ */
+void NmHsWidgetEmailRow::hideIcons()
+{
+    NM_FUNCTION;
+    for (int i = 0; i < mStatusIcons.count(); i++) {
+        mStatusIcons.at(i)->hide();
+    }
+    mNewMailIcon->hide();
+}
+
+/*!
+ Set icons to widget
+ */
+void NmHsWidgetEmailRow::setIconsToWidget(const NmMessageEnvelope& envelope)
+{
+    NM_FUNCTION;
+
+    bool unreadMail = !envelope.isRead();
+    bool attachment = envelope.hasAttachments();
+    int priority = envelope.priority();
+
+    if (unreadMail) {
+        mNewMailIcon->show();
+    }
+
+    // Here we have list for priority and attachment icons. Later it is easy to add
+    // followup icon or something else if needed.
+    QList<HbIcon> iconList;
+
+    // Priority icon is added to list first thus it is always shown most right.
+    switch (priority) {
+        case NmMessagePriorityLow:
+            iconList.append(NmIcons::getIcon(NmIcons::NmIconPriorityLow));
+            break;
+        case NmMessagePriorityHigh:
+            iconList.append(NmIcons::getIcon(NmIcons::NmIconPriorityHigh));
+            break;
+        case NmMessagePriorityNormal:
+        default:
+            // Normal priority has no icon
+            break;
+    }
+
+    // Attachment icon is always shown on the left side of attachment icon if it
+    // exists. Otherwise in the most right.
+    if (attachment) {
+        iconList.append(NmIcons::getIcon(NmIcons::NmIconAttachment));
+    }
+
+    // Here we show icons added to the iconList in the order they have been added.
+    for (int count = 0; count < iconList.count(); count++) {
+        mStatusIcons.at(count)->setIcon(iconList.at(count));
+        mStatusIcons.at(count)->show();
+    }
+}
+
+
+/*!
+    sets fonts size. Unread and read mails are shown differently
+*/
+void NmHsWidgetEmailRow::setFontsSize( bool read )
+    {
+    NM_FUNCTION;
+    HbFontSpec fontSpec;
+    
+    if(!read){
+        fontSpec.setRole(HbFontSpec::Primary);
+        mTimeLabel->fontSpec().setRole(HbFontSpec::Primary);
+    }
+    else{
+        fontSpec.setRole(HbFontSpec::Secondary);
+        mTimeLabel->fontSpec().setRole(HbFontSpec::Secondary);
+    }  
+    
+    HbStyle style;
+    qreal size;
+    bool found = style.parameter(QString("hb-param-text-height-secondary"), size );
+    if (found) {
+        fontSpec.setTextHeight(size);
+    }
+    
+    mSenderLabel->setFontSpec(fontSpec);
+    mSubjectLabel->setFontSpec(fontSpec);
+    }
+
+/*!
+    sets fonts color.
+    /param bool pressed indicates if row is pressed down or not
+*/
+void NmHsWidgetEmailRow::setHighlighedFontsColor( bool pressed )
+    {
+    NM_FUNCTION;
+    QColor newFontColor;
+    
+    if(pressed){
+        newFontColor = HbColorScheme::color("qtc_hs_list_item_pressed");
+    }
+    else if(mEnvelope.isRead()){
+        newFontColor = HbColorScheme::color("qtc_hs_list_item_content_normal");
+    }
+    else{
+        newFontColor = HbColorScheme::color("qtc_hs_list_item_title_normal");
+    }
+ 
+    mSenderLabel->setTextColor(newFontColor);
+    mSubjectLabel->setTextColor(newFontColor);
+    mTimeLabel->setTextColor(newFontColor);
+    }
+
+/*!
+    change background highlight
+    /param bool show if true then shown, false hide
+*/
+void NmHsWidgetEmailRow::showHighlight( bool show )
+    {
+    NM_FUNCTION;
+    
+    if(show){
+        mBackgroundLayoutItem->show();
+    }
+    else{
+        mBackgroundLayoutItem->hide();
+    }
+    }
+
+/*
+ * NmHsWidgetEmailRow::gestureEvent(QGestureEvent *event)
+ */
+void NmHsWidgetEmailRow::gestureEvent(QGestureEvent *event)
+{
+    NM_FUNCTION;
+    if(!event){
+        return;
+    }
+    HbTapGesture *gesture = qobject_cast<HbTapGesture *>(event->gesture(Qt::TapGesture));
+    if(!gesture){
+        return;
+    }
+    switch (gesture->state()) {
+        case Qt::GestureStarted:
+            setHighlighedFontsColor(true);
+            showHighlight(true);
+        break;
+        case Qt::GestureCanceled:
+            setHighlighedFontsColor(false);
+            showHighlight(false);
+        break;
+        case Qt::GestureFinished:
+            setHighlighedFontsColor(false);
+            showHighlight(false);
+            if (gesture->tapStyleHint() == HbTapGesture::Tap) {
+                HbInstantFeedback::play(HbFeedback::BasicItem);
+                emit mailViewerLaunchTriggered(mMessageId);
+            }
+        break;
+    default: 
+        break;
+    }
+}
+
+/*
+ * NmHsWidgetEmailRow::event()
+ */
+bool NmHsWidgetEmailRow::event( QEvent *event )
+{
+    NM_FUNCTION;
+    QEvent::Type eventType = event->type();
+    if( eventType == HbEvent::ThemeChanged ){
+        setHighlighedFontsColor(false);
+        return true;
+    }
+    return HbWidget::event(event);
+}