summaryrefslogtreecommitdiff
path: root/core/pim/todo/todotable.cpp
Unidiff
Diffstat (limited to 'core/pim/todo/todotable.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--core/pim/todo/todotable.cpp148
1 files changed, 136 insertions, 12 deletions
diff --git a/core/pim/todo/todotable.cpp b/core/pim/todo/todotable.cpp
index 2acd03c..401d2c8 100644
--- a/core/pim/todo/todotable.cpp
+++ b/core/pim/todo/todotable.cpp
@@ -19,37 +19,41 @@
19**********************************************************************/ 19**********************************************************************/
20/* Show Deadline was added by Stefan Eilers (se, eilers.stefan@epost.de) 20/* Show Deadline was added by Stefan Eilers (se, eilers.stefan@epost.de)
21 */ 21 */
22#include "todotable.h" 22#include "todotable.h"
23 23
24#include <opie/tododb.h> 24#include <opie/tododb.h>
25#include <opie/xmltree.h>
26
25#include <qpe/categoryselect.h> 27#include <qpe/categoryselect.h>
26#include <qpe/xmlreader.h> 28#include <qpe/xmlreader.h>
27 29
28#include <qasciidict.h> 30#include <qasciidict.h>
29#include <qcombobox.h> 31#include <qcombobox.h>
30#include <qfile.h> 32#include <qfile.h>
31#include <qpainter.h> 33#include <qpainter.h>
32#include <qtextcodec.h> 34#include <qtextcodec.h>
33#include <qtimer.h> 35#include <qtimer.h>
34#include <qdatetime.h> 36#include <qdatetime.h>
37#include <qtextstream.h>
35 38
36#include <qcursor.h> 39#include <qcursor.h>
37#include <qregexp.h> 40#include <qregexp.h>
38 41
39#include <errno.h> 42#include <errno.h>
40#include <stdlib.h> 43#include <stdlib.h>
41 44
42#include <stdio.h> 45#include <stdio.h>
46#include <iostream>
43 47
48namespace {
44 49
45 50 static bool taskCompare( const ToDoEvent &task, const QRegExp &r, int category );
46static bool taskCompare( const ToDoEvent &task, const QRegExp &r, int category ); 51 static QString journalFileName();
47 52 static ToDoEvent xmlToEvent( XMLElement *ev );
48static QString journalFileName(); 53}
49
50CheckItem::CheckItem( QTable *t, const QString &key ) 54CheckItem::CheckItem( QTable *t, const QString &key )
51 : QTableItem( t, Never, "" ), checked( FALSE ), sortKey( key ) 55 : QTableItem( t, Never, "" ), checked( FALSE ), sortKey( key )
52{ 56{
53} 57}
54 58
55QString CheckItem::key() const 59QString CheckItem::key() const
@@ -406,22 +410,21 @@ bool TodoTable::save( const QString &fn )
406} 410}
407 411
408void TodoTable::load( const QString &fn ) 412void TodoTable::load( const QString &fn )
409{ 413{
410 loadFile( fn, false ); 414 loadFile( fn, false );
411 if ( QFile::exists(journalFileName()) ) { 415 if ( QFile::exists(journalFileName()) ) {
412 loadFile( journalFileName(), true ); 416 applyJournal( );
413 save( fn ); 417 save( fn );
414 } 418 }
415// QTable::sortColumn(2,TRUE,TRUE); 419// QTable::sortColumn(2,TRUE,TRUE);
416// QTable::sortColumn(1,TRUE,TRUE); 420// QTable::sortColumn(1,TRUE,TRUE);
417 QTable::sortColumn(0,TRUE,TRUE); 421 QTable::sortColumn(0,TRUE,TRUE);
418 setCurrentCell( 0, 2 ); 422 setCurrentCell( 0, 2 );
419 setSorting(true ); 423 setSorting(true );
420} 424}
421
422void TodoTable::updateVisible() 425void TodoTable::updateVisible()
423{ 426{
424 if ( !isUpdatesEnabled() ) 427 if ( !isUpdatesEnabled() )
425 return; 428 return;
426 429
427 if (showDeadl){ 430 if (showDeadl){
@@ -443,13 +446,13 @@ void TodoTable::updateVisible()
443 hide = true; 446 hide = true;
444 if ( !showCat.isEmpty() ) { 447 if ( !showCat.isEmpty() ) {
445 if ( showCat == tr( "Unfiled" ) ) { 448 if ( showCat == tr( "Unfiled" ) ) {
446 if ( vlCats.count() > 0 ) 449 if ( vlCats.count() > 0 )
447 hide = true; 450 hide = true;
448 } else { 451 } else {
449 // do some comparing, we have to reverse our idea here... which idea - zecke 452 // do some comparing, we have to reverse our idea here... which idea? - zecke
450 if ( !hide ) { 453 if ( !hide ) {
451 hide = true; 454 hide = true;
452 for ( uint it = 0; it < vlCats.count(); ++it ) { 455 for ( uint it = 0; it < vlCats.count(); ++it ) {
453 if ( vlCats[it] == id ) { 456 if ( vlCats[it] == id ) {
454 hide = false; 457 hide = false;
455 break; 458 break;
@@ -496,12 +499,13 @@ void TodoTable::setPaintingEnabled( bool e )
496 499
497void TodoTable::clear() 500void TodoTable::clear()
498{ 501{
499 for ( QMap<CheckItem*, ToDoEvent *>::Iterator it = todoList.begin(); 502 for ( QMap<CheckItem*, ToDoEvent *>::Iterator it = todoList.begin();
500 it != todoList.end(); ++it ) { 503 it != todoList.end(); ++it ) {
501 ToDoEvent *todo = *it; 504 ToDoEvent *todo = *it;
505 updateJournal( todo, ACTION_REMOVE, 0 );
502 delete todo; 506 delete todo;
503 } 507 }
504 todoList.clear(); 508 todoList.clear();
505 for ( int r = 0; r < numRows(); ++r ) { 509 for ( int r = 0; r < numRows(); ++r ) {
506 for ( int c = 0; c < numCols(); ++c ) { 510 for ( int c = 0; c < numCols(); ++c ) {
507 if ( cellWidget( r, c ) ) 511 if ( cellWidget( r, c ) )
@@ -530,23 +534,40 @@ void TodoTable::slotCheckPriority(int row, int col )
530 ComboItem* i = static_cast<ComboItem*>( item( row, col ) ); 534 ComboItem* i = static_cast<ComboItem*>( item( row, col ) );
531 emit signalPriorityChanged( i->text().toInt() ); 535 emit signalPriorityChanged( i->text().toInt() );
532 } 536 }
533} 537}
534 538
535 539
536void TodoTable::updateJournal( const ToDoEvent &/*todo*/, journal_action action, int row ) 540void TodoTable::updateJournal( const ToDoEvent &todo, journal_action action, int row )
537{ 541{
538 QFile f( journalFileName() ); 542 QFile f( journalFileName() );
539 if ( !f.open(IO_WriteOnly|IO_Append) ) 543 if ( !f.open(IO_WriteOnly|IO_Append) )
540 return; 544 return;
541 QString buf; 545 QString buf;
542 QCString str; 546 QCString str;
543 buf = "<Task"; 547 buf = "<Task";
544 // todo.save( buf ); 548 // todo.save( buf );
545 buf += " Action=\"" + QString::number( int(action) ) + "\""; 549 buf += " Action=\"" + QString::number( int(action) ) + "\"";
546 buf += " Row=\"" + QString::number( row ) + "\""; // better write the id 550 buf += " Uid=\"" + QString::number( todo.uid() ) + "\""; // better write the id
551 buf += " Completed=\""+ QString::number((int)todo.isCompleted() ) + "\"";
552 buf += " HasDate=\""+ QString::number((int)todo.hasDate() ) +"\"";
553 buf += " Priority=\"" + QString::number( todo.priority() ) + "\"";
554 QArray<int> arrat = todo.categories();
555 QString attr;
556 for(uint i=0; i < arrat.count(); i++ ){
557 attr.append(QString::number(arrat[i])+";" );
558 }
559 if(!attr.isEmpty() ) // remove the last ;
560 attr.remove(attr.length()-1, 1 );
561 buf += " Categories=\"" + attr + "\"";
562 buf += " Description=\"" + todo.description() + "\"";
563 if(todo.hasDate() ) {
564 buf += " DateYear=\""+QString::number( todo.date().year() ) + "\"";
565 buf += " DateMonth=\"" + QString::number( todo.date().month() ) + "\"";
566 buf += " DateDay=\"" + QString::number( todo.date().day() ) + "\"";
567 }
547 buf += "/>\n"; 568 buf += "/>\n";
548 str = buf.utf8(); 569 str = buf.utf8();
549 f.writeBlock( str.data(), str.length() ); 570 f.writeBlock( str.data(), str.length() );
550 f.close(); 571 f.close();
551} 572}
552 573
@@ -712,13 +733,61 @@ int TodoTable::showCategoryId() const
712 id = -1; 733 id = -1;
713 // if allcategories are selected, you get unfiled... 734 // if allcategories are selected, you get unfiled...
714 if ( showCat != tr( "Unfiled" ) && showCat != tr( "All" ) ) 735 if ( showCat != tr( "Unfiled" ) && showCat != tr( "All" ) )
715 id = mCat.id( "Todo List", showCat ); 736 id = mCat.id( "Todo List", showCat );
716 return id; 737 return id;
717} 738}
718 739void TodoTable::applyJournal()
740{
741 // we need to hack
742 QFile file( journalFileName() );
743 if( file.open(IO_ReadOnly ) ) {
744 QByteArray ar = file.readAll();
745 file.close();
746 QFile file2( journalFileName() + "_new" );
747 if( file2.open(IO_WriteOnly ) ){
748 QTextStream str(&file2 );
749 str << QString::fromLatin1("<Tasks>") << endl;
750 str << ar.data();
751 str << QString::fromLatin1("</Tasks>") << endl;
752 file2.close();
753 }
754 XMLElement *root = XMLElement::load(journalFileName()+ "_new");
755 XMLElement *el = root->firstChild();
756 el = el->firstChild();
757 while( el ){
758 qWarning("journal: %s %s", el->attribute("Uid" ).latin1(), el->tagName().latin1() );
759 doApply( el );
760 el = el->nextChild();
761 }
762 QFile::remove(journalFileName()+ "_new" );
763 }
764}
765// check Action and decide
766void TodoTable::doApply(XMLElement *el )
767{
768 QString dummy;
769 bool ok;
770 int action;
771 dummy = el->attribute("Action" );
772 action = dummy.toInt(&ok );
773 ToDoEvent ev = xmlToEvent( el );
774 if( ok ){
775 switch( action ){
776 case ACTION_ADD:
777 addEntry( ev );
778 break;
779 case ACTION_REMOVE:{ // find an entry with the same uid and remove it then
780 break;
781 }
782 case ACTION_REPLACE:
783 break;
784 }
785 }
786}
787namespace {
719static bool taskCompare( const ToDoEvent &task, const QRegExp &r, int category ) 788static bool taskCompare( const ToDoEvent &task, const QRegExp &r, int category )
720{ 789{
721 bool returnMe; 790 bool returnMe;
722 QArray<int> cats; 791 QArray<int> cats;
723 cats = task.categories(); 792 cats = task.categories();
724 793
@@ -738,16 +807,70 @@ static bool taskCompare( const ToDoEvent &task, const QRegExp &r, int category )
738} 807}
739 808
740static QString journalFileName() 809static QString journalFileName()
741{ 810{
742 QString str; 811 QString str;
743 str = getenv( "HOME" ); 812 str = getenv( "HOME" );
744 str += "/.todojournal"; 813 str += "/.opie_todojournal";
745 return str; 814 return str;
746} 815}
816static ToDoEvent xmlToEvent( XMLElement *element )
817{
818 QString dummy;
819 ToDoEvent event;
820 bool ok;
821 int dumInt;
822 // completed
823 dummy = element->attribute("Completed" );
824 dumInt = dummy.toInt(&ok );
825 if(ok ) event.setCompleted( dumInt == 0 ? false : true );
826 // hasDate
827 dummy = element->attribute("HasDate" );
828 dumInt = dummy.toInt(&ok );
829 if(ok ) event.setHasDate( dumInt == 0 ? false: true );
830 // set the date
831 bool hasDa = dumInt;
832 if ( hasDa ) { //parse the date
833 int year, day, month = 0;
834 year = day = month;
835 // year
836 dummy = element->attribute("DateYear" );
837 dumInt = dummy.toInt(&ok );
838 if( ok ) year = dumInt;
839 // month
840 dummy = element->attribute("DateMonth" );
841 dumInt = dummy.toInt(&ok );
842 if(ok ) month = dumInt;
843 dummy = element->attribute("DateDay" );
844 dumInt = dummy.toInt(&ok );
845 if(ok ) day = dumInt;
846 // set the date
847 QDate date( year, month, day );
848 event.setDate( date);
849 }
850 dummy = element->attribute("Priority" );
851 dumInt = dummy.toInt(&ok );
852 if(!ok ) dumInt = ToDoEvent::NORMAL;
853 event.setPriority( dumInt );
854 //description
855 dummy = element->attribute("Description" );
856 event.setDescription( dummy );
857 // category
858 dummy = element->attribute("Categories" );
859 QStringList ids = QStringList::split(";", dummy );
860 event.setCategories( ids );
861
862 //uid
863 dummy = element->attribute("Uid" );
864 dumInt = dummy.toInt(&ok );
865 if(ok ) event.setUid( dumInt );
866
867 return event;
868}
747 869
870}
748// int TodoTable::rowHeight( int ) const 871// int TodoTable::rowHeight( int ) const
749// { 872// {
750// return 18; 873// return 18;
751// } 874// }
752 875
753// int TodoTable::rowPos( int row ) const 876// int TodoTable::rowPos( int row ) const
@@ -756,6 +879,7 @@ static QString journalFileName()
756// } 879// }
757 880
758// int TodoTable::rowAt( int pos ) const 881// int TodoTable::rowAt( int pos ) const
759// { 882// {
760// return QMIN( pos/18, numRows()-1 ); 883// return QMIN( pos/18, numRows()-1 );
761// } 884// }
885