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\\-\\?\\,\'\\/\\\\+&%\\$#_=~]*)(\\.)([-\\w]*[0-9a-zA-Z])+(:(0-9)*)*(\\/?)([a-zA-Z0-9\\-\\?\\,\'\\/\\\\+&%\\$#_=~]*))+"); |
45 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\\-\\?\'\\/\\\\+&%\\$#_=~]*))+"); |
|
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 } |
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 |