diff -r a32b19fb291e -r 5b14749788d7 messagingapp/msgui/unifiedviewer/src/univiewertextitem.cpp --- a/messagingapp/msgui/unifiedviewer/src/univiewertextitem.cpp Thu Jun 17 09:57:06 2010 +0100 +++ b/messagingapp/msgui/unifiedviewer/src/univiewertextitem.cpp Thu Jul 22 16:32:06 2010 +0100 @@ -21,16 +21,16 @@ #include "msgcontacthandler.h" #include -#include #include #include #include - +#include +#include +#include #include #include -#include #include -#include +#include #include #include @@ -38,11 +38,11 @@ //consts //regexp -const QString NUMBER_PATTERN("(\\(|\\+|\\d)((?:\\d{2,})((?:[\\s-/.\\)\\()])*(?:(\\d+|\\))))*)|((\\*#)(?:\\d+(\\*|#)(?:\\d+#)?))"); +const QString NUMBER_PATTERN("(\\(?(\\+|\\d))((?:\\d)((?:[\\s-/.\\)\\(])*(?:(\\d+|\\))))*(?:\\d?|\\)))|((\\*#)(?:\\d+(\\*|#)(?:\\d+#)?))"); 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])?"); -const QString URL_PATTERN("(((ht|f|rt)(tp|sp)(s?)\\:\\/\\/)|(www|wap)(?:\\.))(([-\\w]*[0-9a-zA-Z])+(:(0-9)*)*(\\/?)([a-zA-Z0-9\\-\\?\\,\'\\/\\\\+&%\\$#_=~]*)(\\.)([-\\w]*[0-9a-zA-Z])+(:(0-9)*)*(\\/?)([a-zA-Z0-9\\-\\?\\,\'\\/\\\\+&%\\$#_=~]*))+"); +const QString URL_PATTERN("(((ht|f|rt)(tp|sp)(s?)\\:\\/\\/)|(www|wap)(?:\\.))(([-\\w]*[0-9a-zA-Z])+(:(0-9)*)*(\\/?)([a-zA-Z0-9\\-\\?\\,\'\\/\\\\+&%\\$#_=~]*)(\\.)([-\\w]*[0-9a-zA-Z])+(:(0-9)*)*(\\/?)([a-zA-Z0-9\\-\\?\\,\'\\/\\\\+&%\\$#_=~]*))+[a-zA-Z0-9/]"); //rules const QString NUMBER_RULE("NUMBER_RULE"); @@ -50,7 +50,7 @@ const QString URL_RULE("URL_RULE"); //localization -#define LOC_OPEN_CONTACT_INFO hbTrId("txt_messaging_menu_open_contact_info") +#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") @@ -68,9 +68,9 @@ this->setReadOnly(true); this->setScrollable(false); this->setCursorVisibility(Hb::TextCursorHidden); + this->setFlag(QGraphicsItem::ItemIsFocusable,false); this->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); - HbFrameItem *noBackground = new HbFrameItem(this); - this->setBackgroundItem(noBackground); + this->setBackgroundItem(0); //inserting rules and patterns to map. mRules.insert(NUMBER_RULE,NUMBER_PATTERN); @@ -117,6 +117,7 @@ QString ruleName = i.key(); QString rule = i.value(); QRegExp ruleExp(rule); + ruleExp.setCaseSensitivity(Qt::CaseInsensitive); QTextCursor cursor = this->document()->find(ruleExp); @@ -177,38 +178,88 @@ } - -void UniViewerTextItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) +void UniViewerTextItem::gestureEvent(QGestureEvent* event) { - HbTextEdit::mouseReleaseEvent(event); - - highlightText(false); - - QString anchor = this->anchorAt(event->pos()); - - if(!anchor.isEmpty() && !this->textCursor().hasSelection()) + //handle gesture to highlight and dehighlight find item. + + if(HbTapGesture *tap = qobject_cast(event->gesture(Qt::TapGesture))) { - shortTapAction(anchor); + //capturing gesture position, and map to local co-ordinates. + QPointF pos = mapFromScene(tap->scenePosition()); + + switch (tap->state()) + { + case Qt::GestureStarted: + { + //highlight find item. + QTextDocument* doc = this->document(); + mCursorPos = doc->documentLayout()->hitTest(pos, Qt::ExactHit); + highlightText(true); + break; + } + + case Qt::GestureFinished: + { + if (HbTapGesture::Tap == tap->tapStyleHint()) + { + //gesture is finshed dehighlight text. + highlightText(false); + + QString anchor = this->anchorAt(pos); + + //do short tap action. + if (!anchor.isEmpty() && !this->textCursor().hasSelection()) + { + handleShortTap(anchor,tap->scenePosition()); + } + } + break; + } + + case Qt::GestureCanceled: + { + //gesture is canceled due to pan or swipe, dehighlight text. + if (HbTapGesture::Tap == tap->tapStyleHint()) + { + highlightText(false); + break; + } + } + default: + break; + } + event->accept(); } -} - -void UniViewerTextItem::mousePressEvent(QGraphicsSceneMouseEvent *event) -{ - HbTextEdit::mousePressEvent(event); - - QTextDocument* doc = this->document(); - - mCursorPos = doc->documentLayout()->hitTest(event->pos(), Qt::ExactHit); - - highlightText(true); + else + { + event->ignore(); + } + + //passing gesture event to base class. + HbTextEdit::gestureEvent(event); } void UniViewerTextItem::addNumberMenu(HbMenu* contextMenu,const QString& data) { HbAction* action = NULL; - action = contextMenu->addAction(LOC_OPEN_CONTACT_INFO, this, SLOT(openContactInfo())); - action->setData(data); + QString number = data; + number.remove(NUMBER_RULE); + int contactId = MsgContactHandler::resolveContactDisplayName( + number, + QContactPhoneNumber::DefinitionName, + QContactPhoneNumber::FieldNumber); + + if(contactId > 0) + { + 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); + } action = contextMenu->addAction(LOC_CALL, this, SLOT(call())); action->setData(data); @@ -216,9 +267,6 @@ action = contextMenu->addAction(LOC_SEND_MESSAGE, this, SLOT(sendMessage())); action->setData(data); - action = contextMenu->addAction(LOC_SAVE_TO_CONTACTS, this, SLOT(saveToContacts())); - action->setData(data); - action = contextMenu->addAction(LOC_COPY, this, SLOT(copyToClipboard())); action->setData(data); } @@ -230,7 +278,7 @@ action = contextMenu->addAction(LOC_CREATE_EMAIL, this, SLOT(createEmail())); action->setData(data); - action = contextMenu->addAction(LOC_OPEN_CONTACT_INFO, this, SLOT(openContactInfo())); + action = contextMenu->addAction(LOC_CONTACT_INFO, this, SLOT(openContactInfo())); action->setData(data); action = contextMenu->addAction(LOC_SAVE_TO_CONTACTS, this, SLOT(saveToContacts())); @@ -254,15 +302,40 @@ action->setData(data); } -void UniViewerTextItem::shortTapAction(QString anchor) +void UniViewerTextItem::handleShortTap(QString anchor,const QPointF& pos) { HbAction action; action.setData(anchor); if(anchor.contains(NUMBER_RULE)) { - //open vcard template. - connect(&action,SIGNAL(triggered()),this,SLOT(openContactInfo())); + QString data = anchor; + data.remove(NUMBER_RULE); + int contactId = MsgContactHandler::resolveContactDisplayName( + data, + QContactPhoneNumber::DefinitionName, + QContactPhoneNumber::FieldNumber); + + if(contactId > 0 ) + { + //if resolved conatct open contact card + connect(&action,SIGNAL(triggered()),this,SLOT(openContactInfo())); + } + else + { + //unresolved contact show popup. + highlightText(true); + + HbMenu* contextMenu = new HbMenu(); + contextMenu->setDismissPolicy(HbPopup::TapAnywhere); + contextMenu->setAttribute(Qt::WA_DeleteOnClose, true); + contextMenu->setPreferredPos(pos); + connect(contextMenu,SIGNAL(aboutToClose()),this,SLOT(menuClosed())); + + addNumberMenu(contextMenu,anchor); + + contextMenu->show(); + } } else if(anchor.contains(EMAIL_RULE)) { @@ -308,7 +381,7 @@ phoneNumber.remove(NUMBER_RULE); //invoke dialer service and pass phoneNumber. - QString serviceName("com.nokia.services.telephony"); + QString serviceName("com.nokia.symbian.ICallDial"); QString operation("dial(QString)"); XQServiceRequest* serviceRequest = new XQServiceRequest(serviceName,operation,false); @@ -348,11 +421,10 @@ emailId.remove(EMAIL_RULE); // Launch email editor - QString serviceName("com.nokia.services.commonemail"); - QString interfaceName("imessage.send"); + QString interfaceName("com.nokia.symbian.IEmailMessageSend"); QString operation("send(QVariant)"); XQApplicationManager appManager; - XQAiwRequest* request = appManager.create(serviceName, interfaceName, + XQAiwRequest* request = appManager.create(interfaceName, operation, true); if ( request == NULL ) { @@ -390,6 +462,8 @@ QString url = action->data().toString(); url.remove(URL_RULE); //invoke browser service & pass url. + QUrl uri(url); + QDesktopServices::openUrl(uri); } } @@ -496,7 +570,7 @@ void UniViewerTextItem::saveToContacts() { - //handler for save to contacts. + openContactInfo(); } void UniViewerTextItem::onServiceRequestCompleted()