diff -r d4f567ce2e7c -r 5b6f26637ad3 phonebookui/pbkcommonui/src/cntfavoritesmemberview.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/pbkcommonui/src/cntfavoritesmemberview.cpp Tue Aug 31 15:05:21 2010 +0300 @@ -0,0 +1,318 @@ +/* +* 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: +* +*/ + +#include "cntfavoritesmemberview.h" +#include "cntfetchcontactpopup.h" +#include "cntglobal.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +const char *CNT_FAVORITESMEMBERVIEW_XML = ":/xml/contacts_favmember.docml"; + +CntFavoritesMemberView::CntFavoritesMemberView() : + mContact(NULL), + mModel(NULL), + mFavoriteListView(NULL), + mViewManager(NULL) +{ + bool ok = false; + mDocumentLoader.load(CNT_FAVORITESMEMBERVIEW_XML, &ok); + + if (ok) + { + mView = static_cast(mDocumentLoader.findWidget(QString("view"))); + } + else + { + qFatal("Unable to read :/xml/contacts_favmember.docml"); + } + + //back button + mSoftkey = new HbAction(Hb::BackNaviAction, mView); + connect(mSoftkey, SIGNAL(triggered()), this, SLOT(showPreviousView())); + + // menu actions + mManageFavoritesAction = static_cast(mDocumentLoader.findObject("cnt:manageFavorite")); + connect(mManageFavoritesAction, SIGNAL(triggered()), this, SLOT(manageFavorites())); +} + +/*! +Destructor +*/ +CntFavoritesMemberView::~CntFavoritesMemberView() +{ + mView->deleteLater(); + + delete mManageFavoritesAction; + mManageFavoritesAction = 0; + + delete mContact; + mContact = 0; + + delete mModel; + mModel = 0; +} + +void CntFavoritesMemberView::showPreviousView() +{ + CntViewParameters viewParameters; + mViewManager->back(viewParameters); +} + +void CntFavoritesMemberView::activate( const CntViewParameters aArgs ) +{ + if (mView->navigationAction() != mSoftkey) + mView->setNavigationAction(mSoftkey); + + mContact = new QContact(aArgs.value(ESelectedGroupContact).value()); + mViewManager = &mEngine->viewManager(); + + mFavoriteListView = static_cast (mDocumentLoader.findWidget("listView")); + mFavoriteListView->setUniformItemSizes(true); + mFavoriteListView->setFrictionEnabled(true); + mFavoriteListView->setScrollingStyle(HbScrollArea::PanWithFollowOn); + mFavoriteListView->verticalScrollBar()->setInteractive(true); + connect(mFavoriteListView, SIGNAL(longPressed(HbAbstractViewItem *, const QPointF &)), + this, SLOT(onLongPressed(HbAbstractViewItem *, const QPointF &))); + + HbIndexFeedback *indexFeedback = new HbIndexFeedback(mView); + indexFeedback->setIndexFeedbackPolicy(HbIndexFeedback::IndexFeedbackSingleCharacter); + indexFeedback->setItemView(mFavoriteListView); + + HbFrameBackground frame; + frame.setFrameGraphicsName("qtg_fr_list_normal"); + frame.setFrameType(HbFrameDrawer::NinePieces); + + HbListViewItem* prototype = mFavoriteListView->listItemPrototype(); + prototype->setDefaultFrame( frame ); + prototype->setStretchingStyle(HbListViewItem::StretchLandscape); + prototype->setGraphicsSize(HbListViewItem::Thumbnail); + + if (!mModel) + { + createModel(); + } + + connect(mFavoriteListView, SIGNAL(activated (const QModelIndex&)), this, + SLOT(openContact(const QModelIndex&))); +} + +void CntFavoritesMemberView::deactivate() +{ + +} + +void CntFavoritesMemberView::manageFavorites() +{ + QContactRelationshipFilter membersFilter; + membersFilter.setRelationshipType(QContactRelationship::HasMember); + membersFilter.setRelatedContactRole(QContactRelationship::First); + membersFilter.setRelatedContactId(mContact->id()); + mOriginalGroupMembers = getContactManager()->contactIds(membersFilter).toSet(); + + CntFetchContactPopup* popup = CntFetchContactPopup::createMultiSelectionPopup( + hbTrId("txt_phob_subtitle_favorites"), + hbTrId("txt_common_button_save"), + *getContactManager()); + connect( popup, SIGNAL(fetchReady(QSet)), this, SLOT(handleManageFavorites(QSet)) ); + popup->setSelectedContacts( mOriginalGroupMembers ); + popup->showPopup(); +} + +void CntFavoritesMemberView::handleManageFavorites(QSet aIds) +{ + for (int i = 0; i < 2; ++i) { + // first iteration processes added members, second removed members + QSet members = (i == 0 ? aIds - mOriginalGroupMembers + : mOriginalGroupMembers - aIds); + QList memberships; + + foreach (QContactLocalId id, members) { + QContactId contactId; + contactId.setLocalId(id); + QContactRelationship membership; + membership.setRelationshipType(QContactRelationship::HasMember); + membership.setFirst(mContact->id()); + membership.setSecond(contactId); + memberships.append(membership); + } + + if (!memberships.isEmpty()) { + if (i == 0) { + getContactManager()->saveRelationships(&memberships, NULL); + } + else { + getContactManager()->removeRelationships(memberships, NULL); + } + } + } +} + +void CntFavoritesMemberView::createModel() +{ + QContactRelationshipFilter rFilter; + rFilter.setRelationshipType(QContactRelationship::HasMember); + rFilter.setRelatedContactRole(QContactRelationship::First); + rFilter.setRelatedContactId(mContact->id()); + + mModel = new CntListModel( getContactManager(), rFilter, false); + mFavoriteListView->setModel(mModel); +} + +/*! +Called when a list item is longpressed +*/ +void CntFavoritesMemberView::onLongPressed(HbAbstractViewItem *aItem, const QPointF &aCoords) +{ + QVariant data(aItem->modelIndex().row()); + + QModelIndex index = aItem->modelIndex(); + QVariant variant = index.data(Qt::UserRole+1); + const QMap map = variant.toMap(); + + HbMenu *menu = new HbMenu(); + menu->setAttribute(Qt::WA_DeleteOnClose); + menu->setPreferredPos( aCoords ); + + HbAction *openContactAction = 0; + HbAction *editContactAction = 0; + HbAction *removeFromFavoritesAction = 0; + HbAction *sendToHsAction = 0; + + QString action = map.value("action").toString(); + + openContactAction = menu->addAction(hbTrId("txt_common_menu_open")); + editContactAction = menu->addAction(hbTrId("txt_common_menu_edit")); + removeFromFavoritesAction = menu->addAction(hbTrId("txt_phob_menu_remove_from_favorites")); + sendToHsAction = menu->addAction(hbTrId("txt_phob_menu_send_to_homescreen")); + + openContactAction->setData( data ); + editContactAction->setData( data ); + removeFromFavoritesAction->setData( data ); + sendToHsAction->setData( data ); + + menu->open(this, SLOT(handleMenu(HbAction*))); +} + +void CntFavoritesMemberView::handleMenu(HbAction* action) +{ + int row = action->data().toInt(); + HbMenu *menuItem = static_cast(sender()); + QModelIndex index = mModel->index(row, 0); + + int id = index.data(Qt::UserRole).toInt(); + + if ( action == menuItem->actions().first() ) + { + openContact(index); + } + else if (action == menuItem->actions().at(1)) + { + editContact(index); + } + else if (action == menuItem->actions().at(2)) + { + removeFromFavorites(index); + } + else if (action == menuItem->actions().at(3)) + { + sendToHs(index); + } +} + +void CntFavoritesMemberView::openContact(const QModelIndex &index) +{ + QContact selectedContact = mModel->contact(index); + + CntViewParameters viewParameters; + viewParameters.insert(EViewId, contactCardView); + QVariant var; + var.setValue(selectedContact); + viewParameters.insert(ESelectedContact, var); + QVariant varGroup; + varGroup.setValue(*mContact); + viewParameters.insert(ESelectedGroupContact, varGroup); + mViewManager->changeView(viewParameters); +} + +void CntFavoritesMemberView::editContact(const QModelIndex &index) +{ + QContact selectedContact = mModel->contact(index); + + CntViewParameters viewParameters; + viewParameters.insert(EViewId, editView); + QVariant var; + var.setValue(selectedContact); + viewParameters.insert(ESelectedContact, var); + QVariant varGroup; + varGroup.setValue(*mContact); + viewParameters.insert(ESelectedGroupContact, varGroup); + mViewManager->changeView(viewParameters); +} + +/*! +Called after user clicked on the listview. +*/ +void CntFavoritesMemberView::removeFromFavorites(const QModelIndex &index) +{ + // get contact id using index + QContact selectedContact = mModel->contact(index); + QContactRelationship relationship; + relationship.setRelationshipType(QContactRelationship::HasMember); + relationship.setFirst(mContact->id()); + relationship.setSecond(selectedContact.id()); + getContactManager()->removeRelationship(relationship); +} + +QContactManager* CntFavoritesMemberView::getContactManager() +{ + if (!mViewManager) { + return NULL; + } + + return &mEngine->contactManager(SYMBIAN_BACKEND); +} + +/*! +Called after user clicked on the listview. +*/ +void CntFavoritesMemberView::sendToHs(const QModelIndex &index) +{ + QVariantHash preferences; + preferences["contactId"] = mModel->contact(index).id().localId(); + + XQServiceRequest snd("com.nokia.symbian.IHomeScreenClient", + "addWidget(QString,QVariantHash)", + false); + snd << QString("contactwidgethsplugin"); + snd << preferences; + snd.send(); +} +