messagingapp/msgui/unifiedviewer/src/univieweraddresswidget.cpp
changeset 76 60a8a215b0ec
parent 62 fdbe8253b596
--- a/messagingapp/msgui/unifiedviewer/src/univieweraddresswidget.cpp	Tue Oct 05 13:58:47 2010 +0530
+++ b/messagingapp/msgui/unifiedviewer/src/univieweraddresswidget.cpp	Tue Oct 19 11:30:16 2010 +0530
@@ -30,10 +30,10 @@
 
 #include <xqservicerequest.h>
 #include <xqappmgr.h>
+#include <xqaiwdecl.h>
+#include <xqaiwrequest.h>
 #include <cntservicescontact.h>
 #include <qtcontacts.h>
-#include <xqservicerequest.h>
-#include <xqaiwrequest.h>
 #include "msgcontacthandler.h"
 
 // LOCAL CONSTANTS
@@ -41,13 +41,14 @@
 const QString ADDRESS_OPEN(" (");
 const QString ADDRESS_CLOSE(")");
 const QString SPACE(" ");
+const QChar AT_SIGN('@');
 
 //localization
 #define LOC_CONTACT_INFO      hbTrId("txt_messaging_menu_contact_info")
 #define LOC_CALL              hbTrId("txt_common_menu_call_verb")
 #define LOC_SEND_MESSAGE      hbTrId("txt_common_menu_send_message")
-#define LOC_SAVE_TO_CONTACTS  hbTrId("txt_common_menu_save_to_contacts")
 #define LOC_COPY              hbTrId("txt_common_menu_copy")
+#define LOC_CREATE_EMAIL      hbTrId("txt_messaging_menu_create_mail")
 
 const QString BG_FRAME_GRAPHICS("qtg_fr_lineedit_normal");
 
@@ -349,6 +350,7 @@
 
     if(!anchor.isEmpty() && !this->textCursor().hasSelection())
     {
+        // Secondary Actions
         populateMenu(contextMenu,anchor);
     }
 }
@@ -357,63 +359,48 @@
 {
     HbAction* action = NULL;
 
-    int contactId = MsgContactHandler::resolveContactDisplayName(
-                                 data, 
-                                 QContactPhoneNumber::DefinitionName,
-                                 QContactPhoneNumber::FieldNumber); 
-    
-    if(contactId > 0)
-    {
+    // Finding if the data is an Email Address
+    QBool isEmail = data.contains(AT_SIGN, Qt::CaseInsensitive);
+
+    if (isEmail) {
+        action = contextMenu->addAction(LOC_CREATE_EMAIL, this, SLOT(createEmail()));
+        action->setData(data);
+
         action = contextMenu->addAction(LOC_CONTACT_INFO, this, SLOT(openContactInfo()));
         action->setData(data);
     }
-    else
-    {
-        action = contextMenu->addAction(LOC_SAVE_TO_CONTACTS, this, SLOT(saveToContacts()));
-        action->setData(data);  
-    }
+    else {
+        action = contextMenu->addAction(LOC_CONTACT_INFO, this, SLOT(openContactInfo()));
+        action->setData(data);
 
-    action = contextMenu->addAction(LOC_CALL, this, SLOT(call()));
-    action->setData(data);
+        action = contextMenu->addAction(LOC_CALL, this, SLOT(call()));
+        action->setData(data);
 
-    action = contextMenu->addAction(LOC_SEND_MESSAGE, this, SLOT(sendMessage()));
-    action->setData(data);
+        action = contextMenu->addAction(LOC_SEND_MESSAGE, this, SLOT(sendMessage()));
+        action->setData(data);
+    }
 
     action = contextMenu->addAction(LOC_COPY, this, SLOT(copyToClipboard()));
     action->setData(data);
-    
-    connect(contextMenu,SIGNAL(aboutToClose()),this,SLOT(menuClosed())); 
+
+    connect(contextMenu, SIGNAL(aboutToClose()), this, SLOT(menuClosed()));
 }
 
 void UniViewerAddressWidget::shortTapAction(QString anchor,const QPointF& pos)
 {
+    Q_UNUSED(pos)
+
+    // Primary Actions
+
     HbAction action;
     action.setData(anchor);
 
-
-    int contactId = MsgContactHandler::resolveContactDisplayName(
-        anchor, 
-        QContactPhoneNumber::DefinitionName,
-        QContactPhoneNumber::FieldNumber);        
-
-    if(contactId > 0 )
-    {
-        //if resolved conatct open contact card 
-        connect(&action,SIGNAL(triggered()),this,SLOT(openContactInfo()));
+    if (anchor.contains(AT_SIGN, Qt::CaseInsensitive)) {
+        // Email address
+        connect(&action, SIGNAL(triggered()), this, SLOT(createEmail()));
     }
-    else
-    {
-        //unresolved contact show popup.  
-        highlightText(true);
-
-        HbMenu* contextMenu = new HbMenu();
-        contextMenu->setDismissPolicy(HbPopup::TapAnywhere);
-        contextMenu->setAttribute(Qt::WA_DeleteOnClose, true);
-        contextMenu->setPreferredPos(pos); 
-
-        populateMenu(contextMenu,anchor);
-        
-        contextMenu->show();
+    else {
+        connect(&action, SIGNAL(triggered()), this, SLOT(openContactInfo()));
     }
 
     action.trigger();
@@ -452,7 +439,10 @@
         connect(serviceRequest, SIGNAL(requestError(int)),
                 this, SLOT(onServiceRequestCompleted()));
         
-        *serviceRequest << phoneNumber;
+        QList<QVariant> args;
+        args << phoneNumber;
+
+        serviceRequest->setArguments(args);
         serviceRequest->send();
     }
 }
@@ -471,63 +461,52 @@
 
 void UniViewerAddressWidget::openContactInfo()
 {
-    HbAction* action = qobject_cast<HbAction*>(sender());
-    
-    if(action)
-    {
-        QString data = action->data().toString();        
-    
-        int contactId = MsgContactHandler::resolveContactDisplayName(
-                data,
-                QContactPhoneNumber::DefinitionName,
-                QContactPhoneNumber::FieldNumber);
+    HbAction* action = qobject_cast<HbAction*> (sender());
+
+    if (action) {
+        QString data = action->data().toString();
+        int contactId = -1;
+        QVariant contactType;
 
-        // if contact is unresolved on phone number field
-        // then, try resolving it on email address field
-        if(contactId <= 0)
-        {
-            contactId = MsgContactHandler::resolveContactDisplayName(
-                data,
-                QContactEmailAddress::DefinitionName,
-                QContactEmailAddress::FieldEmailAddress);
+        if (data.contains(AT_SIGN, Qt::CaseInsensitive)) {
+            // Email address
+            contactId = MsgContactHandler::resolveContactDisplayName(data,
+                QContactEmailAddress::DefinitionName, QContactEmailAddress::FieldEmailAddress);
+            contactType = QContactEmailAddress::DefinitionName;
+        }
+        else {
+            contactId = MsgContactHandler::resolveContactDisplayName(data,
+                QContactPhoneNumber::DefinitionName, QContactPhoneNumber::FieldNumber);
+            contactType = QContactPhoneNumber::DefinitionName;
         }
 
         //service stuff.
-        QString service("phonebookservices");
-        QString interface;
-        QString operation;
         QList<QVariant> args;
+        XQAiwRequest* request = NULL;
+        XQApplicationManager appManager;
 
-        if(contactId > 0)
-        {
-            //open contact card
-            interface = QString("com.nokia.symbian.IContactsView");
-            operation = QString("openContactCard(int)");
+        if (contactId > 0) {
+            // open existing contact card
+            request = appManager.create(XQI_CONTACTS_VIEW, XQOP_CONTACTS_VIEW_CONTACT_CARD, true); // Embedded
             args << contactId;
         }
-        else
-        {
-            //save to contacts with phone number field prefilled.
-            interface = QString("com.nokia.symbian.IContactsEdit");
-            operation = QString("editCreateNew(QString,QString)");
-            QString type = QContactPhoneNumber::DefinitionName;
-            args << type;
-            args << data;
+        else {
+            // open temp contact card
+            request = appManager.create(XQI_CONTACTS_VIEW,
+                XQOP_CONTACTS_VIEW_TEMP_CONTACT_CARD_WITH_DETAIL, true); // Embedded
+            args << contactType; // Type
+            args << data; // Actual data
         }
-        XQAiwRequest* request;
-        XQApplicationManager appManager;
-        request = appManager.create(service, interface, operation, true); // embedded
-        if ( request == NULL )
-            {
-            return;       
-            }
+
+        if (request == NULL) {
+            return;
+        }
 
         // Result handlers
-        connect (request, SIGNAL(requestOk(const QVariant&)), 
-            this, SLOT(handleOk(const QVariant&)));
-        connect (request, SIGNAL(requestError(const QVariant&)), 
-            this, SLOT(handleError(const QVariant&)));
-        
+        connect(request, SIGNAL(requestOk(const QVariant&)), this, SLOT(handleOk(const QVariant&)));
+        connect(request, SIGNAL(requestError(const QVariant&)), this,
+            SLOT(handleError(const QVariant&)));
+
         request->setArguments(args);
         request->send();
         delete request;
@@ -535,19 +514,14 @@
 }
 
 void UniViewerAddressWidget::handleOk(const QVariant& result)
-    {
+{
     Q_UNUSED(result)
-    }
+}
 
 void UniViewerAddressWidget::handleError(int errorCode, const QString& errorMessage)
-    {
+{
     Q_UNUSED(errorMessage)
     Q_UNUSED(errorCode)
-    }
-
-void UniViewerAddressWidget::saveToContacts()
-{
-    openContactInfo();
 }
 
 void UniViewerAddressWidget::sendMessage()
@@ -585,4 +559,45 @@
     }
 }
 
+//---------------------------------------------------------------
+// UniViewerAddressWidget::createEmail
+// @see header file
+//---------------------------------------------------------------
+void UniViewerAddressWidget::createEmail()
+{
+    HbAction* action = qobject_cast<HbAction*> (sender());
+
+    if (action) {
+        QString emailId = action->data().toString();
+
+        // Launch email editor
+        QString interfaceName("com.nokia.symbian.IEmailMessageSend");
+        QString operation("send(QVariant)");
+        XQApplicationManager appManager;
+        XQAiwRequest* request = appManager.create(interfaceName, operation, true);
+        if (request == NULL) {
+            return;
+        }
+
+        // Fill args
+        QStringList recipients;
+        recipients.append(emailId);
+
+        QMap<QString, QVariant> map;
+        map.insert(QString("to"), recipients);
+
+        QList<QVariant> args;
+        args.append(map);
+
+        // Result handlers
+        connect(request, SIGNAL(requestOk(const QVariant&)), this, SLOT(handleOk(const QVariant&)));
+        connect(request, SIGNAL(requestError(const QVariant&)), this,
+            SLOT(handleError(const QVariant&)));
+
+        request->setArguments(args);
+        request->send();
+        delete request;
+    }
+}
+
 // EOF