summaryrefslogtreecommitdiffabout
path: root/libkcal
Unidiff
Diffstat (limited to 'libkcal') (more/less context) (ignore whitespace changes)
-rw-r--r--libkcal/todo.cpp2
-rw-r--r--libkcal/todo.h2
2 files changed, 3 insertions, 1 deletions
diff --git a/libkcal/todo.cpp b/libkcal/todo.cpp
index 62b74f1..9a8b6e4 100644
--- a/libkcal/todo.cpp
+++ b/libkcal/todo.cpp
@@ -1,599 +1,601 @@
1/* 1/*
2 This file is part of libkcal. 2 This file is part of libkcal.
3 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org> 3 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org>
4 4
5 This library is free software; you can redistribute it and/or 5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Library General Public 6 modify it under the terms of the GNU Library General Public
7 License as published by the Free Software Foundation; either 7 License as published by the Free Software Foundation; either
8 version 2 of the License, or (at your option) any later version. 8 version 2 of the License, or (at your option) any later version.
9 9
10 This library is distributed in the hope that it will be useful, 10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Library General Public License for more details. 13 Library General Public License for more details.
14 14
15 You should have received a copy of the GNU Library General Public License 15 You should have received a copy of the GNU Library General Public License
16 along with this library; see the file COPYING.LIB. If not, write to 16 along with this library; see the file COPYING.LIB. If not, write to
17 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 17 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 Boston, MA 02111-1307, USA. 18 Boston, MA 02111-1307, USA.
19*/ 19*/
20 20
21#include <kglobal.h> 21#include <kglobal.h>
22#include <kglobalsettings.h> 22#include <kglobalsettings.h>
23#include <klocale.h> 23#include <klocale.h>
24#include <kdebug.h> 24#include <kdebug.h>
25#include <qregexp.h> 25#include <qregexp.h>
26#include <qfileinfo.h> 26#include <qfileinfo.h>
27 27
28#include "calendarlocal.h" 28#include "calendarlocal.h"
29#include "icalformat.h" 29#include "icalformat.h"
30#include "todo.h" 30#include "todo.h"
31 31
32using namespace KCal; 32using namespace KCal;
33 33
34Todo::Todo(): QObject(), Incidence() 34Todo::Todo(): QObject(), Incidence()
35{ 35{
36// mStatus = TENTATIVE; 36// mStatus = TENTATIVE;
37 37
38 mHasDueDate = false; 38 mHasDueDate = false;
39 setHasStartDate( false ); 39 setHasStartDate( false );
40 mCompleted = getEvenTime(QDateTime::currentDateTime()); 40 mCompleted = getEvenTime(QDateTime::currentDateTime());
41 mHasCompletedDate = false; 41 mHasCompletedDate = false;
42 mPercentComplete = 0; 42 mPercentComplete = 0;
43 mRunning = false; 43 mRunning = false;
44 mRunSaveTimer = 0; 44 mRunSaveTimer = 0;
45} 45}
46 46
47Todo::Todo(const Todo &t) : QObject(),Incidence(t) 47Todo::Todo(const Todo &t) : QObject(),Incidence(t)
48{ 48{
49 mDtDue = t.mDtDue; 49 mDtDue = t.mDtDue;
50 mHasDueDate = t.mHasDueDate; 50 mHasDueDate = t.mHasDueDate;
51 mCompleted = t.mCompleted; 51 mCompleted = t.mCompleted;
52 mHasCompletedDate = t.mHasCompletedDate; 52 mHasCompletedDate = t.mHasCompletedDate;
53 mPercentComplete = t.mPercentComplete; 53 mPercentComplete = t.mPercentComplete;
54 mRunning = false; 54 mRunning = false;
55 mRunSaveTimer = 0; 55 mRunSaveTimer = 0;
56} 56}
57 57
58Todo::~Todo() 58Todo::~Todo()
59{ 59{
60 setRunning( false ); 60 setRunning( false );
61 //qDebug("Todo::~Todo() "); 61 //qDebug("Todo::~Todo() ");
62} 62}
63 63
64void Todo::setRunningFalse( QString s ) 64void Todo::setRunningFalse( QString s )
65{ 65{
66 if ( ! mRunning ) 66 if ( ! mRunning )
67 return; 67 return;
68 mRunning = false; 68 mRunning = false;
69 mRunSaveTimer->stop(); 69 mRunSaveTimer->stop();
70 saveRunningInfoToFile( s ); 70 saveRunningInfoToFile( s );
71} 71}
72void Todo::stopRunning() 72void Todo::stopRunning()
73{ 73{
74 if ( !mRunning ) 74 if ( !mRunning )
75 return; 75 return;
76 if ( mRunSaveTimer ) 76 if ( mRunSaveTimer )
77 mRunSaveTimer->stop(); 77 mRunSaveTimer->stop();
78 mRunning = false; 78 mRunning = false;
79} 79}
80void Todo::setRunning( bool run ) 80void Todo::setRunning( bool run )
81{ 81{
82 if ( run == mRunning ) 82 if ( run == mRunning )
83 return; 83 return;
84 //qDebug("Todo::setRunning %d ", run); 84 //qDebug("Todo::setRunning %d ", run);
85 if ( !mRunSaveTimer ) { 85 if ( !mRunSaveTimer ) {
86 mRunSaveTimer = new QTimer ( this ); 86 mRunSaveTimer = new QTimer ( this );
87 connect ( mRunSaveTimer, SIGNAL( timeout() ), this , SLOT ( saveRunningInfoToFile() ) ); 87 connect ( mRunSaveTimer, SIGNAL( timeout() ), this , SLOT ( saveRunningInfoToFile() ) );
88 } 88 }
89 mRunning = run; 89 mRunning = run;
90 if ( mRunning ) { 90 if ( mRunning ) {
91 mRunSaveTimer->start( 1000 * 60 * 5 ); // 5 min 91 mRunSaveTimer->start( 1000 * 60 * 5 ); // 5 min
92 mRunStart = QDateTime::currentDateTime(); 92 mRunStart = QDateTime::currentDateTime();
93 } else { 93 } else {
94 mRunSaveTimer->stop(); 94 mRunSaveTimer->stop();
95 saveRunningInfoToFile(); 95 saveRunningInfoToFile();
96 } 96 }
97} 97}
98void Todo::saveRunningInfo( QString comment, QDateTime start, QDateTime end ) 98void Todo::saveRunningInfo( QString comment, QDateTime start, QDateTime end )
99{ 99{
100 if ( !mRunning) return;
101 mRunning = false;
100 mRunStart = start; 102 mRunStart = start;
101 mRunEnd = end; 103 mRunEnd = end;
102 saveRunningInfoToFile( comment ); 104 saveRunningInfoToFile( comment );
103} 105}
104void Todo::saveRunningInfoToFile() 106void Todo::saveRunningInfoToFile()
105{ 107{
106 mRunEnd = QDateTime::currentDateTime(); 108 mRunEnd = QDateTime::currentDateTime();
107 saveRunningInfoToFile( QString::null ); 109 saveRunningInfoToFile( QString::null );
108} 110}
109void Todo::saveRunningInfoToFile( QString comment ) 111void Todo::saveRunningInfoToFile( QString comment )
110{ 112{
111 //qDebug("Todo::saveRunningInfoToFile() %s", summary().latin1()); 113 //qDebug("Todo::saveRunningInfoToFile() %s", summary().latin1());
112 if ( mRunStart.secsTo ( QDateTime::currentDateTime() ) < 10 ) { 114 if ( mRunStart.secsTo ( QDateTime::currentDateTime() ) < 10 ) {
113 qDebug("Running time < 30 seconds. Skipped. "); 115 qDebug("Running time < 30 seconds. Skipped. ");
114 return; 116 return;
115 } 117 }
116 QString dir = KGlobalSettings::timeTrackerDir(); 118 QString dir = KGlobalSettings::timeTrackerDir();
117 //qDebug("%s ", dir.latin1()); 119 //qDebug("%s ", dir.latin1());
118 QString file = "%1%2%3-%4%5%6-"; 120 QString file = "%1%2%3-%4%5%6-";
119 file = file.arg( mRunStart.date().year(), 4).arg( mRunStart.date().month(),2 ).arg( mRunStart.date().day(), 2 ).arg( mRunStart.time().hour(),2 ).arg( mRunStart.time().minute(),2 ).arg( mRunStart.time().second(),2 ); 121 file = file.arg( mRunStart.date().year(), 4).arg( mRunStart.date().month(),2 ).arg( mRunStart.date().day(), 2 ).arg( mRunStart.time().hour(),2 ).arg( mRunStart.time().minute(),2 ).arg( mRunStart.time().second(),2 );
120 file.replace ( QRegExp (" "), "0" ); 122 file.replace ( QRegExp (" "), "0" );
121 file += uid(); 123 file += uid();
122 //qDebug("File %s ",file.latin1() ); 124 //qDebug("File %s ",file.latin1() );
123 CalendarLocal cal; 125 CalendarLocal cal;
124 cal.setLocalTime(); 126 cal.setLocalTime();
125 Todo * to = (Todo*) clone(); 127 Todo * to = (Todo*) clone();
126 to->setFloats( false ); 128 to->setFloats( false );
127 to->setDtStart( mRunStart ); 129 to->setDtStart( mRunStart );
128 to->setHasStartDate( true ); 130 to->setHasStartDate( true );
129 to->setDtDue( mRunEnd ); 131 to->setDtDue( mRunEnd );
130 to->setHasDueDate( true ); 132 to->setHasDueDate( true );
131 to->setUid( file ); 133 to->setUid( file );
132 if ( !comment.isEmpty() ) { 134 if ( !comment.isEmpty() ) {
133 QString des = to->description(); 135 QString des = to->description();
134 if ( des.isEmpty () ) 136 if ( des.isEmpty () )
135 to->setDescription( "TT-Note: " + comment ); 137 to->setDescription( "TT-Note: " + comment );
136 else 138 else
137 to->setDescription( "TT-Note: " + comment +"\n" + des ); 139 to->setDescription( "TT-Note: " + comment +"\n" + des );
138 } 140 }
139 cal.addIncidence( to ); 141 cal.addIncidence( to );
140 ICalFormat format; 142 ICalFormat format;
141 file = dir +"/" +file +".ics"; 143 file = dir +"/" +file +".ics";
142 format.save( &cal, file ); 144 format.save( &cal, file );
143 saveParents(); 145 saveParents();
144 146
145} 147}
146void Todo::saveParents() 148void Todo::saveParents()
147{ 149{
148 if (!relatedTo() ) 150 if (!relatedTo() )
149 return; 151 return;
150 Incidence * inc = relatedTo(); 152 Incidence * inc = relatedTo();
151 if ( inc->typeID() != todoID ) 153 if ( inc->typeID() != todoID )
152 return; 154 return;
153 Todo* to = (Todo*)inc; 155 Todo* to = (Todo*)inc;
154 bool saveTodo = false; 156 bool saveTodo = false;
155 QString file = KGlobalSettings::timeTrackerDir() + "/"+ to->uid() + ".ics"; 157 QString file = KGlobalSettings::timeTrackerDir() + "/"+ to->uid() + ".ics";
156 QFileInfo fi ( file ); 158 QFileInfo fi ( file );
157 if ( fi.exists() ) { 159 if ( fi.exists() ) {
158 if ( fi.lastModified () < to->lastModified ()) 160 if ( fi.lastModified () < to->lastModified ())
159 saveTodo = true; 161 saveTodo = true;
160 } else { 162 } else {
161 saveTodo = true; 163 saveTodo = true;
162 } 164 }
163 if ( saveTodo ) { 165 if ( saveTodo ) {
164 CalendarLocal cal; 166 CalendarLocal cal;
165 cal.setLocalTime(); 167 cal.setLocalTime();
166 Todo * par = (Todo *) to->clone(); 168 Todo * par = (Todo *) to->clone();
167 cal.addIncidence( par ); 169 cal.addIncidence( par );
168 ICalFormat format; 170 ICalFormat format;
169 format.save( &cal, file ); 171 format.save( &cal, file );
170 } 172 }
171 to->saveParents(); 173 to->saveParents();
172} 174}
173 175
174int Todo::runTime() 176int Todo::runTime()
175{ 177{
176 if ( !mRunning ) 178 if ( !mRunning )
177 return 0; 179 return 0;
178 return mRunStart.secsTo( QDateTime::currentDateTime() ); 180 return mRunStart.secsTo( QDateTime::currentDateTime() );
179} 181}
180bool Todo::hasRunningSub() 182bool Todo::hasRunningSub()
181{ 183{
182 if ( mRunning ) 184 if ( mRunning )
183 return true; 185 return true;
184 Incidence *aTodo; 186 Incidence *aTodo;
185 for (aTodo = mRelations.first(); aTodo; aTodo = mRelations.next()) { 187 for (aTodo = mRelations.first(); aTodo; aTodo = mRelations.next()) {
186 if ( ((Todo*)aTodo)->hasRunningSub() ) 188 if ( ((Todo*)aTodo)->hasRunningSub() )
187 return true; 189 return true;
188 } 190 }
189 return false; 191 return false;
190} 192}
191Incidence *Todo::clone() 193Incidence *Todo::clone()
192{ 194{
193 return new Todo(*this); 195 return new Todo(*this);
194} 196}
195 197
196bool Todo::contains ( Todo* from ) 198bool Todo::contains ( Todo* from )
197{ 199{
198 200
199 if ( !from->summary().isEmpty() ) 201 if ( !from->summary().isEmpty() )
200 if ( !summary().startsWith( from->summary() )) 202 if ( !summary().startsWith( from->summary() ))
201 return false; 203 return false;
202 if ( from->hasStartDate() ) { 204 if ( from->hasStartDate() ) {
203 if ( !hasStartDate() ) 205 if ( !hasStartDate() )
204 return false; 206 return false;
205 if ( from->dtStart() != dtStart()) 207 if ( from->dtStart() != dtStart())
206 return false; 208 return false;
207 } 209 }
208 if ( from->hasDueDate() ){ 210 if ( from->hasDueDate() ){
209 if ( !hasDueDate() ) 211 if ( !hasDueDate() )
210 return false; 212 return false;
211 if ( from->dtDue() != dtDue()) 213 if ( from->dtDue() != dtDue())
212 return false; 214 return false;
213 } 215 }
214 if ( !from->location().isEmpty() ) 216 if ( !from->location().isEmpty() )
215 if ( !location().startsWith( from->location() ) ) 217 if ( !location().startsWith( from->location() ) )
216 return false; 218 return false;
217 if ( !from->description().isEmpty() ) 219 if ( !from->description().isEmpty() )
218 if ( !description().startsWith( from->description() )) 220 if ( !description().startsWith( from->description() ))
219 return false; 221 return false;
220 if ( from->alarms().count() ) { 222 if ( from->alarms().count() ) {
221 Alarm *a = from->alarms().first(); 223 Alarm *a = from->alarms().first();
222 if ( a->enabled() ){ 224 if ( a->enabled() ){
223 if ( !alarms().count() ) 225 if ( !alarms().count() )
224 return false; 226 return false;
225 Alarm *b = alarms().first(); 227 Alarm *b = alarms().first();
226 if( ! b->enabled() ) 228 if( ! b->enabled() )
227 return false; 229 return false;
228 if ( ! (a->offset() == b->offset() )) 230 if ( ! (a->offset() == b->offset() ))
229 return false; 231 return false;
230 } 232 }
231 } 233 }
232 234
233 QStringList cat = categories(); 235 QStringList cat = categories();
234 QStringList catFrom = from->categories(); 236 QStringList catFrom = from->categories();
235 QString nCat; 237 QString nCat;
236 unsigned int iii; 238 unsigned int iii;
237 for ( iii = 0; iii < catFrom.count();++iii ) { 239 for ( iii = 0; iii < catFrom.count();++iii ) {
238 nCat = catFrom[iii]; 240 nCat = catFrom[iii];
239 if ( !nCat.isEmpty() ) 241 if ( !nCat.isEmpty() )
240 if ( !cat.contains( nCat )) { 242 if ( !cat.contains( nCat )) {
241 return false; 243 return false;
242 } 244 }
243 } 245 }
244 if ( from->isCompleted() ) { 246 if ( from->isCompleted() ) {
245 if ( !isCompleted() ) 247 if ( !isCompleted() )
246 return false; 248 return false;
247 } 249 }
248 if( priority() != from->priority() ) 250 if( priority() != from->priority() )
249 return false; 251 return false;
250 252
251 253
252 return true; 254 return true;
253 255
254} 256}
255bool KCal::operator==( const Todo& t1, const Todo& t2 ) 257bool KCal::operator==( const Todo& t1, const Todo& t2 )
256{ 258{
257 259
258 bool ret = operator==( (const Incidence&)t1, (const Incidence&)t2 ); 260 bool ret = operator==( (const Incidence&)t1, (const Incidence&)t2 );
259 if ( ! ret ) 261 if ( ! ret )
260 return false; 262 return false;
261 if ( t1.hasDueDate() == t2.hasDueDate() ) { 263 if ( t1.hasDueDate() == t2.hasDueDate() ) {
262 if ( t1.hasDueDate() ) { 264 if ( t1.hasDueDate() ) {
263 if ( t1.doesFloat() == t2.doesFloat() ) { 265 if ( t1.doesFloat() == t2.doesFloat() ) {
264 if ( t1.doesFloat() ) { 266 if ( t1.doesFloat() ) {
265 if ( t1.dtDue().date() != t2.dtDue().date() ) 267 if ( t1.dtDue().date() != t2.dtDue().date() )
266 return false; 268 return false;
267 } else 269 } else
268 if ( t1.dtDue() != t2.dtDue() ) 270 if ( t1.dtDue() != t2.dtDue() )
269 return false; 271 return false;
270 } else 272 } else
271 return false;// float != 273 return false;// float !=
272 } 274 }
273 275
274 } else 276 } else
275 return false; 277 return false;
276 if ( t1.percentComplete() != t2.percentComplete() ) 278 if ( t1.percentComplete() != t2.percentComplete() )
277 return false; 279 return false;
278 if ( t1.isCompleted() ) { 280 if ( t1.isCompleted() ) {
279 if ( t1.hasCompletedDate() == t2.hasCompletedDate() ) { 281 if ( t1.hasCompletedDate() == t2.hasCompletedDate() ) {
280 if ( t1.hasCompletedDate() ) { 282 if ( t1.hasCompletedDate() ) {
281 if ( t1.completed() != t2.completed() ) 283 if ( t1.completed() != t2.completed() )
282 return false; 284 return false;
283 } 285 }
284 286
285 } else 287 } else
286 return false; 288 return false;
287 } 289 }
288 return true; 290 return true;
289 291
290} 292}
291 293
292void Todo::setDtDue(const QDateTime &dtDue) 294void Todo::setDtDue(const QDateTime &dtDue)
293{ 295{
294 //int diffsecs = mDtDue.secsTo(dtDue); 296 //int diffsecs = mDtDue.secsTo(dtDue);
295 297
296 /*if (mReadOnly) return; 298 /*if (mReadOnly) return;
297 const QPtrList<Alarm>& alarms = alarms(); 299 const QPtrList<Alarm>& alarms = alarms();
298 for (Alarm* alarm = alarms.first(); alarm; alarm = alarms.next()) { 300 for (Alarm* alarm = alarms.first(); alarm; alarm = alarms.next()) {
299 if (alarm->enabled()) { 301 if (alarm->enabled()) {
300 alarm->setTime(alarm->time().addSecs(diffsecs)); 302 alarm->setTime(alarm->time().addSecs(diffsecs));
301 } 303 }
302 }*/ 304 }*/
303 mDtDue = getEvenTime(dtDue); 305 mDtDue = getEvenTime(dtDue);
304 306
305 //kdDebug(5800) << "setDtDue says date is " << mDtDue.toString() << endl; 307 //kdDebug(5800) << "setDtDue says date is " << mDtDue.toString() << endl;
306 308
307 /*const QPtrList<Alarm>& alarms = alarms(); 309 /*const QPtrList<Alarm>& alarms = alarms();
308 for (Alarm* alarm = alarms.first(); alarm; alarm = alarms.next()) 310 for (Alarm* alarm = alarms.first(); alarm; alarm = alarms.next())
309 alarm->setAlarmStart(mDtDue);*/ 311 alarm->setAlarmStart(mDtDue);*/
310 updated(); 312 updated();
311} 313}
312 314
313QDateTime Todo::dtDue() const 315QDateTime Todo::dtDue() const
314{ 316{
315 return mDtDue; 317 return mDtDue;
316} 318}
317 319
318QString Todo::dtDueTimeStr() const 320QString Todo::dtDueTimeStr() const
319{ 321{
320 return KGlobal::locale()->formatTime(mDtDue.time()); 322 return KGlobal::locale()->formatTime(mDtDue.time());
321} 323}
322 324
323QString Todo::dtDueDateStr(bool shortfmt) const 325QString Todo::dtDueDateStr(bool shortfmt) const
324{ 326{
325 return KGlobal::locale()->formatDate(mDtDue.date(),shortfmt); 327 return KGlobal::locale()->formatDate(mDtDue.date(),shortfmt);
326} 328}
327 329
328QString Todo::dtDueStr(bool shortfmt) const 330QString Todo::dtDueStr(bool shortfmt) const
329{ 331{
330 if ( doesFloat() ) 332 if ( doesFloat() )
331 return KGlobal::locale()->formatDate(mDtDue.date(),shortfmt); 333 return KGlobal::locale()->formatDate(mDtDue.date(),shortfmt);
332 return KGlobal::locale()->formatDateTime(mDtDue, shortfmt); 334 return KGlobal::locale()->formatDateTime(mDtDue, shortfmt);
333} 335}
334// retval 0 : no found 336// retval 0 : no found
335// 1 : due for date found 337// 1 : due for date found
336// 2 : overdue for date found 338// 2 : overdue for date found
337int Todo::hasDueSubTodoForDate( const QDate & date, bool checkSubtodos ) 339int Todo::hasDueSubTodoForDate( const QDate & date, bool checkSubtodos )
338{ 340{
339 int retval = 0; 341 int retval = 0;
340 if ( isCompleted() ) 342 if ( isCompleted() )
341 return 0; 343 return 0;
342 if ( hasDueDate() ) { 344 if ( hasDueDate() ) {
343 if ( dtDue().date() < date ) 345 if ( dtDue().date() < date )
344 return 2; 346 return 2;
345 // we do not return, because we may find an overdue sub todo 347 // we do not return, because we may find an overdue sub todo
346 if ( dtDue().date() == date ) 348 if ( dtDue().date() == date )
347 retval = 1; 349 retval = 1;
348 } 350 }
349 if ( checkSubtodos ) { 351 if ( checkSubtodos ) {
350 Incidence *aTodo; 352 Incidence *aTodo;
351 for (aTodo = mRelations.first(); aTodo; aTodo = mRelations.next()) { 353 for (aTodo = mRelations.first(); aTodo; aTodo = mRelations.next()) {
352 int ret = ((Todo*)aTodo)->hasDueSubTodoForDate( date ,checkSubtodos ); 354 int ret = ((Todo*)aTodo)->hasDueSubTodoForDate( date ,checkSubtodos );
353 if ( ret == 2 ) 355 if ( ret == 2 )
354 return 2; 356 return 2;
355 if ( ret == 1) 357 if ( ret == 1)
356 retval = 1; 358 retval = 1;
357 } 359 }
358 } 360 }
359 return retval; 361 return retval;
360} 362}
361int Todo::hasDueSubTodo( bool checkSubtodos ) //= true 363int Todo::hasDueSubTodo( bool checkSubtodos ) //= true
362{ 364{
363 return hasDueSubTodoForDate(QDate::currentDate(), checkSubtodos ); 365 return hasDueSubTodoForDate(QDate::currentDate(), checkSubtodos );
364} 366}
365bool Todo::hasDueDate() const 367bool Todo::hasDueDate() const
366{ 368{
367 return mHasDueDate; 369 return mHasDueDate;
368} 370}
369 371
370void Todo::setHasDueDate(bool f) 372void Todo::setHasDueDate(bool f)
371{ 373{
372 if (mReadOnly) return; 374 if (mReadOnly) return;
373 mHasDueDate = f; 375 mHasDueDate = f;
374 updated(); 376 updated();
375} 377}
376 378
377 379
378#if 0 380#if 0
379void Todo::setStatus(const QString &statStr) 381void Todo::setStatus(const QString &statStr)
380{ 382{
381 if (mReadOnly) return; 383 if (mReadOnly) return;
382 QString ss(statStr.upper()); 384 QString ss(statStr.upper());
383 385
384 if (ss == "X-ACTION") 386 if (ss == "X-ACTION")
385 mStatus = NEEDS_ACTION; 387 mStatus = NEEDS_ACTION;
386 else if (ss == "NEEDS ACTION") 388 else if (ss == "NEEDS ACTION")
387 mStatus = NEEDS_ACTION; 389 mStatus = NEEDS_ACTION;
388 else if (ss == "ACCEPTED") 390 else if (ss == "ACCEPTED")
389 mStatus = ACCEPTED; 391 mStatus = ACCEPTED;
390 else if (ss == "SENT") 392 else if (ss == "SENT")
391 mStatus = SENT; 393 mStatus = SENT;
392 else if (ss == "TENTATIVE") 394 else if (ss == "TENTATIVE")
393 mStatus = TENTATIVE; 395 mStatus = TENTATIVE;
394 else if (ss == "CONFIRMED") 396 else if (ss == "CONFIRMED")
395 mStatus = CONFIRMED; 397 mStatus = CONFIRMED;
396 else if (ss == "DECLINED") 398 else if (ss == "DECLINED")
397 mStatus = DECLINED; 399 mStatus = DECLINED;
398 else if (ss == "COMPLETED") 400 else if (ss == "COMPLETED")
399 mStatus = COMPLETED; 401 mStatus = COMPLETED;
400 else if (ss == "DELEGATED") 402 else if (ss == "DELEGATED")
401 mStatus = DELEGATED; 403 mStatus = DELEGATED;
402 404
403 updated(); 405 updated();
404} 406}
405 407
406void Todo::setStatus(int status) 408void Todo::setStatus(int status)
407{ 409{
408 if (mReadOnly) return; 410 if (mReadOnly) return;
409 mStatus = status; 411 mStatus = status;
410 updated(); 412 updated();
411} 413}
412 414
413int Todo::status() const 415int Todo::status() const
414{ 416{
415 return mStatus; 417 return mStatus;
416} 418}
417 419
418QString Todo::statusStr() const 420QString Todo::statusStr() const
419{ 421{
420 switch(mStatus) { 422 switch(mStatus) {
421 case NEEDS_ACTION: 423 case NEEDS_ACTION:
422 return QString("NEEDS ACTION"); 424 return QString("NEEDS ACTION");
423 break; 425 break;
424 case ACCEPTED: 426 case ACCEPTED:
425 return QString("ACCEPTED"); 427 return QString("ACCEPTED");
426 break; 428 break;
427 case SENT: 429 case SENT:
428 return QString("SENT"); 430 return QString("SENT");
429 break; 431 break;
430 case TENTATIVE: 432 case TENTATIVE:
431 return QString("TENTATIVE"); 433 return QString("TENTATIVE");
432 break; 434 break;
433 case CONFIRMED: 435 case CONFIRMED:
434 return QString("CONFIRMED"); 436 return QString("CONFIRMED");
435 break; 437 break;
436 case DECLINED: 438 case DECLINED:
437 return QString("DECLINED"); 439 return QString("DECLINED");
438 break; 440 break;
439 case COMPLETED: 441 case COMPLETED:
440 return QString("COMPLETED"); 442 return QString("COMPLETED");
441 break; 443 break;
442 case DELEGATED: 444 case DELEGATED:
443 return QString("DELEGATED"); 445 return QString("DELEGATED");
444 break; 446 break;
445 } 447 }
446 return QString(""); 448 return QString("");
447} 449}
448#endif 450#endif
449 451
450bool Todo::isCompleted() const 452bool Todo::isCompleted() const
451{ 453{
452 if (mPercentComplete == 100) { 454 if (mPercentComplete == 100) {
453 return true; 455 return true;
454 } 456 }
455 else return false; 457 else return false;
456} 458}
457 459
458void Todo::setCompleted(bool completed) 460void Todo::setCompleted(bool completed)
459{ 461{
460 if ( mHasRecurrenceID && completed && mPercentComplete != 100 ) { 462 if ( mHasRecurrenceID && completed && mPercentComplete != 100 ) {
461 if ( !setRecurDates() ) 463 if ( !setRecurDates() )
462 completed = false; 464 completed = false;
463 } 465 }
464 if (completed) mPercentComplete = 100; 466 if (completed) mPercentComplete = 100;
465 else { 467 else {
466 mPercentComplete = 0; 468 mPercentComplete = 0;
467 mHasCompletedDate = false; 469 mHasCompletedDate = false;
468 } 470 }
469 updated(); 471 updated();
470} 472}
471 473
472QDateTime Todo::completed() const 474QDateTime Todo::completed() const
473{ 475{
474 return mCompleted; 476 return mCompleted;
475} 477}
476 478
477QString Todo::completedStr( bool shortF ) const 479QString Todo::completedStr( bool shortF ) const
478{ 480{
479 return KGlobal::locale()->formatDateTime(mCompleted, shortF); 481 return KGlobal::locale()->formatDateTime(mCompleted, shortF);
480} 482}
481 483
482void Todo::setCompleted(const QDateTime &completed) 484void Todo::setCompleted(const QDateTime &completed)
483{ 485{
484 //qDebug("Todo::setCompleted "); 486 //qDebug("Todo::setCompleted ");
485 if ( mHasCompletedDate ) { 487 if ( mHasCompletedDate ) {
486 // qDebug("has completed data - return "); 488 // qDebug("has completed data - return ");
487 return; 489 return;
488 } 490 }
489 mHasCompletedDate = true; 491 mHasCompletedDate = true;
490 mPercentComplete = 100; 492 mPercentComplete = 100;
491 mCompleted = getEvenTime(completed); 493 mCompleted = getEvenTime(completed);
492 updated(); 494 updated();
493} 495}
494 496
495bool Todo::hasCompletedDate() const 497bool Todo::hasCompletedDate() const
496{ 498{
497 return mHasCompletedDate; 499 return mHasCompletedDate;
498} 500}
499 501
500int Todo::percentComplete() const 502int Todo::percentComplete() const
501{ 503{
502 return mPercentComplete; 504 return mPercentComplete;
503} 505}
504bool Todo::setRecurDates() 506bool Todo::setRecurDates()
505{ 507{
506 if ( !mHasRecurrenceID ) 508 if ( !mHasRecurrenceID )
507 return true; 509 return true;
508 int secs = mDtStart.secsTo( dtDue() ); 510 int secs = mDtStart.secsTo( dtDue() );
509 bool ok; 511 bool ok;
510 qDebug("T:setRecurDates() "); 512 qDebug("T:setRecurDates() ");
511 //qDebug("%s %s %s ",mDtStart.toString().latin1(), dtDue().toString().latin1(),mRecurrenceID.toString().latin1() ); 513 //qDebug("%s %s %s ",mDtStart.toString().latin1(), dtDue().toString().latin1(),mRecurrenceID.toString().latin1() );
512 QDateTime next = getNextOccurence( mRecurrenceID, &ok ); 514 QDateTime next = getNextOccurence( mRecurrenceID, &ok );
513 if ( ok ) { 515 if ( ok ) {
514 mRecurrenceID = next; 516 mRecurrenceID = next;
515 mDtStart = next; 517 mDtStart = next;
516 setDtDue( next.addSecs( secs ) ); 518 setDtDue( next.addSecs( secs ) );
517 if ( QDateTime::currentDateTime() > next) 519 if ( QDateTime::currentDateTime() > next)
518 return false; 520 return false;
519 } else { 521 } else {
520 setHasRecurrenceID( false ); 522 setHasRecurrenceID( false );
521 recurrence()->unsetRecurs(); 523 recurrence()->unsetRecurs();
522 } 524 }
523 return true; 525 return true;
524} 526}
525void Todo::setPercentComplete(int v) 527void Todo::setPercentComplete(int v)
526{ 528{
527 if ( mHasRecurrenceID && v == 100 && mPercentComplete != 100 ) { 529 if ( mHasRecurrenceID && v == 100 && mPercentComplete != 100 ) {
528 if ( !setRecurDates() ) 530 if ( !setRecurDates() )
529 v = 0; 531 v = 0;
530 } 532 }
531 mPercentComplete = v; 533 mPercentComplete = v;
532 if ( v != 100 ) 534 if ( v != 100 )
533 mHasCompletedDate = false; 535 mHasCompletedDate = false;
534 updated(); 536 updated();
535} 537}
536QDateTime Todo::getNextAlarmDateTime( bool * ok, int * offset, QDateTime start_dt ) const 538QDateTime Todo::getNextAlarmDateTime( bool * ok, int * offset, QDateTime start_dt ) const
537{ 539{
538 if ( isCompleted() || ! hasDueDate() || cancelled() || !alarmEnabled() ) { 540 if ( isCompleted() || ! hasDueDate() || cancelled() || !alarmEnabled() ) {
539 *ok = false; 541 *ok = false;
540 return QDateTime (); 542 return QDateTime ();
541 } 543 }
542 QDateTime incidenceStart; 544 QDateTime incidenceStart;
543 incidenceStart = dtDue(); 545 incidenceStart = dtDue();
544 bool enabled = false; 546 bool enabled = false;
545 Alarm* alarm; 547 Alarm* alarm;
546 int off = 0; 548 int off = 0;
547 QDateTime alarmStart = QDateTime::currentDateTime().addDays( 3650 );; 549 QDateTime alarmStart = QDateTime::currentDateTime().addDays( 3650 );;
548 // if ( QDateTime::currentDateTime() > incidenceStart ){ 550 // if ( QDateTime::currentDateTime() > incidenceStart ){
549// *ok = false; 551// *ok = false;
550// return incidenceStart; 552// return incidenceStart;
551// } 553// }
552 for (QPtrListIterator<Alarm> it(mAlarms); (alarm = it.current()) != 0; ++it) { 554 for (QPtrListIterator<Alarm> it(mAlarms); (alarm = it.current()) != 0; ++it) {
553 if (alarm->enabled()) { 555 if (alarm->enabled()) {
554 if ( alarm->hasTime () ) { 556 if ( alarm->hasTime () ) {
555 if ( alarm->time() < alarmStart ) { 557 if ( alarm->time() < alarmStart ) {
556 alarmStart = alarm->time(); 558 alarmStart = alarm->time();
557 enabled = true; 559 enabled = true;
558 off = alarmStart.secsTo( incidenceStart ); 560 off = alarmStart.secsTo( incidenceStart );
559 } 561 }
560 562
561 } else { 563 } else {
562 int secs = alarm->startOffset().asSeconds(); 564 int secs = alarm->startOffset().asSeconds();
563 if ( incidenceStart.addSecs( secs ) < alarmStart ) { 565 if ( incidenceStart.addSecs( secs ) < alarmStart ) {
564 alarmStart = incidenceStart.addSecs( secs ); 566 alarmStart = incidenceStart.addSecs( secs );
565 enabled = true; 567 enabled = true;
566 off = -secs; 568 off = -secs;
567 } 569 }
568 } 570 }
569 } 571 }
570 } 572 }
571 if ( enabled ) { 573 if ( enabled ) {
572 if ( alarmStart > start_dt ) { 574 if ( alarmStart > start_dt ) {
573 *ok = true; 575 *ok = true;
574 * offset = off; 576 * offset = off;
575 return alarmStart; 577 return alarmStart;
576 } 578 }
577 } 579 }
578 *ok = false; 580 *ok = false;
579 return QDateTime (); 581 return QDateTime ();
580 582
581} 583}
582 584
583void Todo::checkSetCompletedFalse() 585void Todo::checkSetCompletedFalse()
584{ 586{
585 if ( !mHasRecurrenceID ) { 587 if ( !mHasRecurrenceID ) {
586 qDebug("ERROR 1 in Todo::checkSetCompletedFalse"); 588 qDebug("ERROR 1 in Todo::checkSetCompletedFalse");
587 return; 589 return;
588 } 590 }
589 // qDebug("Todo::checkSetCompletedFalse()"); 591 // qDebug("Todo::checkSetCompletedFalse()");
590 //qDebug("%s %s %s ",mDtStart.toString().latin1(), dtDue().toString().latin1(),mRecurrenceID.toString().latin1() ); 592 //qDebug("%s %s %s ",mDtStart.toString().latin1(), dtDue().toString().latin1(),mRecurrenceID.toString().latin1() );
591 if ( mPercentComplete == 100 ) { 593 if ( mPercentComplete == 100 ) {
592 QDateTime dt = QDateTime::currentDateTime(); 594 QDateTime dt = QDateTime::currentDateTime();
593 if ( dt > mDtStart && dt > mRecurrenceID ) { 595 if ( dt > mDtStart && dt > mRecurrenceID ) {
594 qDebug("start: %s --due: %s --recID: %s ",mDtStart.toString().latin1(), dtDue().toString().latin1(),mRecurrenceID.toString().latin1() ); 596 qDebug("start: %s --due: %s --recID: %s ",mDtStart.toString().latin1(), dtDue().toString().latin1(),mRecurrenceID.toString().latin1() );
595 setCompleted( false ); 597 setCompleted( false );
596 qDebug("Todo::checkSetCompletedFalse "); 598 qDebug("Todo::checkSetCompletedFalse ");
597 } 599 }
598 } 600 }
599} 601}
diff --git a/libkcal/todo.h b/libkcal/todo.h
index 11f848e..425dfad 100644
--- a/libkcal/todo.h
+++ b/libkcal/todo.h
@@ -1,155 +1,155 @@
1/* 1/*
2 This file is part of libkcal. 2 This file is part of libkcal.
3 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org> 3 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org>
4 4
5 This library is free software; you can redistribute it and/or 5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Library General Public 6 modify it under the terms of the GNU Library General Public
7 License as published by the Free Software Foundation; either 7 License as published by the Free Software Foundation; either
8 version 2 of the License, or (at your option) any later version. 8 version 2 of the License, or (at your option) any later version.
9 9
10 This library is distributed in the hope that it will be useful, 10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Library General Public License for more details. 13 Library General Public License for more details.
14 14
15 You should have received a copy of the GNU Library General Public License 15 You should have received a copy of the GNU Library General Public License
16 along with this library; see the file COPYING.LIB. If not, write to 16 along with this library; see the file COPYING.LIB. If not, write to
17 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 17 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 Boston, MA 02111-1307, USA. 18 Boston, MA 02111-1307, USA.
19*/ 19*/
20#ifndef TODO_H 20#ifndef TODO_H
21#define TODO_H 21#define TODO_H
22// 22//
23// Todo component, representing a VTODO object 23// Todo component, representing a VTODO object
24// 24//
25 25
26#include "incidence.h" 26#include "incidence.h"
27 27
28#include <qtimer.h> 28#include <qtimer.h>
29 29
30namespace KCal { 30namespace KCal {
31 31
32/** 32/**
33 This class provides a Todo in the sense of RFC2445. 33 This class provides a Todo in the sense of RFC2445.
34*/ 34*/
35 class Todo : public QObject,public Incidence 35 class Todo : public QObject,public Incidence
36{ 36{
37 Q_OBJECT 37 Q_OBJECT
38 public: 38 public:
39 Todo(); 39 Todo();
40 Todo(const Todo &); 40 Todo(const Todo &);
41 ~Todo(); 41 ~Todo();
42 typedef ListBase<Todo> List; 42 typedef ListBase<Todo> List;
43 QCString type() const { return "Todo"; } 43 QCString type() const { return "Todo"; }
44 IncTypeID typeID() const { return todoID; } 44 IncTypeID typeID() const { return todoID; }
45 void saveRunningInfo( QString comment, QDateTime start, QDateTime end );
46 45
47 /** Return an exact copy of this todo. */ 46 /** Return an exact copy of this todo. */
48 Incidence *clone(); 47 Incidence *clone();
49 QDateTime getNextAlarmDateTime( bool * ok, int * offset, QDateTime start_dt ) const; 48 QDateTime getNextAlarmDateTime( bool * ok, int * offset, QDateTime start_dt ) const;
50 49
51 /** for setting the todo's due date/time with a QDateTime. */ 50 /** for setting the todo's due date/time with a QDateTime. */
52 void setDtDue(const QDateTime &dtDue); 51 void setDtDue(const QDateTime &dtDue);
53 /** returns an event's Due date/time as a QDateTime. */ 52 /** returns an event's Due date/time as a QDateTime. */
54 QDateTime dtDue() const; 53 QDateTime dtDue() const;
55 /** returns an event's due time as a string formatted according to the 54 /** returns an event's due time as a string formatted according to the
56 users locale settings */ 55 users locale settings */
57 QString dtDueTimeStr() const; 56 QString dtDueTimeStr() const;
58 /** returns an event's due date as a string formatted according to the 57 /** returns an event's due date as a string formatted according to the
59 users locale settings */ 58 users locale settings */
60 QString dtDueDateStr(bool shortfmt=true) const; 59 QString dtDueDateStr(bool shortfmt=true) const;
61 /** returns an event's due date and time as a string formatted according 60 /** returns an event's due date and time as a string formatted according
62 to the users locale settings */ 61 to the users locale settings */
63 QString dtDueStr(bool shortfmt=true) const; 62 QString dtDueStr(bool shortfmt=true) const;
64 63
65 /** returns TRUE or FALSE depending on whether the todo has a due date */ 64 /** returns TRUE or FALSE depending on whether the todo has a due date */
66 bool hasDueDate() const; 65 bool hasDueDate() const;
67 /** sets the event's hasDueDate value. */ 66 /** sets the event's hasDueDate value. */
68 void setHasDueDate(bool f); 67 void setHasDueDate(bool f);
69 68
70 /* 69 /*
71 Looks for a subtodo (including itself ) which is not complete and is 70 Looks for a subtodo (including itself ) which is not complete and is
72 - overdue, or 71 - overdue, or
73 - due today. 72 - due today.
74 It returns 0 for nothing found, 73 It returns 0 for nothing found,
75 1 for found a todo which is due today and no overdue found 74 1 for found a todo which is due today and no overdue found
76 2 for found a overdue todo 75 2 for found a overdue todo
77 */ 76 */
78 int hasDueSubTodo( bool checkSubtodos = true ); 77 int hasDueSubTodo( bool checkSubtodos = true );
79 /* same as above, but a specific date can be specified*/ 78 /* same as above, but a specific date can be specified*/
80 int hasDueSubTodoForDate( const QDate & date, bool checkSubtodos ); 79 int hasDueSubTodoForDate( const QDate & date, bool checkSubtodos );
81 80
82 81
83 /** sets the event's status to the string specified. The string 82 /** sets the event's status to the string specified. The string
84 * must be a recognized value for the status field, i.e. a string 83 * must be a recognized value for the status field, i.e. a string
85 * equivalent of the possible status enumerations previously described. */ 84 * equivalent of the possible status enumerations previously described. */
86// void setStatus(const QString &statStr); 85// void setStatus(const QString &statStr);
87 /** sets the event's status to the value specified. See the enumeration 86 /** sets the event's status to the value specified. See the enumeration
88 * above for possible values. */ 87 * above for possible values. */
89// void setStatus(int); 88// void setStatus(int);
90 /** return the event's status. */ 89 /** return the event's status. */
91// int status() const; 90// int status() const;
92 /** return the event's status in string format. */ 91 /** return the event's status in string format. */
93// QString statusStr() const; 92// QString statusStr() const;
94 93
95 /** return, if this todo is completed */ 94 /** return, if this todo is completed */
96 bool isCompleted() const; 95 bool isCompleted() const;
97 /** set completed state of this todo */ 96 /** set completed state of this todo */
98 void setCompleted(bool); 97 void setCompleted(bool);
99 98
100 /** 99 /**
101 Return how many percent of the task are completed. Returns a value 100 Return how many percent of the task are completed. Returns a value
102 between 0 and 100. 101 between 0 and 100.
103 */ 102 */
104 int percentComplete() const; 103 int percentComplete() const;
105 /** 104 /**
106 Set how many percent of the task are completed. Valid values are in the 105 Set how many percent of the task are completed. Valid values are in the
107 range from 0 to 100. 106 range from 0 to 100.
108 */ 107 */
109 void setPercentComplete(int); 108 void setPercentComplete(int);
110 109
111 /** return date and time when todo was completed */ 110 /** return date and time when todo was completed */
112 QDateTime completed() const; 111 QDateTime completed() const;
113 QString completedStr(bool shortF = true) const; 112 QString completedStr(bool shortF = true) const;
114 /** set date and time of completion */ 113 /** set date and time of completion */
115 void setCompleted(const QDateTime &completed); 114 void setCompleted(const QDateTime &completed);
116 115
117 /** Return true, if todo has a date associated with completion */ 116 /** Return true, if todo has a date associated with completion */
118 bool hasCompletedDate() const; 117 bool hasCompletedDate() const;
119 bool contains ( Todo*); 118 bool contains ( Todo*);
120 void checkSetCompletedFalse(); 119 void checkSetCompletedFalse();
121 bool setRecurDates(); 120 bool setRecurDates();
122 bool isRunning() {return mRunning;} 121 bool isRunning() {return mRunning;}
123 bool hasRunningSub(); 122 bool hasRunningSub();
124 void setRunning( bool ); 123 void setRunning( bool );
125 void setRunningFalse( QString ); 124 void setRunningFalse( QString );
126 void stopRunning(); 125 void stopRunning();
127 int runTime(); 126 int runTime();
128 QDateTime runStart () const { return mRunStart;} 127 QDateTime runStart () const { return mRunStart;}
128 void saveRunningInfo( QString comment, QDateTime start, QDateTime end );
129 public slots: 129 public slots:
130 void saveRunningInfoToFile( QString st ); 130 void saveRunningInfoToFile( QString st );
131 void saveRunningInfoToFile( ); 131 void saveRunningInfoToFile( );
132 void saveParents(); 132 void saveParents();
133 private: 133 private:
134 bool mRunning; 134 bool mRunning;
135 QTimer * mRunSaveTimer; 135 QTimer * mRunSaveTimer;
136 QDateTime mRunStart; 136 QDateTime mRunStart;
137 QDateTime mRunEnd; 137 QDateTime mRunEnd;
138 bool accept(Visitor &v) { return v.visit(this); } 138 bool accept(Visitor &v) { return v.visit(this); }
139 139
140 QDateTime mDtDue; // due date of todo 140 QDateTime mDtDue; // due date of todo
141 141
142 bool mHasDueDate; // if todo has associated due date 142 bool mHasDueDate; // if todo has associated due date
143 143
144// int mStatus; // confirmed/delegated/tentative/etc 144// int mStatus; // confirmed/delegated/tentative/etc
145 145
146 QDateTime mCompleted; 146 QDateTime mCompleted;
147 bool mHasCompletedDate; 147 bool mHasCompletedDate;
148 148
149 int mPercentComplete; 149 int mPercentComplete;
150}; 150};
151 151
152 bool operator==( const Todo&, const Todo& ); 152 bool operator==( const Todo&, const Todo& );
153} 153}
154 154
155#endif 155#endif