diff -r 6a20128ce557 -r ebfee66fde93 messagingapp/msgui/msgapp/src/draftslistview.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/messagingapp/msgui/msgapp/src/draftslistview.cpp Fri Jun 04 10:25:39 2010 +0100 @@ -0,0 +1,388 @@ +/* + * 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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +// USER INCLUDES +#include "conversationsengine.h" +#include "conversationsenginedefines.h" +#include "convergedmessage.h" +#include "convergedmessageid.h" + +// LOCAL CONSTANTS +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 + +// Long Tap +#define LOC_COMMON_OPEN hbTrId("txt_common_menu_open") +#define LOC_COMMON_DELETE hbTrId("txt_common_menu_delete") + +// View heading +#define LOC_DLV_HEADING hbTrId("txt_messaging_title_drafts") + +// Menu items +#define LOC_MENU_DELETE_ALL hbTrId("txt_messaging_opt_delete_all") + +// Toolbar & toolbar exension +#define LOC_TB_EXTN_DRAFTS hbTrId("txt_messaging_button_drafts") +#define LOC_TB_EXTN_CONVERSATIONS hbTrId("txt_messaging_button_conversations") + +// Confirmation note +#define LOC_DELETE_MESSAGE hbTrId("txt_messaging_dialog_delete_message") +#define LOC_DELETE_ALL_DRAFTS hbTrId("txt_messaging_dialog_delate_all_drafts") +#define LOC_BUTTON_DELETE hbTrId("txt_common_button_delete") +#define LOC_BUTTON_CANCEL hbTrId("txt_common_button_cancel") + +//--------------------------------------------------------------- +// DraftsListView::DraftsListView +// @see header +//--------------------------------------------------------------- +DraftsListView::DraftsListView(QGraphicsItem *parent) : + MsgBaseView(parent), + mListView(0), + mViewExtnList(0), + mToolBar(0), + mItemLongPressed(false) +{ + // Delayed loading. + connect(this->mainWindow(), SIGNAL(viewReady()), this, SLOT(doDelayedLoading())); +} + +//--------------------------------------------------------------- +// DraftsListView::~DraftsListView +// @see header +//--------------------------------------------------------------- +DraftsListView::~DraftsListView() +{ +} + +//--------------------------------------------------------------- +// DraftsListView::setupMenu +// @see header +//--------------------------------------------------------------- +void DraftsListView::setupMenu() +{ + QAbstractItemModel *model = mListView->model(); + + // Menu items are added/removed based on the item count. + connect(mListView->model(), SIGNAL(rowsInserted(QModelIndex, int, int)), this, + SLOT(handleModelChanged()), Qt::UniqueConnection); + connect(mListView->model(), SIGNAL(rowsRemoved(QModelIndex, int, int)), this, + SLOT(handleModelChanged()), Qt::UniqueConnection); +} + +//--------------------------------------------------------------- +// DraftsListView::setupToolbar +// @see header +//--------------------------------------------------------------- +void DraftsListView::setupToolbar() +{ + if (!mToolBar) { + mToolBar = this->toolBar(); + mToolBar->setOrientation(Qt::Horizontal); + + // Create & setup ToolBar Extension + HbToolBarExtension *viewExtn = new HbToolBarExtension(); + HbAction *viewAction = mToolBar->addExtension(viewExtn); + viewAction->setIcon(HbIcon(SORT_ICON)); + + mViewExtnList = new HbListWidget(); + mViewExtnList->addItem(LOC_TB_EXTN_DRAFTS); + mViewExtnList->addItem(LOC_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(released(HbListWidgetItem*)), viewExtn, SLOT(close())); + + viewExtn->setContentWidget(mViewExtnList); + + // Create & setup 2nd ToolBar button. + mToolBar->addAction(HbIcon(NEW_MESSAGE_ICON), "", this, SLOT(createNewMessage())); + } +} + +//--------------------------------------------------------------- +// DraftsListView::setupListView +// @see header +//--------------------------------------------------------------- +void DraftsListView::setupListView() +{ + if (!mListView) { + // 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->setHeading(LOC_DLV_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(":/dlv"); + // mListView->setLayoutName("custom"); + + // Set list item properties. + HbListViewItem *prototype = mListView->listItemPrototype(); + prototype->setGraphicsSize(HbListViewItem::SmallIcon); + prototype->setStretchingStyle(HbListViewItem::StretchLandscape); + prototype->setSecondaryTextRowCount(1, 1); + + // 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::doDelayedLoading +// @see header +//------------------------------------------------------------------------------ +void DraftsListView::doDelayedLoading() +{ + setupToolbar(); + setupListView(); + setupMenu(); + disconnect(this->mainWindow(), SIGNAL(viewReady()), this, SLOT(doDelayedLoading())); +} + +//------------------------------------------------------------------------------ +// DraftsListView::openDraftMessage +// @see header +//------------------------------------------------------------------------------ +void DraftsListView::openDraftMessage() +{ + openDraftMessage(mListView->currentIndex()); +} + +//------------------------------------------------------------------------------ +// DraftsListView::deleteDraftMessage +// @see header +//------------------------------------------------------------------------------ +void DraftsListView::deleteDraftMessage() +{ + QModelIndex index = mListView->currentIndex(); + + if (!index.isValid()) { + return; + } + + HbMessageBox::question(LOC_DELETE_MESSAGE, + this,SLOT(onDialogDeleteMsg(HbAction*)), + LOC_BUTTON_DELETE, LOC_BUTTON_CANCEL); + +} + +//------------------------------------------------------------------------------ +// DraftsListView::deleteAllDraftMessage +// @see header +//------------------------------------------------------------------------------ +void DraftsListView::deleteAllDraftMessage() +{ + HbMessageBox::question(LOC_DELETE_ALL_DRAFTS, + this,SLOT(onDialogDeleteAllMessages(HbAction*)), + LOC_BUTTON_DELETE, + LOC_BUTTON_CANCEL); +} + +//------------------------------------------------------------------------------ +// 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) +{ + if(mItemLongPressed) + { + //reset the flag + mItemLongPressed = false; + return; + } + 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) +{ + mItemLongPressed = true; + if (this->isVisible()) { + + // Set the current index as tapped items index. + mListView->setCurrentIndex(item->modelIndex(), QItemSelectionModel::Select); + + HbMenu *contextMenu = new HbMenu(); + contextMenu->setAttribute(Qt::WA_DeleteOnClose); + // 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->setPreferredPos(coords); + contextMenu->show(); + } +} + +//------------------------------------------------------------------------------ +// 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); + } +} + +//------------------------------------------------------------------------------ +// DraftsListView::handleModelChanged +// @see header +//------------------------------------------------------------------------------ +void DraftsListView::handleModelChanged() +{ + // If there are no items in list view, delete the menu item. + HbMenu *mainMenu = this->menu(); + if (!mListView->model()->rowCount()) { + mainMenu->clearActions(); + } + else { + if (this->menu()->isEmpty()) { + mainMenu->addAction(LOC_MENU_DELETE_ALL, this, SLOT(deleteAllDraftMessage())); + } + } +} + +//------------------------------------------------------------------------------ +// DraftsListView::onDialogDeleteMsg +// @see header +//------------------------------------------------------------------------------ +void DraftsListView::onDialogDeleteMsg(HbAction* action) +{ + HbMessageBox *dlg = qobject_cast (sender()); + if (action == dlg->actions().at(0)) { + QModelIndex index = mListView->currentIndex(); + if (index.isValid()) { + int msgId = index.data(ConvergedMsgId).toInt(); + QList msgIdList; + msgIdList.append(msgId); + ConversationsEngine::instance()->deleteMessages(msgIdList); + } + + } +} + +//------------------------------------------------------------------------------ +// DraftsListView::onDialogDeleteMsg +// @see header +//------------------------------------------------------------------------------ +void DraftsListView::onDialogDeleteAllMessages(HbAction* action) +{ + HbMessageBox *dlg = qobject_cast (sender()); + if (action == dlg->actions().at(0)) { + ConversationsEngine::instance()->deleteAllDraftMessages(); + } +} + +// EOF