securitydialogs/SecUi/SecUiTestQt/mailtreeviewitem.cpp
author hgs
Wed, 20 Oct 2010 14:51:23 +0300
changeset 66 67b3e3c1fc87
permissions -rw-r--r--
201041
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
66
hgs
parents:
diff changeset
     1
#include "mailtreeviewitem.h"
hgs
parents:
diff changeset
     2
hgs
parents:
diff changeset
     3
#include <hbpushbutton.h>
hgs
parents:
diff changeset
     4
#include <hbabstractitemview.h>
hgs
parents:
diff changeset
     5
#include <hbtextitem.h>
hgs
parents:
diff changeset
     6
#include <hbstyle.h>
hgs
parents:
diff changeset
     7
#include <hblabel.h>
hgs
parents:
diff changeset
     8
#include <hbanchorlayout.h>
hgs
parents:
diff changeset
     9
#include <hbframedrawer.h>
hgs
parents:
diff changeset
    10
#include <hbframeitem.h>
hgs
parents:
diff changeset
    11
#include <hbicon.h>
hgs
parents:
diff changeset
    12
#include <hbstyle_p.h>
hgs
parents:
diff changeset
    13
hgs
parents:
diff changeset
    14
#include <QPainter>
hgs
parents:
diff changeset
    15
#include <QDebug>
hgs
parents:
diff changeset
    16
hgs
parents:
diff changeset
    17
/*!
hgs
parents:
diff changeset
    18
    \class NmMessageListViewItem
hgs
parents:
diff changeset
    19
    \brief list view item for message list view
hgs
parents:
diff changeset
    20
*/
hgs
parents:
diff changeset
    21
hgs
parents:
diff changeset
    22
/*!
hgs
parents:
diff changeset
    23
    Constructor
hgs
parents:
diff changeset
    24
*/
hgs
parents:
diff changeset
    25
MailTreeViewItem::MailTreeViewItem(QGraphicsItem *parent): 
hgs
parents:
diff changeset
    26
    HbTreeViewItem(parent),
hgs
parents:
diff changeset
    27
    mSender(0),
hgs
parents:
diff changeset
    28
    mSubject(0),
hgs
parents:
diff changeset
    29
    mTime(0),
hgs
parents:
diff changeset
    30
    mDividerTitle(0),
hgs
parents:
diff changeset
    31
    mNewMsgIcon(0),
hgs
parents:
diff changeset
    32
    mFrom(0)
hgs
parents:
diff changeset
    33
{
hgs
parents:
diff changeset
    34
}
hgs
parents:
diff changeset
    35
hgs
parents:
diff changeset
    36
MailTreeViewItem::~MailTreeViewItem()
hgs
parents:
diff changeset
    37
{
hgs
parents:
diff changeset
    38
}
hgs
parents:
diff changeset
    39
hgs
parents:
diff changeset
    40
hgs
parents:
diff changeset
    41
int MailTreeViewItem::type() const
hgs
parents:
diff changeset
    42
{
hgs
parents:
diff changeset
    43
    return MailTreeViewItem::Type;
hgs
parents:
diff changeset
    44
}
hgs
parents:
diff changeset
    45
hgs
parents:
diff changeset
    46
HbAbstractViewItem *MailTreeViewItem::createItem()
hgs
parents:
diff changeset
    47
{
hgs
parents:
diff changeset
    48
    return new MailTreeViewItem(*this);
hgs
parents:
diff changeset
    49
}
hgs
parents:
diff changeset
    50
hgs
parents:
diff changeset
    51
/*!
hgs
parents:
diff changeset
    52
    boolean value indicating model index availability
hgs
parents:
diff changeset
    53
*/
hgs
parents:
diff changeset
    54
bool MailTreeViewItem::canSetModelIndex(const QModelIndex &index) const
hgs
parents:
diff changeset
    55
{
hgs
parents:
diff changeset
    56
    Q_UNUSED(index);
hgs
parents:
diff changeset
    57
    // This item class can handle all items in message list
hgs
parents:
diff changeset
    58
    return true;
hgs
parents:
diff changeset
    59
}
hgs
parents:
diff changeset
    60
hgs
parents:
diff changeset
    61
/*!
hgs
parents:
diff changeset
    62
    update child items
hgs
parents:
diff changeset
    63
*/
hgs
parents:
diff changeset
    64
void MailTreeViewItem::updateChildItems()
hgs
parents:
diff changeset
    65
{
hgs
parents:
diff changeset
    66
    // to create expand icon, if it doesn't exist
hgs
parents:
diff changeset
    67
    HbTreeViewItem::updateChildItems();
hgs
parents:
diff changeset
    68
hgs
parents:
diff changeset
    69
    // Shared data with ModelFactory.
hgs
parents:
diff changeset
    70
    int messageRole = Qt::UserRole+1;
hgs
parents:
diff changeset
    71
    int dateRole = Qt::UserRole+2;
hgs
parents:
diff changeset
    72
hgs
parents:
diff changeset
    73
    mLayout = 0;
hgs
parents:
diff changeset
    74
    setLayout(0);
hgs
parents:
diff changeset
    75
hgs
parents:
diff changeset
    76
    // Create layout
hgs
parents:
diff changeset
    77
    mLayout = new HbAnchorLayout();
hgs
parents:
diff changeset
    78
    setLayout(mLayout); // mLayout ownership is passed to QGraphicsWidget
hgs
parents:
diff changeset
    79
hgs
parents:
diff changeset
    80
    QVariant dateData = modelIndex().data(dateRole);
hgs
parents:
diff changeset
    81
    QVariant messageData = modelIndex().data(messageRole);
hgs
parents:
diff changeset
    82
hgs
parents:
diff changeset
    83
    // Create fonts
hgs
parents:
diff changeset
    84
    HbFontSpec primaryFont = HbFontSpec(HbFontSpec::Primary);
hgs
parents:
diff changeset
    85
    HbFontSpec secondaryFont = HbFontSpec(HbFontSpec::Secondary);
hgs
parents:
diff changeset
    86
hgs
parents:
diff changeset
    87
    // Check whether item is message item or title divider
hgs
parents:
diff changeset
    88
    // and set the layout accordingly
hgs
parents:
diff changeset
    89
    if (messageData.isValid()) {
hgs
parents:
diff changeset
    90
        QStringList stringList;
hgs
parents:
diff changeset
    91
        if ( messageData.canConvert<QStringList>()) {
hgs
parents:
diff changeset
    92
            stringList = messageData.toStringList();
hgs
parents:
diff changeset
    93
        }
hgs
parents:
diff changeset
    94
hgs
parents:
diff changeset
    95
        if (stringList.count() < 3) {
hgs
parents:
diff changeset
    96
            // to avoid crash
hgs
parents:
diff changeset
    97
            return;
hgs
parents:
diff changeset
    98
        }
hgs
parents:
diff changeset
    99
hgs
parents:
diff changeset
   100
        delete mDividerTitle;
hgs
parents:
diff changeset
   101
        mDividerTitle = 0;
hgs
parents:
diff changeset
   102
hgs
parents:
diff changeset
   103
        if (!mTime) {
hgs
parents:
diff changeset
   104
            mTime = new HbLabel();
hgs
parents:
diff changeset
   105
        }
hgs
parents:
diff changeset
   106
        mTime->setObjectName("ListViewItemMessageTime");
hgs
parents:
diff changeset
   107
        mTime->setFontSpec(HbFontSpec(HbFontSpec::Primary));
hgs
parents:
diff changeset
   108
        // Create subject label
hgs
parents:
diff changeset
   109
        if (!mSubject) {
hgs
parents:
diff changeset
   110
            mSubject = new HbLabel();
hgs
parents:
diff changeset
   111
        }
hgs
parents:
diff changeset
   112
        mSubject->setObjectName("ListViewItemMessageSubject");
hgs
parents:
diff changeset
   113
        mSubject->setFontSpec(HbFontSpec(HbFontSpec::Secondary));
hgs
parents:
diff changeset
   114
hgs
parents:
diff changeset
   115
        if (!mFrom) {
hgs
parents:
diff changeset
   116
            mFrom = new HbLabel(stringList.at(0));
hgs
parents:
diff changeset
   117
        }
hgs
parents:
diff changeset
   118
        mFrom->setObjectName("ListViewItemMessageSender");
hgs
parents:
diff changeset
   119
        mFrom->setFontSpec(primaryFont);
hgs
parents:
diff changeset
   120
hgs
parents:
diff changeset
   121
        // Create default locale
hgs
parents:
diff changeset
   122
        /*QLocale locale;
hgs
parents:
diff changeset
   123
        mTime->setText(locale.toString(
hgs
parents:
diff changeset
   124
                msgModelItem->metaData().sentTime().toLocalTime().time(),
hgs
parents:
diff changeset
   125
                QLocale::ShortFormat));*/
hgs
parents:
diff changeset
   126
        mTime->setPlainText(stringList.at(1));
hgs
parents:
diff changeset
   127
hgs
parents:
diff changeset
   128
       // mTime->setAlignment(Qt::AlignVCenter | Qt::AlignRight);
hgs
parents:
diff changeset
   129
        mSubject->setPlainText(stringList.at(2));
hgs
parents:
diff changeset
   130
hgs
parents:
diff changeset
   131
        // Create new message icon
hgs
parents:
diff changeset
   132
        if (!mNewMsgIcon) {
hgs
parents:
diff changeset
   133
           HbFrameDrawer *drawer = new HbFrameDrawer(":/resources/qtg_fr_list_new_item", HbFrameDrawer::ThreePiecesVertical);
hgs
parents:
diff changeset
   134
            drawer->setFillWholeRect(false);
hgs
parents:
diff changeset
   135
            mNewMsgIcon = new HbFrameItem(drawer, this);
hgs
parents:
diff changeset
   136
        }
hgs
parents:
diff changeset
   137
        mNewMsgIcon->setObjectName("ListViewItemMessageIcon");
hgs
parents:
diff changeset
   138
hgs
parents:
diff changeset
   139
        static const int iconWidth = 8;
hgs
parents:
diff changeset
   140
hgs
parents:
diff changeset
   141
        // Set message item layout
hgs
parents:
diff changeset
   142
        // Place new message icon to layout
hgs
parents:
diff changeset
   143
        mLayout->setAnchor(mLayout, Hb::TopEdge, mNewMsgIcon, Hb::TopEdge, 0);
hgs
parents:
diff changeset
   144
        mLayout->setAnchor(mLayout, Hb::LeftEdge, mNewMsgIcon, Hb::LeftEdge, 0);
hgs
parents:
diff changeset
   145
        mLayout->setAnchor(mNewMsgIcon, Hb::RightEdge, mFrom, Hb::LeftEdge, 0);
hgs
parents:
diff changeset
   146
hgs
parents:
diff changeset
   147
        // Set from & subject 10 pixels from left
hgs
parents:
diff changeset
   148
        mLayout->setAnchor(mLayout, Hb::TopEdge, mFrom, Hb::TopEdge, 0);
hgs
parents:
diff changeset
   149
        mLayout->setAnchor(mLayout, Hb::LeftEdge, mFrom, Hb::LeftEdge, iconWidth);
hgs
parents:
diff changeset
   150
        mLayout->setAnchor(mLayout, Hb::RightEdge, mSubject, Hb::RightEdge, iconWidth);
hgs
parents:
diff changeset
   151
hgs
parents:
diff changeset
   152
        mLayout->setAnchor(mLayout, Hb::LeftEdge, mSubject, Hb::LeftEdge, iconWidth);
hgs
parents:
diff changeset
   153
        mLayout->setAnchor(mFrom, Hb::BottomEdge, mSubject, Hb::TopEdge, 0);
hgs
parents:
diff changeset
   154
        // Set Time label to correct place
hgs
parents:
diff changeset
   155
        mLayout->setAnchor(mTime, Hb::LeftEdge, mLayout, Hb::RightEdge, 100);
hgs
parents:
diff changeset
   156
        mLayout->setAnchor(mFrom, Hb::RightEdge, mTime, Hb::LeftEdge, 0);
hgs
parents:
diff changeset
   157
        // Set subject right edge alignment
hgs
parents:
diff changeset
   158
        mLayout->setAnchor(mSubject, Hb::RightEdge, mLayout, Hb::RightEdge, iconWidth);
hgs
parents:
diff changeset
   159
hgs
parents:
diff changeset
   160
        mLayout->setPreferredHeight(50);
hgs
parents:
diff changeset
   161
        setObjectName("ListViewItemMessage");
hgs
parents:
diff changeset
   162
    }
hgs
parents:
diff changeset
   163
    else if (dateData.isValid()) {
hgs
parents:
diff changeset
   164
        QString date;
hgs
parents:
diff changeset
   165
        if (dateData.canConvert<QString>()) {
hgs
parents:
diff changeset
   166
            date = dateData.toString();
hgs
parents:
diff changeset
   167
        }
hgs
parents:
diff changeset
   168
        else {
hgs
parents:
diff changeset
   169
            return;
hgs
parents:
diff changeset
   170
        }
hgs
parents:
diff changeset
   171
hgs
parents:
diff changeset
   172
        // NOTE: Layout data will be read from xml once orbit supports it
hgs
parents:
diff changeset
   173
        // Create divider icon
hgs
parents:
diff changeset
   174
        delete mTime;
hgs
parents:
diff changeset
   175
        mTime = 0;
hgs
parents:
diff changeset
   176
hgs
parents:
diff changeset
   177
        delete mSubject;
hgs
parents:
diff changeset
   178
        mSubject = 0;
hgs
parents:
diff changeset
   179
hgs
parents:
diff changeset
   180
        delete mNewMsgIcon;
hgs
parents:
diff changeset
   181
        mNewMsgIcon = 0;
hgs
parents:
diff changeset
   182
hgs
parents:
diff changeset
   183
        delete mFrom;
hgs
parents:
diff changeset
   184
        mFrom = 0;
hgs
parents:
diff changeset
   185
hgs
parents:
diff changeset
   186
        // Create divider title
hgs
parents:
diff changeset
   187
        if (!mDividerTitle) {
hgs
parents:
diff changeset
   188
            mDividerTitle = new HbLabel();
hgs
parents:
diff changeset
   189
        }
hgs
parents:
diff changeset
   190
        mDividerTitle->setObjectName("ListViewItemDividerTitle");
hgs
parents:
diff changeset
   191
hgs
parents:
diff changeset
   192
        mDividerTitle->setPlainText(date);
hgs
parents:
diff changeset
   193
        mDividerTitle->setFontSpec(primaryFont);
hgs
parents:
diff changeset
   194
        mDividerTitle->setAlignment(Qt::AlignVCenter | Qt::AlignLeft);
hgs
parents:
diff changeset
   195
hgs
parents:
diff changeset
   196
        // Add title divider text
hgs
parents:
diff changeset
   197
        mLayout->setAnchor(mLayout, Hb::TopEdge, mDividerTitle, Hb::TopEdge, 1);
hgs
parents:
diff changeset
   198
        mLayout->setAnchor(mLayout, Hb::LeftEdge, mDividerTitle, Hb::LeftEdge, 0);
hgs
parents:
diff changeset
   199
hgs
parents:
diff changeset
   200
        QGraphicsItem *graphicsItem = primitive(QLatin1String("subitem-indicator"));
hgs
parents:
diff changeset
   201
        if (    graphicsItem 
hgs
parents:
diff changeset
   202
            &&  graphicsItem->isWidget()) {
hgs
parents:
diff changeset
   203
            HbLabel *dividerIcon = qobject_cast<HbLabel*>(static_cast<QGraphicsWidget*>(graphicsItem));
hgs
parents:
diff changeset
   204
            if (dividerIcon) {
hgs
parents:
diff changeset
   205
                mLayout->setAnchor(mLayout, Hb::TopEdge, dividerIcon, Hb::TopEdge, 5);
hgs
parents:
diff changeset
   206
                mLayout->setAnchor(dividerIcon, Hb::RightEdge, mLayout, Hb::RightEdge, 20);
hgs
parents:
diff changeset
   207
            }
hgs
parents:
diff changeset
   208
        }
hgs
parents:
diff changeset
   209
hgs
parents:
diff changeset
   210
        mLayout->setPreferredHeight(32);
hgs
parents:
diff changeset
   211
        setObjectName("ListViewItemDivider");
hgs
parents:
diff changeset
   212
    }
hgs
parents:
diff changeset
   213
    else {
hgs
parents:
diff changeset
   214
        qDebug() <<"MailTreeViewItem: Invalid message meta data when drawing message list";
hgs
parents:
diff changeset
   215
    }
hgs
parents:
diff changeset
   216
hgs
parents:
diff changeset
   217
    const QSizeF reso = HbDeviceProfile::current().logicalSize();
hgs
parents:
diff changeset
   218
    mLayout->setPreferredWidth(reso.width()-20);
hgs
parents:
diff changeset
   219
}
hgs
parents:
diff changeset
   220
hgs
parents:
diff changeset
   221
void MailTreeViewItem::polishEvent()
hgs
parents:
diff changeset
   222
{
hgs
parents:
diff changeset
   223
    QGraphicsWidget::polishEvent();
hgs
parents:
diff changeset
   224
}
hgs
parents:
diff changeset
   225
hgs
parents:
diff changeset
   226
hgs
parents:
diff changeset
   227
HbWidgetBase *MailTreeViewItem::updateExpandItem()
hgs
parents:
diff changeset
   228
{
hgs
parents:
diff changeset
   229
    HbLabel *dividerIcon = 0;
hgs
parents:
diff changeset
   230
    QGraphicsItem *graphicsItem = primitive(QLatin1String("subitem-indicator"));
hgs
parents:
diff changeset
   231
    if (    graphicsItem 
hgs
parents:
diff changeset
   232
        &&  graphicsItem->isWidget()) {
hgs
parents:
diff changeset
   233
        dividerIcon = qobject_cast<HbLabel*>(static_cast<QGraphicsWidget*>(graphicsItem));
hgs
parents:
diff changeset
   234
    }
hgs
parents:
diff changeset
   235
hgs
parents:
diff changeset
   236
    if (!dividerIcon) {
hgs
parents:
diff changeset
   237
        dividerIcon = new HbLabel();
hgs
parents:
diff changeset
   238
        HbIcon icon;
hgs
parents:
diff changeset
   239
        icon.setIconName(":/resources/qtg_nmailui_minus_sign", QIcon::Normal, QIcon::On);
hgs
parents:
diff changeset
   240
        icon.setIconName(":/resources/qtg_nmailui_plus_sign", QIcon::Normal, QIcon::Off);
hgs
parents:
diff changeset
   241
        dividerIcon->setIcon(icon);
hgs
parents:
diff changeset
   242
    }
hgs
parents:
diff changeset
   243
hgs
parents:
diff changeset
   244
    if (isExpanded()) {
hgs
parents:
diff changeset
   245
        dividerIcon->setObjectName("ListViewItemDividerIconMinus");
hgs
parents:
diff changeset
   246
    }
hgs
parents:
diff changeset
   247
    else {
hgs
parents:
diff changeset
   248
        dividerIcon->setObjectName("ListViewItemDividerIconPlus");
hgs
parents:
diff changeset
   249
    }
hgs
parents:
diff changeset
   250
    return dividerIcon;
hgs
parents:
diff changeset
   251
}
hgs
parents:
diff changeset
   252
hgs
parents:
diff changeset
   253
void MailTreeViewItem::paint(
hgs
parents:
diff changeset
   254
    QPainter *painter,
hgs
parents:
diff changeset
   255
    const QStyleOptionGraphicsItem *option,
hgs
parents:
diff changeset
   256
    QWidget *widget)
hgs
parents:
diff changeset
   257
{
hgs
parents:
diff changeset
   258
    Q_UNUSED(option);
hgs
parents:
diff changeset
   259
    Q_UNUSED(widget);
hgs
parents:
diff changeset
   260
    if (painter){
hgs
parents:
diff changeset
   261
        painter->save();
hgs
parents:
diff changeset
   262
        painter->setOpacity(0.15);
hgs
parents:
diff changeset
   263
        QLineF line1( rect().topLeft().x(), rect().bottomRight().y(),
hgs
parents:
diff changeset
   264
                     rect().bottomRight().x(), rect().bottomRight().y());
hgs
parents:
diff changeset
   265
        painter->drawLine(line1);
hgs
parents:
diff changeset
   266
        // Draw line before each item
hgs
parents:
diff changeset
   267
        QLineF line2( rect().topLeft().x(), rect().topLeft().y(),
hgs
parents:
diff changeset
   268
                     rect().bottomRight().x(), rect().topLeft().y());
hgs
parents:
diff changeset
   269
        painter->drawLine(line2);
hgs
parents:
diff changeset
   270
        painter->restore();
hgs
parents:
diff changeset
   271
    }
hgs
parents:
diff changeset
   272
}
hgs
parents:
diff changeset
   273
hgs
parents:
diff changeset
   274