summaryrefslogtreecommitdiff
authorzecke <zecke>2002-03-20 21:45:51 (UTC)
committer zecke <zecke>2002-03-20 21:45:51 (UTC)
commite9189f8d0cc46b0532fdcbcb2377ae3d108666d5 (patch) (unidiff)
tree20af6104c262510595b82e619ee69b0958596ddd
parent0b39bb8d62f67a86128a6bd16afbd2aae004637c (diff)
downloadopie-e9189f8d0cc46b0532fdcbcb2377ae3d108666d5.zip
opie-e9189f8d0cc46b0532fdcbcb2377ae3d108666d5.tar.gz
opie-e9189f8d0cc46b0532fdcbcb2377ae3d108666d5.tar.bz2
vCal Resource for the tododb
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--core/pim/todo/mainwindow.cpp8
-rw-r--r--core/pim/todo/mainwindow.h3
-rw-r--r--core/pim/todo/todoentryimpl.cpp2
-rw-r--r--libopie/libopie.pro2
-rw-r--r--libopie/tododb.cpp8
-rw-r--r--libopie/todoevent.cpp6
-rw-r--r--libopie/todovcalresource.cpp153
7 files changed, 175 insertions, 7 deletions
diff --git a/core/pim/todo/mainwindow.cpp b/core/pim/todo/mainwindow.cpp
index fb85a09..6709811 100644
--- a/core/pim/todo/mainwindow.cpp
+++ b/core/pim/todo/mainwindow.cpp
@@ -1,68 +1,70 @@
1/********************************************************************** 1/**********************************************************************
2** Copyright (C) 2000 Trolltech AS. All rights reserved. 2** Copyright (C) 2000 Trolltech AS. All rights reserved.
3** 3**
4** This file is part of Qtopia Environment. 4** This file is part of Qtopia Environment.
5** 5**
6** This file may be distributed and/or modified under the terms of the 6** This file may be distributed and/or modified under the terms of the
7** GNU General Public License version 2 as published by the Free Software 7** GNU General Public License version 2 as published by the Free Software
8** Foundation and appearing in the file LICENSE.GPL included in the 8** Foundation and appearing in the file LICENSE.GPL included in the
9** packaging of this file. 9** packaging of this file.
10** 10**
11** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE 11** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
12** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 12** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
13** 13**
14** See http://www.trolltech.com/gpl/ for GPL licensing information. 14** See http://www.trolltech.com/gpl/ for GPL licensing information.
15** 15**
16** Contact info@trolltech.com if any conditions of this licensing are 16** Contact info@trolltech.com if any conditions of this licensing are
17** not clear to you. 17** not clear to you.
18** 18**
19**********************************************************************/ 19**********************************************************************/
20 20
21#define QTOPIA_INTERNAL_FD
22
21#include "mainwindow.h" 23#include "mainwindow.h"
22#include "todoentryimpl.h" 24#include "todoentryimpl.h"
23#include "todotable.h" 25#include "todotable.h"
24 26
25#include <qpe/qpeapplication.h> 27#include <qpe/qpeapplication.h>
26#include <qpe/config.h> 28#include <qpe/config.h>
27#include <qpe/finddialog.h> 29#include <qpe/finddialog.h>
28#include <qpe/global.h> 30#include <qpe/global.h>
29#include <qpe/ir.h> 31#include <qpe/ir.h>
30#include <qpe/qpemenubar.h> 32#include <qpe/qpemenubar.h>
31#include <qpe/qpemessagebox.h> 33#include <qpe/qpemessagebox.h>
32#include <qpe/resource.h> 34#include <qpe/resource.h>
33#include <qpe/task.h> 35#include <qpe/task.h>
34#include <qpe/qpetoolbar.h> 36#include <qpe/qpetoolbar.h>
35 37
36#include <qaction.h> 38#include <qaction.h>
37#include <qarray.h> 39#include <qarray.h>
38#include <qdatastream.h> 40#include <qdatastream.h>
39#include <qdatetime.h> 41#include <qdatetime.h>
40#include <qfile.h> 42#include <qfile.h>
41#include <qmessagebox.h> 43#include <qmessagebox.h>
42#include <qpopupmenu.h> 44#include <qpopupmenu.h>
43 45
44#include <sys/stat.h> 46#include <sys/stat.h>
45#include <sys/types.h> 47#include <sys/types.h>
46#include <fcntl.h> 48#include <fcntl.h>
47#include <unistd.h> 49#include <unistd.h>
48 50
49#include <stdlib.h> 51#include <stdlib.h>
50 52
51static QString todolistXMLFilename() 53static QString todolistXMLFilename()
52{ 54{
53 return Global::applicationFileName("todolist","todolist.xml"); 55 return Global::applicationFileName("todolist","todolist.xml");
54} 56}
55 57
56static QString categoriesXMLFilename() 58static QString categoriesXMLFilename()
57{ 59{
58 return Global::applicationFileName("todolist","categories.xml"); 60 return Global::applicationFileName("todolist","categories.xml");
59} 61}
60 62
61TodoWindow::TodoWindow( QWidget *parent, const char *name, WFlags f = 0 ) : 63TodoWindow::TodoWindow( QWidget *parent, const char *name, WFlags f = 0 ) :
62 QMainWindow( parent, name, f ), syncing(FALSE) 64 QMainWindow( parent, name, f ), syncing(FALSE)
63{ 65{
64// QTime t; 66// QTime t;
65// t.start(); 67// t.start();
66 68
67 setCaption( tr("Todo") ); 69 setCaption( tr("Todo") );
68 QString str; 70 QString str;
@@ -77,105 +79,107 @@ TodoWindow::TodoWindow( QWidget *parent, const char *name, WFlags f = 0 ) :
77 if ( str.isNull() ) 79 if ( str.isNull() )
78 QMessageBox::critical( this, 80 QMessageBox::critical( this,
79 tr("Out of Space"), 81 tr("Out of Space"),
80 tr("Unable to create startup files\n" 82 tr("Unable to create startup files\n"
81 "Free up some space\n" 83 "Free up some space\n"
82 "before you enter any data") ); 84 "before you enter any data") );
83 else 85 else
84 table->load( str ); 86 table->load( str );
85 } 87 }
86 88
87 // repeat for categories... 89 // repeat for categories...
88 str = categoriesXMLFilename(); 90 str = categoriesXMLFilename();
89 if ( str.isNull() ) 91 if ( str.isNull() )
90 QMessageBox::critical( this, 92 QMessageBox::critical( this,
91 tr( "Out of Space" ), 93 tr( "Out of Space" ),
92 tr( "Unable to create startup files\n" 94 tr( "Unable to create startup files\n"
93 "Free up some space\n" 95 "Free up some space\n"
94 "before you enter any data") ); 96 "before you enter any data") );
95 97
96 setCentralWidget( table ); 98 setCentralWidget( table );
97 setToolBarsMovable( FALSE ); 99 setToolBarsMovable( FALSE );
98 100
99// qDebug("after load: t=%d", t.elapsed() ); 101// qDebug("after load: t=%d", t.elapsed() );
100 102
101 Config config( "todo" ); 103 Config config( "todo" );
102 config.setGroup( "View" ); 104 config.setGroup( "View" );
103 bool complete = config.readBoolEntry( "ShowComplete", true ); 105 bool complete = config.readBoolEntry( "ShowComplete", true );
104 table->setShowCompleted( complete ); 106 table->setShowCompleted( complete );
105 QString category = config.readEntry( "Category", QString::null ); 107 QString category = config.readEntry( "Category", QString::null );
106 table->setShowCategory( category ); 108 table->setShowCategory( category );
107 109
108 QPEToolBar *bar = new QPEToolBar( this ); 110 QPEToolBar *bar = new QPEToolBar( this );
109 bar->setHorizontalStretchable( TRUE ); 111 bar->setHorizontalStretchable( TRUE );
110 112
111 QPEMenuBar *mb = new QPEMenuBar( bar ); 113 QPEMenuBar *mb = new QPEMenuBar( bar );
112 114
113 catMenu = new QPopupMenu( this ); 115 catMenu = new QPopupMenu( this );
114 QPopupMenu *edit = new QPopupMenu( this ); 116 QPopupMenu *edit = new QPopupMenu( this );
115 contextMenu = new QPopupMenu( this ); 117 contextMenu = new QPopupMenu( this );
116 118
117 bar = new QPEToolBar( this ); 119 bar = new QPEToolBar( this );
118 120
119 QAction *a = new QAction( tr( "New Task" ), Resource::loadPixmap( "new" ), 121 QAction *a = new QAction( tr( "New Task" ), Resource::loadPixmap( "new" ),
120 QString::null, 0, this, 0 ); 122 QString::null, 0, this, 0 );
121 connect( a, SIGNAL( activated() ), 123 connect( a, SIGNAL( activated() ),
122 this, SLOT( slotNew() ) ); 124 this, SLOT( slotNew() ) );
123 a->addTo( bar ); 125 a->addTo( bar );
124 a->addTo( edit ); 126 a->addTo( edit );
127
125 a = new QAction( tr( "Edit" ), Resource::loadIconSet( "edit" ), 128 a = new QAction( tr( "Edit" ), Resource::loadIconSet( "edit" ),
126 QString::null, 0, this, 0 ); 129 QString::null, 0, this, 0 );
127 connect( a, SIGNAL( activated() ), 130 connect( a, SIGNAL( activated() ),
128 this, SLOT( slotEdit() ) ); 131 this, SLOT( slotEdit() ) );
129 a->addTo( bar ); 132 a->addTo( bar );
130 a->addTo( edit ); 133 a->addTo( edit );
131 a->addTo( contextMenu ); 134 a->addTo( contextMenu );
132 a->setEnabled( FALSE ); 135 a->setEnabled( FALSE );
133 editAction = a; 136 editAction = a;
137
134 a = new QAction( tr( "Delete" ), Resource::loadIconSet( "trash" ), 138 a = new QAction( tr( "Delete" ), Resource::loadIconSet( "trash" ),
135 QString::null, 0, this, 0 ); 139 QString::null, 0, this, 0 );
136 connect( a, SIGNAL( activated() ), 140 connect( a, SIGNAL( activated() ),
137 this, SLOT( slotDelete() ) ); 141 this, SLOT( slotDelete() ) );
138 a->addTo( bar ); 142 a->addTo( bar );
139 a->addTo( edit ); 143 a->addTo( edit );
140 a->addTo( contextMenu ); 144 a->addTo( contextMenu );
141 a->setEnabled( FALSE ); 145 a->setEnabled( FALSE );
142 deleteAction = a; 146 deleteAction = a;
143 147
144 if ( Ir::supported() ) { 148 if ( Ir::supported() ) {
145 a = new QAction( tr( "Beam" ), Resource::loadPixmap( "beam" ), 149 a = new QAction( tr( "Beam" ), Resource::loadPixmap( "beam" ),
146 QString::null, 0, this, 0 ); 150 QString::null, 0, this, 0 );
147 connect( a, SIGNAL( activated() ), 151 connect( a, SIGNAL( activated() ),
148 this, SLOT( slotBeam() ) ); 152 this, SLOT( slotBeam() ) );
149 a->addTo( edit ); 153 a->addTo( edit );
150 a->addTo( bar ); 154 a->addTo( bar );
151 } 155 }
152 156
153 a = new QAction( tr( "Find" ), Resource::loadIconSet( "mag" ), 157 a = new QAction( tr( "Find" ), Resource::loadIconSet( "mag" ),
154 QString::null, 0, this, 0 ); 158 QString::null, 0, this, 0 );
155 connect( a, SIGNAL( activated() ), 159 connect( a, SIGNAL( activated() ),
156 this, SLOT( slotFind() ) ); 160 this, SLOT( slotFind() ) );
157 a->addTo( bar ); 161 a->addTo( bar );
158 a->addTo( edit ); 162 a->addTo( edit );
159 if ( table->numRows() ) 163 if ( table->numRows() )
160 a->setEnabled( TRUE ); 164 a->setEnabled( TRUE );
161 else 165 else
162 a->setEnabled( FALSE ); 166 a->setEnabled( FALSE );
163 167
164 //a->setEnabled( FALSE ); 168 //a->setEnabled( FALSE );
165 findAction = a; 169 findAction = a;
166// qDebug("mainwindow #2: t=%d", t.elapsed() ); 170// qDebug("mainwindow #2: t=%d", t.elapsed() );
167 171
168 completedAction = new QAction( QString::null, tr("Completed tasks"), 0, this, 0, TRUE ); 172 completedAction = new QAction( QString::null, tr("Completed tasks"), 0, this, 0, TRUE );
169 173
170 catMenu->setCheckable( true ); 174 catMenu->setCheckable( true );
171 populateCategories(); 175 populateCategories();
172 176
173 mb->insertItem( tr( "Task" ), edit ); 177 mb->insertItem( tr( "Task" ), edit );
174 mb->insertItem( tr( "View" ), catMenu ); 178 mb->insertItem( tr( "View" ), catMenu );
175 179
176 resize( 200, 300 ); 180 resize( 200, 300 );
177 if ( table->numRows() > 0 ) 181 if ( table->numRows() > 0 )
178 currentEntryChanged( 0, 0 ); 182 currentEntryChanged( 0, 0 );
179 connect( table, SIGNAL( signalEdit() ), 183 connect( table, SIGNAL( signalEdit() ),
180 this, SLOT( slotEdit() ) ); 184 this, SLOT( slotEdit() ) );
181 connect( table, SIGNAL(signalShowMenu(const QPoint &)), 185 connect( table, SIGNAL(signalShowMenu(const QPoint &)),
@@ -281,119 +285,119 @@ void TodoWindow::slotEdit()
281#endif 285#endif
282 int ret = e.exec(); 286 int ret = e.exec();
283 287
284 if ( ret == QDialog::Accepted ) { 288 if ( ret == QDialog::Accepted ) {
285 table->setPaintingEnabled( false ); 289 table->setPaintingEnabled( false );
286 todo = e.todoEntry(); 290 todo = e.todoEntry();
287 table->replaceCurrentEntry( todo ); 291 table->replaceCurrentEntry( todo );
288 table->setPaintingEnabled( true ); 292 table->setPaintingEnabled( true );
289 } 293 }
290 populateCategories(); 294 populateCategories();
291 295
292} 296}
293 297
294void TodoWindow::slotShowPopup( const QPoint &p ) 298void TodoWindow::slotShowPopup( const QPoint &p )
295{ 299{
296 contextMenu->popup( p ); 300 contextMenu->popup( p );
297} 301}
298 302
299void TodoWindow::showCompleted( bool s ) 303void TodoWindow::showCompleted( bool s )
300{ 304{
301 if ( !table->isUpdatesEnabled() ) 305 if ( !table->isUpdatesEnabled() )
302 return; 306 return;
303 table->setPaintingEnabled( false ); 307 table->setPaintingEnabled( false );
304 table->setShowCompleted( s ); 308 table->setShowCompleted( s );
305 table->setPaintingEnabled( true ); 309 table->setPaintingEnabled( true );
306} 310}
307 311
308void TodoWindow::currentEntryChanged( int r, int ) 312void TodoWindow::currentEntryChanged( int r, int )
309{ 313{
310 if ( r != -1 && table->rowHeight( r ) > 0 ) { 314 if ( r != -1 && table->rowHeight( r ) > 0 ) {
311 editAction->setEnabled( TRUE ); 315 editAction->setEnabled( TRUE );
312 deleteAction->setEnabled( TRUE ); 316 deleteAction->setEnabled( TRUE );
313 } else { 317 } else {
314 editAction->setEnabled( FALSE ); 318 editAction->setEnabled( FALSE );
315 deleteAction->setEnabled( FALSE ); 319 deleteAction->setEnabled( FALSE );
316 } 320 }
317} 321}
318 322
319void TodoWindow::setCategory( int c ) 323void TodoWindow::setCategory( int c )
320{ 324{
321 if ( c <= 0 ) return; 325 if ( c <= 0 ) return;
322 if ( !table->isUpdatesEnabled() ) 326 if ( !table->isUpdatesEnabled() )
323 return; 327 return;
324 table->setPaintingEnabled( false ); 328 table->setPaintingEnabled( false );
325 for ( unsigned int i = 1; i < catMenu->count(); i++ ) 329 for ( unsigned int i = 1; i < catMenu->count(); i++ )
326 catMenu->setItemChecked( i, c == (int)i ); 330 catMenu->setItemChecked( i, c == (int)i );
327 if ( c == 1 ) { 331 if ( c == 1 ) {
328 table->setShowCategory( QString::null ); 332 table->setShowCategory( QString::null );
329 setCaption( tr("Todo") + " - " + tr( "All" ) ); 333 setCaption( tr("Todo") + " - " + tr( "All Categories" ) );
330 } else if ( c == (int)catMenu->count() - 1 ) { 334 } else if ( c == (int)catMenu->count() - 1 ) {
331 table->setShowCategory( tr( "Unfiled" ) ); 335 table->setShowCategory( tr( "Unfiled" ) );
332 setCaption( tr("Todo") + " - " + tr( "Unfiled" ) ); 336 setCaption( tr("Todo") + " - " + tr( "Unfiled" ) );
333 } else { 337 } else {
334 QString cat = table->categories()[c - 2]; 338 QString cat = table->categories()[c - 2];
335 table->setShowCategory( cat ); 339 table->setShowCategory( cat );
336 setCaption( tr("Todo") + " - " + cat ); 340 setCaption( tr("Todo") + " - " + cat );
337 } 341 }
338 table->setPaintingEnabled( true ); 342 table->setPaintingEnabled( true );
339} 343}
340 344
341void TodoWindow::populateCategories() 345void TodoWindow::populateCategories()
342{ 346{
343 catMenu->clear(); 347 catMenu->clear();
344 348
345 completedAction->addTo( catMenu ); 349 completedAction->addTo( catMenu );
346 completedAction->setOn( table->showCompleted() ); 350 completedAction->setOn( table->showCompleted() );
347 351
348 int id, 352 int id,
349 rememberId; 353 rememberId;
350 id = 1; 354 id = 1;
351 catMenu->insertItem( tr( "All" ), id++ ); 355 catMenu->insertItem( tr( "All Categories" ), id++ );
352// catMenu->insertSeparator(); 356// catMenu->insertSeparator();
353 QStringList categories = table->categories(); 357 QStringList categories = table->categories();
354 categories.append( tr( "Unfiled" ) ); 358 categories.append( tr( "Unfiled" ) );
355 for ( QStringList::Iterator it = categories.begin(); 359 for ( QStringList::Iterator it = categories.begin();
356 it != categories.end(); ++it ) { 360 it != categories.end(); ++it ) {
357 catMenu->insertItem( *it, id ); 361 catMenu->insertItem( *it, id );
358 if ( *it == table->showCategory() ) 362 if ( *it == table->showCategory() )
359 rememberId = id; 363 rememberId = id;
360 ++id; 364 ++id;
361 } 365 }
362 if ( table->showCategory().isEmpty() ) 366 if ( table->showCategory().isEmpty() )
363 setCategory( 1 ); 367 setCategory( 1 );
364 else 368 else
365 setCategory( rememberId ); 369 setCategory( rememberId );
366} 370}
367 371
368void TodoWindow::reload() 372void TodoWindow::reload()
369{ 373{
370 table->clear(); 374 table->clear();
371 table->load( todolistXMLFilename() ); 375 table->load( todolistXMLFilename() );
372 syncing = FALSE; 376 syncing = FALSE;
373} 377}
374 378
375void TodoWindow::flush() 379void TodoWindow::flush()
376{ 380{
377 syncing = TRUE; 381 syncing = TRUE;
378 table->save( todolistXMLFilename() ); 382 table->save( todolistXMLFilename() );
379} 383}
380 384
381void TodoWindow::closeEvent( QCloseEvent *e ) 385void TodoWindow::closeEvent( QCloseEvent *e )
382{ 386{
383 if(syncing) { 387 if(syncing) {
384 /* no need to save if in the middle of syncing */ 388 /* no need to save if in the middle of syncing */
385 e->accept(); 389 e->accept();
386 return; 390 return;
387 } 391 }
388 392
389 if ( table->save( todolistXMLFilename() ) ) { 393 if ( table->save( todolistXMLFilename() ) ) {
390 e->accept(); 394 e->accept();
391 // repeat for categories... 395 // repeat for categories...
392 // if writing configs fail, it will emit an 396 // if writing configs fail, it will emit an
393 // error, but I feel that it is "ok" for us to exit 397 // error, but I feel that it is "ok" for us to exit
394 // espically since we aren't told if the write succeeded... 398 // espically since we aren't told if the write succeeded...
395 Config config( "todo" ); 399 Config config( "todo" );
396 config.setGroup( "View" ); 400 config.setGroup( "View" );
397 config.writeEntry( "ShowComplete", table->showCompleted() ); 401 config.writeEntry( "ShowComplete", table->showCompleted() );
398 config.writeEntry( "Category", table->showCategory() ); 402 config.writeEntry( "Category", table->showCategory() );
399 } else { 403 } else {
diff --git a/core/pim/todo/mainwindow.h b/core/pim/todo/mainwindow.h
index f4fcd1b..856dcb4 100644
--- a/core/pim/todo/mainwindow.h
+++ b/core/pim/todo/mainwindow.h
@@ -1,52 +1,53 @@
1/********************************************************************** 1/**********************************************************************
2 Copyright (C) 2002 Holger 'zecke' Freyther <freyther@kde.org>
2** Copyright (C) 2000 Trolltech AS. All rights reserved. 3** Copyright (C) 2000 Trolltech AS. All rights reserved.
3** 4**
4** This file is part of Qtopia Environment. 5** This file is part of Qtopia and Opi Environment.
5** 6**
6** This file may be distributed and/or modified under the terms of the 7** This file may be distributed and/or modified under the terms of the
7** GNU General Public License version 2 as published by the Free Software 8** GNU General Public License version 2 as published by the Free Software
8** Foundation and appearing in the file LICENSE.GPL included in the 9** Foundation and appearing in the file LICENSE.GPL included in the
9** packaging of this file. 10** packaging of this file.
10** 11**
11** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE 12** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
12** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 13** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
13** 14**
14** See http://www.trolltech.com/gpl/ for GPL licensing information. 15** See http://www.trolltech.com/gpl/ for GPL licensing information.
15** 16**
16** Contact info@trolltech.com if any conditions of this licensing are 17** Contact info@trolltech.com if any conditions of this licensing are
17** not clear to you. 18** not clear to you.
18** 19**
19**********************************************************************/ 20**********************************************************************/
20 21
21#ifndef MAINWINDOW_H 22#ifndef MAINWINDOW_H
22#define MAINWINDOW_H 23#define MAINWINDOW_H
23 24
24#include <qmainwindow.h> 25#include <qmainwindow.h>
25 26
26class TodoTable; 27class TodoTable;
27class QAction; 28class QAction;
28class QPopupMenu; 29class QPopupMenu;
29class Ir; 30class Ir;
30 31
31class TodoWindow : public QMainWindow 32class TodoWindow : public QMainWindow
32{ 33{
33 Q_OBJECT 34 Q_OBJECT
34 35
35public: 36public:
36 TodoWindow( QWidget *parent = 0, const char *name = 0, WFlags f = 0 ); 37 TodoWindow( QWidget *parent = 0, const char *name = 0, WFlags f = 0 );
37 ~TodoWindow(); 38 ~TodoWindow();
38 39
39public slots: 40public slots:
40 void flush(); 41 void flush();
41 void reload(); 42 void reload();
42 43
43protected slots: 44protected slots:
44 void slotNew(); 45 void slotNew();
45 void slotDelete(); 46 void slotDelete();
46 void slotEdit(); 47 void slotEdit();
47 void slotShowPopup( const QPoint & ); 48 void slotShowPopup( const QPoint & );
48 void showCompleted( bool ); 49 void showCompleted( bool );
49 void currentEntryChanged( int r, int c ); 50 void currentEntryChanged( int r, int c );
50 void setCategory( int ); 51 void setCategory( int );
51 void slotFind(); 52 void slotFind();
52 void setDocument( const QString & ); 53 void setDocument( const QString & );
diff --git a/core/pim/todo/todoentryimpl.cpp b/core/pim/todo/todoentryimpl.cpp
index 79206de..c957715 100644
--- a/core/pim/todo/todoentryimpl.cpp
+++ b/core/pim/todo/todoentryimpl.cpp
@@ -88,55 +88,55 @@ void NewTaskDialog::init()
88 buttonDate->setPopup( m1 ); 88 buttonDate->setPopup( m1 );
89 comboCategory->setCategories( todo.categories(), "Todo List", tr("Todo List") ); 89 comboCategory->setCategories( todo.categories(), "Todo List", tr("Todo List") );
90 90
91 connect( picker, SIGNAL( dateClicked( int, int, int ) ), 91 connect( picker, SIGNAL( dateClicked( int, int, int ) ),
92 this, SLOT( dateChanged( int, int, int ) ) ); 92 this, SLOT( dateChanged( int, int, int ) ) );
93 93
94 buttonDate->setText( TimeString::longDateString( date ) ); 94 buttonDate->setText( TimeString::longDateString( date ) );
95 picker->setDate( date.year(), date.month(), date.day() ); 95 picker->setDate( date.year(), date.month(), date.day() );
96} 96}
97 97
98/* 98/*
99 * Destroys the object and frees any allocated resources 99 * Destroys the object and frees any allocated resources
100 */ 100 */
101NewTaskDialog::~NewTaskDialog() 101NewTaskDialog::~NewTaskDialog()
102{ 102{
103 // no need to delete child widgets, Qt does it all for us 103 // no need to delete child widgets, Qt does it all for us
104} 104}
105void NewTaskDialog::dateChanged( int y, int m, int d ) 105void NewTaskDialog::dateChanged( int y, int m, int d )
106{ 106{
107 date = QDate( y, m, d ); 107 date = QDate( y, m, d );
108 buttonDate->setText( TimeString::longDateString( date ) ); 108 buttonDate->setText( TimeString::longDateString( date ) );
109} 109}
110 110
111/*! 111/*!
112*/ 112*/
113 113
114Task NewTaskDialog::todoEntry() 114Task NewTaskDialog::todoEntry()
115{ 115{
116 todo.setDueDate( date, checkDate->isChecked() ); 116 todo.setDueDate( date, checkDate->isChecked() );
117 if ( comboCategory->currentCategory() != -1 ) { 117 if ( comboCategory->currentCategory() != -1 ) {
118 todo.setCategories( comboCategory->currentCategories() ); 118 todo.setCategories( comboCategory->currentCategories() );
119 } 119 }
120 todo.setPriority( comboPriority->currentItem() + 1 ); 120 todo.setPriority( comboPriority->currentItem() + 1 );
121 todo.setCompleted( checkCompleted->isChecked() ); 121 todo.setCompleted( checkCompleted->isChecked() );
122 122
123 todo.setDescription( txtTodo->text() ); 123 todo.setDescription( txtTodo->text() );
124 124
125 return todo; 125 return todo;
126} 126}
127 127
128 128
129/*! 129/*!
130 130
131*/ 131*/
132 132
133void NewTaskDialog::accept() 133void NewTaskDialog::accept()
134{ 134{
135 QString strText = txtTodo->text(); 135 QString strText = txtTodo->text();
136 if ( !strText || strText == "") { 136 if ( strText.isEmpty() ) {
137 // hmm... just decline it then, the user obviously didn't care about it 137 // hmm... just decline it then, the user obviously didn't care about it
138 QDialog::reject(); 138 QDialog::reject();
139 return; 139 return;
140 } 140 }
141 QDialog::accept(); 141 QDialog::accept();
142} 142}
diff --git a/libopie/libopie.pro b/libopie/libopie.pro
index fb00422..1c0bf7b 100644
--- a/libopie/libopie.pro
+++ b/libopie/libopie.pro
@@ -1,7 +1,7 @@
1TEMPLATE = lib 1TEMPLATE = lib
2CONFIG += qte warn_on release 2CONFIG += qte warn_on release
3 HEADERS = $(OPIEDIR)/include/opie/xmltree.h 3 HEADERS = $(OPIEDIR)/include/opie/xmltree.h
4 SOURCES = xmltree.cc tododb.cpp todoevent.cpp 4 SOURCES = xmltree.cc tododb.cpp todoevent.cpp todovcalresource.cpp
5 TARGET = opie 5 TARGET = opie
6INCLUDEPATH += $(OPIEDIR)/include 6INCLUDEPATH += $(OPIEDIR)/include
7DESTDIR = $(QTDIR)/lib$(PROJMAK) 7DESTDIR = $(QTDIR)/lib$(PROJMAK)
diff --git a/libopie/tododb.cpp b/libopie/tododb.cpp
index b1b35d0..f9756c6 100644
--- a/libopie/tododb.cpp
+++ b/libopie/tododb.cpp
@@ -93,96 +93,104 @@ public:
93 event.setDate( date); 93 event.setDate( date);
94 } 94 }
95 dummy = element->attribute("Priority" ); 95 dummy = element->attribute("Priority" );
96 dumInt = dummy.toInt(&ok ); 96 dumInt = dummy.toInt(&ok );
97 if(!ok ) dumInt = ToDoEvent::NORMAL; 97 if(!ok ) dumInt = ToDoEvent::NORMAL;
98 event.setPriority( dumInt ); 98 event.setPriority( dumInt );
99 //description 99 //description
100 dummy = element->attribute("Description" ); 100 dummy = element->attribute("Description" );
101 event.setDescription( dummy ); 101 event.setDescription( dummy );
102 // category 102 // category
103 dummy = element->attribute("Categories" ); 103 dummy = element->attribute("Categories" );
104 dumInt = dummy.toInt(&ok ); 104 dumInt = dummy.toInt(&ok );
105 if(ok ) { 105 if(ok ) {
106 QArray<int> arrat(1); 106 QArray<int> arrat(1);
107 arrat[0] = dumInt; 107 arrat[0] = dumInt;
108 event.setCategory( Qtopia::Record::idsToString( arrat ) ); 108 event.setCategory( Qtopia::Record::idsToString( arrat ) );
109 } 109 }
110 //uid 110 //uid
111 dummy = element->attribute("Uid" ); 111 dummy = element->attribute("Uid" );
112 dumInt = dummy.toInt(&ok ); 112 dumInt = dummy.toInt(&ok );
113 if(ok ) event.setUid( dumInt ); 113 if(ok ) event.setUid( dumInt );
114 m_todos.append( event ); 114 m_todos.append( event );
115 element = element->nextChild(); // next element 115 element = element->nextChild(); // next element
116 } 116 }
117 //} 117 //}
118 }else { 118 }else {
119 qWarning("could not load" ); 119 qWarning("could not load" );
120 } 120 }
121 delete root; 121 delete root;
122 qWarning("returning" ); 122 qWarning("returning" );
123 return m_todos; 123 return m_todos;
124 } 124 }
125}; 125};
126 126
127} 127}
128 128
129ToDoDB::ToDoDB(const QString &fileName = QString::null, ToDoResource *res ){ 129ToDoDB::ToDoDB(const QString &fileName = QString::null, ToDoResource *res ){
130 m_fileName = fileName; 130 m_fileName = fileName;
131 if( fileName.isEmpty() && res == 0 ){ 131 if( fileName.isEmpty() && res == 0 ){
132 m_fileName = Global::applicationFileName("todolist","todolist.xml"); 132 m_fileName = Global::applicationFileName("todolist","todolist.xml");
133 res = new FileToDoResource(); 133 res = new FileToDoResource();
134 //qWarning("%s", m_fileName.latin1() ); 134 //qWarning("%s", m_fileName.latin1() );
135 }else if(res == 0 ){ // let's create a ToDoResource for xml 135 }else if(res == 0 ){ // let's create a ToDoResource for xml
136 res = new FileToDoResource(); 136 res = new FileToDoResource();
137 } 137 }
138 m_res = res; 138 m_res = res;
139 load(); 139 load();
140} 140}
141ToDoResource* ToDoDB::resource(){
142 return m_res;
143};
144void ToDoDB::setResource( ToDoResource *res )
145{
146 delete m_res;
147 m_res = res;
148}
141ToDoDB::~ToDoDB() 149ToDoDB::~ToDoDB()
142{ 150{
143 delete m_res; 151 delete m_res;
144} 152}
145QValueList<ToDoEvent> ToDoDB::effectiveToDos(const QDate &from, const QDate &to, 153QValueList<ToDoEvent> ToDoDB::effectiveToDos(const QDate &from, const QDate &to,
146 bool all ) 154 bool all )
147{ 155{
148 QValueList<ToDoEvent> events; 156 QValueList<ToDoEvent> events;
149 for( QValueList<ToDoEvent>::Iterator it = m_todos.begin(); it!= m_todos.end(); ++it ){ 157 for( QValueList<ToDoEvent>::Iterator it = m_todos.begin(); it!= m_todos.end(); ++it ){
150 if( (*it).hasDate() ){ 158 if( (*it).hasDate() ){
151 if( (*it).date() >= from && (*it).date() <= to ) 159 if( (*it).date() >= from && (*it).date() <= to )
152 events.append( (*it) ); 160 events.append( (*it) );
153 }else if( all ){ 161 }else if( all ){
154 events.append( (*it) ); 162 events.append( (*it) );
155 } 163 }
156 } 164 }
157 return events; 165 return events;
158} 166}
159QValueList<ToDoEvent> ToDoDB::effectiveToDos(const QDate &from, 167QValueList<ToDoEvent> ToDoDB::effectiveToDos(const QDate &from,
160 bool all) 168 bool all)
161{ 169{
162 return effectiveToDos( from, QDate::currentDate(), all ); 170 return effectiveToDos( from, QDate::currentDate(), all );
163} 171}
164QValueList<ToDoEvent> ToDoDB::overDue() 172QValueList<ToDoEvent> ToDoDB::overDue()
165{ 173{
166 QValueList<ToDoEvent> events; 174 QValueList<ToDoEvent> events;
167 for( QValueList<ToDoEvent>::Iterator it = m_todos.begin(); it!= m_todos.end(); ++it ){ 175 for( QValueList<ToDoEvent>::Iterator it = m_todos.begin(); it!= m_todos.end(); ++it ){
168 if( (*it).isOverdue() ) 176 if( (*it).isOverdue() )
169 events.append((*it) ); 177 events.append((*it) );
170 } 178 }
171 return events; 179 return events;
172} 180}
173QValueList<ToDoEvent> ToDoDB::rawToDos() 181QValueList<ToDoEvent> ToDoDB::rawToDos()
174{ 182{
175 return m_todos; 183 return m_todos;
176} 184}
177void ToDoDB::addEvent( const ToDoEvent &event ) 185void ToDoDB::addEvent( const ToDoEvent &event )
178{ 186{
179 m_todos.append( event ); 187 m_todos.append( event );
180} 188}
181void ToDoDB::editEvent( const ToDoEvent &event ) 189void ToDoDB::editEvent( const ToDoEvent &event )
182{ 190{
183 m_todos.remove( event ); 191 m_todos.remove( event );
184 m_todos.append( event ); 192 m_todos.append( event );
185} 193}
186void ToDoDB::removeEvent( const ToDoEvent &event ) 194void ToDoDB::removeEvent( const ToDoEvent &event )
187{ 195{
188 m_todos.remove( event ); 196 m_todos.remove( event );
diff --git a/libopie/todoevent.cpp b/libopie/todoevent.cpp
index 4cfe1c0..5fa4472 100644
--- a/libopie/todoevent.cpp
+++ b/libopie/todoevent.cpp
@@ -1,104 +1,106 @@
1 1
2#include <opie/todoevent.h> 2#include <opie/todoevent.h>
3#include <qpe/palmtopuidgen.h> 3#include <qpe/palmtopuidgen.h>
4#include <qpe/stringutil.h>
5//#include <qpe/palmtoprecord.h>
4 6
5ToDoEvent::ToDoEvent(bool completed, int priority, const QString &category, 7ToDoEvent::ToDoEvent(bool completed, int priority, const QString &category,
6 const QString &description, bool hasDate, QDate date, int uid ) 8 const QString &description, bool hasDate, QDate date, int uid )
7{ 9{
8 qWarning("todoEvent c'tor" ); 10 qWarning("todoEvent c'tor" );
9 m_date = date; 11 m_date = date;
10 m_isCompleted = completed; 12 m_isCompleted = completed;
11 m_hasDate = hasDate; 13 m_hasDate = hasDate;
12 m_priority = priority; 14 m_priority = priority;
13 m_category = category; 15 m_category = category;
14 m_desc = description; 16 m_desc = Qtopia::simplifyMultiLineSpace(description );
15 if (uid == -1 ) { 17 if (uid == -1 ) {
16 Qtopia::UidGen *uidgen = new Qtopia::UidGen(); 18 Qtopia::UidGen *uidgen = new Qtopia::UidGen();
17 uid = uidgen->generate(); 19 uid = uidgen->generate();
18 delete uidgen; 20 delete uidgen;
19 }// generate the ids 21 }// generate the ids
20 m_uid = uid; 22 m_uid = uid;
21} 23}
22bool ToDoEvent::isCompleted() const 24bool ToDoEvent::isCompleted() const
23{ 25{
24 return m_isCompleted; 26 return m_isCompleted;
25} 27}
26bool ToDoEvent::hasDate() const 28bool ToDoEvent::hasDate() const
27{ 29{
28 return m_hasDate; 30 return m_hasDate;
29} 31}
30int ToDoEvent::priority()const 32int ToDoEvent::priority()const
31{ 33{
32 return m_priority; 34 return m_priority;
33} 35}
34QString ToDoEvent::category()const 36QString ToDoEvent::category()const
35{ 37{
36 return m_category; 38 return m_category;
37} 39}
38QDate ToDoEvent::date()const 40QDate ToDoEvent::date()const
39{ 41{
40 return m_date; 42 return m_date;
41} 43}
42QString ToDoEvent::description()const 44QString ToDoEvent::description()const
43{ 45{
44 return m_desc; 46 return m_desc;
45} 47}
46void ToDoEvent::setCompleted( bool completed ) 48void ToDoEvent::setCompleted( bool completed )
47{ 49{
48 m_isCompleted = completed; 50 m_isCompleted = completed;
49} 51}
50void ToDoEvent::setHasDate( bool hasDate ) 52void ToDoEvent::setHasDate( bool hasDate )
51{ 53{
52 m_hasDate = hasDate; 54 m_hasDate = hasDate;
53} 55}
54void ToDoEvent::setDescription(const QString &desc ) 56void ToDoEvent::setDescription(const QString &desc )
55{ 57{
56 m_desc = desc; 58 m_desc = Qtopia::simplifyMultiLineSpace(desc );
57} 59}
58void ToDoEvent::setCategory( const QString &cat ) 60void ToDoEvent::setCategory( const QString &cat )
59{ 61{
60 m_category = cat; 62 m_category = cat;
61} 63}
62void ToDoEvent::setPriority(int prio ) 64void ToDoEvent::setPriority(int prio )
63{ 65{
64 m_priority = prio; 66 m_priority = prio;
65} 67}
66void ToDoEvent::setDate( QDate date ) 68void ToDoEvent::setDate( QDate date )
67{ 69{
68 m_date = date; 70 m_date = date;
69} 71}
70bool ToDoEvent::isOverdue( ) 72bool ToDoEvent::isOverdue( )
71{ 73{
72 if( m_hasDate ) 74 if( m_hasDate )
73 return QDate::currentDate() > m_date; 75 return QDate::currentDate() > m_date;
74 return false; 76 return false;
75} 77}
76bool ToDoEvent::operator<( const ToDoEvent &toDoEvent )const{ 78bool ToDoEvent::operator<( const ToDoEvent &toDoEvent )const{
77 if( !hasDate() && !toDoEvent.hasDate() ) return true; 79 if( !hasDate() && !toDoEvent.hasDate() ) return true;
78 if( !hasDate() && toDoEvent.hasDate() ) return true; 80 if( !hasDate() && toDoEvent.hasDate() ) return true;
79 if( hasDate() && toDoEvent.hasDate() ){ 81 if( hasDate() && toDoEvent.hasDate() ){
80 if( date() == toDoEvent.date() ){ // let's the priority decide 82 if( date() == toDoEvent.date() ){ // let's the priority decide
81 return priority() < toDoEvent.priority(); 83 return priority() < toDoEvent.priority();
82 }else{ 84 }else{
83 return date() < toDoEvent.date(); 85 return date() < toDoEvent.date();
84 } 86 }
85 } 87 }
86 return false; 88 return false;
87} 89}
88bool ToDoEvent::operator<=(const ToDoEvent &toDoEvent )const 90bool ToDoEvent::operator<=(const ToDoEvent &toDoEvent )const
89{ 91{
90 if( !hasDate() && !toDoEvent.hasDate() ) return true; 92 if( !hasDate() && !toDoEvent.hasDate() ) return true;
91 if( !hasDate() && toDoEvent.hasDate() ) return true; 93 if( !hasDate() && toDoEvent.hasDate() ) return true;
92 if( hasDate() && toDoEvent.hasDate() ){ 94 if( hasDate() && toDoEvent.hasDate() ){
93 if( date() == toDoEvent.date() ){ // let's the priority decide 95 if( date() == toDoEvent.date() ){ // let's the priority decide
94 return priority() <= toDoEvent.priority(); 96 return priority() <= toDoEvent.priority();
95 }else{ 97 }else{
96 return date() <= toDoEvent.date(); 98 return date() <= toDoEvent.date();
97 } 99 }
98 } 100 }
99 return true; 101 return true;
100} 102}
101bool ToDoEvent::operator>(const ToDoEvent &toDoEvent )const 103bool ToDoEvent::operator>(const ToDoEvent &toDoEvent )const
102{ 104{
103 if( !hasDate() && !toDoEvent.hasDate() ) return false; 105 if( !hasDate() && !toDoEvent.hasDate() ) return false;
104 if( !hasDate() && toDoEvent.hasDate() ) return false; 106 if( !hasDate() && toDoEvent.hasDate() ) return false;
diff --git a/libopie/todovcalresource.cpp b/libopie/todovcalresource.cpp
new file mode 100644
index 0000000..a6afe68
--- a/dev/null
+++ b/libopie/todovcalresource.cpp
@@ -0,0 +1,153 @@
1/*
2               =. This file is part of the OPIE Project
3             .=l. Copyright (c) 2002 Holger Freyther <freyther@kde.org>
4           .>+-= the use of vobject was inspired by libkcal
5 _;:,     .>    :=|. This library is free software; you can
6.> <`_,   >  .   <= redistribute it and/or modify it under
7:`=1 )Y*s>-.--   : the terms of the GNU Library General Public
8.="- .-=="i,     .._ License as published by the Free Software
9 - .   .-<_>     .<> Foundation; either version 2 of the License,
10     ._= =}       : or (at your option) any later version.
11    .%`+i>       _;_.
12    .i_,=:_.      -<s. This library is distributed in the hope that
13     +  .  -:.       = it will be useful, but WITHOUT ANY WARRANTY;
14    : ..    .:,     . . . without even the implied warranty of
15    =_        +     =;=|` MERCHANTABILITY or FITNESS FOR A
16  _.=:.       :    :=>`: PARTICULAR PURPOSE. See the GNU
17..}^=.=       =       ; Library General Public License for more
18++=   -.     .`     .: details.
19 :     =  ...= . :.=-
20 -.   .:....=;==+<; You should have received a copy of the GNU
21  -_. . .   )=.  = Library General Public License along with
22    --        :-=` this library; see the file COPYING.LIB.
23 If not, write to the Free Software Foundation,
24 Inc., 59 Temple Place - Suite 330,
25 Boston, MA 02111-1307, USA.
26
27*/
28
29#include <qfile.h>
30#include <qvaluelist.h>
31#include <opie/todoevent.h>
32#include <opie/todovcalresource.h>
33
34#include "../library/backend/vobject_p.h"
35#include "../library/backend/timeconversion.h"
36#include "../library/backend/qfiledirect_p.h"
37
38static VObject *vobjByEvent( const ToDoEvent &event )
39{
40 VObject *task = newVObject( VCTodoProp );
41 if( task == 0 )
42 return 0l;
43 if( event.hasDate() )
44 addPropValue( task, VCDueProp, TimeConversion::toISO8601( event.date() ) );
45
46 if( event.isCompleted() )
47 addPropValue( task, VCStatusProp, "COMPLETED");
48
49 QString string = QString::number(event.priority() );
50 addPropValue( task, VCPriorityProp, string.local8Bit() );
51 addPropValue( task, VCCategoriesProp, event.category().local8Bit() );
52 addPropValue( task, VCDescriptionProp, event.description().local8Bit() );
53 addPropValue( task, VCSummaryProp, event.description().left(15).local8Bit() );
54 return task;
55};
56
57static ToDoEvent eventByVObj( VObject *obj ){
58 ToDoEvent event;
59 VObject *ob;
60 QCString name;
61 // no uid, attendees, ... and no fun
62 // description
63 if( ( ob = isAPropertyOf( obj, VCDescriptionProp )) != 0 ){
64 name = vObjectStringZValue( ob );
65 event.setDescription( name );
66 }
67 // completed
68 if( ( ob = isAPropertyOf( obj, VCStatusProp )) != 0 ){
69 name = vObjectStringZValue( ob );
70 if( name == "COMPLETED" ){
71 event.setCompleted( true );
72 }else{
73 event.setCompleted( false );
74 }
75 }else
76 event.setCompleted( false );
77 // priority
78 if ((ob = isAPropertyOf(obj, VCPriorityProp))) {
79 name = vObjectStringZValue( ob );
80 bool ok;
81 event.setPriority(name.toInt(&ok) );
82 }
83 //due date
84 if((ob = isAPropertyOf(obj, VCDueProp)) ){
85 event.setHasDate( true );
86 name = vObjectStringZValue( ob );
87 event.setDate( TimeConversion::fromISO8601( name).date() );
88 }
89 // categories
90 if((ob = isAPropertyOf( obj, VCCategoriesProp )) != 0 ){
91 name = vObjectStringZValue( ob );
92 qWarning("Categories:%s", name.data() );
93 }
94
95 return event;
96};
97
98
99QValueList<ToDoEvent> ToDoVCalResource::load(const QString &file)
100{
101 QValueList<ToDoEvent> events;
102 VObject *vcal = 0l;
103 vcal = Parse_MIME_FromFileName( (char *)file.utf8().data() ); // from vobject
104 if(!vcal )
105 return events;
106 // start parsing
107
108 VObjectIterator it;
109 VObject *vobj;
110 initPropIterator(&it, vcal);
111
112 while( moreIteration( &it ) ) {
113 vobj = ::nextVObject( &it );
114 QCString name = ::vObjectName( vobj );
115 //QCString objVal = ::vObjectStringZValue( vobj );
116 // let's find out the type
117 if( name == VCTodoProp ){
118 events.append( eventByVObj( vobj ) );
119
120 } // parse the value
121 }
122 return events;
123}
124bool ToDoVCalResource::save(const QString &fileName, const QValueList<ToDoEvent>&list )
125{
126 QFileDirect file ( fileName );
127 if(!file.open(IO_WriteOnly ) )
128 return false;
129 // obj
130 VObject *obj;
131 obj = newVObject( VCCalProp );
132 addPropValue( obj, VCVersionProp, "1.0" );
133 VObject *vo;
134 for(QValueList<ToDoEvent>::ConstIterator it = list.begin(); it != list.end(); ++it ){
135 vo = vobjByEvent( (*it) );
136 addVObjectProp(obj, vo );
137 }
138 writeVObject( file.directHandle(), obj );
139 cleanVObject( obj );
140 cleanStrTbl();
141
142 return true;
143}
144
145
146
147
148
149
150
151
152
153