phonebookui/cntcommonui/views/cntactionmenubuilder.cpp
changeset 75 4ecbe3571b5a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/cntcommonui/views/cntactionmenubuilder.cpp	Mon Oct 04 00:06:02 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 <qcontact.h>
+#include "cntstringmapper.h"
+#include <hbaction.h>
+#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<QContactActionDescriptor> 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<QContactPhoneNumber>().count() == 1 )
+    {
+        mContact->setPreferredDetail("call", mContact->details<QContactPhoneNumber>().first());
+        emit performContactAction(*mContact, mContact->details<QContactPhoneNumber>().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<QContactPhoneNumber>().count() == 1 )
+    {
+        mContact->setPreferredDetail("message", mContact->details<QContactPhoneNumber>().first());
+        emit performContactAction(*mContact, mContact->details<QContactPhoneNumber>().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<QContactEmailAddress>().count() == 1 )
+    {
+        mContact->setPreferredDetail("email", mContact->details<QContactEmailAddress>().first());
+        emit performContactAction(*mContact, mContact->details<QContactEmailAddress>().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<QContactPhoneNumber>() : 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<QContactEmailAddress>() : 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<QContactActionDescriptor> actionDescriptors = QContactAction::actionDescriptors(actionName, "symbian");
+    if (actionDescriptors.isEmpty())
+        {
+        return false;
+        }
+    
+    QContactAction* contactAction = QContactAction::action(actionDescriptors.first()); 
+    QList<QContactDetail> 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