emailuis/nmailui/src/nmmessagelistviewitem.cpp
changeset 59 16ed8d08d0b1
parent 54 997a02608b3a
child 65 478bc57ad291
equal deleted inserted replaced
54:997a02608b3a 59:16ed8d08d0b1
     1 /*
     1 /*
     2 * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
     2  * Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
     3 * All rights reserved.
     3  * All rights reserved.
     4 * This component and the accompanying materials are made available
     4  * This component and the accompanying materials are made available
     5 * under the terms of "Eclipse Public License v1.0"
     5  * under the terms of "Eclipse Public License v1.0"
     6 * which accompanies this distribution, and is available
     6  * which accompanies this distribution, and is available
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
     7  * at the URL "http://www.eclipse.org/legal/epl-v10.html".
     8 *
     8  *
     9 * Initial Contributors:
     9  * Initial Contributors:
    10 * Nokia Corporation - initial contribution.
    10  * Nokia Corporation - initial contribution.
    11 *
    11  *
    12 * Contributors:
    12  * Contributors:
    13 *
    13  *
    14 *
    14  * Description:
    15 */
    15  *
       
    16  */
    16 
    17 
    17 #include "nmuiheaders.h"
    18 #include "nmuiheaders.h"
    18 
    19 
    19 /*!
    20 /*!
    20     \class NmMessageListViewItem
    21     \class NmMessageListViewItem
    21     \brief list view item for message list view
    22     \brief List view item for message list view.
    22 */
    23  */
    23 
    24 
    24 static const int NmFolderTypeRole = Qt::UserRole+1; 
    25 static const int NmFolderTypeRole = Qt::UserRole+1; 
    25 
    26 
    26 /*!
    27 /*!
    27     Constructor
    28     Constructor.
    28 */
    29  */
    29 NmMessageListViewItem::NmMessageListViewItem(QGraphicsItem *parent):
    30 NmMessageListViewItem::NmMessageListViewItem(QGraphicsItem *parent)
    30     HbTreeViewItem(parent),
    31 : HbTreeViewItem(parent),
    31     mSender(NULL),
    32   mSender(NULL),
    32     mSubject(NULL),
    33   mSubject(NULL),
    33     mTime(NULL),
    34   mTime(NULL),
    34     mDividerTitle(NULL),
    35   mDividerTitle(NULL),
    35     mNewMsgIcon(NULL),
    36   mNewMsgIcon(NULL),
    36     mIcon1(NULL),
    37   mIcon1(NULL),
    37     mIcon2(NULL),
    38   mIcon2(NULL),
    38     mPrimarySize(0),
    39   mPrimarySize(0),
    39     mSecondarySize(0),
    40   mSecondarySize(0)   
    40     mTinySize(0)    
    41 {
    41 {
    42 }
    42     NM_FUNCTION;
    43 
    43 }
    44 /*!
    44 
    45     Destructor.
    45 /*!
    46  */
    46     Destruction.
       
    47 */
       
    48 NmMessageListViewItem::~NmMessageListViewItem()
    47 NmMessageListViewItem::~NmMessageListViewItem()
    49 {
    48 {
    50     NM_FUNCTION;
    49 }
    51 }
    50 
    52 
    51 /*!
    53 /*!
    52     Create item.
    54 */
    53  */
    55 HbTreeViewItem *NmMessageListViewItem::createItem()
    54 HbTreeViewItem *NmMessageListViewItem::createItem()
    56 {
    55 {
    57     NM_FUNCTION;
       
    58     
       
    59     return new NmMessageListViewItem(*this);
    56     return new NmMessageListViewItem(*this);
    60 }
    57 }
    61 
    58 
    62 /*!
    59 /*!
    63     boolean value indicating model index availability. Always true since
    60     Boolean value indicating model index availability. Always true since
    64     this item prototype is used for both divider and message
    61     this item prototype is used for both divider and message.
    65 */
    62  */
    66 bool NmMessageListViewItem::canSetModelIndex(const QModelIndex &index) const
    63 bool NmMessageListViewItem::canSetModelIndex(const QModelIndex &index) const
    67 {
    64 {
    68     NM_FUNCTION;
       
    69     
       
    70     Q_UNUSED(index);
    65     Q_UNUSED(index);
    71     // This item class can handle all items in message list
    66     // This item class can handle all items in message list.
    72     return true;
    67     return true;
    73 }
    68 }
    74 
    69 
    75 /*!
    70 /*!
    76     update child items. List calls this function whenever item is needed
    71     Update child items. List calls this function whenever item is needed
    77     to be updated.
    72     to be updated.
    78 */
    73  */
    79 void NmMessageListViewItem::updateChildItems()
    74 void NmMessageListViewItem::updateChildItems()
    80 {
    75 {
    81     NM_FUNCTION;
       
    82     
       
    83     // Get model pointer
    76     // Get model pointer
    84     NmMessageListModelItem *msgModelItem = modelIndex().data(
    77     NmMessageListModelItem *msgModelItem = modelIndex().data(
    85             Qt::DisplayRole).value<NmMessageListModelItem*>();
    78         Qt::DisplayRole).value<NmMessageListModelItem*>();
    86     // Check whether item is message item or title divider
    79     // Check whether item is message item or title divider
    87     // and set the layout accordingly, dividers not currently used
    80     // and set the layout accordingly. Dividers are not currently used.
    88     if (msgModelItem && msgModelItem->itemType() ==
    81     if (msgModelItem && msgModelItem->itemType() ==
    89         NmMessageListModelItem::NmMessageItemMessage){
    82         NmMessageListModelItem::NmMessageItemMessage){
    90         NmMessageListModel *model = static_cast<NmMessageListModel*>(msgModelItem->model());
    83         NmMessageListModel *model = static_cast<NmMessageListModel*>(msgModelItem->model());
    91         if (model){
    84         if (model){
    92             // First set item layout
    85             // First set item layout.
    93             createMessageItemLayout();
    86             createMessageItemLayout();
    94             // Set content data to item after layout is created
    87             // Set content data to item after layout is created.
    95             setContentsToMessageItem(msgModelItem->envelope(), model->dividersActive());
    88             setContentsToMessageItem(msgModelItem->envelope(), model->dividersActive());
    96         }
    89         }
    97     }
    90     }
    98     HbTreeViewItem::updateChildItems();
    91     HbTreeViewItem::updateChildItems();
    99 }
    92 }
   100 
    93 
   101 /*!
    94 /*!
   102     Set item layout.
    95     Set item layout.
   103     Function does not take ownership of model or model item
    96     Function does not take ownership of model or model item.
   104 */
    97  */
   105 void NmMessageListViewItem::createMessageItemLayout()
    98 void NmMessageListViewItem::createMessageItemLayout()
   106 { 
    99 {
   107     NM_FUNCTION;
       
   108     
       
   109     getFontSizes();
   100     getFontSizes();
   110     // Create sender label and set name from widgetml
   101     // Create sender label and set name from widgetml.
   111     if (!mSender){
   102     if (!mSender) {
   112         mSender = new HbTextItem(this);
   103         mSender = new HbTextItem(this);
   113         HbStyle::setItemName(mSender, "sender");
   104         HbStyle::setItemName(mSender, "sender");
   114         mSender->setObjectName("ListViewItemMessageSender");
   105         mSender->setObjectName("ListViewItemMessageSender");
   115         mSender->setTextWrapping(Hb::TextNoWrap);
   106     }
   116     }
   107     // Create time label and set name from widgetml.
   117     // Create time label and set name from widgetml
   108     if (!mTime) {
   118     if (!mTime){
       
   119         mTime = new HbTextItem(this);
   109         mTime = new HbTextItem(this);
   120         HbStyle::setItemName(mTime, "time");
   110         HbStyle::setItemName(mTime, "time");
   121         mTime->setObjectName("ListViewItemMessageTime");
   111         mTime->setObjectName("ListViewItemMessageTime");
   122     }
   112     }
   123     // Create subject label and set name from widgetml
   113     // Create subject label and set name from widgetml.
   124     if (!mSubject){
   114     if (!mSubject) {
   125         mSubject = new HbTextItem(this);
   115         mSubject = new HbTextItem(this);
   126         HbStyle::setItemName(mSubject, "subject");
   116         HbStyle::setItemName(mSubject, "subject");
   127         mSubject->setObjectName("ListViewItemMessageSubject");
   117         mSubject->setObjectName("ListViewItemMessageSubject");
   128         mSubject->setTextWrapping(Hb::TextNoWrap);
   118     }
   129     }
   119     // Set new message icon.
   130     // Set new message icon
       
   131     if (!mNewMsgIcon) {
   120     if (!mNewMsgIcon) {
   132         mNewMsgIcon = new HbFrameItem(this);
   121         mNewMsgIcon = new HbFrameItem(this);
   133      }
   122     }
   134     // Create priority icon and set name from widgetml
   123     // Create priority icon and set name from widgetml.
   135     if (!mIcon1){
   124     if (!mIcon1) {
   136         mIcon1 = new HbIconItem(this);
   125         mIcon1 = new HbIconItem(this);
   137         HbStyle::setItemName(mIcon1, "icon1");
   126         HbStyle::setItemName(mIcon1, "icon1");
   138         // According to layout guide, icon alignment is always right
   127     }
   139         mIcon1->setAlignment(Qt::AlignRight);
   128     // Create attachment icon and set name from widgetml.
   140     }
   129     if (!mIcon2) {
   141     // Create attachment icon and set name from widgetml
       
   142     if (!mIcon2){
       
   143         mIcon2 = new HbIconItem(this);
   130         mIcon2 = new HbIconItem(this);
   144         HbStyle::setItemName(mIcon2, "icon2");
   131         HbStyle::setItemName(mIcon2, "icon2");
   145         // According to layout guide, icon alignment is always right
       
   146         mIcon2->setAlignment(Qt::AlignRight);
       
   147     }
   132     }
   148     setObjectName("ListViewItemMessage");
   133     setObjectName("ListViewItemMessage");
   149 }
   134 }
   150 
   135 
   151 /*!
   136 /*!
   152     set item text label contents, icons, etc.
   137     Set item text label contents, icons, etc.
   153     Function does not take ownership of model or model item
   138     Function does not take ownership of model or model item.
   154 */
   139 */
   155 void NmMessageListViewItem::setContentsToMessageItem(const NmMessageEnvelope &envelope, 
   140 void NmMessageListViewItem::setContentsToMessageItem(const NmMessageEnvelope &envelope, 
   156                                                      bool dividersActive)
   141                                                      bool dividersActive)
   157 {
   142 {
   158     NM_FUNCTION;
   143     // Member variables are created in previous function.
   159     
   144     // Sender.
   160     // member variables are created in previous function
       
   161     // sender
       
   162     mSender->setText(senderFieldText(envelope));
   145     mSender->setText(senderFieldText(envelope));
   163     // time
   146     // Time.
   164     HbExtendedLocale locale = HbExtendedLocale::system();
   147     HbExtendedLocale locale = HbExtendedLocale::system();
   165     QDateTime localTime = envelope.sentTime().addSecs(locale.universalTimeOffset());
   148     QDateTime localTime = envelope.sentTime().addSecs(locale.universalTimeOffset());
   166     QDate sentLocalDate = localTime.date();
   149     QDate sentLocalDate = localTime.date();
   167     QDate currentdate = QDate::currentDate();
   150     QDate currentdate = QDate::currentDate();
   168     if (dividersActive || sentLocalDate == currentdate) {
   151     if (dividersActive || sentLocalDate == currentdate) {
   171         mTime->setText(locale.format(time, shortTimeSpec));
   154         mTime->setText(locale.format(time, shortTimeSpec));
   172     } else {
   155     } else {
   173         QString shortDateSpec = r_qtn_date_without_year;
   156         QString shortDateSpec = r_qtn_date_without_year;
   174         mTime->setText(locale.format(sentLocalDate, shortDateSpec));
   157         mTime->setText(locale.format(sentLocalDate, shortDateSpec));
   175     }
   158     }
   176     // subject 
   159     // Subject.
   177     QString subjectText = envelope.subject();
   160     QString subjectText = envelope.subject();
   178     if (subjectText.length()) {
   161     if (subjectText.length()) {
   179         mSubject->setText(subjectText);
   162         mSubject->setText(subjectText);
   180     } else {
   163     } else {
   181         mSubject->setText(hbTrId("txt_mail_dblist_val_no_subject"));
   164         mSubject->setText(hbTrId("txt_mail_dblist_val_no_subject"));
   182     }
   165     }
   183     // priority
   166     // Priority.
   184     bool priorityIs(false);
   167     bool priorityIs(false);
   185     mIcon1->hide();
   168     mIcon1->hide();
   186     mIcon2->hide();
   169     mIcon2->hide();
   187     switch (envelope.priority()) {
   170     switch (envelope.priority()) {
   188         case NmMessagePriorityLow:
   171         case NmMessagePriorityLow:
   199             break;
   182             break;
   200         case NmMessagePriorityNormal:
   183         case NmMessagePriorityNormal:
   201         default:
   184         default:
   202             break;
   185             break;
   203     }
   186     }
   204     // attachments
   187     // Attachments.
   205     HbIconItem *attaIcon = (priorityIs ? mIcon2 : mIcon1);
   188     HbIconItem *attaIcon = (priorityIs ? mIcon2 : mIcon1);
   206     if (envelope.hasAttachments()) {
   189     if (envelope.hasAttachments()) {
   207         HbIcon &icon = NmIcons::getIcon(NmIcons::NmIconAttachment);
   190         HbIcon &icon = NmIcons::getIcon(NmIcons::NmIconAttachment);
   208         attaIcon->setIcon(icon);
   191         attaIcon->setIcon(icon);
   209         attaIcon->setObjectName("ListViewItemMessageIconAttachment");
   192         attaIcon->setObjectName("ListViewItemMessageIconAttachment");
   210         attaIcon->show();
   193         attaIcon->show();
   211     }
   194     }
   212     // message read status
   195     // Message read status.
   213     bool msgReadStatus(envelope.isRead());
   196     bool msgReadStatus(envelope.isRead());
   214     HbFrameDrawer *drawer(NULL);
   197     HbFrameDrawer *drawer(NULL);
   215     HbStyle::setItemName(mNewMsgIcon, "msgicon");
   198     HbStyle::setItemName(mNewMsgIcon, "msgicon");
   216     if (!msgReadStatus) {
   199     if (!msgReadStatus) {
   217 
       
   218         setFontsUnread();
   200         setFontsUnread();
   219         mNewMsgIcon->setObjectName("ListViewItemMessageIconUnread");
   201         mNewMsgIcon->setObjectName("ListViewItemMessageIconUnread");
   220         drawer = new HbFrameDrawer("qtg_fr_list_new_item",
   202         drawer = new HbFrameDrawer("qtg_fr_list_new_item",
   221                 HbFrameDrawer::ThreePiecesVertical);
   203                 HbFrameDrawer::ThreePiecesVertical);
   222         drawer->setFillWholeRect(false);
   204         drawer->setFillWholeRect(false);
   223         // Set drawer. Takes ownership of the drawer and deletes previous drawer.
   205         // Set drawer. Takes ownership of the drawer and deletes previous drawer.
   224         mNewMsgIcon->setFrameDrawer(drawer);
   206         mNewMsgIcon->setFrameDrawer(drawer);
   225         mNewMsgIcon->show();
   207         mNewMsgIcon->show();
   226     } else {
   208     } else {
   227 
       
   228         setFontsRead();
   209         setFontsRead();
   229         mNewMsgIcon->setObjectName("ListViewItemMessageIconRead");
   210         mNewMsgIcon->setObjectName("ListViewItemMessageIconRead");
   230         drawer = new HbFrameDrawer(); // Create empty drawer
   211         drawer = new HbFrameDrawer(); // Create empty drawer.
   231         drawer->setFillWholeRect(false);
   212         drawer->setFillWholeRect(false);
   232         // Set drawer. Takes ownership of the drawer and deletes previous drawer.
   213         // Set drawer. Takes ownership of the drawer and deletes previous drawer.
   233         mNewMsgIcon->setFrameDrawer(drawer);
   214         mNewMsgIcon->setFrameDrawer(drawer);
   234         mNewMsgIcon->hide();        
   215         mNewMsgIcon->hide();        
   235     }
   216     }
   236 }
   217 }
   237 
   218 
   238 /*!
   219 /*!
   239     setFontsUnread
   220     Set fonts unread.
   240 */
   221  */
   241 void  NmMessageListViewItem::setFontsUnread()
   222 void  NmMessageListViewItem::setFontsUnread()
   242 {    
   223 {
   243     NM_FUNCTION;
       
   244     
       
   245     static QColor colorRole = HbColorScheme::color("qtc_list_item_title_normal");
   224     static QColor colorRole = HbColorScheme::color("qtc_list_item_title_normal");
   246     HbFontSpec fontSpec(HbFontSpec::Primary);
   225     HbFontSpec fontSpec(HbFontSpec::Primary);
   247     setFonts(colorRole, fontSpec);
   226     setFonts(colorRole, fontSpec);
   248 }
   227 }
   249 
   228 
   250 /*!
   229 /*!
   251     setFontsRead
   230     Set fonts read.
   252 */
   231  */
   253 void  NmMessageListViewItem::setFontsRead()
   232 void  NmMessageListViewItem::setFontsRead()
   254 {
   233 {
   255     NM_FUNCTION;
       
   256     
       
   257     static QColor colorRole = HbColorScheme::color("qtc_list_item_content_normal");
   234     static QColor colorRole = HbColorScheme::color("qtc_list_item_content_normal");
   258     HbFontSpec fontSpec(HbFontSpec::Secondary);
   235     HbFontSpec fontSpec(HbFontSpec::Secondary);
   259     setFonts(colorRole, fontSpec);
   236     setFonts(colorRole, fontSpec);
   260 }
   237 }
   261 
   238 
   262 /*!
   239 /*!
   263     getFontSizes.
   240     Get font sizes.
   264 */
   241  */
   265 void  NmMessageListViewItem::getFontSizes()
   242 void  NmMessageListViewItem::getFontSizes()
   266 {
   243 {
   267     NM_FUNCTION;
   244     // Get font sizes from style.
   268     
       
   269     // Get font sizes from style  
       
   270     qreal currentSize;
   245     qreal currentSize;
   271     bool found = style()->parameter(QString("hb-param-text-height-primary"), currentSize );
   246     bool found = style()->parameter(QString("hb-param-text-height-primary"), currentSize );
   272     if (found) {
   247     if (found) {
   273         mPrimarySize = currentSize;
   248         mPrimarySize = currentSize;
   274     }      
   249     }      
   275     found = style()->parameter(QString("hb-param-text-height-secondary"), currentSize );
   250     found = style()->parameter(QString("hb-param-text-height-secondary"), currentSize );
   276     if (found) {
   251     if (found) {
   277         mSecondarySize = currentSize;
   252         mSecondarySize = currentSize;
   278     }        
   253     }        
   279     found = style()->parameter(QString("hb-param-text-height-tiny"), currentSize );
   254 }
   280     if (found) {
   255 
   281         mTinySize = currentSize;
   256 /*!
   282     } 
   257     Set fonts.
   283 }
   258  */
   284 
       
   285 /*!
       
   286     setFonts.
       
   287 */
       
   288 void  NmMessageListViewItem::setFonts(const QColor &colorRole, 
   259 void  NmMessageListViewItem::setFonts(const QColor &colorRole, 
   289         HbFontSpec &fontSpec)
   260         HbFontSpec &fontSpec)
   290 {
   261 {
   291     NM_FUNCTION;
       
   292     
       
   293     // Change sizes explicitly since css is overwritten in polish now.    
   262     // Change sizes explicitly since css is overwritten in polish now.    
   294     if (mSender && mSubject && mTime) {
   263     if (mSender && mSubject && mTime) {
   295         
       
   296         if (mPrimarySize) {
   264         if (mPrimarySize) {
   297             fontSpec.setTextHeight(mPrimarySize);
   265             fontSpec.setTextHeight(mPrimarySize);
   298         }      
   266         }      
   299         mSender->setFontSpec(fontSpec);
   267         mSender->setFontSpec(fontSpec);
   300         mSender->setTextColor(colorRole);
   268         mSender->setTextColor(colorRole);
   301         
       
   302         if (mSecondarySize) {
   269         if (mSecondarySize) {
   303             fontSpec.setTextHeight(mSecondarySize);
   270             fontSpec.setTextHeight(mSecondarySize);
   304         }        
   271         }        
   305         mSubject->setFontSpec(fontSpec);
   272         mSubject->setFontSpec(fontSpec);
   306         mSubject->setTextColor(colorRole);
   273         mSubject->setTextColor(colorRole);
   307 
       
   308         if (mTinySize) {
       
   309             fontSpec.setTextHeight(mTinySize);
       
   310         } 
       
   311         mTime->setFontSpec(fontSpec);        
   274         mTime->setFontSpec(fontSpec);        
   312         mTime->setTextColor(colorRole);
   275         mTime->setTextColor(colorRole);
   313     }
   276     }
   314 }
   277 }
   315 
   278 
   316 /*!
   279 /*!
   317     senderFieldText. Function returns sender field text from
   280     Get sender field text. Function returns sender field text from
   318     envelope based on currently used function
   281     envelope based on currently used function.
   319 */
   282  */
   320 QString NmMessageListViewItem::senderFieldText(const NmMessageEnvelope &envelope)
   283 QString NmMessageListViewItem::senderFieldText(const NmMessageEnvelope &envelope)
   321 {
   284 {
   322     NM_FUNCTION;
       
   323     
       
   324     QString ret;  
   285     QString ret;  
   325     QVariant folderType = modelIndex().data(
   286     QVariant folderType = modelIndex().data(
   326             NmFolderTypeRole).value<QVariant>();
   287             NmFolderTypeRole).value<QVariant>();
   327     switch (folderType.toInt()) {
   288     switch (folderType.toInt()) {
   328         // Outbox, drafts and sent folder, sender name is 
   289         // Outbox, drafts and sent folder, sender name is 
   329         // replaced with first recipient from to/cc list
   290         // replaced with first recipient from to/cc list.
   330         case NmFolderOutbox:
   291         case NmFolderOutbox:
   331         case NmFolderDrafts:
   292         case NmFolderDrafts:
   332         case NmFolderSent:
   293         case NmFolderSent:
   333         {
   294         {
   334             QList<NmAddress>& toRecipients = envelope.toRecipients();
   295             QList<NmAddress>& toRecipients = envelope.toRecipients();
   350                 } 
   311                 } 
   351                 else {
   312                 else {
   352                     ret += addressToUse.address();                    
   313                     ret += addressToUse.address();                    
   353                 }               
   314                 }               
   354             }
   315             }
   355             
       
   356         }
   316         }
   357         break;    
   317         break;    
   358         // All other folders will show sender display name
   318         // All other folders will show sender display name.
   359         default: 
   319         default: 
   360         {
   320         {
   361             QString displayName = envelope.sender().displayName();
   321             QString displayName = envelope.sender().displayName();
   362             if (displayName.length()) {
   322             if (displayName.length()) {
   363                 ret += NmUtilities::cleanupDisplayName(displayName);
   323                 ret += NmUtilities::cleanupDisplayName(displayName);
   368         }
   328         }
   369         break;
   329         break;
   370     }
   330     }
   371     return ret;
   331     return ret;
   372 }
   332 }
   373