messagingapp/msgui/unifiedviewer/src/univiewertextitem.cpp
changeset 37 518b245aa84c
parent 25 84d9eb65b26f
child 38 4e4b6adb1024
equal deleted inserted replaced
25:84d9eb65b26f 37:518b245aa84c
    16  * has in built logic for finding phone number, email, url.
    16  * has in built logic for finding phone number, email, url.
    17  *
    17  *
    18  */
    18  */
    19 
    19 
    20 #include "univiewertextitem.h"
    20 #include "univiewertextitem.h"
       
    21 #include "msgcontacthandler.h"
    21 
    22 
    22 #include <QRegExp>
    23 #include <QRegExp>
    23 #include <QGraphicsSceneMouseEvent>
       
    24 #include <QApplication>
    24 #include <QApplication>
    25 #include <QClipboard>
    25 #include <QClipboard>
    26 #include <QTextBlock>
    26 #include <QTextBlock>
    27 
    27 #include <QUrl>
       
    28 #include <QDesktopServices>
       
    29 #include <HbTapGesture>
    28 #include <HbMenu>
    30 #include <HbMenu>
    29 #include <HbAction>
    31 #include <HbAction>
    30 #include <cntservicescontact.h>
    32 #include <cntservicescontact.h>
    31 #include <qtcontacts.h>
    33 #include <xqservicerequest.h>
    32 #include <XQServiceRequest.h>
       
    33 #include <xqaiwrequest.h>
    34 #include <xqaiwrequest.h>
    34 
    35 #include <xqappmgr.h>
    35 QTM_USE_NAMESPACE
    36 
    36 
    37 
    37 //consts
    38 //consts
    38 
    39 
    39 //regexp
    40 //regexp
    40 const QString NUMBER_PATTERN("(\\(|\\+|\\d)((?:\\d{2,})((?:[\\s-/.\\)\\()])*(?:(\\d+|\\))))*)|((\\*#)(?:\\d+(\\*|#)(?:\\d+#)?))");
    41 const QString NUMBER_PATTERN("(\\(?(\\+|\\d))((?:\\d)((?:[\\s-/.\\)\\(])*(?:(\\d+|\\))))*(?:\\d|\\)))|((\\*#)(?:\\d+(\\*|#)(?:\\d+#)?))");
    41 
    42 
    42 const QString EMAIL_PATTERN("[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?\\.)+[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?");
    43 const QString EMAIL_PATTERN("[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?\\.)+[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?");
    43 
    44 
    44 const QString URL_PATTERN("(((ht|f|rt)(tp|sp)(s?)\\:\\/\\/)|(www|wap)(?:\\.))(([-\\w]*[0-9a-zA-Z])+(:(0-9)*)*(\\/?)([a-zA-Z0-9\\-\\?\\,\'\\/\\\\+&amp;%\\$#_=~]*)(\\.)([-\\w]*[0-9a-zA-Z])+(:(0-9)*)*(\\/?)([a-zA-Z0-9\\-\\?\\,\'\\/\\\\+&amp;%\\$#_=~]*))+");
    45 const QString URL_PATTERN("(((ht|f|rt)(tp|sp)(s?)\\:\\/\\/)|(www|wap)(?:\\.))(([-\\w]*[0-9a-zA-Z])+(:(0-9)*)*(\\/?)([a-zA-Z0-9\\-\\?\\,\'\\/\\\\+&amp;%\\$#_=~]*)(\\.)([-\\w]*[0-9a-zA-Z])+(:(0-9)*)*(\\/?)([a-zA-Z0-9\\-\\?\'\\/\\\\+&amp;%\\$#_=~]*))+");
       
    46 
    45 
    47 
    46 //rules
    48 //rules
    47 const QString NUMBER_RULE("NUMBER_RULE");
    49 const QString NUMBER_RULE("NUMBER_RULE");
    48 const QString EMAIL_RULE("EMAIL_RULE");
    50 const QString EMAIL_RULE("EMAIL_RULE");
    49 const QString URL_RULE("URL_RULE");
    51 const QString URL_RULE("URL_RULE");
    63 HbTextEdit(parent),
    65 HbTextEdit(parent),
    64 mFindOn(true),
    66 mFindOn(true),
    65 mCursorPos(-1)
    67 mCursorPos(-1)
    66 {
    68 {
    67     this->setReadOnly(true);
    69     this->setReadOnly(true);
       
    70     this->setScrollable(false);
    68     this->setCursorVisibility(Hb::TextCursorHidden);
    71     this->setCursorVisibility(Hb::TextCursorHidden);
       
    72     this->setFlag(QGraphicsItem::ItemIsFocusable,false);
       
    73     this->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
       
    74     this->setBackgroundItem(0);   
    69 
    75 
    70     //inserting rules and patterns to map.
    76     //inserting rules and patterns to map.
    71     mRules.insert(NUMBER_RULE,NUMBER_PATTERN);
    77     mRules.insert(NUMBER_RULE,NUMBER_PATTERN);
    72     mRules.insert(EMAIL_RULE,EMAIL_PATTERN);
    78     mRules.insert(EMAIL_RULE,EMAIL_PATTERN);
    73     mRules.insert(URL_RULE,URL_PATTERN);
    79     mRules.insert(URL_RULE,URL_PATTERN);
   110     for (i = mRules.constBegin(); i != mRules.constEnd(); ++i)
   116     for (i = mRules.constBegin(); i != mRules.constEnd(); ++i)
   111     {
   117     {
   112         QString ruleName = i.key();
   118         QString ruleName = i.key();
   113         QString rule = i.value();
   119         QString rule = i.value();
   114         QRegExp ruleExp(rule);
   120         QRegExp ruleExp(rule);
       
   121         ruleExp.setCaseSensitivity(Qt::CaseInsensitive);
   115 
   122 
   116         QTextCursor cursor = this->document()->find(ruleExp);
   123         QTextCursor cursor = this->document()->find(ruleExp);
   117 
   124 
   118         while(cursor.hasSelection())
   125         while(cursor.hasSelection())
   119         {
   126         {
   170 
   177 
   171     connect(contextMenu,SIGNAL(aboutToClose()),this,SLOT(menuClosed()));
   178     connect(contextMenu,SIGNAL(aboutToClose()),this,SLOT(menuClosed()));
   172     
   179     
   173 }
   180 }
   174 
   181 
   175 
   182 void UniViewerTextItem::gestureEvent(QGestureEvent* event)
   176 void UniViewerTextItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
   183 {
   177 {
   184     //handle gesture to highlight and dehighlight find item.
   178     HbTextEdit::mouseReleaseEvent(event);
   185     
   179 
   186     if(HbTapGesture *tap = qobject_cast<HbTapGesture*>(event->gesture(Qt::TapGesture)))
   180     highlightText(false);
   187     {
   181 
   188         //capturing gesture position, and map to local co-ordinates.
   182     QString anchor = this->anchorAt(event->pos());
   189         QPointF pos = mapFromScene(tap->scenePosition());
   183 
   190         
   184     if(!anchor.isEmpty() && !this->textCursor().hasSelection())
   191         switch (tap->state()) 
   185     {
   192         {
   186         shortTapAction(anchor);
   193             case Qt::GestureStarted:
   187     }
   194             {
   188 }
   195                 //highlight find item.
   189 
   196                 QTextDocument* doc = this->document();
   190 void UniViewerTextItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
   197                 mCursorPos = doc->documentLayout()->hitTest(pos, Qt::ExactHit);
   191 {
   198                 highlightText(true);
   192     HbTextEdit::mousePressEvent(event);
   199                 break;
   193 
   200             }  
   194     QTextDocument* doc = this->document();
   201             
   195 
   202             case Qt::GestureFinished:
   196     mCursorPos = doc->documentLayout()->hitTest(event->pos(), Qt::ExactHit);
   203             {
   197 
   204                 if (HbTapGesture::Tap == tap->tapStyleHint()) 
   198     highlightText(true);
   205                 {
       
   206                     //gesture is finshed dehighlight text.
       
   207                     highlightText(false);
       
   208                     
       
   209                     QString anchor = this->anchorAt(pos);
       
   210                     
       
   211                     //do short tap action.
       
   212                     if (!anchor.isEmpty() && !this->textCursor().hasSelection())
       
   213                     {
       
   214                         shortTapAction(anchor);
       
   215                     }
       
   216                 }
       
   217                 break;
       
   218             }
       
   219             
       
   220             case Qt::GestureCanceled:
       
   221             {
       
   222                 //gesture is canceled due to pan or swipe, dehighlight text.
       
   223                 if (HbTapGesture::Tap == tap->tapStyleHint()) 
       
   224                 {
       
   225                 highlightText(false);
       
   226                 break;
       
   227                 }
       
   228             }
       
   229             default:
       
   230                 break;
       
   231         }
       
   232         event->accept();
       
   233     }
       
   234     else
       
   235     {
       
   236         event->ignore();
       
   237     }
       
   238     
       
   239     //passing gesture event to base class.
       
   240     HbTextEdit::gestureEvent(event);
   199 }
   241 }
   200 
   242 
   201 void UniViewerTextItem::addNumberMenu(HbMenu* contextMenu,const QString& data)
   243 void UniViewerTextItem::addNumberMenu(HbMenu* contextMenu,const QString& data)
   202 {
   244 {
   203     HbAction* action = NULL;
   245     HbAction* action = NULL;
   301     {
   343     {
   302         QString phoneNumber = action->data().toString();
   344         QString phoneNumber = action->data().toString();
   303         phoneNumber.remove(NUMBER_RULE);
   345         phoneNumber.remove(NUMBER_RULE);
   304         
   346         
   305         //invoke dialer service and pass phoneNumber.        
   347         //invoke dialer service and pass phoneNumber.        
   306         QString serviceName("com.nokia.services.telephony");
   348         QString serviceName("com.nokia.symbian.ICallDial");
   307         QString operation("dial(QString)");
   349         QString operation("dial(QString)");
   308         
   350         
   309         XQServiceRequest* serviceRequest = new XQServiceRequest(serviceName,operation,false);
   351         XQServiceRequest* serviceRequest = new XQServiceRequest(serviceName,operation,false);
   310         
   352         
   311         connect(serviceRequest, SIGNAL(requestCompleted(QVariant)),
   353         connect(serviceRequest, SIGNAL(requestCompleted(QVariant)),
   341     {
   383     {
   342         QString emailId = action->data().toString();
   384         QString emailId = action->data().toString();
   343         emailId.remove(EMAIL_RULE);
   385         emailId.remove(EMAIL_RULE);
   344 
   386 
   345         // Launch email editor
   387         // Launch email editor
   346         QString serviceName("com.nokia.services.commonemail");
   388         QString interfaceName("com.nokia.symbian.IEmailMessageSend");
   347         QString interfaceName("imessage.send");
       
   348         QString operation("send(QVariant)");
   389         QString operation("send(QVariant)");
   349         XQAiwRequest* request = mAppManager.create(serviceName, interfaceName, 
   390         XQApplicationManager appManager;
       
   391         XQAiwRequest* request = appManager.create(interfaceName, 
   350 			operation, true); 
   392 			operation, true); 
   351         if ( request == NULL )
   393         if ( request == NULL )
   352             {
   394             {
   353             return;       
   395             return;       
   354             }
   396             }
   382     if(action)
   424     if(action)
   383     {
   425     {
   384         QString url = action->data().toString();
   426         QString url = action->data().toString();
   385         url.remove(URL_RULE);
   427         url.remove(URL_RULE);
   386         //invoke browser service  & pass url.
   428         //invoke browser service  & pass url.
       
   429         QUrl uri(url);
       
   430         QDesktopServices::openUrl(uri);
   387     }
   431     }
   388 }
   432 }
   389 
   433 
   390 void UniViewerTextItem::addToBookmarks()
   434 void UniViewerTextItem::addToBookmarks()
   391 {
   435 {
   412         
   456         
   413         if(data.contains(QRegExp("^"+NUMBER_RULE)))
   457         if(data.contains(QRegExp("^"+NUMBER_RULE)))
   414         {
   458         {
   415             data.remove(NUMBER_RULE);
   459             data.remove(NUMBER_RULE);
   416     
   460     
   417             int contactId = resolveContactId(data, 
   461             int contactId = MsgContactHandler::resolveContactDisplayName(
   418                                              QContactPhoneNumber::DefinitionName,
   462                                          data, 
   419                                              QContactPhoneNumber::FieldNumber);
   463                                          QContactPhoneNumber::DefinitionName,
       
   464                                          QContactPhoneNumber::FieldNumber);
   420     
   465     
   421             if(contactId > 0)
   466             if(contactId > 0)
   422                 {
   467                 {
   423                 //open contact card
   468                 //open contact card
   424                 operation = QString("open(int)");
   469                 operation = QString("open(int)");
   437         }
   482         }
   438         else if(data.contains(QRegExp("^"+EMAIL_RULE)))
   483         else if(data.contains(QRegExp("^"+EMAIL_RULE)))
   439         {
   484         {
   440             data.remove(EMAIL_RULE);
   485             data.remove(EMAIL_RULE);
   441     
   486     
   442             int contactId = resolveContactId(data,
   487             int contactId = MsgContactHandler::resolveContactDisplayName(
   443                                              QContactEmailAddress::DefinitionName,
   488                     data,
   444                                              QContactEmailAddress::FieldEmailAddress);
   489                     QContactEmailAddress::DefinitionName,
       
   490                     QContactEmailAddress::FieldEmailAddress);
   445             
   491             
   446             if(contactId > 0)
   492             if(contactId > 0)
   447                 {
   493                 {
   448                 //open contact card
   494                 //open contact card
   449                 operation = QString("open(int)");
   495                 operation = QString("open(int)");
   464         
   510         
   465         //service stuff.
   511         //service stuff.
   466         QString serviceName("com.nokia.services.phonebookservices");
   512         QString serviceName("com.nokia.services.phonebookservices");
   467      
   513      
   468         XQAiwRequest* request;
   514         XQAiwRequest* request;
   469         request = mAppManager.create(serviceName, "Fetch", operation, true); // embedded
   515         XQApplicationManager appManager;
       
   516         request = appManager.create(serviceName, "Fetch", operation, true); // embedded
   470         if ( request == NULL )
   517         if ( request == NULL )
   471             {
   518             {
   472             return;       
   519             return;       
   473             }
   520             }
   474 
   521 
   500         {
   547         {
   501         delete request;
   548         delete request;
   502         }
   549         }
   503     }
   550     }
   504 
   551 
   505 int UniViewerTextItem::resolveContactId(const QString& value,
       
   506                                         const QString& fieldName,
       
   507                                         const QString& fieldType)
       
   508     {
       
   509     int contactId = -1;
       
   510     
       
   511     QContactManager phonebookManager("symbian");
       
   512     
       
   513     QContactDetailFilter phoneFilter;
       
   514     phoneFilter.setDetailDefinitionName(fieldName, fieldType);
       
   515     phoneFilter.setValue(value);
       
   516     phoneFilter.setMatchFlags(QContactFilter::MatchEndsWith);
       
   517 
       
   518     QList<QContactSortOrder> sortOrder;
       
   519     QList<QContact> matchingContacts = phonebookManager.contacts(
       
   520             phoneFilter,
       
   521             sortOrder,
       
   522             QStringList());
       
   523 
       
   524     if ( matchingContacts.count() > 0 ) 
       
   525         {       
       
   526         contactId = matchingContacts.at(0).localId();;   
       
   527         }
       
   528     
       
   529     return contactId;
       
   530     }
       
   531 
       
   532 void UniViewerTextItem::menuClosed()
   552 void UniViewerTextItem::menuClosed()
   533 {
   553 {
   534     highlightText(false);
   554     highlightText(false);
   535 }
   555 }
   536 
   556 
   563             {
   583             {
   564                 cursor.mergeCharFormat(mFormatNormal);
   584                 cursor.mergeCharFormat(mFormatNormal);
   565             }
   585             }
   566 
   586 
   567             cursor.clearSelection();
   587             cursor.clearSelection();
       
   588             break;
   568         }
   589         }
   569     }
   590     }
   570 }
   591 }
   571 
   592 
   572 //---------------------------------------------------------------
   593 //---------------------------------------------------------------