--- /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 <hbmenu.h>
+#include <hbaction.h>
+#include <hbtoolbar.h>
+#include <hbtoolbarextension.h>
+#include <hblistview.h>
+#include <hblistwidget.h>
+#include <hblistwidgetitem.h>
+#include <hbgroupbox.h>
+#include <hbmessagebox.h>
+#include <hbframebackground.h>
+#include <QSortFilterProxyModel>
+#include <QGraphicsLinearLayout>
+#include <hblistviewitem.h>
+#include <HbStyleLoader>
+#include <HbMainWindow>
+#include <xqaiwrequest.h>
+#include <xqappmgr.h>
+#include <qtcontacts.h>
+
+// 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<QVariant> 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<QVariant> 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<HbMessageBox*> (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