summaryrefslogtreecommitdiff
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--core/pim/todo/mainwindow.cpp106
-rw-r--r--core/pim/todo/mainwindow.h14
-rw-r--r--core/pim/todo/todotable.cpp148
-rw-r--r--core/pim/todo/todotable.h7
4 files changed, 238 insertions, 37 deletions
diff --git a/core/pim/todo/mainwindow.cpp b/core/pim/todo/mainwindow.cpp
index b5cace9..883d78c 100644
--- a/core/pim/todo/mainwindow.cpp
+++ b/core/pim/todo/mainwindow.cpp
@@ -125,4 +125,6 @@ TodoWindow::TodoWindow( QWidget *parent, const char *name, WFlags f = 0 ) :
125 catMenu = new QPopupMenu( this ); 125 catMenu = new QPopupMenu( this );
126 QPopupMenu *edit = new QPopupMenu( this ); 126 QPopupMenu *edit = new QPopupMenu( this );
127 QPopupMenu *options = new QPopupMenu(this );
128
127 contextMenu = new QPopupMenu( this ); 129 contextMenu = new QPopupMenu( this );
128 130
@@ -136,5 +138,5 @@ TodoWindow::TodoWindow( QWidget *parent, const char *name, WFlags f = 0 ) :
136 a->addTo( edit ); 138 a->addTo( edit );
137 139
138 a = new QAction( tr( "Edit" ), Resource::loadIconSet( "edit" ), 140 a = new QAction( tr( "Edit Task" ), Resource::loadIconSet( "edit" ),
139 QString::null, 0, this, 0 ); 141 QString::null, 0, this, 0 );
140 connect( a, SIGNAL( activated() ), 142 connect( a, SIGNAL( activated() ),
@@ -145,6 +147,7 @@ TodoWindow::TodoWindow( QWidget *parent, const char *name, WFlags f = 0 ) :
145 a->setEnabled( FALSE ); 147 a->setEnabled( FALSE );
146 editAction = a; 148 editAction = a;
149 edit->insertSeparator();
147 150
148 a = new QAction( tr( "Delete" ), Resource::loadIconSet( "trash" ), 151 a = new QAction( tr( "Delete..." ), Resource::loadIconSet( "trash" ),
149 QString::null, 0, this, 0 ); 152 QString::null, 0, this, 0 );
150 connect( a, SIGNAL( activated() ), 153 connect( a, SIGNAL( activated() ),
@@ -156,4 +159,24 @@ TodoWindow::TodoWindow( QWidget *parent, const char *name, WFlags f = 0 ) :
156 deleteAction = a; 159 deleteAction = a;
157 160
161 // delete All in category is missing....
162 // set All Done
163 // set All Done in category
164
165 a = new QAction( QString::null, tr( "Delete all..."), 0, this, 0 );
166 connect(a, SIGNAL( activated() ),
167 this, SLOT( slotDeleteAll() ) );
168 a->addTo(edit );
169 a->setEnabled( FALSE );
170 deleteAllAction = a;
171
172 edit->insertSeparator();
173 a = new QAction( QString::null, tr("Duplicate" ), 0, this, 0 );
174 connect(a, SIGNAL( activated() ),
175 this, SLOT( slotDuplicate() ) );
176 a->addTo(edit );
177 a->setEnabled( FALSE );
178 duplicateAction = a;
179
180 edit->insertSeparator();
158 if ( Ir::supported() ) { 181 if ( Ir::supported() ) {
159 a = new QAction( tr( "Beam" ), Resource::loadPixmap( "beam" ), 182 a = new QAction( tr( "Beam" ), Resource::loadPixmap( "beam" ),
@@ -170,5 +193,7 @@ TodoWindow::TodoWindow( QWidget *parent, const char *name, WFlags f = 0 ) :
170 this, SLOT( slotFind() ) ); 193 this, SLOT( slotFind() ) );
171 a->addTo( bar ); 194 a->addTo( bar );
172 a->addTo( edit ); 195 a->addTo( options );
196 options->insertSeparator();
197
173 if ( table->numRows() ) 198 if ( table->numRows() )
174 a->setEnabled( TRUE ); 199 a->setEnabled( TRUE );
@@ -187,7 +212,22 @@ TodoWindow::TodoWindow( QWidget *parent, const char *name, WFlags f = 0 ) :
187 populateCategories(); 212 populateCategories();
188 213
189 mb->insertItem( tr( "Data" ), edit ); 214
190 mb->insertItem( tr( "View" ), catMenu ); 215 completedAction->addTo( options );
216 completedAction->setOn( table->showCompleted() );
217 showdeadlineAction->addTo( options );
218 showdeadlineAction->setOn( table->showDeadline() );
219 options->insertSeparator( );
220 QList<QWidget> list;
221 list.append(table );
222 OFontMenu *menu = new OFontMenu(this, "menu",list );
223 menu->forceSize( table->horizontalHeader(), 10 );
224 //catMenu->insertItem(tr("Fonts"), menu );
225 list.clear();
226 options->insertItem( tr("Fonts"), menu );
227
191 228
229 mb->insertItem( tr( "Data" ), edit );
230 mb->insertItem( tr( "Category" ), catMenu );
231 mb->insertItem( tr( "Options"), options );
192 resize( 200, 300 ); 232 resize( 200, 300 );
193 if ( table->numRows() > 0 ) 233 if ( table->numRows() > 0 )
@@ -280,4 +320,28 @@ void TodoWindow::slotDelete()
280 } 320 }
281} 321}
322void TodoWindow::slotDeleteAll()
323{
324 if(syncing) {
325 QMessageBox::warning(this, tr("Todo"),
326 tr("Can not edit data, currently syncing"));
327 return;
328 }
329
330 //QString strName = table->text( table->currentRow(), 2 ).left( 30 );
331
332 if ( !QPEMessageBox::confirmDelete( this, tr( "Todo" ), tr("Should I delete all tasks?") ) )
333 return;
334
335
336
337 table->setPaintingEnabled( false );
338 table->removeAllEntries();
339 table->setPaintingEnabled( true );
340
341 if ( table->numRows() == 0 ) {
342 currentEntryChanged( -1, 0 );
343 findAction->setEnabled( FALSE );
344 }
345}
282 346
283void TodoWindow::slotEdit() 347void TodoWindow::slotEdit()
@@ -308,5 +372,17 @@ void TodoWindow::slotEdit()
308 372
309} 373}
310 374void TodoWindow::slotDuplicate()
375{
376 if(syncing) {
377 QMessageBox::warning(this, tr("Todo"),
378 tr("Can not edit data, currently syncing"));
379 return;
380 }
381 ToDoEvent ev = table->currentEntry();
382 ToDoEvent ev2 = ToDoEvent( ev );
383 table->setPaintingEnabled( false );
384 table->addEntry( ev2 );
385 table->setPaintingEnabled( true );
386}
311void TodoWindow::slotShowPopup( const QPoint &p ) 387void TodoWindow::slotShowPopup( const QPoint &p )
312{ 388{
@@ -328,7 +404,11 @@ void TodoWindow::currentEntryChanged( int r, int )
328 editAction->setEnabled( TRUE ); 404 editAction->setEnabled( TRUE );
329 deleteAction->setEnabled( TRUE ); 405 deleteAction->setEnabled( TRUE );
406 duplicateAction->setEnabled( TRUE );
407 deleteAllAction->setEnabled( TRUE );
330 } else { 408 } else {
331 editAction->setEnabled( FALSE ); 409 editAction->setEnabled( FALSE );
332 deleteAction->setEnabled( FALSE ); 410 deleteAction->setEnabled( FALSE );
411 duplicateAction->setEnabled( FALSE );
412 deleteAllAction->setEnabled( FALSE );
333 } 413 }
334} 414}
@@ -359,20 +439,8 @@ void TodoWindow::populateCategories()
359{ 439{
360 catMenu->clear(); 440 catMenu->clear();
361
362 QList<QWidget> list;
363 list.append(table );
364 OFontMenu *menu = new OFontMenu(this, "menu",list );
365 menu->forceSize( table->horizontalHeader(), 10 );
366 catMenu->insertItem(tr("Fonts"), menu );
367
368 completedAction->addTo( catMenu );
369 completedAction->setOn( table->showCompleted() );
370 showdeadlineAction->addTo( catMenu );
371 showdeadlineAction->setOn( table->showDeadline() );
372 catMenu->insertSeparator();
373 int id, rememberId; 441 int id, rememberId;
374 id = 1; 442 id = 1;
375 catMenu->insertItem( tr( "All Categories" ), id++ ); 443 catMenu->insertItem( tr( "All Categories" ), id++ );
376// catMenu->insertSeparator(); 444 catMenu->insertSeparator();
377 QStringList categories = table->categories(); 445 QStringList categories = table->categories();
378 categories.append( tr( "Unfiled" ) ); 446 categories.append( tr( "Unfiled" ) );
diff --git a/core/pim/todo/mainwindow.h b/core/pim/todo/mainwindow.h
index 9be7c66..b9172e1 100644
--- a/core/pim/todo/mainwindow.h
+++ b/core/pim/todo/mainwindow.h
@@ -59,5 +59,7 @@ protected slots:
59 void slotBeam(); 59 void slotBeam();
60 void beamDone( Ir * ); 60 void beamDone( Ir * );
61 61 void slotDeleteAll();
62 void slotDuplicate();
63
62protected: 64protected:
63 void closeEvent( QCloseEvent *e ); 65 void closeEvent( QCloseEvent *e );
@@ -69,8 +71,10 @@ private:
69 TodoTable *table; 71 TodoTable *table;
70 QAction *editAction, 72 QAction *editAction,
71 *deleteAction, 73 *deleteAction,
72 *findAction, 74 *findAction,
73 * completedAction, 75 *completedAction,
74 *showdeadlineAction ; 76 *showdeadlineAction,
77 *deleteAllAction,
78 *duplicateAction;
75 QPopupMenu *contextMenu, *catMenu; 79 QPopupMenu *contextMenu, *catMenu;
76 80
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
@@ -23,4 +23,6 @@
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>
@@ -33,4 +35,5 @@
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>
@@ -41,11 +44,12 @@
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 )
@@ -410,5 +414,5 @@ void TodoTable::load( const QString &fn )
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 }
@@ -419,5 +423,4 @@ void TodoTable::load( const QString &fn )
419 setSorting(true ); 423 setSorting(true );
420} 424}
421
422void TodoTable::updateVisible() 425void TodoTable::updateVisible()
423{ 426{
@@ -447,5 +450,5 @@ void TodoTable::updateVisible()
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;
@@ -500,4 +503,5 @@ void TodoTable::clear()
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 }
@@ -534,5 +538,5 @@ void TodoTable::slotCheckPriority(int row, int col )
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() );
@@ -544,5 +548,22 @@ void TodoTable::updateJournal( const ToDoEvent &/*todo*/, journal_action action,
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();
@@ -716,5 +737,53 @@ int TodoTable::showCategoryId() const
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{
@@ -742,8 +811,62 @@ static QString journalFileName()
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// {
@@ -760,2 +883,3 @@ static QString journalFileName()
760// return QMIN( pos/18, numRows()-1 ); 883// return QMIN( pos/18, numRows()-1 );
761// } 884// }
885
diff --git a/core/pim/todo/todotable.h b/core/pim/todo/todotable.h
index 32df514..6917e04 100644
--- a/core/pim/todo/todotable.h
+++ b/core/pim/todo/todotable.h
@@ -93,6 +93,7 @@ class DueTextItem : public QTableItem
93 93
94 94
95enum journal_action { ACTION_ADD, ACTION_REMOVE, ACTION_REPLACE }; 95enum journal_action { ACTION_ADD=0, ACTION_REMOVE, ACTION_REPLACE };
96 96
97class XMLElement;
97class TodoTable : public QTable 98class TodoTable : public QTable
98{ 99{
@@ -121,6 +122,9 @@ public:
121 bool save( const QString &fn ); 122 bool save( const QString &fn );
122 void load( const QString &fn ); 123 void load( const QString &fn );
124 void applyJournal( );
123 void clear(); 125 void clear();
124 void removeCurrentEntry(); 126 void removeCurrentEntry();
127 void removeAllEntries() { clear(); };
128 //void removeAllEntriesInCategory(const QString &category );
125 129
126 void setPaintingEnabled( bool e ); 130 void setPaintingEnabled( bool e );
@@ -154,4 +158,5 @@ private:
154 inline void realignTable( int row ); 158 inline void realignTable( int row );
155 void loadFile( const QString &strFile, bool fromJournal = false ); 159 void loadFile( const QString &strFile, bool fromJournal = false );
160 void doApply(XMLElement *el );
156 161
157private slots: 162private slots: