diff -r fa1df4b99609 -r ebe688cedc25 messagingapp/msgui/msgapp/src/msglistview.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/messagingapp/msgui/msgapp/src/msglistview.cpp Tue Aug 31 15:11:31 2010 +0300 @@ -0,0 +1,460 @@ +/* + * 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:Message List View for the messaging application. + * + */ + +#include "msglistview.h" + +// SYSTEM INCLUDES +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// USER INCLUDES +#include "msgconversationviewinterface.h" +#include "debugtraces.h" +#include "conversationsengine.h" +#include "conversationsenginedefines.h" +#include "convergedmessage.h" +#include "msglistviewitem.h" + +QTM_USE_NAMESPACE + +//Icons +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"); + +//Localized constants + +#define LOC_DIALOG_DELETE_CONVERSATION hbTrId("txt_messaging_dialog_delete_conversation") + +//itemspecific menu +#define LOC_OPEN hbTrId("txt_common_menu_open") +#define LOC_SAVETO_CONTACTS hbTrId("txt_messaging_menu_save_to_contacts") +#define LOC_DELETE_CONVERSATION hbTrId("txt_messaging_menu_delete_conversation") +#define LOC_OPEN_CONTACT_INFO hbTrId("txt_messaging_menu_contact_info") + +//main menu +#define LOC_SETTINGS hbTrId("txt_messaging_opt_settings") + +#define LOC_TB_VIEW_EXTN hbTrId("txt_messaging_button_view") +#define LOC_TB_EXTN_DRAFTS hbTrId("txt_messaging_button_drafts") +#define LOC_TB_EXTN_CONVERSATIONS hbTrId("txt_messaging_button_conversations") + +#define LOC_VIEW_HEADING hbTrId("txt_messaging_title_conversations") + +//--------------------------------------------------------------- +// MsgListView::MsgListView +// @see header +//--------------------------------------------------------------- +MsgListView::MsgListView(QGraphicsItem *parent) : + MsgBaseView(parent) + { + //These changes are needed for splash implementation to avoid flicker + setupToolBar(); + setupMenu(); + + // Create parent layout. + mMainLayout = new QGraphicsLinearLayout(Qt::Vertical); + mMainLayout->setContentsMargins(0, 0, 0, 0); + mMainLayout->setSpacing(0); + + // Create view heading. + HbGroupBox *viewHeading = new HbGroupBox(); + viewHeading->setHeading(LOC_VIEW_HEADING); + + // Add view heading widget to main layout. + mMainLayout->addItem(viewHeading); + + this->setLayout(mMainLayout); + + connect(this->mainWindow(), SIGNAL(viewReady()), this, + SLOT(doDelayedConstruction())); + } + +//--------------------------------------------------------------- +// MsgListView::~MsgListView +// @see header +//--------------------------------------------------------------- +MsgListView::~MsgListView() +{ + +} + +//--------------------------------------------------------------- +// MsgListView::longPressed +// @see header +//--------------------------------------------------------------- +void MsgListView::longPressed(HbAbstractViewItem* viewItem, const QPointF& point) +{ + if (this->isVisible()) { + // Set the current index as the present Item's index. + // By default it will not be set. + mMsgList->setCurrentIndex(viewItem->modelIndex(), QItemSelectionModel::Select); + + // Create new menu + HbMenu *contextMenu = new HbMenu(); + contextMenu->setAttribute(Qt::WA_DeleteOnClose); + //open menu option + contextMenu->addAction(LOC_OPEN,this,SLOT(openConversation())); + + //save to contacts for unresolved. + int msgType = viewItem->modelIndex().data(MessageType).toInt(); + if(msgType == ConvergedMessage::Sms || + msgType == ConvergedMessage::Mms || + msgType == ConvergedMessage::BioMsg) + { + qint64 contactId = mMsgList->currentIndex().data(ContactId).toLongLong(); + if(contactId < 0) + { + contextMenu->addAction(LOC_SAVETO_CONTACTS,this,SLOT(saveToContacts())); + } + else + { + contextMenu->addAction(LOC_OPEN_CONTACT_INFO,this,SLOT(contactInfo())); + } + } + + //delete conversation + contextMenu->addAction(LOC_DELETE_CONVERSATION,this,SLOT(deleteItem())); + + contextMenu->setPreferredPos(point); + contextMenu->show(); + } +} + +//--------------------------------------------------------------- +// MsgListView::openConversation +// @see header +//--------------------------------------------------------------- +void MsgListView::openConversation(const QModelIndex& index) +{ + //TODO: model populating possibilities. + if (index.isValid()) { + QVariant conversationId = index.data(ConversationId); + + // Launch conversation view + QVariantList param; + param << MsgBaseView::CV; // target view + param << MsgBaseView::CLV; // source view + + param << conversationId; + + emit switchView(param); + } +} + +//--------------------------------------------------------------- +// MsgListView::sendNewMessage +// @see header +//--------------------------------------------------------------- +void MsgListView::sendNewMessage() +{ + QVariantList param; + param << MsgBaseView::UNIEDITOR; // target view + param << MsgBaseView::CLV; // source view + + emit switchView(param); +} + +//--------------------------------------------------------------- +// MsgListView::settings +// @see header +//--------------------------------------------------------------- +void MsgListView::settings() +{ + // Launch message settings + QVariantList param; + param << MsgBaseView::MSGSETTINGS; + param << MsgBaseView::CLV; + emit switchView(param); +} + +//--------------------------------------------------------------- +// MsgListView::openConversation +// @see header +//--------------------------------------------------------------- +void MsgListView::openConversation() +{ + QModelIndex modelIndex = mMsgList->currentIndex(); + openConversation(modelIndex); +} + +//--------------------------------------------------------------- +// MsgListView::showContact +// @see header +//--------------------------------------------------------------- +void MsgListView::showContact() +{ +} + +//--------------------------------------------------------------- +// MsgListView::deleteItem +// @see header +//--------------------------------------------------------------- +void MsgListView::deleteItem() +{ +#ifdef _DEBUG_TRACES_ + qDebug() << "Inside MsgListView::deleteItem"; +#endif + //confirmation dialog. + HbMessageBox::question(LOC_DIALOG_DELETE_CONVERSATION, + this,SLOT(onDialogDeleteMsg(HbAction*)), + HbMessageBox::Delete | HbMessageBox::Cancel); +#ifdef _DEBUG_TRACES_ + qDebug() << " Leaving MsgConversationView::deleteItem"; +#endif +} + +//--------------------------------------------------------------- +// MsgListView::setupView +// @see header +//--------------------------------------------------------------- +void MsgListView::setupListView() + { + // Register the custorm css path. + HbStyleLoader::registerFilePath(":/clv"); + + mMsgList = new HbListView(this); + mMsgList->setScrollingStyle(HbScrollArea::PanOrFlick); + mMsgList->setClampingStyle(HbScrollArea::BounceBackClamping); + + mMsgList->setLayoutName("custom"); + mMsgList->setItemRecycling(true); + mMsgList->setUniformItemSizes(true); + + MsgListViewItem *prototype = new MsgListViewItem(this); + mMsgList->setItemPrototype(prototype); + mMsgList->setModel(ConversationsEngine::instance()->getConversationsSummaryModel()); + + // Single tap list item + connect(mMsgList, SIGNAL(activated(const QModelIndex&)), this, + SLOT(openConversation(const QModelIndex&))); + + // Long tap list item + connect(mMsgList, + SIGNAL(longPressed(HbAbstractViewItem*, const QPointF&)), this, + SLOT(longPressed(HbAbstractViewItem*, const QPointF&))); + + // enable tap after delete is completed + connect(ConversationsEngine::instance(), + SIGNAL(conversationListEntryDeleted( int )), this, + SLOT(enableListitem( int ))); + + // Add list view to main layout. + mMainLayout->addItem(mMsgList); + } + +//--------------------------------------------------------------- +// MsgListView::addMenu +// @see header +//--------------------------------------------------------------- +void MsgListView::setupMenu() +{ + // Main menu + HbMenu* mainMenu = this->menu(); + mainMenu->addAction(LOC_SETTINGS,this,SLOT(settings())); +} + +//--------------------------------------------------------------- +// MsgListView::setupToolBar +// @see header +//--------------------------------------------------------------- +void MsgListView::setupToolBar() +{ + // ToolBar + HbToolBar *toolBar = this->toolBar(); + toolBar->setOrientation(Qt::Horizontal); + + // Create & setup ToolBar Extension + HbToolBarExtension *viewExtn = new HbToolBarExtension(); + HbAction *viewAction = toolBar->addExtension(viewExtn); + viewAction->setIcon(HbIcon(SORT_ICON)); + + mViewExtnList = new HbListWidget(); + mViewExtnList->setSizePolicy(QSizePolicy::Preferred,QSizePolicy::Fixed); + 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. + toolBar->addAction(HbIcon(NEW_MESSAGE_ICON),"",this,SLOT(sendNewMessage())); +} + +//--------------------------------------------------------------- +// MsgListView::handleViewExtnActivated +// @see header +//--------------------------------------------------------------- +void MsgListView::handleViewExtnActivated(HbListWidgetItem *item) +{ + int row = mViewExtnList->row(item); + if (DRAFTS_EXTN == row) { + QVariantList param; + param << MsgBaseView::DLV; // target view + param << MsgBaseView::CLV; // source view + + emit switchView(param); + } +} + +//--------------------------------------------------------------- +// MsgListView::doDelayedConstruction +// @see header +//--------------------------------------------------------------- +void MsgListView::doDelayedConstruction() + { + setupListView(); + + disconnect(this->mainWindow(),SIGNAL(viewReady()),this,SLOT(doDelayedConstruction())); + } + +//--------------------------------------------------------------- +// MsgListView::saveToContacts +// @see header +//--------------------------------------------------------------- +void MsgListView::saveToContacts() + { + //save to contacts with phone number field prefilled. + QList args; + + QString data = mMsgList->currentIndex().data(DisplayName).toString(); + + QString type = QContactPhoneNumber::DefinitionName; + + args << type; + args << data; + + //service stuff. + QString serviceName("com.nokia.services.phonebookservices"); + QString operation("editCreateNew(QString,QString)"); + + XQAiwRequest* request; + XQApplicationManager appManager; + request = appManager.create(serviceName, "Fetch", operation, true); // embedded + if ( request == NULL ) + { + return; + } + + request->setArguments(args); + request->send(); + + delete request; + } + +//--------------------------------------------------------------- +// MsgListView::contactInfo +// @see header +//--------------------------------------------------------------- +void MsgListView::contactInfo() + { + //open contact info. + QList args; + + int contactId = mMsgList->currentIndex().data(ContactId).toInt(); + + args << contactId; + + //service stuff. + QString serviceName("com.nokia.services.phonebookservices"); + QString operation("open(int)"); + + XQAiwRequest* request; + XQApplicationManager appManager; + request = appManager.create(serviceName, "Fetch", operation, true); // embedded + if ( request == NULL ) + { + return; + } + + request->setArguments(args); + request->send(); + + delete request; + } + +//--------------------------------------------------------------- +// MsgListView::onDialogDeleteMsg +// @see header +//--------------------------------------------------------------- +void MsgListView::onDialogDeleteMsg(HbAction* action) + { + HbMessageBox *dlg = qobject_cast (sender()); + if (action == dlg->actions().at(0)) + { + QModelIndex index = mMsgList->currentIndex(); + if (index.isValid()) + { + HbAbstractViewItem *item = mMsgList->currentViewItem(); + item->ungrabGesture(Qt::TapGesture); + qint64 conversationId = index.data(ConversationId).toLongLong(); + + ConversationsEngine::instance()->deleteConversations( + conversationId); + + } + + } + } + +//--------------------------------------------------------------- +// MsgListView::enableListitem +// @see header +//--------------------------------------------------------------- +void MsgListView::enableListitem(int conversationId) + { + QAbstractItemModel* proxyModel = mMsgList->model(); + QModelIndexList indexList = proxyModel->match(proxyModel->index(0, 0), + ConversationId, conversationId, 1, Qt::MatchExactly); + HbAbstractViewItem* item = NULL; + int count = indexList.count(); + // only item is expected to be the result of the above match function + if (1 == count) + { + item = mMsgList->itemByIndex(indexList[0]); + if (item) + { + item->grabGesture(Qt::TapGesture); + } + } + + } + +//EOF