messagingapp/msgui/msgapp/src/draftslistview.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Fri, 16 Apr 2010 14:56:15 +0300
changeset 23 238255e8b033
child 25 84d9eb65b26f
permissions -rw-r--r--
Revision: 201011 Kit: 201015

/*
 * 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: Drafts List View for displaying drafts messages.
 *
 */

#include "draftslistview.h"

// SYSTEM INCLUDES
#include <HbMenu>
#include <HbAction>
#include <HbToolBar>
#include <HbToolBarExtension>
#include <HbListView>
#include <HbListViewItem>
#include <HbListWidget>
#include <HbListWidgetItem>
#include <HbStyleLoader>
#include <HbGroupBox>
#include <HbFrameBackground>

#include <QSortFilterProxyModel>
#include <QGraphicsLinearLayout>

// USER INCLUDES
#include "conversationsengine.h"
#include "conversationsenginedefines.h"
#include "convergedmessage.h"
#include "convergedmessageid.h"

// LOCAL CONSTANTS
const QString LIST_ITEM_FRAME("qtg_fr_list_normal");
const QString POPUP_LIST_FRAME("qtg_fr_popup_list_normal");
const QString NEW_MESSAGE_ICON("qtg_mono_create_message");
const QString SORT_ICON("qtg_mono_sort");

// LOCALIZATION CONSTANTS
#define LOC_COMMON_OPEN hbTrId("txt_common_menu_open")
#define LOC_COMMON_DELETE hbTrId("txt_common_menu_delete")
#define VIEW_HEADING "Drafts"
#define MENU_DELETE_ALL "Delete all drafts"
#define TB_VIEW_EXTN "View"
#define TB_NEW_MESSAGE "New message"
#define TB_EXTN_DRAFTS "Drafts"
#define TB_EXTN_CONVERSATIONS "Conversations"

//---------------------------------------------------------------
// DraftsListView::DraftsListView
// @see header
//---------------------------------------------------------------
DraftsListView::DraftsListView(QGraphicsItem *parent) :
    MsgBaseView(parent), mListView(0), mViewExtnList(0)
{
    createView();
}

//---------------------------------------------------------------
// DraftsListView::~DraftsListView
// @see header
//---------------------------------------------------------------
DraftsListView::~DraftsListView()
{
}

//---------------------------------------------------------------
// DraftsListView::createView
// @see header
//---------------------------------------------------------------
void DraftsListView::createView()
{
    setupToolbar();
    setupMenu();
    setupListView();
}

//---------------------------------------------------------------
// DraftsListView::setupMenu
// @see header
//---------------------------------------------------------------
void DraftsListView::setupMenu()
{
}

//---------------------------------------------------------------
// DraftsListView::setupToolbar
// @see header
//---------------------------------------------------------------
void DraftsListView::setupToolbar()
{
    HbToolBar *toolBar = this->toolBar();
    toolBar->setOrientation(Qt::Horizontal);

    // Create & setup ToolBar Extension
    HbToolBarExtension *viewExtn = new HbToolBarExtension();
    HbAction *viewAction = toolBar->addExtension(viewExtn);
    viewAction->setText(TB_VIEW_EXTN);
    viewAction->setIcon(HbIcon(SORT_ICON));

    mViewExtnList = new HbListWidget();
    mViewExtnList->addItem(TB_EXTN_DRAFTS);
    mViewExtnList->addItem(TB_EXTN_CONVERSATIONS);

    HbListViewItem *prototype = mViewExtnList->listItemPrototype();
    HbFrameBackground frame(POPUP_LIST_FRAME, HbFrameDrawer::NinePieces);
    prototype->setDefaultFrame(frame);

    connect(mViewExtnList, SIGNAL(activated(HbListWidgetItem*)), this,
        SLOT(handleViewExtnActivated(HbListWidgetItem*)));
    connect(mViewExtnList, SIGNAL(activated(HbListWidgetItem*)), viewExtn, SLOT(close()));

    viewExtn->setContentWidget(mViewExtnList);

    // Create & setup 2nd ToolBar button.
    HbAction* newMessageAction = new HbAction(HbIcon(NEW_MESSAGE_ICON), TB_NEW_MESSAGE, this);
    connect(newMessageAction, SIGNAL(triggered()), this, SLOT(createNewMessage()));
    toolBar->addAction(newMessageAction);
}

//---------------------------------------------------------------
// DraftsListView::setupListView
// @see header
//---------------------------------------------------------------
void DraftsListView::setupListView()
{
    // Create parent layout.
    QGraphicsLinearLayout *mainLayout = new QGraphicsLinearLayout(Qt::Vertical);
    mainLayout->setContentsMargins(0, 0, 0, 0);
    mainLayout->setSpacing(0);

    // Create view heading.
    HbGroupBox *viewHeading = new HbGroupBox();
    viewHeading->setTitleText(VIEW_HEADING);

    // Create List View.
    mListView = new HbListView(this);
    mListView->setScrollingStyle(HbScrollArea::PanOrFlick);
    mListView->setItemRecycling(true);
    mListView->setUniformItemSizes(true);
    mListView->setClampingStyle(HbScrollArea::BounceBackClamping);

    // Register the custorm css path.
    HbStyleLoader::registerFilePath(":/hblistviewitem.css");
    //    mListView->setLayoutName("custom");

    // Set list item properties.
    HbListViewItem *prototype = mListView->listItemPrototype();
    prototype->setGraphicsSize(HbListViewItem::SmallIcon);
    prototype->setStretchingStyle(HbListViewItem::StretchLandscape);
    prototype->setSecondaryTextRowCount(1, 1);
    HbFrameBackground frame(LIST_ITEM_FRAME, HbFrameDrawer::NinePieces);
    prototype->setDefaultFrame(frame);

    // Create and set model
    QSortFilterProxyModel *proxyModel = new QSortFilterProxyModel(this);
    proxyModel->setDynamicSortFilter(true);
    proxyModel->setSourceModel(ConversationsEngine::instance()->getDraftsModel());
    proxyModel->setSortRole(TimeStamp);
    proxyModel->sort(0, Qt::DescendingOrder);
    mListView->setModel(proxyModel);

    // Short & Long Taps
    connect(mListView, SIGNAL(activated(QModelIndex)), this, SLOT(openDraftMessage(QModelIndex)));
    connect(mListView, SIGNAL(longPressed(HbAbstractViewItem*,QPointF)), this,
        SLOT(handleLongPressed(HbAbstractViewItem*,QPointF)));

    // Add all widgets to main layout.
    mainLayout->addItem(viewHeading);
    mainLayout->addItem(mListView);

    this->setLayout(mainLayout);
}

//------------------------------------------------------------------------------
// DraftsListView::openDraftMessage
// @see header
//------------------------------------------------------------------------------
void DraftsListView::openDraftMessage()
{
    openDraftMessage(mListView->currentIndex());
}

//------------------------------------------------------------------------------
// DraftsListView::deleteDraftMessage
// @see header
//------------------------------------------------------------------------------
void DraftsListView::deleteDraftMessage()
{
    int msgId = mListView->currentIndex().data(ConvergedMsgId).toInt();
    QList<int> msgIdList;
    msgIdList.append(msgId);
    ConversationsEngine::instance()->deleteMessages(msgIdList);
}

//------------------------------------------------------------------------------
// DraftsListView::createNewMessage
// @see header
//------------------------------------------------------------------------------
void DraftsListView::createNewMessage()
{
    QVariantList param;
    param << MsgBaseView::UNIEDITOR; // target view
    param << MsgBaseView::DLV; // source view

    emit switchView(param);
}

//------------------------------------------------------------------------------
// DraftsListView::openDraftMessage
// @see header
//------------------------------------------------------------------------------
void DraftsListView::openDraftMessage(const QModelIndex &index)
{
    QVariant msgId = index.data(ConvergedMsgId);
    QVariant msgType = index.data(MessageType);
    ConvergedMessageId convergedMsgId = ConvergedMessageId(msgId.toInt());
    ConvergedMessage message;
    message.setMessageType((ConvergedMessage::MessageType) msgType.toInt());
    message.setMessageId(convergedMsgId);

    // Launch uni-editor view
    QByteArray dataArray;
    QDataStream messageStream(&dataArray, QIODevice::WriteOnly | QIODevice::Append);
    message.serialize(messageStream);

    QVariantList params;
    params << MsgBaseView::UNIEDITOR; // target view
    params << MsgBaseView::DLV; // source view

    params << dataArray;
    emit switchView(params);
}

//------------------------------------------------------------------------------
// DraftsListView::handleLongPressed
// @see header
//------------------------------------------------------------------------------
void DraftsListView::handleLongPressed(HbAbstractViewItem *item, const QPointF &coords)
{
    if (this->isVisible()) {

        // Set the current index as tapped items index.
        mListView->setCurrentIndex(item->modelIndex(), QItemSelectionModel::Select);

        HbMenu *contextMenu = new HbMenu();

        // Open
        HbAction* openAction = contextMenu->addAction(LOC_COMMON_OPEN);
        connect(openAction, SIGNAL(triggered()), this, SLOT(openDraftMessage()));

        // Delete
        HbAction *deletAction = contextMenu->addAction(LOC_COMMON_DELETE);
        connect(deletAction, SIGNAL(triggered()), this, SLOT(deleteDraftMessage()));

        contextMenu->exec(coords);
        delete contextMenu;
    }
}

//------------------------------------------------------------------------------
// DraftsListView::handleViewExtnActivated
// @see header
//------------------------------------------------------------------------------
void DraftsListView::handleViewExtnActivated(HbListWidgetItem *item)
{
    int row = mViewExtnList->row(item);
    if (CONVERSATIONS_EXTN == row) {
        QVariantList param;
        param << MsgBaseView::CLV; // target view
        param << MsgBaseView::DLV; // source view

        emit switchView(param);
    }
}

// EOF