diff -r 59984e68247d -r 6abfb1094884 phonebookui/cntcommonui/views/cntactionmenubuilder.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/cntcommonui/views/cntactionmenubuilder.cpp Tue Sep 21 17:07:25 2010 +0300 @@ -0,0 +1,226 @@ +/* +* 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 "cntactionmenubuilder.h" +#include +#include "cntstringmapper.h" +#include +#include "cntactionpopup.h" + +CntActionMenuBuilder::CntActionMenuBuilder( QContactLocalId aMyCardId ) : +QObject(), +iMyCardId( aMyCardId ), +mContact( 0 ), +mMap( 0 ) + { + mMap = new CntStringMapper(); + } + +CntActionMenuBuilder::~CntActionMenuBuilder() +{ + delete mMap; + mMap = 0; + + delete mContact; + mContact = 0; +} + +HbMenu* CntActionMenuBuilder::buildActionMenu( QContact& aContact ) +{ + HbMenu* menu = new HbMenu(); + + // Regular contact, NOT MyCard + if ( aContact.localId() != iMyCardId ) + { + QList actionDescriptors = aContact.availableActions(); + QStringList actions; + foreach ( QContactActionDescriptor d, aContact.availableActions() ) + { + actions << d.actionName(); + } + + if ( actions.contains("call", Qt::CaseInsensitive) && isSupportedDetails("call", aContact)) + { + createCallAction( *menu, aContact ); + } + + if ( actions.contains("message", Qt::CaseInsensitive) && isSupportedDetails("message", aContact) ) + { + createMessageAction( *menu, aContact ); + } + + if ( actions.contains("email", Qt::CaseInsensitive) ) + { + createEmailAction( *menu, aContact ); + } + + if ( menu->actions().size() > 0 ) + menu->addSeparator(); + } + + // If contact is NOT MyCard OR MyCard is not empty (detail count is more than 4) + if ( aContact.localId() != iMyCardId || aContact.details().size() > 4 ) + { + menu->addAction(hbTrId("txt_common_menu_open"), this, SLOT(emitOpenContact()) ); + menu->addAction(hbTrId("txt_common_menu_edit"), this, SLOT(emitEditContact()) ); + menu->addAction(hbTrId("txt_phob_menu_delete_contact"), this, SLOT(emitDeleteContact())); + } + return menu; +} + +HbMenu* CntActionMenuBuilder::actionMenu( QContact& aContact, QContactLocalId myCardId) +{ + iMyCardId = myCardId; + mContact = new QContact( aContact ); + return buildActionMenu( aContact ); +} + +void CntActionMenuBuilder::emitOpenContact() +{ + emit openContact( *mContact ); +} + +void CntActionMenuBuilder::emitEditContact() +{ + emit editContact( *mContact ); +} + +void CntActionMenuBuilder::emitDeleteContact() +{ + emit deleteContact( *mContact ); +} + +void CntActionMenuBuilder::emitCallContact() +{ + QContactDetail detail = mContact->preferredDetail("call"); + if (!detail.isEmpty()) + { + emit performContactAction( *mContact, detail, "call" ); + } + else if (mContact->details().count() == 1 ) + { + mContact->setPreferredDetail("call", mContact->details().first()); + emit performContactAction(*mContact, mContact->details().first(), "call"); + } + else + { + CntActionPopup *actionPopup = new CntActionPopup(mContact); + actionPopup->showActionPopup("call"); + connect( actionPopup, SIGNAL(executeContactAction(QContact&, QContactDetail, QString)), this, + SLOT(emitContactaction(QContact&,QContactDetail, QString))); + } +} + +void CntActionMenuBuilder::emitSmsContact() +{ + QContactDetail detail = mContact->preferredDetail("message"); + if (!detail.isEmpty()) + { + emit performContactAction( *mContact, detail, "message" ); + } + else if (mContact->details().count() == 1 ) + { + mContact->setPreferredDetail("message", mContact->details().first()); + emit performContactAction(*mContact, mContact->details().first(), "message"); + } + else + { + CntActionPopup *actionPopup = new CntActionPopup(mContact); + actionPopup->showActionPopup("message"); + connect( actionPopup, SIGNAL(executeContactAction(QContact&, QContactDetail, QString)), this, + SLOT(emitContactaction(QContact&,QContactDetail, QString))); + } +} + +void CntActionMenuBuilder::emitMailContact() +{ + QContactDetail detail = mContact->preferredDetail("email"); + if (!detail.isEmpty()) + { + emit performContactAction( *mContact,detail, "email" ); + } + else if (mContact->details().count() == 1 ) + { + mContact->setPreferredDetail("email", mContact->details().first()); + emit performContactAction(*mContact, mContact->details().first(), "email"); + } + else + { + CntActionPopup *actionPopup = new CntActionPopup(mContact); + actionPopup->showActionPopup("email"); + connect( actionPopup, SIGNAL(executeContactAction(QContact&, QContactDetail, QString)), this, + SLOT(emitContactaction(QContact&,QContactDetail, QString))); + } +} + +void CntActionMenuBuilder::emitContactaction(QContact& aContact,QContactDetail contactDetail, QString aAction) +{ + emit performContactAction( aContact,contactDetail, aAction); +} + +void CntActionMenuBuilder::createCallAction( HbMenu& aMenu, QContact& aContact ) +{ + // Create call action + QContactDetail detail = aContact.preferredDetail("call"); + QContactPhoneNumber number = detail.isEmpty() ? aContact.detail() : detail; + QString context = number.contexts().isEmpty() ? QString() : number.contexts().first(); + QString subtype = number.subTypes().isEmpty() ? number.definitionName() : number.subTypes().first(); + + aMenu.addAction( mMap->getItemSpecificMenuLocString( subtype, context ), this, SLOT(emitCallContact()) ); +} + +void CntActionMenuBuilder::createEmailAction( HbMenu& aMenu, QContact& aContact ) +{ + // Create email action + QContactDetail detail = aContact.preferredDetail("email"); + QContactEmailAddress email = detail.isEmpty() ? aContact.detail() : detail; + QString context = email.contexts().isEmpty() ? QString() : email.contexts().first(); + + aMenu.addAction( mMap->getItemSpecificMenuLocString( email.definitionName(), context), this, SLOT(emitMailContact()) ); +} + +void CntActionMenuBuilder::createMessageAction( HbMenu& aMenu, QContact& aContact ) +{ + Q_UNUSED( aContact ); + + aMenu.addAction(hbTrId("txt_phob_menu_send_message"), this, SLOT(emitSmsContact())); +} + +bool CntActionMenuBuilder::isSupportedDetails( const QString &actionName, const QContact &contact ) +{ + QList actionDescriptors = QContactAction::actionDescriptors(actionName, "symbian"); + if (actionDescriptors.isEmpty()) + { + return false; + } + + QContactAction* contactAction = QContactAction::action(actionDescriptors.first()); + QList details = contactAction->supportedDetails(contact); + + delete contactAction; + + for (int i = 0; i < details.count(); i++) + { + if (contact.details().contains(details[i])) + { + return true; + } + } + + return false; +} + +// End of File