summaryrefslogtreecommitdiff
authordrw <drw>2003-05-18 23:20:25 (UTC)
committer drw <drw>2003-05-18 23:20:25 (UTC)
commit586dea6e61c766da49ba6cb55dd71851c0fafad3 (patch) (unidiff)
tree6122bd75b327c4a29157a66e273bae9632ac22a0
parent34c5b88459bcf5e02deae6b04e8bc17ee0de74c0 (diff)
downloadopie-586dea6e61c766da49ba6cb55dd71851c0fafad3.zip
opie-586dea6e61c766da49ba6cb55dd71851c0fafad3.tar.gz
opie-586dea6e61c766da49ba6cb55dd71851c0fafad3.tar.bz2
Updates to ocontact, oevent & otodo's toRichText() implementations
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--libopie/pim/ocontact.cpp31
-rw-r--r--libopie/pim/oevent.cpp56
-rw-r--r--libopie/pim/otodo.cpp54
-rw-r--r--libopie2/opiepim/ocontact.cpp31
-rw-r--r--libopie2/opiepim/oevent.cpp56
-rw-r--r--libopie2/opiepim/otodo.cpp54
6 files changed, 212 insertions, 70 deletions
diff --git a/libopie/pim/ocontact.cpp b/libopie/pim/ocontact.cpp
index a7ca975..a2fb68c 100644
--- a/libopie/pim/ocontact.cpp
+++ b/libopie/pim/ocontact.cpp
@@ -347,377 +347,382 @@ OContact::~OContact()
347*/ 347*/
348 348
349/*! \fn QString OContact::businessCountry() const 349/*! \fn QString OContact::businessCountry() const
350 Returns the business country of the contact. 350 Returns the business country of the contact.
351*/ 351*/
352 352
353/*! \fn QString OContact::businessPhone() const 353/*! \fn QString OContact::businessPhone() const
354 Returns the business phone number of the contact. 354 Returns the business phone number of the contact.
355*/ 355*/
356 356
357/*! \fn QString OContact::businessFax() const 357/*! \fn QString OContact::businessFax() const
358 Returns the business fax number of the contact. 358 Returns the business fax number of the contact.
359*/ 359*/
360 360
361/*! \fn QString OContact::businessMobile() const 361/*! \fn QString OContact::businessMobile() const
362 Returns the business mobile number of the contact. 362 Returns the business mobile number of the contact.
363*/ 363*/
364 364
365/*! \fn QString OContact::businessPager() const 365/*! \fn QString OContact::businessPager() const
366 Returns the business pager number of the contact. 366 Returns the business pager number of the contact.
367*/ 367*/
368 368
369/*! \fn QString OContact::businessWebpage() const 369/*! \fn QString OContact::businessWebpage() const
370 Returns the business webpage of the contact. 370 Returns the business webpage of the contact.
371*/ 371*/
372 372
373/*! \fn QString OContact::spouse() const 373/*! \fn QString OContact::spouse() const
374 Returns the spouse of the contact. 374 Returns the spouse of the contact.
375*/ 375*/
376 376
377/*! \fn QString OContact::gender() const 377/*! \fn QString OContact::gender() const
378 Returns the gender of the contact. 378 Returns the gender of the contact.
379*/ 379*/
380 380
381/*! \fn QString OContact::nickname() const 381/*! \fn QString OContact::nickname() const
382 Returns the nickname of the contact. 382 Returns the nickname of the contact.
383*/ 383*/
384 384
385/*! \fn QString OContact::children() const 385/*! \fn QString OContact::children() const
386 Returns the children of the contact. 386 Returns the children of the contact.
387*/ 387*/
388 388
389/*! \fn QString OContact::notes() const 389/*! \fn QString OContact::notes() const
390 Returns the notes relating to the the contact. 390 Returns the notes relating to the the contact.
391*/ 391*/
392 392
393/*! \fn QString OContact::groups() const 393/*! \fn QString OContact::groups() const
394 \internal 394 \internal
395 Returns the groups for the contact. 395 Returns the groups for the contact.
396*/ 396*/
397 397
398/*! \fn QStringList OContact::groupList() const 398/*! \fn QStringList OContact::groupList() const
399 \internal 399 \internal
400*/ 400*/
401 401
402/*! \fn QString OContact::field(int) const 402/*! \fn QString OContact::field(int) const
403 \internal 403 \internal
404*/ 404*/
405 405
406/*! \fn void OContact::saveJournal( journal_action, const QString & = QString::null ) 406/*! \fn void OContact::saveJournal( journal_action, const QString & = QString::null )
407 \internal 407 \internal
408*/ 408*/
409 409
410/*! \fn void OContact::setUid( int id ) 410/*! \fn void OContact::setUid( int id )
411 \internal 411 \internal
412 Sets the uid for this record to \a id. 412 Sets the uid for this record to \a id.
413*/ 413*/
414 414
415/*! \enum OContact::journal_action 415/*! \enum OContact::journal_action
416 \internal 416 \internal
417*/ 417*/
418 418
419/*! 419/*!
420 \internal 420 \internal
421*/ 421*/
422QMap<int, QString> OContact::toMap() const 422QMap<int, QString> OContact::toMap() const
423{ 423{
424 QMap<int, QString> map = mMap; 424 QMap<int, QString> map = mMap;
425 QString cats = idsToString( categories() ); 425 QString cats = idsToString( categories() );
426 if ( !cats.isEmpty() ) 426 if ( !cats.isEmpty() )
427 map.insert( Qtopia::AddressCategory, cats ); 427 map.insert( Qtopia::AddressCategory, cats );
428 return map; 428 return map;
429} 429}
430 430
431/*! 431/*!
432 Returns a rich text formatted QString representing the contents the contact. 432 Returns a rich text formatted QString representing the contents the contact.
433*/ 433*/
434QString OContact::toRichText() const 434QString OContact::toRichText() const
435{ 435{
436 QString text; 436 QString text;
437 QString value, comp, state; 437 QString value, comp, state;
438 QString str; 438 QString str;
439 bool marker = false; 439 bool marker = false;
440 440
441 // name, jobtitle and company 441 // name, jobtitle and company
442 if ( !(value = fullName()).isEmpty() ) 442 if ( !(value = fullName()).isEmpty() )
443 text += "<b><h3>" + Qtopia::escapeString(value) + "</h3></b><br>"; 443 text += "<b><h3><img src=\"addressbook/AddressBook\">" + Qtopia::escapeString(value) + "</h3></b>";
444
444 if ( !(value = jobTitle()).isEmpty() ) 445 if ( !(value = jobTitle()).isEmpty() )
445 text += Qtopia::escapeString(value) + "<br>"; 446 text += Qtopia::escapeString(value) + "<br>";
446 447
447 comp = company(); 448 comp = company();
448 if ( !(value = department()).isEmpty() ) { 449 if ( !(value = department()).isEmpty() ) {
449 text += Qtopia::escapeString(value); 450 text += Qtopia::escapeString(value);
450 if ( comp ) 451 if ( comp )
451 text += ", "; 452 text += ", ";
452 else 453 else
453 text += "<br>"; 454 text += "<br>";
454 } 455 }
455 if ( !comp.isEmpty() ) 456 if ( !comp.isEmpty() )
456 text += Qtopia::escapeString(comp) + "<br>"; 457 text += Qtopia::escapeString(comp) + "<br>";
457 458
459 text += "<hr><br>";
460
461 // defailt email
458 QString defEmail = defaultEmail(); 462 QString defEmail = defaultEmail();
459 if ( !defEmail.isEmpty() ) 463 if ( !defEmail.isEmpty() )
460 text += "<b>" + QObject::tr("Default Email: ") + "</b>" 464 text += "<b><img src=\"addressbook/email\">" + QObject::tr("Default Email: ") + "</b>"
461 + Qtopia::escapeString(defEmail) + "<br>"; 465 + Qtopia::escapeString(defEmail) + "<br>";
462 466
463 text += "<hr>"; 467 text += "<br>";
464 468
465 // business address 469 // business address
466 if ( !businessStreet().isEmpty() || !businessCity().isEmpty() || 470 if ( !businessStreet().isEmpty() || !businessCity().isEmpty() ||
467 !businessZip().isEmpty() || !businessCountry().isEmpty() ) { 471 !businessZip().isEmpty() || !businessCountry().isEmpty() ) {
468 text += "<br>";
469 text += QObject::tr( "<b>Work Address:</b>" ); 472 text += QObject::tr( "<b>Work Address:</b>" );
470 text += "<br>"; 473 text += "<br>";
471 marker = true; 474 marker = true;
472 } 475 }
473 476
474 if ( !(value = businessStreet()).isEmpty() ) 477 if ( !(value = businessStreet()).isEmpty() )
475 text += Qtopia::escapeString(value) + "<br>"; 478 text += Qtopia::escapeString(value) + "<br>";
476 state = businessState(); 479 state = businessState();
477 if ( !(value = businessZip()).isEmpty() ) 480 if ( !(value = businessZip()).isEmpty() )
478 text += Qtopia::escapeString(value) + " "; 481 text += Qtopia::escapeString(value) + " ";
479 if ( !(value = businessCity()).isEmpty() ) { 482 if ( !(value = businessCity()).isEmpty() ) {
480 text += Qtopia::escapeString(value); 483 text += Qtopia::escapeString(value);
481 if ( state ) 484 if ( state )
482 text += ", " + Qtopia::escapeString(state); 485 text += ", " + Qtopia::escapeString(state);
483 text += "<br>"; 486 text += "<br>";
484 } else if ( !state.isEmpty() ) 487 } else if ( !state.isEmpty() )
485 text += Qtopia::escapeString(state) + "<br>"; 488 text += Qtopia::escapeString(state) + "<br>";
486 489
487 if ( !(value = businessCountry()).isEmpty() ) 490 if ( !(value = businessCountry()).isEmpty() )
488 text += Qtopia::escapeString(value) + "<br>"; 491 text += Qtopia::escapeString(value) + "<br>";
489 492
490 // rest of Business data 493 // rest of Business data
491 str = office(); 494 str = office();
492 if ( !str.isEmpty() ){ 495 if ( !str.isEmpty() ){
493 text += "<b>" + QObject::tr("Office: ") + "</b>" 496 text += "<b>" + QObject::tr("Office: ") + "</b>"
494 + Qtopia::escapeString(str) + "<br>"; 497 + Qtopia::escapeString(str) + "<br>";
495 marker = true; 498 marker = true;
496 } 499 }
497 str = businessWebpage(); 500 str = businessWebpage();
498 if ( !str.isEmpty() ){ 501 if ( !str.isEmpty() ){
499 text += "<b>" + QObject::tr("Business Web Page: ") + "</b>" 502 text += "<b><img src=\"addressbook/webpagework\">" + QObject::tr("Business Web Page: ") + "</b>"
500 + Qtopia::escapeString(str) + "<br>"; 503 + Qtopia::escapeString(str) + "<br>";
501 marker = true; 504 marker = true;
502 } 505 }
503 str = businessPhone(); 506 str = businessPhone();
504 if ( !str.isEmpty() ){ 507 if ( !str.isEmpty() ){
505 text += "<b>" + QObject::tr("Business Phone: ") + "</b>" 508 text += "<b><img src=\"addressbook/phonework\">" + QObject::tr("Business Phone: ") + "</b>"
506 + Qtopia::escapeString(str) + "<br>"; 509 + Qtopia::escapeString(str) + "<br>";
507 marker = true; 510 marker = true;
508 } 511 }
509 str = businessFax(); 512 str = businessFax();
510 if ( !str.isEmpty() ){ 513 if ( !str.isEmpty() ){
511 text += "<b>" + QObject::tr("Business Fax: ") + "</b>" 514 text += "<b><img src=\"addressbook/faxwork\">" + QObject::tr("Business Fax: ") + "</b>"
512 + Qtopia::escapeString(str) + "<br>"; 515 + Qtopia::escapeString(str) + "<br>";
513 marker = true; 516 marker = true;
514 } 517 }
515 str = businessMobile(); 518 str = businessMobile();
516 if ( !str.isEmpty() ){ 519 if ( !str.isEmpty() ){
517 text += "<b>" + QObject::tr("Business Mobile: ") + "</b>" 520 text += "<b><img src=\"addressbook/mobilework\">" + QObject::tr("Business Mobile: ") + "</b>"
518 + Qtopia::escapeString(str) + "<br>"; 521 + Qtopia::escapeString(str) + "<br>";
519 marker = true; 522 marker = true;
520 } 523 }
521 str = businessPager(); 524 str = businessPager();
522 if ( !str.isEmpty() ){ 525 if ( !str.isEmpty() ){
523 text += "<b>" + QObject::tr("Business Pager: ") + "</b>" 526 text += "<b>" + QObject::tr("Business Pager: ") + "</b>"
524 + Qtopia::escapeString(str) + "<br>"; 527 + Qtopia::escapeString(str) + "<br>";
525 marker = true; 528 marker = true;
526 } 529 }
527 530
531 text += "<br>";
532
528 // home address 533 // home address
529 if ( !homeStreet().isEmpty() || !homeCity().isEmpty() || 534 if ( !homeStreet().isEmpty() || !homeCity().isEmpty() ||
530 !homeZip().isEmpty() || !homeCountry().isEmpty() ) { 535 !homeZip().isEmpty() || !homeCountry().isEmpty() ) {
531 text += "<br>";
532 text += QObject::tr( "<b>Home Address:</b>" ); 536 text += QObject::tr( "<b>Home Address:</b>" );
533 text += "<br>"; 537 text += "<br>";
534 } 538 }
535 539
536 if ( !(value = homeStreet()).isEmpty() ) 540 if ( !(value = homeStreet()).isEmpty() )
537 text += Qtopia::escapeString(value) + "<br>"; 541 text += Qtopia::escapeString(value) + "<br>";
538 state = homeState(); 542 state = homeState();
539 if ( !(value = homeZip()).isEmpty() ) 543 if ( !(value = homeZip()).isEmpty() )
540 text += Qtopia::escapeString(value) + " "; 544 text += Qtopia::escapeString(value) + " ";
541 if ( !(value = homeCity()).isEmpty() ) { 545 if ( !(value = homeCity()).isEmpty() ) {
542 text += Qtopia::escapeString(value); 546 text += Qtopia::escapeString(value);
543 if ( !state.isEmpty() ) 547 if ( !state.isEmpty() )
544 text += ", " + Qtopia::escapeString(state); 548 text += ", " + Qtopia::escapeString(state);
545 text += "<br>"; 549 text += "<br>";
546 } else if (!state.isEmpty()) 550 } else if (!state.isEmpty())
547 text += Qtopia::escapeString(state) + "<br>"; 551 text += Qtopia::escapeString(state) + "<br>";
548 if ( !(value = homeCountry()).isEmpty() ) 552 if ( !(value = homeCountry()).isEmpty() )
549 text += Qtopia::escapeString(value) + "<br>"; 553 text += Qtopia::escapeString(value) + "<br>";
550 554
551 // rest of Home data 555 // rest of Home data
552 str = homeWebpage(); 556 str = homeWebpage();
553 if ( !str.isEmpty() ){ 557 if ( !str.isEmpty() ){
554 text += "<b>" + QObject::tr("Home Web Page: ") + "</b>" 558 text += "<b><img src=\"addressbook/webpagehome\">" + QObject::tr("Home Web Page: ") + "</b>"
555 + Qtopia::escapeString(str) + "<br>"; 559 + Qtopia::escapeString(str) + "<br>";
556 marker = true; 560 marker = true;
557 } 561 }
558 str = homePhone(); 562 str = homePhone();
559 if ( !str.isEmpty() ){ 563 if ( !str.isEmpty() ){
560 text += "<b>" + QObject::tr("Home Phone: ") + "</b>" 564 text += "<b><img src=\"addressbook/phonehome\">" + QObject::tr("Home Phone: ") + "</b>"
561 + Qtopia::escapeString(str) + "<br>"; 565 + Qtopia::escapeString(str) + "<br>";
562 marker = true; 566 marker = true;
563 } 567 }
564 str = homeFax(); 568 str = homeFax();
565 if ( !str.isEmpty() ){ 569 if ( !str.isEmpty() ){
566 text += "<b>" + QObject::tr("Home Fax: ") + "</b>" 570 text += "<b><img src=\"addressbook/faxhome\">" + QObject::tr("Home Fax: ") + "</b>"
567 + Qtopia::escapeString(str) + "<br>"; 571 + Qtopia::escapeString(str) + "<br>";
568 marker = true; 572 marker = true;
569 } 573 }
570 str = homeMobile(); 574 str = homeMobile();
571 if ( !str.isEmpty() ){ 575 if ( !str.isEmpty() ){
572 text += "<b>" + QObject::tr("Home Mobile: ") + "</b>" 576 text += "<b><img src=\"addressbook/mobilehome\">" + QObject::tr("Home Mobile: ") + "</b>"
573 + Qtopia::escapeString(str) + "<br>"; 577 + Qtopia::escapeString(str) + "<br>";
574 marker = true; 578 marker = true;
575 } 579 }
576 580
577 if ( marker ) 581 if ( marker )
578 text += "<br><hr><br>"; 582 text += "<br><hr><br>";
579 // the others... 583 // the others...
580 str = emails(); 584 str = emails();
581 if ( !str.isEmpty() && ( str != defEmail ) ) 585 if ( !str.isEmpty() && ( str != defEmail ) )
582 text += "<b>" + QObject::tr("All Emails: ") + "</b>" 586 text += "<b>" + QObject::tr("All Emails: ") + "</b>"
583 + Qtopia::escapeString(str) + "<br>"; 587 + Qtopia::escapeString(str) + "<br>";
584 str = profession(); 588 str = profession();
585 if ( !str.isEmpty() ) 589 if ( !str.isEmpty() )
586 text += "<b>" + QObject::tr("Profession: ") + "</b>" 590 text += "<b>" + QObject::tr("Profession: ") + "</b>"
587 + Qtopia::escapeString(str) + "<br>"; 591 + Qtopia::escapeString(str) + "<br>";
588 str = assistant(); 592 str = assistant();
589 if ( !str.isEmpty() ) 593 if ( !str.isEmpty() )
590 text += "<b>" + QObject::tr("Assistant: ") + "</b>" 594 text += "<b>" + QObject::tr("Assistant: ") + "</b>"
591 + Qtopia::escapeString(str) + "<br>"; 595 + Qtopia::escapeString(str) + "<br>";
592 str = manager(); 596 str = manager();
593 if ( !str.isEmpty() ) 597 if ( !str.isEmpty() )
594 text += "<b>" + QObject::tr("Manager: ") + "</b>" 598 text += "<b>" + QObject::tr("Manager: ") + "</b>"
595 + Qtopia::escapeString(str) + "<br>"; 599 + Qtopia::escapeString(str) + "<br>";
596 str = gender(); 600 str = gender();
597 if ( !str.isEmpty() && str.toInt() != 0 ) { 601 if ( !str.isEmpty() && str.toInt() != 0 ) {
598 if ( str.toInt() == 1 ) 602 if ( str.toInt() == 1 )
599 str = QObject::tr( "Male" ); 603 str = QObject::tr( "Male" );
600 else if ( str.toInt() == 2 ) 604 else if ( str.toInt() == 2 )
601 str = QObject::tr( "Female" ); 605 str = QObject::tr( "Female" );
602 text += "<b>" + QObject::tr("Gender: ") + "</b>" + str + "<br>"; 606 text += "<b>" + QObject::tr("Gender: ") + "</b>" + str + "<br>";
603 } 607 }
604 str = spouse(); 608 str = spouse();
605 if ( !str.isEmpty() ) 609 if ( !str.isEmpty() )
606 text += "<b>" + QObject::tr("Spouse: ") + "</b>" 610 text += "<b>" + QObject::tr("Spouse: ") + "</b>"
607 + Qtopia::escapeString(str) + "<br>"; 611 + Qtopia::escapeString(str) + "<br>";
608 if ( birthday().isValid() ){ 612 if ( birthday().isValid() ){
609 str = TimeString::numberDateString( birthday() ); 613 str = TimeString::numberDateString( birthday() );
610 text += "<b>" + QObject::tr("Birthday: ") + "</b>" 614 text += "<b>" + QObject::tr("Birthday: ") + "</b>"
611 + Qtopia::escapeString(str) + "<br>"; 615 + Qtopia::escapeString(str) + "<br>";
612 } 616 }
613 if ( anniversary().isValid() ){ 617 if ( anniversary().isValid() ){
614 str = TimeString::numberDateString( anniversary() ); 618 str = TimeString::numberDateString( anniversary() );
615 text += "<b>" + QObject::tr("Anniversary: ") + "</b>" 619 text += "<b>" + QObject::tr("Anniversary: ") + "</b>"
616 + Qtopia::escapeString(str) + "<br>"; 620 + Qtopia::escapeString(str) + "<br>";
617 } 621 }
618 str = children(); 622 str = children();
619 if ( !str.isEmpty() ) 623 if ( !str.isEmpty() )
620 text += "<b>" + QObject::tr("Children: ") + "</b>" 624 text += "<b>" + QObject::tr("Children: ") + "</b>"
621 + Qtopia::escapeString(str) + "<br>"; 625 + Qtopia::escapeString(str) + "<br>";
622 626
623 str = nickname(); 627 str = nickname();
624 if ( !str.isEmpty() ) 628 if ( !str.isEmpty() )
625 text += "<b>" + QObject::tr("Nickname: ") + "</b>" 629 text += "<b>" + QObject::tr("Nickname: ") + "</b>"
626 + Qtopia::escapeString(str) + "<br>"; 630 + Qtopia::escapeString(str) + "<br>";
627 631
632 // categories
628 if ( categoryNames("Contacts").count() ){ 633 if ( categoryNames("Contacts").count() ){
629 text += "<b>" + QObject::tr( "Category:") + "</b> "; 634 text += "<b>" + QObject::tr( "Category:") + "</b> ";
630 text += categoryNames("Contacts").join(", "); 635 text += categoryNames("Contacts").join(", ");
631 text += "<br>"; 636 text += "<br>";
632 } 637 }
633 638
634 // notes last 639 // notes last
635 if ( !(value = notes()).isEmpty() ) { 640 if ( !(value = notes()).isEmpty() ) {
636 text += "<br><hr><b>" + QObject::tr( "Notes:") + "</b> "; 641 text += "<br><hr><b>" + QObject::tr( "Notes:") + "</b> ";
637 QRegExp reg("\n"); 642 QRegExp reg("\n");
638 643
639 //QString tmp = Qtopia::escapeString(value); 644 //QString tmp = Qtopia::escapeString(value);
640 QString tmp = QStyleSheet::convertFromPlainText(value); 645 QString tmp = QStyleSheet::convertFromPlainText(value);
641 //tmp.replace( reg, "<br>" ); 646 //tmp.replace( reg, "<br>" );
642 text += "<br>" + tmp + "<br>"; 647 text += "<br>" + tmp + "<br>";
643 } 648 }
644 return text; 649 return text;
645} 650}
646 651
647/*! 652/*!
648 \internal 653 \internal
649*/ 654*/
650void OContact::insert( int key, const QString &v ) 655void OContact::insert( int key, const QString &v )
651{ 656{
652 QString value = v.stripWhiteSpace(); 657 QString value = v.stripWhiteSpace();
653 if ( value.isEmpty() ) 658 if ( value.isEmpty() )
654 mMap.remove( key ); 659 mMap.remove( key );
655 else 660 else
656 mMap.insert( key, value ); 661 mMap.insert( key, value );
657} 662}
658 663
659/*! 664/*!
660 \internal 665 \internal
661*/ 666*/
662void OContact::replace( int key, const QString & v ) 667void OContact::replace( int key, const QString & v )
663{ 668{
664 QString value = v.stripWhiteSpace(); 669 QString value = v.stripWhiteSpace();
665 if ( value.isEmpty() ) 670 if ( value.isEmpty() )
666 mMap.remove( key ); 671 mMap.remove( key );
667 else 672 else
668 mMap.replace( key, value ); 673 mMap.replace( key, value );
669} 674}
670 675
671/*! 676/*!
672 \internal 677 \internal
673*/ 678*/
674QString OContact::find( int key ) const 679QString OContact::find( int key ) const
675{ 680{
676 return mMap[key]; 681 return mMap[key];
677} 682}
678 683
679/*! 684/*!
680 \internal 685 \internal
681*/ 686*/
682QString OContact::displayAddress( const QString &street, 687QString OContact::displayAddress( const QString &street,
683 const QString &city, 688 const QString &city,
684 const QString &state, 689 const QString &state,
685 const QString &zip, 690 const QString &zip,
686 const QString &country ) const 691 const QString &country ) const
687{ 692{
688 QString s = street; 693 QString s = street;
689 if ( !street.isEmpty() ) 694 if ( !street.isEmpty() )
690 s+= "\n"; 695 s+= "\n";
691 s += city; 696 s += city;
692 if ( !city.isEmpty() && !state.isEmpty() ) 697 if ( !city.isEmpty() && !state.isEmpty() )
693 s += ", "; 698 s += ", ";
694 s += state; 699 s += state;
695 if ( !state.isEmpty() && !zip.isEmpty() ) 700 if ( !state.isEmpty() && !zip.isEmpty() )
696 s += " "; 701 s += " ";
697 s += zip; 702 s += zip;
698 if ( !country.isEmpty() && !s.isEmpty() ) 703 if ( !country.isEmpty() && !s.isEmpty() )
699 s += "\n"; 704 s += "\n";
700 s += country; 705 s += country;
701 return s; 706 return s;
702} 707}
703 708
704/*! 709/*!
705 \internal 710 \internal
706*/ 711*/
707QString OContact::displayBusinessAddress() const 712QString OContact::displayBusinessAddress() const
708{ 713{
709 return displayAddress( businessStreet(), businessCity(), 714 return displayAddress( businessStreet(), businessCity(),
710 businessState(), businessZip(), 715 businessState(), businessZip(),
711 businessCountry() ); 716 businessCountry() );
712} 717}
713 718
714/*! 719/*!
715 \internal 720 \internal
716*/ 721*/
717QString OContact::displayHomeAddress() const 722QString OContact::displayHomeAddress() const
718{ 723{
719 return displayAddress( homeStreet(), homeCity(), 724 return displayAddress( homeStreet(), homeCity(),
720 homeState(), homeZip(), 725 homeState(), homeZip(),
721 homeCountry() ); 726 homeCountry() );
722} 727}
723 728
diff --git a/libopie/pim/oevent.cpp b/libopie/pim/oevent.cpp
index 83b191f..e4f5d92 100644
--- a/libopie/pim/oevent.cpp
+++ b/libopie/pim/oevent.cpp
@@ -142,208 +142,240 @@ bool OEvent::hasRecurrence()const {
142 if (!data->recur ) return false; 142 if (!data->recur ) return false;
143 return data->recur->doesRecur(); 143 return data->recur->doesRecur();
144} 144}
145QString OEvent::note()const { 145QString OEvent::note()const {
146 return data->note; 146 return data->note;
147} 147}
148void OEvent::setNote( const QString& note ) { 148void OEvent::setNote( const QString& note ) {
149 changeOrModify(); 149 changeOrModify();
150 data->note = note; 150 data->note = note;
151} 151}
152QDateTime OEvent::createdDateTime()const { 152QDateTime OEvent::createdDateTime()const {
153 return data->created; 153 return data->created;
154} 154}
155void OEvent::setCreatedDateTime( const QDateTime& time ) { 155void OEvent::setCreatedDateTime( const QDateTime& time ) {
156 changeOrModify(); 156 changeOrModify();
157 data->created = time; 157 data->created = time;
158} 158}
159QDateTime OEvent::startDateTime()const { 159QDateTime OEvent::startDateTime()const {
160 if ( data->isAllDay ) 160 if ( data->isAllDay )
161 return QDateTime( data->start.date(), QTime(0, 0, 0 ) ); 161 return QDateTime( data->start.date(), QTime(0, 0, 0 ) );
162 return data->start; 162 return data->start;
163} 163}
164QDateTime OEvent::startDateTimeInZone()const { 164QDateTime OEvent::startDateTimeInZone()const {
165 /* if no timezone, or all day event or if the current and this timeZone match... */ 165 /* if no timezone, or all day event or if the current and this timeZone match... */
166 if (data->timezone.isEmpty() || data->isAllDay || data->timezone == OTimeZone::current().timeZone() ) return startDateTime(); 166 if (data->timezone.isEmpty() || data->isAllDay || data->timezone == OTimeZone::current().timeZone() ) return startDateTime();
167 167
168 OTimeZone zone(data->timezone ); 168 OTimeZone zone(data->timezone );
169 return zone.toDateTime( data->start, OTimeZone::current() ); 169 return zone.toDateTime( data->start, OTimeZone::current() );
170} 170}
171void OEvent::setStartDateTime( const QDateTime& dt ) { 171void OEvent::setStartDateTime( const QDateTime& dt ) {
172 changeOrModify(); 172 changeOrModify();
173 data->start = dt; 173 data->start = dt;
174} 174}
175QDateTime OEvent::endDateTime()const { 175QDateTime OEvent::endDateTime()const {
176 /* 176 /*
177 * if all Day event the end time needs 177 * if all Day event the end time needs
178 * to be on the same day as the start 178 * to be on the same day as the start
179 */ 179 */
180 if ( data->isAllDay ) 180 if ( data->isAllDay )
181 return QDateTime( data->start.date(), QTime(23, 59, 59 ) ); 181 return QDateTime( data->start.date(), QTime(23, 59, 59 ) );
182 return data->end; 182 return data->end;
183} 183}
184QDateTime OEvent::endDateTimeInZone()const { 184QDateTime OEvent::endDateTimeInZone()const {
185 /* if no timezone, or all day event or if the current and this timeZone match... */ 185 /* if no timezone, or all day event or if the current and this timeZone match... */
186 if (data->timezone.isEmpty() || data->isAllDay || data->timezone == OTimeZone::current().timeZone() ) return endDateTime(); 186 if (data->timezone.isEmpty() || data->isAllDay || data->timezone == OTimeZone::current().timeZone() ) return endDateTime();
187 187
188 OTimeZone zone(data->timezone ); 188 OTimeZone zone(data->timezone );
189 return zone.toDateTime( data->end, OTimeZone::current() ); 189 return zone.toDateTime( data->end, OTimeZone::current() );
190} 190}
191void OEvent::setEndDateTime( const QDateTime& dt ) { 191void OEvent::setEndDateTime( const QDateTime& dt ) {
192 changeOrModify(); 192 changeOrModify();
193 data->end = dt; 193 data->end = dt;
194} 194}
195bool OEvent::isMultipleDay()const { 195bool OEvent::isMultipleDay()const {
196 return data->end.date().day() - data->start.date().day(); 196 return data->end.date().day() - data->start.date().day();
197} 197}
198bool OEvent::isAllDay()const { 198bool OEvent::isAllDay()const {
199 return data->isAllDay; 199 return data->isAllDay;
200} 200}
201void OEvent::setAllDay( bool allDay ) { 201void OEvent::setAllDay( bool allDay ) {
202 changeOrModify(); 202 changeOrModify();
203 data->isAllDay = allDay; 203 data->isAllDay = allDay;
204 if (allDay ) data->timezone = "UTC"; 204 if (allDay ) data->timezone = "UTC";
205} 205}
206void OEvent::setTimeZone( const QString& tz ) { 206void OEvent::setTimeZone( const QString& tz ) {
207 changeOrModify(); 207 changeOrModify();
208 data->timezone = tz; 208 data->timezone = tz;
209} 209}
210QString OEvent::timeZone()const { 210QString OEvent::timeZone()const {
211 if (data->isAllDay ) return QString::fromLatin1("UTC"); 211 if (data->isAllDay ) return QString::fromLatin1("UTC");
212 return data->timezone; 212 return data->timezone;
213} 213}
214bool OEvent::match( const QRegExp& re )const { 214bool OEvent::match( const QRegExp& re )const {
215 if ( re.match( data->description ) != -1 ){ 215 if ( re.match( data->description ) != -1 ){
216 setLastHitField( Qtopia::DatebookDescription ); 216 setLastHitField( Qtopia::DatebookDescription );
217 return true; 217 return true;
218 } 218 }
219 if ( re.match( data->note ) != -1 ){ 219 if ( re.match( data->note ) != -1 ){
220 setLastHitField( Qtopia::Note ); 220 setLastHitField( Qtopia::Note );
221 return true; 221 return true;
222 } 222 }
223 if ( re.match( data->location ) != -1 ){ 223 if ( re.match( data->location ) != -1 ){
224 setLastHitField( Qtopia::Location ); 224 setLastHitField( Qtopia::Location );
225 return true; 225 return true;
226 } 226 }
227 if ( re.match( data->start.toString() ) != -1 ){ 227 if ( re.match( data->start.toString() ) != -1 ){
228 setLastHitField( Qtopia::StartDateTime ); 228 setLastHitField( Qtopia::StartDateTime );
229 return true; 229 return true;
230 } 230 }
231 if ( re.match( data->end.toString() ) != -1 ){ 231 if ( re.match( data->end.toString() ) != -1 ){
232 setLastHitField( Qtopia::EndDateTime ); 232 setLastHitField( Qtopia::EndDateTime );
233 return true; 233 return true;
234 } 234 }
235 return false; 235 return false;
236} 236}
237QString OEvent::toRichText()const { 237QString OEvent::toRichText()const {
238 QString text; 238 QString text, value;
239
240 // description
241 text += "<b><h3><img src=\"datebook/DateBook\">";
239 if ( !description().isEmpty() ) { 242 if ( !description().isEmpty() ) {
240 text += "<b>" + QObject::tr( "Description:") + "</b><br>"; 243 text += Qtopia::escapeString(description() ).replace(QRegExp( "[\n]"), "" );
241 text += Qtopia::escapeString(description() ). 244 }
242 replace(QRegExp( "[\n]"), "<br>" ) + "<br>"; 245 text += "</h3></b><br><hr><br>";
246
247 // location
248 if ( !(value = location()).isEmpty() ) {
249 text += "<b>" + QObject::tr( "Location:" ) + "</b> ";
250 text += Qtopia::escapeString(value) + "<br>";
251 }
252
253 // all day event
254 if ( isAllDay() ) {
255 text += "<b><i>" + QObject::tr( "This is an all day event" ) + "</i></b><br>";
243 } 256 }
244 if ( startDateTime().isValid() ) { 257 // multiple day event
245 text += "<b>" + QObject::tr( "Start:") + "</b> "; 258 else if ( isMultipleDay () ) {
246 text += Qtopia::escapeString(startDateTime().toString() ). 259 text += "<b><i>" + QObject::tr( "This is a multiple day event" ) + "</i></b><br>";
247 replace(QRegExp( "[\n]"), "<br>" ) + "<br>"; 260 }
261 // start & end times
262 else {
263 // start time
264 if ( startDateTime().isValid() ) {
265 text += "<b>" + QObject::tr( "Start:") + "</b> ";
266 text += Qtopia::escapeString(startDateTime().toString() ).
267 replace(QRegExp( "[\n]"), "<br>" ) + "<br>";
268 }
269
270 // end time
271 if ( endDateTime().isValid() ) {
272 text += "<b>" + QObject::tr( "End:") + "</b> ";
273 text += Qtopia::escapeString(endDateTime().toString() ).
274 replace(QRegExp( "[\n]"), "<br>" ) + "<br>";
275 }
248 } 276 }
249 if ( endDateTime().isValid() ) { 277
250 text += "<b>" + QObject::tr( "End:") + "</b> "; 278 // categories
251 text += Qtopia::escapeString(endDateTime().toString() ). 279 if ( categoryNames("Calendar").count() ){
252 replace(QRegExp( "[\n]"), "<br>" ) + "<br>"; 280 text += "<b>" + QObject::tr( "Category:") + "</b> ";
281 text += categoryNames("Calendar").join(", ");
282 text += "<br>";
253 } 283 }
284
285 //notes
254 if ( !note().isEmpty() ) { 286 if ( !note().isEmpty() ) {
255 text += "<b>" + QObject::tr( "Note:") + "</b><br>"; 287 text += "<b>" + QObject::tr( "Note:") + "</b><br>";
256 text += note(); 288 text += note();
257// text += Qtopia::escapeString(note() ). 289// text += Qtopia::escapeString(note() ).
258// replace(QRegExp( "[\n]"), "<br>" ) + "<br>"; 290// replace(QRegExp( "[\n]"), "<br>" ) + "<br>";
259 } 291 }
260 return text; 292 return text;
261} 293}
262QString OEvent::toShortText()const { 294QString OEvent::toShortText()const {
263 QString text; 295 QString text;
264 text += QString::number( startDateTime().date().day() ); 296 text += QString::number( startDateTime().date().day() );
265 text += "."; 297 text += ".";
266 text += QString::number( startDateTime().date().month() ); 298 text += QString::number( startDateTime().date().month() );
267 text += "."; 299 text += ".";
268 text += QString::number( startDateTime().date().year() ); 300 text += QString::number( startDateTime().date().year() );
269 text += " "; 301 text += " ";
270 text += QString::number( startDateTime().time().hour() ); 302 text += QString::number( startDateTime().time().hour() );
271 text += ":"; 303 text += ":";
272 text += QString::number( startDateTime().time().minute() ); 304 text += QString::number( startDateTime().time().minute() );
273 text += " - "; 305 text += " - ";
274 text += description(); 306 text += description();
275 return text; 307 return text;
276} 308}
277QString OEvent::type()const { 309QString OEvent::type()const {
278 return QString::fromLatin1("OEvent"); 310 return QString::fromLatin1("OEvent");
279} 311}
280QString OEvent::recordField( int /*id */ )const { 312QString OEvent::recordField( int /*id */ )const {
281 return QString::null; 313 return QString::null;
282} 314}
283int OEvent::rtti() { 315int OEvent::rtti() {
284 return OPimResolver::DateBook; 316 return OPimResolver::DateBook;
285} 317}
286bool OEvent::loadFromStream( QDataStream& ) { 318bool OEvent::loadFromStream( QDataStream& ) {
287 return true; 319 return true;
288} 320}
289bool OEvent::saveToStream( QDataStream& )const { 321bool OEvent::saveToStream( QDataStream& )const {
290 return true; 322 return true;
291} 323}
292void OEvent::changeOrModify() { 324void OEvent::changeOrModify() {
293 if ( data->count != 1 ) { 325 if ( data->count != 1 ) {
294 data->deref(); 326 data->deref();
295 Data* d2 = new Data; 327 Data* d2 = new Data;
296 d2->description = data->description; 328 d2->description = data->description;
297 d2->location = data->location; 329 d2->location = data->location;
298 330
299 if (data->manager ) 331 if (data->manager )
300 d2->manager = new OPimNotifyManager( *data->manager ); 332 d2->manager = new OPimNotifyManager( *data->manager );
301 333
302 if ( data->recur ) 334 if ( data->recur )
303 d2->recur = new ORecur( *data->recur ); 335 d2->recur = new ORecur( *data->recur );
304 336
305 d2->note = data->note; 337 d2->note = data->note;
306 d2->created = data->created; 338 d2->created = data->created;
307 d2->start = data->start; 339 d2->start = data->start;
308 d2->end = data->end; 340 d2->end = data->end;
309 d2->isAllDay = data->isAllDay; 341 d2->isAllDay = data->isAllDay;
310 d2->timezone = data->timezone; 342 d2->timezone = data->timezone;
311 d2->parent = data->parent; 343 d2->parent = data->parent;
312 344
313 if ( data->child ) { 345 if ( data->child ) {
314 d2->child = new QArray<int>( *data->child ); 346 d2->child = new QArray<int>( *data->child );
315 d2->child->detach(); 347 d2->child->detach();
316 } 348 }
317 349
318 data = d2; 350 data = d2;
319 } 351 }
320} 352}
321void OEvent::deref() { 353void OEvent::deref() {
322 if ( data->deref() ) { 354 if ( data->deref() ) {
323 delete data; 355 delete data;
324 data = 0; 356 data = 0;
325 } 357 }
326} 358}
327// FIXME 359// FIXME
328QMap<int, QString> OEvent::toMap()const { 360QMap<int, QString> OEvent::toMap()const {
329 return QMap<int, QString>(); 361 return QMap<int, QString>();
330} 362}
331QMap<QString, QString> OEvent::toExtraMap()const { 363QMap<QString, QString> OEvent::toExtraMap()const {
332 return QMap<QString, QString>(); 364 return QMap<QString, QString>();
333} 365}
334int OEvent::parent()const { 366int OEvent::parent()const {
335 return data->parent; 367 return data->parent;
336} 368}
337void OEvent::setParent( int uid ) { 369void OEvent::setParent( int uid ) {
338 changeOrModify(); 370 changeOrModify();
339 data->parent = uid; 371 data->parent = uid;
340} 372}
341QArray<int> OEvent::children() const{ 373QArray<int> OEvent::children() const{
342 if (!data->child) return QArray<int>(); 374 if (!data->child) return QArray<int>();
343 else 375 else
344 return data->child->copy(); 376 return data->child->copy();
345} 377}
346void OEvent::setChildren( const QArray<int>& arr ) { 378void OEvent::setChildren( const QArray<int>& arr ) {
347 changeOrModify(); 379 changeOrModify();
348 if (data->child) delete data->child; 380 if (data->child) delete data->child;
349 381
diff --git a/libopie/pim/otodo.cpp b/libopie/pim/otodo.cpp
index e087a00..c84eeeb 100644
--- a/libopie/pim/otodo.cpp
+++ b/libopie/pim/otodo.cpp
@@ -180,213 +180,247 @@ ORecur OTodo::recurrence()const {
180 180
181 return (*data->recur); 181 return (*data->recur);
182} 182}
183bool OTodo::hasMaintainer()const { 183bool OTodo::hasMaintainer()const {
184 if (!data->maintainer) return false; 184 if (!data->maintainer) return false;
185 185
186 return (data->maintainer->mode() != OPimMaintainer::Undefined ); 186 return (data->maintainer->mode() != OPimMaintainer::Undefined );
187} 187}
188OPimMaintainer OTodo::maintainer()const { 188OPimMaintainer OTodo::maintainer()const {
189 if (!data->maintainer) return OPimMaintainer(); 189 if (!data->maintainer) return OPimMaintainer();
190 190
191 return (*data->maintainer); 191 return (*data->maintainer);
192} 192}
193void OTodo::setCompleted( bool completed ) 193void OTodo::setCompleted( bool completed )
194{ 194{
195 changeOrModify(); 195 changeOrModify();
196 data->isCompleted = completed; 196 data->isCompleted = completed;
197} 197}
198void OTodo::setHasDueDate( bool hasDate ) 198void OTodo::setHasDueDate( bool hasDate )
199{ 199{
200 changeOrModify(); 200 changeOrModify();
201 data->hasDate = hasDate; 201 data->hasDate = hasDate;
202} 202}
203void OTodo::setDescription(const QString &desc ) 203void OTodo::setDescription(const QString &desc )
204{ 204{
205// qWarning( "desc " + desc ); 205// qWarning( "desc " + desc );
206 changeOrModify(); 206 changeOrModify();
207 data->desc = Qtopia::simplifyMultiLineSpace(desc ); 207 data->desc = Qtopia::simplifyMultiLineSpace(desc );
208} 208}
209void OTodo::setSummary( const QString& sum ) 209void OTodo::setSummary( const QString& sum )
210{ 210{
211 changeOrModify(); 211 changeOrModify();
212 data->sum = sum; 212 data->sum = sum;
213} 213}
214void OTodo::setPriority(int prio ) 214void OTodo::setPriority(int prio )
215{ 215{
216 changeOrModify(); 216 changeOrModify();
217 data->priority = prio; 217 data->priority = prio;
218} 218}
219void OTodo::setDueDate( const QDate& date ) 219void OTodo::setDueDate( const QDate& date )
220{ 220{
221 changeOrModify(); 221 changeOrModify();
222 data->date = date; 222 data->date = date;
223} 223}
224void OTodo::setStartDate( const QDate& date ) { 224void OTodo::setStartDate( const QDate& date ) {
225 changeOrModify(); 225 changeOrModify();
226 data->start = date; 226 data->start = date;
227} 227}
228void OTodo::setCompletedDate( const QDate& date ) { 228void OTodo::setCompletedDate( const QDate& date ) {
229 changeOrModify(); 229 changeOrModify();
230 data->completed = date; 230 data->completed = date;
231} 231}
232void OTodo::setState( const OPimState& state ) { 232void OTodo::setState( const OPimState& state ) {
233 changeOrModify(); 233 changeOrModify();
234 if (data->state ) 234 if (data->state )
235 (*data->state) = state; 235 (*data->state) = state;
236 else 236 else
237 data->state = new OPimState( state ); 237 data->state = new OPimState( state );
238} 238}
239void OTodo::setRecurrence( const ORecur& rec) { 239void OTodo::setRecurrence( const ORecur& rec) {
240 changeOrModify(); 240 changeOrModify();
241 if (data->recur ) 241 if (data->recur )
242 (*data->recur) = rec; 242 (*data->recur) = rec;
243 else 243 else
244 data->recur = new ORecur( rec ); 244 data->recur = new ORecur( rec );
245} 245}
246void OTodo::setMaintainer( const OPimMaintainer& pim ) { 246void OTodo::setMaintainer( const OPimMaintainer& pim ) {
247 changeOrModify(); 247 changeOrModify();
248 248
249 if (data->maintainer ) 249 if (data->maintainer )
250 (*data->maintainer) = pim; 250 (*data->maintainer) = pim;
251 else 251 else
252 data->maintainer = new OPimMaintainer( pim ); 252 data->maintainer = new OPimMaintainer( pim );
253} 253}
254bool OTodo::isOverdue( ) 254bool OTodo::isOverdue( )
255{ 255{
256 if( data->hasDate && !data->isCompleted) 256 if( data->hasDate && !data->isCompleted)
257 return QDate::currentDate() > data->date; 257 return QDate::currentDate() > data->date;
258 return false; 258 return false;
259} 259}
260void OTodo::setProgress(ushort progress ) 260void OTodo::setProgress(ushort progress )
261{ 261{
262 changeOrModify(); 262 changeOrModify();
263 data->prog = progress; 263 data->prog = progress;
264} 264}
265QString OTodo::toShortText() const { 265QString OTodo::toShortText() const {
266 return summary(); 266 return summary();
267} 267}
268/*! 268/*!
269 Returns a richt text string 269 Returns a richt text string
270*/ 270*/
271QString OTodo::toRichText() const 271QString OTodo::toRichText() const
272{ 272{
273 QString text; 273 QString text;
274 QStringList catlist; 274 QStringList catlist;
275 275
276 // Description of the todo 276 // summary
277 text += "<b><h3><img src=\"todo/TodoList\">";
277 if ( !summary().isEmpty() ) { 278 if ( !summary().isEmpty() ) {
278 text += "<b>" + QObject::tr( "Summary:") + "</b><br>"; 279 text += Qtopia::escapeString(summary() ).replace(QRegExp( "[\n]"), "" );
279 text += Qtopia::escapeString(summary() ).replace(QRegExp( "[\n]"), "<br>" ) + "<br>";
280 } 280 }
281 text += "</h3></b><br><hr><br>";
282
283 // description
281 if( !description().isEmpty() ){ 284 if( !description().isEmpty() ){
282 text += "<b>" + QObject::tr( "Description:" ) + "</b><br>"; 285 text += "<b>" + QObject::tr( "Description:" ) + "</b><br>";
283 text += Qtopia::escapeString(description() ).replace(QRegExp( "[\n]"), "<br>" ) ; 286 text += Qtopia::escapeString(description() ).replace(QRegExp( "[\n]"), "<br>" ) ;
284 } 287 }
285 text += "<br><br><br>";
286 288
287 text += "<b>" + QObject::tr( "Priority:") +" </b>" 289 // priority
288 + QString::number( priority() ) + " <br>"; 290 int priorityval = priority();
291 text += "<b>" + QObject::tr( "Priority:") +" </b><img src=\"todo/priority" +
292 QString::number( priorityval ) + "\">";
293// text += "<b>" + QObject::tr( "Priority:") +"</b><img src=\"todo/priority" +
294// QString::number( priority() ) + "\"><br>";
295 switch ( priorityval )
296 {
297 case 1 : text += QObject::tr( "Very high" );
298 break;
299 case 2 : text += QObject::tr( "High" );
300 break;
301 case 3 : text += QObject::tr( "Normal" );
302 break;
303 case 4 : text += QObject::tr( "Low" );
304 break;
305 case 5 : text += QObject::tr( "Very low" );
306 break;
307 };
308 text += "<br>";
309
310 // progress
289 text += "<b>" + QObject::tr( "Progress:") + " </b>" 311 text += "<b>" + QObject::tr( "Progress:") + " </b>"
290 + QString::number( progress() ) + " %<br>"; 312 + QString::number( progress() ) + " %<br>";
313
314 // due date
291 if (hasDueDate() ){ 315 if (hasDueDate() ){
292 text += "<b>" + QObject::tr( "Deadline:") + " </b>"; 316 QDate dd = dueDate();
293 text += dueDate().toString(); 317 int off = QDate::currentDate().daysTo( dd );
294 text += "<br>"; 318
319 text += "<b>" + QObject::tr( "Deadline:" ) + " </b><font color=\"";
320 if ( off < 0 )
321 text += "#FF0000";
322 else if ( off == 0 )
323 text += "#FFFF00";
324 else if ( off > 0 )
325 text += "#00FF00";
326
327 text += "\">" + dd.toString() + "</font><br>";
295 } 328 }
296 329
330 // categories
297 text += "<b>" + QObject::tr( "Category:") + "</b> "; 331 text += "<b>" + QObject::tr( "Category:") + "</b> ";
298 text += categoryNames( "Todo List" ).join(", "); 332 text += categoryNames( "Todo List" ).join(", ");
299 text += "<br>"; 333 text += "<br>";
300 334
301 return text; 335 return text;
302} 336}
303bool OTodo::hasNotifiers()const { 337bool OTodo::hasNotifiers()const {
304 if (!data->notifiers) return false; 338 if (!data->notifiers) return false;
305 return !data->notifiers->isEmpty(); 339 return !data->notifiers->isEmpty();
306} 340}
307OPimNotifyManager& OTodo::notifiers() { 341OPimNotifyManager& OTodo::notifiers() {
308 if (!data->notifiers ) 342 if (!data->notifiers )
309 data->notifiers = new OPimNotifyManager; 343 data->notifiers = new OPimNotifyManager;
310 return (*data->notifiers); 344 return (*data->notifiers);
311} 345}
312const OPimNotifyManager& OTodo::notifiers()const{ 346const OPimNotifyManager& OTodo::notifiers()const{
313 if (!data->notifiers ) 347 if (!data->notifiers )
314 data->notifiers = new OPimNotifyManager; 348 data->notifiers = new OPimNotifyManager;
315 349
316 return (*data->notifiers); 350 return (*data->notifiers);
317} 351}
318 352
319bool OTodo::operator<( const OTodo &toDoEvent )const{ 353bool OTodo::operator<( const OTodo &toDoEvent )const{
320 if( !hasDueDate() && !toDoEvent.hasDueDate() ) return true; 354 if( !hasDueDate() && !toDoEvent.hasDueDate() ) return true;
321 if( !hasDueDate() && toDoEvent.hasDueDate() ) return false; 355 if( !hasDueDate() && toDoEvent.hasDueDate() ) return false;
322 if( hasDueDate() && toDoEvent.hasDueDate() ){ 356 if( hasDueDate() && toDoEvent.hasDueDate() ){
323 if( dueDate() == toDoEvent.dueDate() ){ // let's the priority decide 357 if( dueDate() == toDoEvent.dueDate() ){ // let's the priority decide
324 return priority() < toDoEvent.priority(); 358 return priority() < toDoEvent.priority();
325 }else{ 359 }else{
326 return dueDate() < toDoEvent.dueDate(); 360 return dueDate() < toDoEvent.dueDate();
327 } 361 }
328 } 362 }
329 return false; 363 return false;
330} 364}
331bool OTodo::operator<=(const OTodo &toDoEvent )const 365bool OTodo::operator<=(const OTodo &toDoEvent )const
332{ 366{
333 if( !hasDueDate() && !toDoEvent.hasDueDate() ) return true; 367 if( !hasDueDate() && !toDoEvent.hasDueDate() ) return true;
334 if( !hasDueDate() && toDoEvent.hasDueDate() ) return true; 368 if( !hasDueDate() && toDoEvent.hasDueDate() ) return true;
335 if( hasDueDate() && toDoEvent.hasDueDate() ){ 369 if( hasDueDate() && toDoEvent.hasDueDate() ){
336 if( dueDate() == toDoEvent.dueDate() ){ // let's the priority decide 370 if( dueDate() == toDoEvent.dueDate() ){ // let's the priority decide
337 return priority() <= toDoEvent.priority(); 371 return priority() <= toDoEvent.priority();
338 }else{ 372 }else{
339 return dueDate() <= toDoEvent.dueDate(); 373 return dueDate() <= toDoEvent.dueDate();
340 } 374 }
341 } 375 }
342 return true; 376 return true;
343} 377}
344bool OTodo::operator>(const OTodo &toDoEvent )const 378bool OTodo::operator>(const OTodo &toDoEvent )const
345{ 379{
346 if( !hasDueDate() && !toDoEvent.hasDueDate() ) return false; 380 if( !hasDueDate() && !toDoEvent.hasDueDate() ) return false;
347 if( !hasDueDate() && toDoEvent.hasDueDate() ) return false; 381 if( !hasDueDate() && toDoEvent.hasDueDate() ) return false;
348 if( hasDueDate() && toDoEvent.hasDueDate() ){ 382 if( hasDueDate() && toDoEvent.hasDueDate() ){
349 if( dueDate() == toDoEvent.dueDate() ){ // let's the priority decide 383 if( dueDate() == toDoEvent.dueDate() ){ // let's the priority decide
350 return priority() > toDoEvent.priority(); 384 return priority() > toDoEvent.priority();
351 }else{ 385 }else{
352 return dueDate() > toDoEvent.dueDate(); 386 return dueDate() > toDoEvent.dueDate();
353 } 387 }
354 } 388 }
355 return false; 389 return false;
356} 390}
357bool OTodo::operator>=(const OTodo &toDoEvent )const 391bool OTodo::operator>=(const OTodo &toDoEvent )const
358{ 392{
359 if( !hasDueDate() && !toDoEvent.hasDueDate() ) return true; 393 if( !hasDueDate() && !toDoEvent.hasDueDate() ) return true;
360 if( !hasDueDate() && toDoEvent.hasDueDate() ) return false; 394 if( !hasDueDate() && toDoEvent.hasDueDate() ) return false;
361 if( hasDueDate() && toDoEvent.hasDueDate() ){ 395 if( hasDueDate() && toDoEvent.hasDueDate() ){
362 if( dueDate() == toDoEvent.dueDate() ){ // let's the priority decide 396 if( dueDate() == toDoEvent.dueDate() ){ // let's the priority decide
363 return priority() > toDoEvent.priority(); 397 return priority() > toDoEvent.priority();
364 }else{ 398 }else{
365 return dueDate() > toDoEvent.dueDate(); 399 return dueDate() > toDoEvent.dueDate();
366 } 400 }
367 } 401 }
368 return true; 402 return true;
369} 403}
370bool OTodo::operator==(const OTodo &toDoEvent )const 404bool OTodo::operator==(const OTodo &toDoEvent )const
371{ 405{
372 if ( data->priority != toDoEvent.data->priority ) return false; 406 if ( data->priority != toDoEvent.data->priority ) return false;
373 if ( data->priority != toDoEvent.data->prog ) return false; 407 if ( data->priority != toDoEvent.data->prog ) return false;
374 if ( data->isCompleted != toDoEvent.data->isCompleted ) return false; 408 if ( data->isCompleted != toDoEvent.data->isCompleted ) return false;
375 if ( data->hasDate != toDoEvent.data->hasDate ) return false; 409 if ( data->hasDate != toDoEvent.data->hasDate ) return false;
376 if ( data->date != toDoEvent.data->date ) return false; 410 if ( data->date != toDoEvent.data->date ) return false;
377 if ( data->sum != toDoEvent.data->sum ) return false; 411 if ( data->sum != toDoEvent.data->sum ) return false;
378 if ( data->desc != toDoEvent.data->desc ) return false; 412 if ( data->desc != toDoEvent.data->desc ) return false;
379 if ( data->maintainer != toDoEvent.data->maintainer ) 413 if ( data->maintainer != toDoEvent.data->maintainer )
380 return false; 414 return false;
381 415
382 return OPimRecord::operator==( toDoEvent ); 416 return OPimRecord::operator==( toDoEvent );
383} 417}
384void OTodo::deref() { 418void OTodo::deref() {
385 419
386// qWarning("deref in ToDoEvent"); 420// qWarning("deref in ToDoEvent");
387 if ( data->deref() ) { 421 if ( data->deref() ) {
388// qWarning("deleting"); 422// qWarning("deleting");
389 delete data; 423 delete data;
390 data= 0; 424 data= 0;
391 } 425 }
392} 426}
diff --git a/libopie2/opiepim/ocontact.cpp b/libopie2/opiepim/ocontact.cpp
index a7ca975..a2fb68c 100644
--- a/libopie2/opiepim/ocontact.cpp
+++ b/libopie2/opiepim/ocontact.cpp
@@ -347,377 +347,382 @@ OContact::~OContact()
347*/ 347*/
348 348
349/*! \fn QString OContact::businessCountry() const 349/*! \fn QString OContact::businessCountry() const
350 Returns the business country of the contact. 350 Returns the business country of the contact.
351*/ 351*/
352 352
353/*! \fn QString OContact::businessPhone() const 353/*! \fn QString OContact::businessPhone() const
354 Returns the business phone number of the contact. 354 Returns the business phone number of the contact.
355*/ 355*/
356 356
357/*! \fn QString OContact::businessFax() const 357/*! \fn QString OContact::businessFax() const
358 Returns the business fax number of the contact. 358 Returns the business fax number of the contact.
359*/ 359*/
360 360
361/*! \fn QString OContact::businessMobile() const 361/*! \fn QString OContact::businessMobile() const
362 Returns the business mobile number of the contact. 362 Returns the business mobile number of the contact.
363*/ 363*/
364 364
365/*! \fn QString OContact::businessPager() const 365/*! \fn QString OContact::businessPager() const
366 Returns the business pager number of the contact. 366 Returns the business pager number of the contact.
367*/ 367*/
368 368
369/*! \fn QString OContact::businessWebpage() const 369/*! \fn QString OContact::businessWebpage() const
370 Returns the business webpage of the contact. 370 Returns the business webpage of the contact.
371*/ 371*/
372 372
373/*! \fn QString OContact::spouse() const 373/*! \fn QString OContact::spouse() const
374 Returns the spouse of the contact. 374 Returns the spouse of the contact.
375*/ 375*/
376 376
377/*! \fn QString OContact::gender() const 377/*! \fn QString OContact::gender() const
378 Returns the gender of the contact. 378 Returns the gender of the contact.
379*/ 379*/
380 380
381/*! \fn QString OContact::nickname() const 381/*! \fn QString OContact::nickname() const
382 Returns the nickname of the contact. 382 Returns the nickname of the contact.
383*/ 383*/
384 384
385/*! \fn QString OContact::children() const 385/*! \fn QString OContact::children() const
386 Returns the children of the contact. 386 Returns the children of the contact.
387*/ 387*/
388 388
389/*! \fn QString OContact::notes() const 389/*! \fn QString OContact::notes() const
390 Returns the notes relating to the the contact. 390 Returns the notes relating to the the contact.
391*/ 391*/
392 392
393/*! \fn QString OContact::groups() const 393/*! \fn QString OContact::groups() const
394 \internal 394 \internal
395 Returns the groups for the contact. 395 Returns the groups for the contact.
396*/ 396*/
397 397
398/*! \fn QStringList OContact::groupList() const 398/*! \fn QStringList OContact::groupList() const
399 \internal 399 \internal
400*/ 400*/
401 401
402/*! \fn QString OContact::field(int) const 402/*! \fn QString OContact::field(int) const
403 \internal 403 \internal
404*/ 404*/
405 405
406/*! \fn void OContact::saveJournal( journal_action, const QString & = QString::null ) 406/*! \fn void OContact::saveJournal( journal_action, const QString & = QString::null )
407 \internal 407 \internal
408*/ 408*/
409 409
410/*! \fn void OContact::setUid( int id ) 410/*! \fn void OContact::setUid( int id )
411 \internal 411 \internal
412 Sets the uid for this record to \a id. 412 Sets the uid for this record to \a id.
413*/ 413*/
414 414
415/*! \enum OContact::journal_action 415/*! \enum OContact::journal_action
416 \internal 416 \internal
417*/ 417*/
418 418
419/*! 419/*!
420 \internal 420 \internal
421*/ 421*/
422QMap<int, QString> OContact::toMap() const 422QMap<int, QString> OContact::toMap() const
423{ 423{
424 QMap<int, QString> map = mMap; 424 QMap<int, QString> map = mMap;
425 QString cats = idsToString( categories() ); 425 QString cats = idsToString( categories() );
426 if ( !cats.isEmpty() ) 426 if ( !cats.isEmpty() )
427 map.insert( Qtopia::AddressCategory, cats ); 427 map.insert( Qtopia::AddressCategory, cats );
428 return map; 428 return map;
429} 429}
430 430
431/*! 431/*!
432 Returns a rich text formatted QString representing the contents the contact. 432 Returns a rich text formatted QString representing the contents the contact.
433*/ 433*/
434QString OContact::toRichText() const 434QString OContact::toRichText() const
435{ 435{
436 QString text; 436 QString text;
437 QString value, comp, state; 437 QString value, comp, state;
438 QString str; 438 QString str;
439 bool marker = false; 439 bool marker = false;
440 440
441 // name, jobtitle and company 441 // name, jobtitle and company
442 if ( !(value = fullName()).isEmpty() ) 442 if ( !(value = fullName()).isEmpty() )
443 text += "<b><h3>" + Qtopia::escapeString(value) + "</h3></b><br>"; 443 text += "<b><h3><img src=\"addressbook/AddressBook\">" + Qtopia::escapeString(value) + "</h3></b>";
444
444 if ( !(value = jobTitle()).isEmpty() ) 445 if ( !(value = jobTitle()).isEmpty() )
445 text += Qtopia::escapeString(value) + "<br>"; 446 text += Qtopia::escapeString(value) + "<br>";
446 447
447 comp = company(); 448 comp = company();
448 if ( !(value = department()).isEmpty() ) { 449 if ( !(value = department()).isEmpty() ) {
449 text += Qtopia::escapeString(value); 450 text += Qtopia::escapeString(value);
450 if ( comp ) 451 if ( comp )
451 text += ", "; 452 text += ", ";
452 else 453 else
453 text += "<br>"; 454 text += "<br>";
454 } 455 }
455 if ( !comp.isEmpty() ) 456 if ( !comp.isEmpty() )
456 text += Qtopia::escapeString(comp) + "<br>"; 457 text += Qtopia::escapeString(comp) + "<br>";
457 458
459 text += "<hr><br>";
460
461 // defailt email
458 QString defEmail = defaultEmail(); 462 QString defEmail = defaultEmail();
459 if ( !defEmail.isEmpty() ) 463 if ( !defEmail.isEmpty() )
460 text += "<b>" + QObject::tr("Default Email: ") + "</b>" 464 text += "<b><img src=\"addressbook/email\">" + QObject::tr("Default Email: ") + "</b>"
461 + Qtopia::escapeString(defEmail) + "<br>"; 465 + Qtopia::escapeString(defEmail) + "<br>";
462 466
463 text += "<hr>"; 467 text += "<br>";
464 468
465 // business address 469 // business address
466 if ( !businessStreet().isEmpty() || !businessCity().isEmpty() || 470 if ( !businessStreet().isEmpty() || !businessCity().isEmpty() ||
467 !businessZip().isEmpty() || !businessCountry().isEmpty() ) { 471 !businessZip().isEmpty() || !businessCountry().isEmpty() ) {
468 text += "<br>";
469 text += QObject::tr( "<b>Work Address:</b>" ); 472 text += QObject::tr( "<b>Work Address:</b>" );
470 text += "<br>"; 473 text += "<br>";
471 marker = true; 474 marker = true;
472 } 475 }
473 476
474 if ( !(value = businessStreet()).isEmpty() ) 477 if ( !(value = businessStreet()).isEmpty() )
475 text += Qtopia::escapeString(value) + "<br>"; 478 text += Qtopia::escapeString(value) + "<br>";
476 state = businessState(); 479 state = businessState();
477 if ( !(value = businessZip()).isEmpty() ) 480 if ( !(value = businessZip()).isEmpty() )
478 text += Qtopia::escapeString(value) + " "; 481 text += Qtopia::escapeString(value) + " ";
479 if ( !(value = businessCity()).isEmpty() ) { 482 if ( !(value = businessCity()).isEmpty() ) {
480 text += Qtopia::escapeString(value); 483 text += Qtopia::escapeString(value);
481 if ( state ) 484 if ( state )
482 text += ", " + Qtopia::escapeString(state); 485 text += ", " + Qtopia::escapeString(state);
483 text += "<br>"; 486 text += "<br>";
484 } else if ( !state.isEmpty() ) 487 } else if ( !state.isEmpty() )
485 text += Qtopia::escapeString(state) + "<br>"; 488 text += Qtopia::escapeString(state) + "<br>";
486 489
487 if ( !(value = businessCountry()).isEmpty() ) 490 if ( !(value = businessCountry()).isEmpty() )
488 text += Qtopia::escapeString(value) + "<br>"; 491 text += Qtopia::escapeString(value) + "<br>";
489 492
490 // rest of Business data 493 // rest of Business data
491 str = office(); 494 str = office();
492 if ( !str.isEmpty() ){ 495 if ( !str.isEmpty() ){
493 text += "<b>" + QObject::tr("Office: ") + "</b>" 496 text += "<b>" + QObject::tr("Office: ") + "</b>"
494 + Qtopia::escapeString(str) + "<br>"; 497 + Qtopia::escapeString(str) + "<br>";
495 marker = true; 498 marker = true;
496 } 499 }
497 str = businessWebpage(); 500 str = businessWebpage();
498 if ( !str.isEmpty() ){ 501 if ( !str.isEmpty() ){
499 text += "<b>" + QObject::tr("Business Web Page: ") + "</b>" 502 text += "<b><img src=\"addressbook/webpagework\">" + QObject::tr("Business Web Page: ") + "</b>"
500 + Qtopia::escapeString(str) + "<br>"; 503 + Qtopia::escapeString(str) + "<br>";
501 marker = true; 504 marker = true;
502 } 505 }
503 str = businessPhone(); 506 str = businessPhone();
504 if ( !str.isEmpty() ){ 507 if ( !str.isEmpty() ){
505 text += "<b>" + QObject::tr("Business Phone: ") + "</b>" 508 text += "<b><img src=\"addressbook/phonework\">" + QObject::tr("Business Phone: ") + "</b>"
506 + Qtopia::escapeString(str) + "<br>"; 509 + Qtopia::escapeString(str) + "<br>";
507 marker = true; 510 marker = true;
508 } 511 }
509 str = businessFax(); 512 str = businessFax();
510 if ( !str.isEmpty() ){ 513 if ( !str.isEmpty() ){
511 text += "<b>" + QObject::tr("Business Fax: ") + "</b>" 514 text += "<b><img src=\"addressbook/faxwork\">" + QObject::tr("Business Fax: ") + "</b>"
512 + Qtopia::escapeString(str) + "<br>"; 515 + Qtopia::escapeString(str) + "<br>";
513 marker = true; 516 marker = true;
514 } 517 }
515 str = businessMobile(); 518 str = businessMobile();
516 if ( !str.isEmpty() ){ 519 if ( !str.isEmpty() ){
517 text += "<b>" + QObject::tr("Business Mobile: ") + "</b>" 520 text += "<b><img src=\"addressbook/mobilework\">" + QObject::tr("Business Mobile: ") + "</b>"
518 + Qtopia::escapeString(str) + "<br>"; 521 + Qtopia::escapeString(str) + "<br>";
519 marker = true; 522 marker = true;
520 } 523 }
521 str = businessPager(); 524 str = businessPager();
522 if ( !str.isEmpty() ){ 525 if ( !str.isEmpty() ){
523 text += "<b>" + QObject::tr("Business Pager: ") + "</b>" 526 text += "<b>" + QObject::tr("Business Pager: ") + "</b>"
524 + Qtopia::escapeString(str) + "<br>"; 527 + Qtopia::escapeString(str) + "<br>";
525 marker = true; 528 marker = true;
526 } 529 }
527 530
531 text += "<br>";
532
528 // home address 533 // home address
529 if ( !homeStreet().isEmpty() || !homeCity().isEmpty() || 534 if ( !homeStreet().isEmpty() || !homeCity().isEmpty() ||
530 !homeZip().isEmpty() || !homeCountry().isEmpty() ) { 535 !homeZip().isEmpty() || !homeCountry().isEmpty() ) {
531 text += "<br>";
532 text += QObject::tr( "<b>Home Address:</b>" ); 536 text += QObject::tr( "<b>Home Address:</b>" );
533 text += "<br>"; 537 text += "<br>";
534 } 538 }
535 539
536 if ( !(value = homeStreet()).isEmpty() ) 540 if ( !(value = homeStreet()).isEmpty() )
537 text += Qtopia::escapeString(value) + "<br>"; 541 text += Qtopia::escapeString(value) + "<br>";
538 state = homeState(); 542 state = homeState();
539 if ( !(value = homeZip()).isEmpty() ) 543 if ( !(value = homeZip()).isEmpty() )
540 text += Qtopia::escapeString(value) + " "; 544 text += Qtopia::escapeString(value) + " ";
541 if ( !(value = homeCity()).isEmpty() ) { 545 if ( !(value = homeCity()).isEmpty() ) {
542 text += Qtopia::escapeString(value); 546 text += Qtopia::escapeString(value);
543 if ( !state.isEmpty() ) 547 if ( !state.isEmpty() )
544 text += ", " + Qtopia::escapeString(state); 548 text += ", " + Qtopia::escapeString(state);
545 text += "<br>"; 549 text += "<br>";
546 } else if (!state.isEmpty()) 550 } else if (!state.isEmpty())
547 text += Qtopia::escapeString(state) + "<br>"; 551 text += Qtopia::escapeString(state) + "<br>";
548 if ( !(value = homeCountry()).isEmpty() ) 552 if ( !(value = homeCountry()).isEmpty() )
549 text += Qtopia::escapeString(value) + "<br>"; 553 text += Qtopia::escapeString(value) + "<br>";
550 554
551 // rest of Home data 555 // rest of Home data
552 str = homeWebpage(); 556 str = homeWebpage();
553 if ( !str.isEmpty() ){ 557 if ( !str.isEmpty() ){
554 text += "<b>" + QObject::tr("Home Web Page: ") + "</b>" 558 text += "<b><img src=\"addressbook/webpagehome\">" + QObject::tr("Home Web Page: ") + "</b>"
555 + Qtopia::escapeString(str) + "<br>"; 559 + Qtopia::escapeString(str) + "<br>";
556 marker = true; 560 marker = true;
557 } 561 }
558 str = homePhone(); 562 str = homePhone();
559 if ( !str.isEmpty() ){ 563 if ( !str.isEmpty() ){
560 text += "<b>" + QObject::tr("Home Phone: ") + "</b>" 564 text += "<b><img src=\"addressbook/phonehome\">" + QObject::tr("Home Phone: ") + "</b>"
561 + Qtopia::escapeString(str) + "<br>"; 565 + Qtopia::escapeString(str) + "<br>";
562 marker = true; 566 marker = true;
563 } 567 }
564 str = homeFax(); 568 str = homeFax();
565 if ( !str.isEmpty() ){ 569 if ( !str.isEmpty() ){
566 text += "<b>" + QObject::tr("Home Fax: ") + "</b>" 570 text += "<b><img src=\"addressbook/faxhome\">" + QObject::tr("Home Fax: ") + "</b>"
567 + Qtopia::escapeString(str) + "<br>"; 571 + Qtopia::escapeString(str) + "<br>";
568 marker = true; 572 marker = true;
569 } 573 }
570 str = homeMobile(); 574 str = homeMobile();
571 if ( !str.isEmpty() ){ 575 if ( !str.isEmpty() ){
572 text += "<b>" + QObject::tr("Home Mobile: ") + "</b>" 576 text += "<b><img src=\"addressbook/mobilehome\">" + QObject::tr("Home Mobile: ") + "</b>"
573 + Qtopia::escapeString(str) + "<br>"; 577 + Qtopia::escapeString(str) + "<br>";
574 marker = true; 578 marker = true;
575 } 579 }
576 580
577 if ( marker ) 581 if ( marker )
578 text += "<br><hr><br>"; 582 text += "<br><hr><br>";
579 // the others... 583 // the others...
580 str = emails(); 584 str = emails();
581 if ( !str.isEmpty() && ( str != defEmail ) ) 585 if ( !str.isEmpty() && ( str != defEmail ) )
582 text += "<b>" + QObject::tr("All Emails: ") + "</b>" 586 text += "<b>" + QObject::tr("All Emails: ") + "</b>"
583 + Qtopia::escapeString(str) + "<br>"; 587 + Qtopia::escapeString(str) + "<br>";
584 str = profession(); 588 str = profession();
585 if ( !str.isEmpty() ) 589 if ( !str.isEmpty() )
586 text += "<b>" + QObject::tr("Profession: ") + "</b>" 590 text += "<b>" + QObject::tr("Profession: ") + "</b>"
587 + Qtopia::escapeString(str) + "<br>"; 591 + Qtopia::escapeString(str) + "<br>";
588 str = assistant(); 592 str = assistant();
589 if ( !str.isEmpty() ) 593 if ( !str.isEmpty() )
590 text += "<b>" + QObject::tr("Assistant: ") + "</b>" 594 text += "<b>" + QObject::tr("Assistant: ") + "</b>"
591 + Qtopia::escapeString(str) + "<br>"; 595 + Qtopia::escapeString(str) + "<br>";
592 str = manager(); 596 str = manager();
593 if ( !str.isEmpty() ) 597 if ( !str.isEmpty() )
594 text += "<b>" + QObject::tr("Manager: ") + "</b>" 598 text += "<b>" + QObject::tr("Manager: ") + "</b>"
595 + Qtopia::escapeString(str) + "<br>"; 599 + Qtopia::escapeString(str) + "<br>";
596 str = gender(); 600 str = gender();
597 if ( !str.isEmpty() && str.toInt() != 0 ) { 601 if ( !str.isEmpty() && str.toInt() != 0 ) {
598 if ( str.toInt() == 1 ) 602 if ( str.toInt() == 1 )
599 str = QObject::tr( "Male" ); 603 str = QObject::tr( "Male" );
600 else if ( str.toInt() == 2 ) 604 else if ( str.toInt() == 2 )
601 str = QObject::tr( "Female" ); 605 str = QObject::tr( "Female" );
602 text += "<b>" + QObject::tr("Gender: ") + "</b>" + str + "<br>"; 606 text += "<b>" + QObject::tr("Gender: ") + "</b>" + str + "<br>";
603 } 607 }
604 str = spouse(); 608 str = spouse();
605 if ( !str.isEmpty() ) 609 if ( !str.isEmpty() )
606 text += "<b>" + QObject::tr("Spouse: ") + "</b>" 610 text += "<b>" + QObject::tr("Spouse: ") + "</b>"
607 + Qtopia::escapeString(str) + "<br>"; 611 + Qtopia::escapeString(str) + "<br>";
608 if ( birthday().isValid() ){ 612 if ( birthday().isValid() ){
609 str = TimeString::numberDateString( birthday() ); 613 str = TimeString::numberDateString( birthday() );
610 text += "<b>" + QObject::tr("Birthday: ") + "</b>" 614 text += "<b>" + QObject::tr("Birthday: ") + "</b>"
611 + Qtopia::escapeString(str) + "<br>"; 615 + Qtopia::escapeString(str) + "<br>";
612 } 616 }
613 if ( anniversary().isValid() ){ 617 if ( anniversary().isValid() ){
614 str = TimeString::numberDateString( anniversary() ); 618 str = TimeString::numberDateString( anniversary() );
615 text += "<b>" + QObject::tr("Anniversary: ") + "</b>" 619 text += "<b>" + QObject::tr("Anniversary: ") + "</b>"
616 + Qtopia::escapeString(str) + "<br>"; 620 + Qtopia::escapeString(str) + "<br>";
617 } 621 }
618 str = children(); 622 str = children();
619 if ( !str.isEmpty() ) 623 if ( !str.isEmpty() )
620 text += "<b>" + QObject::tr("Children: ") + "</b>" 624 text += "<b>" + QObject::tr("Children: ") + "</b>"
621 + Qtopia::escapeString(str) + "<br>"; 625 + Qtopia::escapeString(str) + "<br>";
622 626
623 str = nickname(); 627 str = nickname();
624 if ( !str.isEmpty() ) 628 if ( !str.isEmpty() )
625 text += "<b>" + QObject::tr("Nickname: ") + "</b>" 629 text += "<b>" + QObject::tr("Nickname: ") + "</b>"
626 + Qtopia::escapeString(str) + "<br>"; 630 + Qtopia::escapeString(str) + "<br>";
627 631
632 // categories
628 if ( categoryNames("Contacts").count() ){ 633 if ( categoryNames("Contacts").count() ){
629 text += "<b>" + QObject::tr( "Category:") + "</b> "; 634 text += "<b>" + QObject::tr( "Category:") + "</b> ";
630 text += categoryNames("Contacts").join(", "); 635 text += categoryNames("Contacts").join(", ");
631 text += "<br>"; 636 text += "<br>";
632 } 637 }
633 638
634 // notes last 639 // notes last
635 if ( !(value = notes()).isEmpty() ) { 640 if ( !(value = notes()).isEmpty() ) {
636 text += "<br><hr><b>" + QObject::tr( "Notes:") + "</b> "; 641 text += "<br><hr><b>" + QObject::tr( "Notes:") + "</b> ";
637 QRegExp reg("\n"); 642 QRegExp reg("\n");
638 643
639 //QString tmp = Qtopia::escapeString(value); 644 //QString tmp = Qtopia::escapeString(value);
640 QString tmp = QStyleSheet::convertFromPlainText(value); 645 QString tmp = QStyleSheet::convertFromPlainText(value);
641 //tmp.replace( reg, "<br>" ); 646 //tmp.replace( reg, "<br>" );
642 text += "<br>" + tmp + "<br>"; 647 text += "<br>" + tmp + "<br>";
643 } 648 }
644 return text; 649 return text;
645} 650}
646 651
647/*! 652/*!
648 \internal 653 \internal
649*/ 654*/
650void OContact::insert( int key, const QString &v ) 655void OContact::insert( int key, const QString &v )
651{ 656{
652 QString value = v.stripWhiteSpace(); 657 QString value = v.stripWhiteSpace();
653 if ( value.isEmpty() ) 658 if ( value.isEmpty() )
654 mMap.remove( key ); 659 mMap.remove( key );
655 else 660 else
656 mMap.insert( key, value ); 661 mMap.insert( key, value );
657} 662}
658 663
659/*! 664/*!
660 \internal 665 \internal
661*/ 666*/
662void OContact::replace( int key, const QString & v ) 667void OContact::replace( int key, const QString & v )
663{ 668{
664 QString value = v.stripWhiteSpace(); 669 QString value = v.stripWhiteSpace();
665 if ( value.isEmpty() ) 670 if ( value.isEmpty() )
666 mMap.remove( key ); 671 mMap.remove( key );
667 else 672 else
668 mMap.replace( key, value ); 673 mMap.replace( key, value );
669} 674}
670 675
671/*! 676/*!
672 \internal 677 \internal
673*/ 678*/
674QString OContact::find( int key ) const 679QString OContact::find( int key ) const
675{ 680{
676 return mMap[key]; 681 return mMap[key];
677} 682}
678 683
679/*! 684/*!
680 \internal 685 \internal
681*/ 686*/
682QString OContact::displayAddress( const QString &street, 687QString OContact::displayAddress( const QString &street,
683 const QString &city, 688 const QString &city,
684 const QString &state, 689 const QString &state,
685 const QString &zip, 690 const QString &zip,
686 const QString &country ) const 691 const QString &country ) const
687{ 692{
688 QString s = street; 693 QString s = street;
689 if ( !street.isEmpty() ) 694 if ( !street.isEmpty() )
690 s+= "\n"; 695 s+= "\n";
691 s += city; 696 s += city;
692 if ( !city.isEmpty() && !state.isEmpty() ) 697 if ( !city.isEmpty() && !state.isEmpty() )
693 s += ", "; 698 s += ", ";
694 s += state; 699 s += state;
695 if ( !state.isEmpty() && !zip.isEmpty() ) 700 if ( !state.isEmpty() && !zip.isEmpty() )
696 s += " "; 701 s += " ";
697 s += zip; 702 s += zip;
698 if ( !country.isEmpty() && !s.isEmpty() ) 703 if ( !country.isEmpty() && !s.isEmpty() )
699 s += "\n"; 704 s += "\n";
700 s += country; 705 s += country;
701 return s; 706 return s;
702} 707}
703 708
704/*! 709/*!
705 \internal 710 \internal
706*/ 711*/
707QString OContact::displayBusinessAddress() const 712QString OContact::displayBusinessAddress() const
708{ 713{
709 return displayAddress( businessStreet(), businessCity(), 714 return displayAddress( businessStreet(), businessCity(),
710 businessState(), businessZip(), 715 businessState(), businessZip(),
711 businessCountry() ); 716 businessCountry() );
712} 717}
713 718
714/*! 719/*!
715 \internal 720 \internal
716*/ 721*/
717QString OContact::displayHomeAddress() const 722QString OContact::displayHomeAddress() const
718{ 723{
719 return displayAddress( homeStreet(), homeCity(), 724 return displayAddress( homeStreet(), homeCity(),
720 homeState(), homeZip(), 725 homeState(), homeZip(),
721 homeCountry() ); 726 homeCountry() );
722} 727}
723 728
diff --git a/libopie2/opiepim/oevent.cpp b/libopie2/opiepim/oevent.cpp
index 83b191f..e4f5d92 100644
--- a/libopie2/opiepim/oevent.cpp
+++ b/libopie2/opiepim/oevent.cpp
@@ -142,208 +142,240 @@ bool OEvent::hasRecurrence()const {
142 if (!data->recur ) return false; 142 if (!data->recur ) return false;
143 return data->recur->doesRecur(); 143 return data->recur->doesRecur();
144} 144}
145QString OEvent::note()const { 145QString OEvent::note()const {
146 return data->note; 146 return data->note;
147} 147}
148void OEvent::setNote( const QString& note ) { 148void OEvent::setNote( const QString& note ) {
149 changeOrModify(); 149 changeOrModify();
150 data->note = note; 150 data->note = note;
151} 151}
152QDateTime OEvent::createdDateTime()const { 152QDateTime OEvent::createdDateTime()const {
153 return data->created; 153 return data->created;
154} 154}
155void OEvent::setCreatedDateTime( const QDateTime& time ) { 155void OEvent::setCreatedDateTime( const QDateTime& time ) {
156 changeOrModify(); 156 changeOrModify();
157 data->created = time; 157 data->created = time;
158} 158}
159QDateTime OEvent::startDateTime()const { 159QDateTime OEvent::startDateTime()const {
160 if ( data->isAllDay ) 160 if ( data->isAllDay )
161 return QDateTime( data->start.date(), QTime(0, 0, 0 ) ); 161 return QDateTime( data->start.date(), QTime(0, 0, 0 ) );
162 return data->start; 162 return data->start;
163} 163}
164QDateTime OEvent::startDateTimeInZone()const { 164QDateTime OEvent::startDateTimeInZone()const {
165 /* if no timezone, or all day event or if the current and this timeZone match... */ 165 /* if no timezone, or all day event or if the current and this timeZone match... */
166 if (data->timezone.isEmpty() || data->isAllDay || data->timezone == OTimeZone::current().timeZone() ) return startDateTime(); 166 if (data->timezone.isEmpty() || data->isAllDay || data->timezone == OTimeZone::current().timeZone() ) return startDateTime();
167 167
168 OTimeZone zone(data->timezone ); 168 OTimeZone zone(data->timezone );
169 return zone.toDateTime( data->start, OTimeZone::current() ); 169 return zone.toDateTime( data->start, OTimeZone::current() );
170} 170}
171void OEvent::setStartDateTime( const QDateTime& dt ) { 171void OEvent::setStartDateTime( const QDateTime& dt ) {
172 changeOrModify(); 172 changeOrModify();
173 data->start = dt; 173 data->start = dt;
174} 174}
175QDateTime OEvent::endDateTime()const { 175QDateTime OEvent::endDateTime()const {
176 /* 176 /*
177 * if all Day event the end time needs 177 * if all Day event the end time needs
178 * to be on the same day as the start 178 * to be on the same day as the start
179 */ 179 */
180 if ( data->isAllDay ) 180 if ( data->isAllDay )
181 return QDateTime( data->start.date(), QTime(23, 59, 59 ) ); 181 return QDateTime( data->start.date(), QTime(23, 59, 59 ) );
182 return data->end; 182 return data->end;
183} 183}
184QDateTime OEvent::endDateTimeInZone()const { 184QDateTime OEvent::endDateTimeInZone()const {
185 /* if no timezone, or all day event or if the current and this timeZone match... */ 185 /* if no timezone, or all day event or if the current and this timeZone match... */
186 if (data->timezone.isEmpty() || data->isAllDay || data->timezone == OTimeZone::current().timeZone() ) return endDateTime(); 186 if (data->timezone.isEmpty() || data->isAllDay || data->timezone == OTimeZone::current().timeZone() ) return endDateTime();
187 187
188 OTimeZone zone(data->timezone ); 188 OTimeZone zone(data->timezone );
189 return zone.toDateTime( data->end, OTimeZone::current() ); 189 return zone.toDateTime( data->end, OTimeZone::current() );
190} 190}
191void OEvent::setEndDateTime( const QDateTime& dt ) { 191void OEvent::setEndDateTime( const QDateTime& dt ) {
192 changeOrModify(); 192 changeOrModify();
193 data->end = dt; 193 data->end = dt;
194} 194}
195bool OEvent::isMultipleDay()const { 195bool OEvent::isMultipleDay()const {
196 return data->end.date().day() - data->start.date().day(); 196 return data->end.date().day() - data->start.date().day();
197} 197}
198bool OEvent::isAllDay()const { 198bool OEvent::isAllDay()const {
199 return data->isAllDay; 199 return data->isAllDay;
200} 200}
201void OEvent::setAllDay( bool allDay ) { 201void OEvent::setAllDay( bool allDay ) {
202 changeOrModify(); 202 changeOrModify();
203 data->isAllDay = allDay; 203 data->isAllDay = allDay;
204 if (allDay ) data->timezone = "UTC"; 204 if (allDay ) data->timezone = "UTC";
205} 205}
206void OEvent::setTimeZone( const QString& tz ) { 206void OEvent::setTimeZone( const QString& tz ) {
207 changeOrModify(); 207 changeOrModify();
208 data->timezone = tz; 208 data->timezone = tz;
209} 209}
210QString OEvent::timeZone()const { 210QString OEvent::timeZone()const {
211 if (data->isAllDay ) return QString::fromLatin1("UTC"); 211 if (data->isAllDay ) return QString::fromLatin1("UTC");
212 return data->timezone; 212 return data->timezone;
213} 213}
214bool OEvent::match( const QRegExp& re )const { 214bool OEvent::match( const QRegExp& re )const {
215 if ( re.match( data->description ) != -1 ){ 215 if ( re.match( data->description ) != -1 ){
216 setLastHitField( Qtopia::DatebookDescription ); 216 setLastHitField( Qtopia::DatebookDescription );
217 return true; 217 return true;
218 } 218 }
219 if ( re.match( data->note ) != -1 ){ 219 if ( re.match( data->note ) != -1 ){
220 setLastHitField( Qtopia::Note ); 220 setLastHitField( Qtopia::Note );
221 return true; 221 return true;
222 } 222 }
223 if ( re.match( data->location ) != -1 ){ 223 if ( re.match( data->location ) != -1 ){
224 setLastHitField( Qtopia::Location ); 224 setLastHitField( Qtopia::Location );
225 return true; 225 return true;
226 } 226 }
227 if ( re.match( data->start.toString() ) != -1 ){ 227 if ( re.match( data->start.toString() ) != -1 ){
228 setLastHitField( Qtopia::StartDateTime ); 228 setLastHitField( Qtopia::StartDateTime );
229 return true; 229 return true;
230 } 230 }
231 if ( re.match( data->end.toString() ) != -1 ){ 231 if ( re.match( data->end.toString() ) != -1 ){
232 setLastHitField( Qtopia::EndDateTime ); 232 setLastHitField( Qtopia::EndDateTime );
233 return true; 233 return true;
234 } 234 }
235 return false; 235 return false;
236} 236}
237QString OEvent::toRichText()const { 237QString OEvent::toRichText()const {
238 QString text; 238 QString text, value;
239
240 // description
241 text += "<b><h3><img src=\"datebook/DateBook\">";
239 if ( !description().isEmpty() ) { 242 if ( !description().isEmpty() ) {
240 text += "<b>" + QObject::tr( "Description:") + "</b><br>"; 243 text += Qtopia::escapeString(description() ).replace(QRegExp( "[\n]"), "" );
241 text += Qtopia::escapeString(description() ). 244 }
242 replace(QRegExp( "[\n]"), "<br>" ) + "<br>"; 245 text += "</h3></b><br><hr><br>";
246
247 // location
248 if ( !(value = location()).isEmpty() ) {
249 text += "<b>" + QObject::tr( "Location:" ) + "</b> ";
250 text += Qtopia::escapeString(value) + "<br>";
251 }
252
253 // all day event
254 if ( isAllDay() ) {
255 text += "<b><i>" + QObject::tr( "This is an all day event" ) + "</i></b><br>";
243 } 256 }
244 if ( startDateTime().isValid() ) { 257 // multiple day event
245 text += "<b>" + QObject::tr( "Start:") + "</b> "; 258 else if ( isMultipleDay () ) {
246 text += Qtopia::escapeString(startDateTime().toString() ). 259 text += "<b><i>" + QObject::tr( "This is a multiple day event" ) + "</i></b><br>";
247 replace(QRegExp( "[\n]"), "<br>" ) + "<br>"; 260 }
261 // start & end times
262 else {
263 // start time
264 if ( startDateTime().isValid() ) {
265 text += "<b>" + QObject::tr( "Start:") + "</b> ";
266 text += Qtopia::escapeString(startDateTime().toString() ).
267 replace(QRegExp( "[\n]"), "<br>" ) + "<br>";
268 }
269
270 // end time
271 if ( endDateTime().isValid() ) {
272 text += "<b>" + QObject::tr( "End:") + "</b> ";
273 text += Qtopia::escapeString(endDateTime().toString() ).
274 replace(QRegExp( "[\n]"), "<br>" ) + "<br>";
275 }
248 } 276 }
249 if ( endDateTime().isValid() ) { 277
250 text += "<b>" + QObject::tr( "End:") + "</b> "; 278 // categories
251 text += Qtopia::escapeString(endDateTime().toString() ). 279 if ( categoryNames("Calendar").count() ){
252 replace(QRegExp( "[\n]"), "<br>" ) + "<br>"; 280 text += "<b>" + QObject::tr( "Category:") + "</b> ";
281 text += categoryNames("Calendar").join(", ");
282 text += "<br>";
253 } 283 }
284
285 //notes
254 if ( !note().isEmpty() ) { 286 if ( !note().isEmpty() ) {
255 text += "<b>" + QObject::tr( "Note:") + "</b><br>"; 287 text += "<b>" + QObject::tr( "Note:") + "</b><br>";
256 text += note(); 288 text += note();
257// text += Qtopia::escapeString(note() ). 289// text += Qtopia::escapeString(note() ).
258// replace(QRegExp( "[\n]"), "<br>" ) + "<br>"; 290// replace(QRegExp( "[\n]"), "<br>" ) + "<br>";
259 } 291 }
260 return text; 292 return text;
261} 293}
262QString OEvent::toShortText()const { 294QString OEvent::toShortText()const {
263 QString text; 295 QString text;
264 text += QString::number( startDateTime().date().day() ); 296 text += QString::number( startDateTime().date().day() );
265 text += "."; 297 text += ".";
266 text += QString::number( startDateTime().date().month() ); 298 text += QString::number( startDateTime().date().month() );
267 text += "."; 299 text += ".";
268 text += QString::number( startDateTime().date().year() ); 300 text += QString::number( startDateTime().date().year() );
269 text += " "; 301 text += " ";
270 text += QString::number( startDateTime().time().hour() ); 302 text += QString::number( startDateTime().time().hour() );
271 text += ":"; 303 text += ":";
272 text += QString::number( startDateTime().time().minute() ); 304 text += QString::number( startDateTime().time().minute() );
273 text += " - "; 305 text += " - ";
274 text += description(); 306 text += description();
275 return text; 307 return text;
276} 308}
277QString OEvent::type()const { 309QString OEvent::type()const {
278 return QString::fromLatin1("OEvent"); 310 return QString::fromLatin1("OEvent");
279} 311}
280QString OEvent::recordField( int /*id */ )const { 312QString OEvent::recordField( int /*id */ )const {
281 return QString::null; 313 return QString::null;
282} 314}
283int OEvent::rtti() { 315int OEvent::rtti() {
284 return OPimResolver::DateBook; 316 return OPimResolver::DateBook;
285} 317}
286bool OEvent::loadFromStream( QDataStream& ) { 318bool OEvent::loadFromStream( QDataStream& ) {
287 return true; 319 return true;
288} 320}
289bool OEvent::saveToStream( QDataStream& )const { 321bool OEvent::saveToStream( QDataStream& )const {
290 return true; 322 return true;
291} 323}
292void OEvent::changeOrModify() { 324void OEvent::changeOrModify() {
293 if ( data->count != 1 ) { 325 if ( data->count != 1 ) {
294 data->deref(); 326 data->deref();
295 Data* d2 = new Data; 327 Data* d2 = new Data;
296 d2->description = data->description; 328 d2->description = data->description;
297 d2->location = data->location; 329 d2->location = data->location;
298 330
299 if (data->manager ) 331 if (data->manager )
300 d2->manager = new OPimNotifyManager( *data->manager ); 332 d2->manager = new OPimNotifyManager( *data->manager );
301 333
302 if ( data->recur ) 334 if ( data->recur )
303 d2->recur = new ORecur( *data->recur ); 335 d2->recur = new ORecur( *data->recur );
304 336
305 d2->note = data->note; 337 d2->note = data->note;
306 d2->created = data->created; 338 d2->created = data->created;
307 d2->start = data->start; 339 d2->start = data->start;
308 d2->end = data->end; 340 d2->end = data->end;
309 d2->isAllDay = data->isAllDay; 341 d2->isAllDay = data->isAllDay;
310 d2->timezone = data->timezone; 342 d2->timezone = data->timezone;
311 d2->parent = data->parent; 343 d2->parent = data->parent;
312 344
313 if ( data->child ) { 345 if ( data->child ) {
314 d2->child = new QArray<int>( *data->child ); 346 d2->child = new QArray<int>( *data->child );
315 d2->child->detach(); 347 d2->child->detach();
316 } 348 }
317 349
318 data = d2; 350 data = d2;
319 } 351 }
320} 352}
321void OEvent::deref() { 353void OEvent::deref() {
322 if ( data->deref() ) { 354 if ( data->deref() ) {
323 delete data; 355 delete data;
324 data = 0; 356 data = 0;
325 } 357 }
326} 358}
327// FIXME 359// FIXME
328QMap<int, QString> OEvent::toMap()const { 360QMap<int, QString> OEvent::toMap()const {
329 return QMap<int, QString>(); 361 return QMap<int, QString>();
330} 362}
331QMap<QString, QString> OEvent::toExtraMap()const { 363QMap<QString, QString> OEvent::toExtraMap()const {
332 return QMap<QString, QString>(); 364 return QMap<QString, QString>();
333} 365}
334int OEvent::parent()const { 366int OEvent::parent()const {
335 return data->parent; 367 return data->parent;
336} 368}
337void OEvent::setParent( int uid ) { 369void OEvent::setParent( int uid ) {
338 changeOrModify(); 370 changeOrModify();
339 data->parent = uid; 371 data->parent = uid;
340} 372}
341QArray<int> OEvent::children() const{ 373QArray<int> OEvent::children() const{
342 if (!data->child) return QArray<int>(); 374 if (!data->child) return QArray<int>();
343 else 375 else
344 return data->child->copy(); 376 return data->child->copy();
345} 377}
346void OEvent::setChildren( const QArray<int>& arr ) { 378void OEvent::setChildren( const QArray<int>& arr ) {
347 changeOrModify(); 379 changeOrModify();
348 if (data->child) delete data->child; 380 if (data->child) delete data->child;
349 381
diff --git a/libopie2/opiepim/otodo.cpp b/libopie2/opiepim/otodo.cpp
index e087a00..c84eeeb 100644
--- a/libopie2/opiepim/otodo.cpp
+++ b/libopie2/opiepim/otodo.cpp
@@ -180,213 +180,247 @@ ORecur OTodo::recurrence()const {
180 180
181 return (*data->recur); 181 return (*data->recur);
182} 182}
183bool OTodo::hasMaintainer()const { 183bool OTodo::hasMaintainer()const {
184 if (!data->maintainer) return false; 184 if (!data->maintainer) return false;
185 185
186 return (data->maintainer->mode() != OPimMaintainer::Undefined ); 186 return (data->maintainer->mode() != OPimMaintainer::Undefined );
187} 187}
188OPimMaintainer OTodo::maintainer()const { 188OPimMaintainer OTodo::maintainer()const {
189 if (!data->maintainer) return OPimMaintainer(); 189 if (!data->maintainer) return OPimMaintainer();
190 190
191 return (*data->maintainer); 191 return (*data->maintainer);
192} 192}
193void OTodo::setCompleted( bool completed ) 193void OTodo::setCompleted( bool completed )
194{ 194{
195 changeOrModify(); 195 changeOrModify();
196 data->isCompleted = completed; 196 data->isCompleted = completed;
197} 197}
198void OTodo::setHasDueDate( bool hasDate ) 198void OTodo::setHasDueDate( bool hasDate )
199{ 199{
200 changeOrModify(); 200 changeOrModify();
201 data->hasDate = hasDate; 201 data->hasDate = hasDate;
202} 202}
203void OTodo::setDescription(const QString &desc ) 203void OTodo::setDescription(const QString &desc )
204{ 204{
205// qWarning( "desc " + desc ); 205// qWarning( "desc " + desc );
206 changeOrModify(); 206 changeOrModify();
207 data->desc = Qtopia::simplifyMultiLineSpace(desc ); 207 data->desc = Qtopia::simplifyMultiLineSpace(desc );
208} 208}
209void OTodo::setSummary( const QString& sum ) 209void OTodo::setSummary( const QString& sum )
210{ 210{
211 changeOrModify(); 211 changeOrModify();
212 data->sum = sum; 212 data->sum = sum;
213} 213}
214void OTodo::setPriority(int prio ) 214void OTodo::setPriority(int prio )
215{ 215{
216 changeOrModify(); 216 changeOrModify();
217 data->priority = prio; 217 data->priority = prio;
218} 218}
219void OTodo::setDueDate( const QDate& date ) 219void OTodo::setDueDate( const QDate& date )
220{ 220{
221 changeOrModify(); 221 changeOrModify();
222 data->date = date; 222 data->date = date;
223} 223}
224void OTodo::setStartDate( const QDate& date ) { 224void OTodo::setStartDate( const QDate& date ) {
225 changeOrModify(); 225 changeOrModify();
226 data->start = date; 226 data->start = date;
227} 227}
228void OTodo::setCompletedDate( const QDate& date ) { 228void OTodo::setCompletedDate( const QDate& date ) {
229 changeOrModify(); 229 changeOrModify();
230 data->completed = date; 230 data->completed = date;
231} 231}
232void OTodo::setState( const OPimState& state ) { 232void OTodo::setState( const OPimState& state ) {
233 changeOrModify(); 233 changeOrModify();
234 if (data->state ) 234 if (data->state )
235 (*data->state) = state; 235 (*data->state) = state;
236 else 236 else
237 data->state = new OPimState( state ); 237 data->state = new OPimState( state );
238} 238}
239void OTodo::setRecurrence( const ORecur& rec) { 239void OTodo::setRecurrence( const ORecur& rec) {
240 changeOrModify(); 240 changeOrModify();
241 if (data->recur ) 241 if (data->recur )
242 (*data->recur) = rec; 242 (*data->recur) = rec;
243 else 243 else
244 data->recur = new ORecur( rec ); 244 data->recur = new ORecur( rec );
245} 245}
246void OTodo::setMaintainer( const OPimMaintainer& pim ) { 246void OTodo::setMaintainer( const OPimMaintainer& pim ) {
247 changeOrModify(); 247 changeOrModify();
248 248
249 if (data->maintainer ) 249 if (data->maintainer )
250 (*data->maintainer) = pim; 250 (*data->maintainer) = pim;
251 else 251 else
252 data->maintainer = new OPimMaintainer( pim ); 252 data->maintainer = new OPimMaintainer( pim );
253} 253}
254bool OTodo::isOverdue( ) 254bool OTodo::isOverdue( )
255{ 255{
256 if( data->hasDate && !data->isCompleted) 256 if( data->hasDate && !data->isCompleted)
257 return QDate::currentDate() > data->date; 257 return QDate::currentDate() > data->date;
258 return false; 258 return false;
259} 259}
260void OTodo::setProgress(ushort progress ) 260void OTodo::setProgress(ushort progress )
261{ 261{
262 changeOrModify(); 262 changeOrModify();
263 data->prog = progress; 263 data->prog = progress;
264} 264}
265QString OTodo::toShortText() const { 265QString OTodo::toShortText() const {
266 return summary(); 266 return summary();
267} 267}
268/*! 268/*!
269 Returns a richt text string 269 Returns a richt text string
270*/ 270*/
271QString OTodo::toRichText() const 271QString OTodo::toRichText() const
272{ 272{
273 QString text; 273 QString text;
274 QStringList catlist; 274 QStringList catlist;
275 275
276 // Description of the todo 276 // summary
277 text += "<b><h3><img src=\"todo/TodoList\">";
277 if ( !summary().isEmpty() ) { 278 if ( !summary().isEmpty() ) {
278 text += "<b>" + QObject::tr( "Summary:") + "</b><br>"; 279 text += Qtopia::escapeString(summary() ).replace(QRegExp( "[\n]"), "" );
279 text += Qtopia::escapeString(summary() ).replace(QRegExp( "[\n]"), "<br>" ) + "<br>";
280 } 280 }
281 text += "</h3></b><br><hr><br>";
282
283 // description
281 if( !description().isEmpty() ){ 284 if( !description().isEmpty() ){
282 text += "<b>" + QObject::tr( "Description:" ) + "</b><br>"; 285 text += "<b>" + QObject::tr( "Description:" ) + "</b><br>";
283 text += Qtopia::escapeString(description() ).replace(QRegExp( "[\n]"), "<br>" ) ; 286 text += Qtopia::escapeString(description() ).replace(QRegExp( "[\n]"), "<br>" ) ;
284 } 287 }
285 text += "<br><br><br>";
286 288
287 text += "<b>" + QObject::tr( "Priority:") +" </b>" 289 // priority
288 + QString::number( priority() ) + " <br>"; 290 int priorityval = priority();
291 text += "<b>" + QObject::tr( "Priority:") +" </b><img src=\"todo/priority" +
292 QString::number( priorityval ) + "\">";
293// text += "<b>" + QObject::tr( "Priority:") +"</b><img src=\"todo/priority" +
294// QString::number( priority() ) + "\"><br>";
295 switch ( priorityval )
296 {
297 case 1 : text += QObject::tr( "Very high" );
298 break;
299 case 2 : text += QObject::tr( "High" );
300 break;
301 case 3 : text += QObject::tr( "Normal" );
302 break;
303 case 4 : text += QObject::tr( "Low" );
304 break;
305 case 5 : text += QObject::tr( "Very low" );
306 break;
307 };
308 text += "<br>";
309
310 // progress
289 text += "<b>" + QObject::tr( "Progress:") + " </b>" 311 text += "<b>" + QObject::tr( "Progress:") + " </b>"
290 + QString::number( progress() ) + " %<br>"; 312 + QString::number( progress() ) + " %<br>";
313
314 // due date
291 if (hasDueDate() ){ 315 if (hasDueDate() ){
292 text += "<b>" + QObject::tr( "Deadline:") + " </b>"; 316 QDate dd = dueDate();
293 text += dueDate().toString(); 317 int off = QDate::currentDate().daysTo( dd );
294 text += "<br>"; 318
319 text += "<b>" + QObject::tr( "Deadline:" ) + " </b><font color=\"";
320 if ( off < 0 )
321 text += "#FF0000";
322 else if ( off == 0 )
323 text += "#FFFF00";
324 else if ( off > 0 )
325 text += "#00FF00";
326
327 text += "\">" + dd.toString() + "</font><br>";
295 } 328 }
296 329
330 // categories
297 text += "<b>" + QObject::tr( "Category:") + "</b> "; 331 text += "<b>" + QObject::tr( "Category:") + "</b> ";
298 text += categoryNames( "Todo List" ).join(", "); 332 text += categoryNames( "Todo List" ).join(", ");
299 text += "<br>"; 333 text += "<br>";
300 334
301 return text; 335 return text;
302} 336}
303bool OTodo::hasNotifiers()const { 337bool OTodo::hasNotifiers()const {
304 if (!data->notifiers) return false; 338 if (!data->notifiers) return false;
305 return !data->notifiers->isEmpty(); 339 return !data->notifiers->isEmpty();
306} 340}
307OPimNotifyManager& OTodo::notifiers() { 341OPimNotifyManager& OTodo::notifiers() {
308 if (!data->notifiers ) 342 if (!data->notifiers )
309 data->notifiers = new OPimNotifyManager; 343 data->notifiers = new OPimNotifyManager;
310 return (*data->notifiers); 344 return (*data->notifiers);
311} 345}
312const OPimNotifyManager& OTodo::notifiers()const{ 346const OPimNotifyManager& OTodo::notifiers()const{
313 if (!data->notifiers ) 347 if (!data->notifiers )
314 data->notifiers = new OPimNotifyManager; 348 data->notifiers = new OPimNotifyManager;
315 349
316 return (*data->notifiers); 350 return (*data->notifiers);
317} 351}
318 352
319bool OTodo::operator<( const OTodo &toDoEvent )const{ 353bool OTodo::operator<( const OTodo &toDoEvent )const{
320 if( !hasDueDate() && !toDoEvent.hasDueDate() ) return true; 354 if( !hasDueDate() && !toDoEvent.hasDueDate() ) return true;
321 if( !hasDueDate() && toDoEvent.hasDueDate() ) return false; 355 if( !hasDueDate() && toDoEvent.hasDueDate() ) return false;
322 if( hasDueDate() && toDoEvent.hasDueDate() ){ 356 if( hasDueDate() && toDoEvent.hasDueDate() ){
323 if( dueDate() == toDoEvent.dueDate() ){ // let's the priority decide 357 if( dueDate() == toDoEvent.dueDate() ){ // let's the priority decide
324 return priority() < toDoEvent.priority(); 358 return priority() < toDoEvent.priority();
325 }else{ 359 }else{
326 return dueDate() < toDoEvent.dueDate(); 360 return dueDate() < toDoEvent.dueDate();
327 } 361 }
328 } 362 }
329 return false; 363 return false;
330} 364}
331bool OTodo::operator<=(const OTodo &toDoEvent )const 365bool OTodo::operator<=(const OTodo &toDoEvent )const
332{ 366{
333 if( !hasDueDate() && !toDoEvent.hasDueDate() ) return true; 367 if( !hasDueDate() && !toDoEvent.hasDueDate() ) return true;
334 if( !hasDueDate() && toDoEvent.hasDueDate() ) return true; 368 if( !hasDueDate() && toDoEvent.hasDueDate() ) return true;
335 if( hasDueDate() && toDoEvent.hasDueDate() ){ 369 if( hasDueDate() && toDoEvent.hasDueDate() ){
336 if( dueDate() == toDoEvent.dueDate() ){ // let's the priority decide 370 if( dueDate() == toDoEvent.dueDate() ){ // let's the priority decide
337 return priority() <= toDoEvent.priority(); 371 return priority() <= toDoEvent.priority();
338 }else{ 372 }else{
339 return dueDate() <= toDoEvent.dueDate(); 373 return dueDate() <= toDoEvent.dueDate();
340 } 374 }
341 } 375 }
342 return true; 376 return true;
343} 377}
344bool OTodo::operator>(const OTodo &toDoEvent )const 378bool OTodo::operator>(const OTodo &toDoEvent )const
345{ 379{
346 if( !hasDueDate() && !toDoEvent.hasDueDate() ) return false; 380 if( !hasDueDate() && !toDoEvent.hasDueDate() ) return false;
347 if( !hasDueDate() && toDoEvent.hasDueDate() ) return false; 381 if( !hasDueDate() && toDoEvent.hasDueDate() ) return false;
348 if( hasDueDate() && toDoEvent.hasDueDate() ){ 382 if( hasDueDate() && toDoEvent.hasDueDate() ){
349 if( dueDate() == toDoEvent.dueDate() ){ // let's the priority decide 383 if( dueDate() == toDoEvent.dueDate() ){ // let's the priority decide
350 return priority() > toDoEvent.priority(); 384 return priority() > toDoEvent.priority();
351 }else{ 385 }else{
352 return dueDate() > toDoEvent.dueDate(); 386 return dueDate() > toDoEvent.dueDate();
353 } 387 }
354 } 388 }
355 return false; 389 return false;
356} 390}
357bool OTodo::operator>=(const OTodo &toDoEvent )const 391bool OTodo::operator>=(const OTodo &toDoEvent )const
358{ 392{
359 if( !hasDueDate() && !toDoEvent.hasDueDate() ) return true; 393 if( !hasDueDate() && !toDoEvent.hasDueDate() ) return true;
360 if( !hasDueDate() && toDoEvent.hasDueDate() ) return false; 394 if( !hasDueDate() && toDoEvent.hasDueDate() ) return false;
361 if( hasDueDate() && toDoEvent.hasDueDate() ){ 395 if( hasDueDate() && toDoEvent.hasDueDate() ){
362 if( dueDate() == toDoEvent.dueDate() ){ // let's the priority decide 396 if( dueDate() == toDoEvent.dueDate() ){ // let's the priority decide
363 return priority() > toDoEvent.priority(); 397 return priority() > toDoEvent.priority();
364 }else{ 398 }else{
365 return dueDate() > toDoEvent.dueDate(); 399 return dueDate() > toDoEvent.dueDate();
366 } 400 }
367 } 401 }
368 return true; 402 return true;
369} 403}
370bool OTodo::operator==(const OTodo &toDoEvent )const 404bool OTodo::operator==(const OTodo &toDoEvent )const
371{ 405{
372 if ( data->priority != toDoEvent.data->priority ) return false; 406 if ( data->priority != toDoEvent.data->priority ) return false;
373 if ( data->priority != toDoEvent.data->prog ) return false; 407 if ( data->priority != toDoEvent.data->prog ) return false;
374 if ( data->isCompleted != toDoEvent.data->isCompleted ) return false; 408 if ( data->isCompleted != toDoEvent.data->isCompleted ) return false;
375 if ( data->hasDate != toDoEvent.data->hasDate ) return false; 409 if ( data->hasDate != toDoEvent.data->hasDate ) return false;
376 if ( data->date != toDoEvent.data->date ) return false; 410 if ( data->date != toDoEvent.data->date ) return false;
377 if ( data->sum != toDoEvent.data->sum ) return false; 411 if ( data->sum != toDoEvent.data->sum ) return false;
378 if ( data->desc != toDoEvent.data->desc ) return false; 412 if ( data->desc != toDoEvent.data->desc ) return false;
379 if ( data->maintainer != toDoEvent.data->maintainer ) 413 if ( data->maintainer != toDoEvent.data->maintainer )
380 return false; 414 return false;
381 415
382 return OPimRecord::operator==( toDoEvent ); 416 return OPimRecord::operator==( toDoEvent );
383} 417}
384void OTodo::deref() { 418void OTodo::deref() {
385 419
386// qWarning("deref in ToDoEvent"); 420// qWarning("deref in ToDoEvent");
387 if ( data->deref() ) { 421 if ( data->deref() ) {
388// qWarning("deleting"); 422// qWarning("deleting");
389 delete data; 423 delete data;
390 data= 0; 424 data= 0;
391 } 425 }
392} 426}