summaryrefslogtreecommitdiffabout
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--libkcal/todo.cpp9
1 files changed, 5 insertions, 4 deletions
diff --git a/libkcal/todo.cpp b/libkcal/todo.cpp
index 19a7ffd..90e7eb9 100644
--- a/libkcal/todo.cpp
+++ b/libkcal/todo.cpp
@@ -1,475 +1,476 @@
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 26
27#include "calendarlocal.h" 27#include "calendarlocal.h"
28#include "icalformat.h" 28#include "icalformat.h"
29#include "todo.h" 29#include "todo.h"
30 30
31using namespace KCal; 31using namespace KCal;
32 32
33Todo::Todo(): Incidence() 33Todo::Todo(): Incidence()
34{ 34{
35// mStatus = TENTATIVE; 35// mStatus = TENTATIVE;
36 36
37 mHasDueDate = false; 37 mHasDueDate = false;
38 setHasStartDate( false ); 38 setHasStartDate( false );
39 mCompleted = getEvenTime(QDateTime::currentDateTime()); 39 mCompleted = getEvenTime(QDateTime::currentDateTime());
40 mHasCompletedDate = false; 40 mHasCompletedDate = false;
41 mPercentComplete = 0; 41 mPercentComplete = 0;
42 mRunning = false; 42 mRunning = false;
43 mRunSaveTimer = 0; 43 mRunSaveTimer = 0;
44} 44}
45 45
46Todo::Todo(const Todo &t) : Incidence(t) 46Todo::Todo(const Todo &t) : Incidence(t)
47{ 47{
48 mDtDue = t.mDtDue; 48 mDtDue = t.mDtDue;
49 mHasDueDate = t.mHasDueDate; 49 mHasDueDate = t.mHasDueDate;
50 mCompleted = t.mCompleted; 50 mCompleted = t.mCompleted;
51 mHasCompletedDate = t.mHasCompletedDate; 51 mHasCompletedDate = t.mHasCompletedDate;
52 mPercentComplete = t.mPercentComplete; 52 mPercentComplete = t.mPercentComplete;
53 mRunning = false; 53 mRunning = false;
54 mRunSaveTimer = 0; 54 mRunSaveTimer = 0;
55} 55}
56 56
57Todo::~Todo() 57Todo::~Todo()
58{ 58{
59 setRunning( false ); 59 setRunning( false );
60 //qDebug("Todo::~Todo() "); 60 //qDebug("Todo::~Todo() ");
61} 61}
62 62
63void Todo::setRunning( bool run ) 63void Todo::setRunning( bool run )
64{ 64{
65 if ( run == mRunning ) 65 if ( run == mRunning )
66 return; 66 return;
67 if ( !mRunSaveTimer ) { 67 if ( !mRunSaveTimer ) {
68 mRunSaveTimer = new QTimer ( this ); 68 mRunSaveTimer = new QTimer ( this );
69 connect ( mRunSaveTimer, SIGNAL( timeout() ), this , SLOT ( saveRunningInfoToFile() ) ); 69 connect ( mRunSaveTimer, SIGNAL( timeout() ), this , SLOT ( saveRunningInfoToFile() ) );
70 } 70 }
71 mRunning = run; 71 mRunning = run;
72 if ( mRunning ) { 72 if ( mRunning ) {
73 mRunSaveTimer->start( 1000 * 60 * 5 ); // 5 min 73 mRunSaveTimer->start( 1000 * 60 * 5 ); // 5 min
74 mRunStart = QDateTime::currentDateTime(); 74 mRunStart = QDateTime::currentDateTime();
75 } else { 75 } else {
76 mRunSaveTimer->stop(); 76 mRunSaveTimer->stop();
77 saveRunningInfoToFile(); 77 saveRunningInfoToFile();
78 } 78 }
79} 79}
80 80
81void Todo::saveRunningInfoToFile() 81void Todo::saveRunningInfoToFile()
82{ 82{
83 qDebug("Todo::saveRunningInfoToFile() %s", summary().latin1()); 83 //qDebug("Todo::saveRunningInfoToFile() %s", summary().latin1());
84 84 if ( mRunStart.secsTo ( QDateTime::currentDateTime() ) < 30 )
85 return;
85 QString dir = KGlobalSettings::timeTrackerDir(); 86 QString dir = KGlobalSettings::timeTrackerDir();
86 qDebug("%s ", dir.latin1()); 87 //qDebug("%s ", dir.latin1());
87 QString file = "%1%2%3-%4%5%6-"; 88 QString file = "%1%2%3-%4%5%6-";
88 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 ); 89 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 );
89 file.replace ( QRegExp (" "), "0" ); 90 file.replace ( QRegExp (" "), "0" );
90 file += uid(); 91 file += uid();
91 qDebug("File %s ",file.latin1() ); 92 //qDebug("File %s ",file.latin1() );
92 CalendarLocal cal; 93 CalendarLocal cal;
93 cal.setTimeZoneId( " 00:00 Europe/London(UTC)" ); 94 cal.setTimeZoneId( " 00:00 Europe/London(UTC)" );
94 Todo * to = (Todo*) clone(); 95 Todo * to = (Todo*) clone();
95 to->setFloats( false ); 96 to->setFloats( false );
96 to->setDtStart( mRunStart ); 97 to->setDtStart( mRunStart );
97 to->setHasStartDate( true ); 98 to->setHasStartDate( true );
98 to->setDtDue( QDateTime::currentDateTime() ); 99 to->setDtDue( QDateTime::currentDateTime() );
99 to->setHasDueDate( true ); 100 to->setHasDueDate( true );
100 to->setUid( file ); 101 to->setUid( file );
101 cal.addIncidence( to ); 102 cal.addIncidence( to );
102 ICalFormat format; 103 ICalFormat format;
103 file = dir +"/" +file +".ics"; 104 file = dir +"/" +file +".ics";
104 format.save( &cal, file ); 105 format.save( &cal, file );
105 106
106} 107}
107 108
108int Todo::runTime() 109int Todo::runTime()
109{ 110{
110 if ( !mRunning ) 111 if ( !mRunning )
111 return 0; 112 return 0;
112 return mRunStart.secsTo( QDateTime::currentDateTime() ); 113 return mRunStart.secsTo( QDateTime::currentDateTime() );
113} 114}
114bool Todo::hasRunningSub() 115bool Todo::hasRunningSub()
115{ 116{
116 if ( mRunning ) 117 if ( mRunning )
117 return true; 118 return true;
118 Incidence *aTodo; 119 Incidence *aTodo;
119 for (aTodo = mRelations.first(); aTodo; aTodo = mRelations.next()) { 120 for (aTodo = mRelations.first(); aTodo; aTodo = mRelations.next()) {
120 if ( ((Todo*)aTodo)->hasRunningSub() ) 121 if ( ((Todo*)aTodo)->hasRunningSub() )
121 return true; 122 return true;
122 } 123 }
123 return false; 124 return false;
124} 125}
125Incidence *Todo::clone() 126Incidence *Todo::clone()
126{ 127{
127 return new Todo(*this); 128 return new Todo(*this);
128} 129}
129 130
130bool Todo::contains ( Todo* from ) 131bool Todo::contains ( Todo* from )
131{ 132{
132 133
133 if ( !from->summary().isEmpty() ) 134 if ( !from->summary().isEmpty() )
134 if ( !summary().startsWith( from->summary() )) 135 if ( !summary().startsWith( from->summary() ))
135 return false; 136 return false;
136 if ( from->hasStartDate() ) { 137 if ( from->hasStartDate() ) {
137 if ( !hasStartDate() ) 138 if ( !hasStartDate() )
138 return false; 139 return false;
139 if ( from->dtStart() != dtStart()) 140 if ( from->dtStart() != dtStart())
140 return false; 141 return false;
141 } 142 }
142 if ( from->hasDueDate() ){ 143 if ( from->hasDueDate() ){
143 if ( !hasDueDate() ) 144 if ( !hasDueDate() )
144 return false; 145 return false;
145 if ( from->dtDue() != dtDue()) 146 if ( from->dtDue() != dtDue())
146 return false; 147 return false;
147 } 148 }
148 if ( !from->location().isEmpty() ) 149 if ( !from->location().isEmpty() )
149 if ( !location().startsWith( from->location() ) ) 150 if ( !location().startsWith( from->location() ) )
150 return false; 151 return false;
151 if ( !from->description().isEmpty() ) 152 if ( !from->description().isEmpty() )
152 if ( !description().startsWith( from->description() )) 153 if ( !description().startsWith( from->description() ))
153 return false; 154 return false;
154 if ( from->alarms().count() ) { 155 if ( from->alarms().count() ) {
155 Alarm *a = from->alarms().first(); 156 Alarm *a = from->alarms().first();
156 if ( a->enabled() ){ 157 if ( a->enabled() ){
157 if ( !alarms().count() ) 158 if ( !alarms().count() )
158 return false; 159 return false;
159 Alarm *b = alarms().first(); 160 Alarm *b = alarms().first();
160 if( ! b->enabled() ) 161 if( ! b->enabled() )
161 return false; 162 return false;
162 if ( ! (a->offset() == b->offset() )) 163 if ( ! (a->offset() == b->offset() ))
163 return false; 164 return false;
164 } 165 }
165 } 166 }
166 167
167 QStringList cat = categories(); 168 QStringList cat = categories();
168 QStringList catFrom = from->categories(); 169 QStringList catFrom = from->categories();
169 QString nCat; 170 QString nCat;
170 unsigned int iii; 171 unsigned int iii;
171 for ( iii = 0; iii < catFrom.count();++iii ) { 172 for ( iii = 0; iii < catFrom.count();++iii ) {
172 nCat = catFrom[iii]; 173 nCat = catFrom[iii];
173 if ( !nCat.isEmpty() ) 174 if ( !nCat.isEmpty() )
174 if ( !cat.contains( nCat )) { 175 if ( !cat.contains( nCat )) {
175 return false; 176 return false;
176 } 177 }
177 } 178 }
178 if ( from->isCompleted() ) { 179 if ( from->isCompleted() ) {
179 if ( !isCompleted() ) 180 if ( !isCompleted() )
180 return false; 181 return false;
181 } 182 }
182 if( priority() != from->priority() ) 183 if( priority() != from->priority() )
183 return false; 184 return false;
184 185
185 186
186 return true; 187 return true;
187 188
188} 189}
189bool KCal::operator==( const Todo& t1, const Todo& t2 ) 190bool KCal::operator==( const Todo& t1, const Todo& t2 )
190{ 191{
191 192
192 bool ret = operator==( (const Incidence&)t1, (const Incidence&)t2 ); 193 bool ret = operator==( (const Incidence&)t1, (const Incidence&)t2 );
193 if ( ! ret ) 194 if ( ! ret )
194 return false; 195 return false;
195 if ( t1.hasDueDate() == t2.hasDueDate() ) { 196 if ( t1.hasDueDate() == t2.hasDueDate() ) {
196 if ( t1.hasDueDate() ) { 197 if ( t1.hasDueDate() ) {
197 if ( t1.doesFloat() == t2.doesFloat() ) { 198 if ( t1.doesFloat() == t2.doesFloat() ) {
198 if ( t1.doesFloat() ) { 199 if ( t1.doesFloat() ) {
199 if ( t1.dtDue().date() != t2.dtDue().date() ) 200 if ( t1.dtDue().date() != t2.dtDue().date() )
200 return false; 201 return false;
201 } else 202 } else
202 if ( t1.dtDue() != t2.dtDue() ) 203 if ( t1.dtDue() != t2.dtDue() )
203 return false; 204 return false;
204 } else 205 } else
205 return false;// float != 206 return false;// float !=
206 } 207 }
207 208
208 } else 209 } else
209 return false; 210 return false;
210 if ( t1.percentComplete() != t2.percentComplete() ) 211 if ( t1.percentComplete() != t2.percentComplete() )
211 return false; 212 return false;
212 if ( t1.isCompleted() ) { 213 if ( t1.isCompleted() ) {
213 if ( t1.hasCompletedDate() == t2.hasCompletedDate() ) { 214 if ( t1.hasCompletedDate() == t2.hasCompletedDate() ) {
214 if ( t1.hasCompletedDate() ) { 215 if ( t1.hasCompletedDate() ) {
215 if ( t1.completed() != t2.completed() ) 216 if ( t1.completed() != t2.completed() )
216 return false; 217 return false;
217 } 218 }
218 219
219 } else 220 } else
220 return false; 221 return false;
221 } 222 }
222 return true; 223 return true;
223 224
224} 225}
225 226
226void Todo::setDtDue(const QDateTime &dtDue) 227void Todo::setDtDue(const QDateTime &dtDue)
227{ 228{
228 //int diffsecs = mDtDue.secsTo(dtDue); 229 //int diffsecs = mDtDue.secsTo(dtDue);
229 230
230 /*if (mReadOnly) return; 231 /*if (mReadOnly) return;
231 const QPtrList<Alarm>& alarms = alarms(); 232 const QPtrList<Alarm>& alarms = alarms();
232 for (Alarm* alarm = alarms.first(); alarm; alarm = alarms.next()) { 233 for (Alarm* alarm = alarms.first(); alarm; alarm = alarms.next()) {
233 if (alarm->enabled()) { 234 if (alarm->enabled()) {
234 alarm->setTime(alarm->time().addSecs(diffsecs)); 235 alarm->setTime(alarm->time().addSecs(diffsecs));
235 } 236 }
236 }*/ 237 }*/
237 mDtDue = getEvenTime(dtDue); 238 mDtDue = getEvenTime(dtDue);
238 239
239 //kdDebug(5800) << "setDtDue says date is " << mDtDue.toString() << endl; 240 //kdDebug(5800) << "setDtDue says date is " << mDtDue.toString() << endl;
240 241
241 /*const QPtrList<Alarm>& alarms = alarms(); 242 /*const QPtrList<Alarm>& alarms = alarms();
242 for (Alarm* alarm = alarms.first(); alarm; alarm = alarms.next()) 243 for (Alarm* alarm = alarms.first(); alarm; alarm = alarms.next())
243 alarm->setAlarmStart(mDtDue);*/ 244 alarm->setAlarmStart(mDtDue);*/
244 updated(); 245 updated();
245} 246}
246 247
247QDateTime Todo::dtDue() const 248QDateTime Todo::dtDue() const
248{ 249{
249 return mDtDue; 250 return mDtDue;
250} 251}
251 252
252QString Todo::dtDueTimeStr() const 253QString Todo::dtDueTimeStr() const
253{ 254{
254 return KGlobal::locale()->formatTime(mDtDue.time()); 255 return KGlobal::locale()->formatTime(mDtDue.time());
255} 256}
256 257
257QString Todo::dtDueDateStr(bool shortfmt) const 258QString Todo::dtDueDateStr(bool shortfmt) const
258{ 259{
259 return KGlobal::locale()->formatDate(mDtDue.date(),shortfmt); 260 return KGlobal::locale()->formatDate(mDtDue.date(),shortfmt);
260} 261}
261 262
262QString Todo::dtDueStr(bool shortfmt) const 263QString Todo::dtDueStr(bool shortfmt) const
263{ 264{
264 if ( doesFloat() ) 265 if ( doesFloat() )
265 return KGlobal::locale()->formatDate(mDtDue.date(),shortfmt); 266 return KGlobal::locale()->formatDate(mDtDue.date(),shortfmt);
266 return KGlobal::locale()->formatDateTime(mDtDue, shortfmt); 267 return KGlobal::locale()->formatDateTime(mDtDue, shortfmt);
267} 268}
268// retval 0 : no found 269// retval 0 : no found
269// 1 : due for date found 270// 1 : due for date found
270// 2 : overdue for date found 271// 2 : overdue for date found
271int Todo::hasDueSubTodoForDate( const QDate & date, bool checkSubtodos ) 272int Todo::hasDueSubTodoForDate( const QDate & date, bool checkSubtodos )
272{ 273{
273 int retval = 0; 274 int retval = 0;
274 if ( isCompleted() ) 275 if ( isCompleted() )
275 return 0; 276 return 0;
276 if ( hasDueDate() ) { 277 if ( hasDueDate() ) {
277 if ( dtDue().date() < date ) 278 if ( dtDue().date() < date )
278 return 2; 279 return 2;
279 // we do not return, because we may find an overdue sub todo 280 // we do not return, because we may find an overdue sub todo
280 if ( dtDue().date() == date ) 281 if ( dtDue().date() == date )
281 retval = 1; 282 retval = 1;
282 } 283 }
283 if ( checkSubtodos ) { 284 if ( checkSubtodos ) {
284 Incidence *aTodo; 285 Incidence *aTodo;
285 for (aTodo = mRelations.first(); aTodo; aTodo = mRelations.next()) { 286 for (aTodo = mRelations.first(); aTodo; aTodo = mRelations.next()) {
286 int ret = ((Todo*)aTodo)->hasDueSubTodoForDate( date ,checkSubtodos ); 287 int ret = ((Todo*)aTodo)->hasDueSubTodoForDate( date ,checkSubtodos );
287 if ( ret == 2 ) 288 if ( ret == 2 )
288 return 2; 289 return 2;
289 if ( ret == 1) 290 if ( ret == 1)
290 retval = 1; 291 retval = 1;
291 } 292 }
292 } 293 }
293 return retval; 294 return retval;
294} 295}
295int Todo::hasDueSubTodo( bool checkSubtodos ) //= true 296int Todo::hasDueSubTodo( bool checkSubtodos ) //= true
296{ 297{
297 return hasDueSubTodoForDate(QDate::currentDate(), checkSubtodos ); 298 return hasDueSubTodoForDate(QDate::currentDate(), checkSubtodos );
298} 299}
299bool Todo::hasDueDate() const 300bool Todo::hasDueDate() const
300{ 301{
301 return mHasDueDate; 302 return mHasDueDate;
302} 303}
303 304
304void Todo::setHasDueDate(bool f) 305void Todo::setHasDueDate(bool f)
305{ 306{
306 if (mReadOnly) return; 307 if (mReadOnly) return;
307 mHasDueDate = f; 308 mHasDueDate = f;
308 updated(); 309 updated();
309} 310}
310 311
311 312
312#if 0 313#if 0
313void Todo::setStatus(const QString &statStr) 314void Todo::setStatus(const QString &statStr)
314{ 315{
315 if (mReadOnly) return; 316 if (mReadOnly) return;
316 QString ss(statStr.upper()); 317 QString ss(statStr.upper());
317 318
318 if (ss == "X-ACTION") 319 if (ss == "X-ACTION")
319 mStatus = NEEDS_ACTION; 320 mStatus = NEEDS_ACTION;
320 else if (ss == "NEEDS ACTION") 321 else if (ss == "NEEDS ACTION")
321 mStatus = NEEDS_ACTION; 322 mStatus = NEEDS_ACTION;
322 else if (ss == "ACCEPTED") 323 else if (ss == "ACCEPTED")
323 mStatus = ACCEPTED; 324 mStatus = ACCEPTED;
324 else if (ss == "SENT") 325 else if (ss == "SENT")
325 mStatus = SENT; 326 mStatus = SENT;
326 else if (ss == "TENTATIVE") 327 else if (ss == "TENTATIVE")
327 mStatus = TENTATIVE; 328 mStatus = TENTATIVE;
328 else if (ss == "CONFIRMED") 329 else if (ss == "CONFIRMED")
329 mStatus = CONFIRMED; 330 mStatus = CONFIRMED;
330 else if (ss == "DECLINED") 331 else if (ss == "DECLINED")
331 mStatus = DECLINED; 332 mStatus = DECLINED;
332 else if (ss == "COMPLETED") 333 else if (ss == "COMPLETED")
333 mStatus = COMPLETED; 334 mStatus = COMPLETED;
334 else if (ss == "DELEGATED") 335 else if (ss == "DELEGATED")
335 mStatus = DELEGATED; 336 mStatus = DELEGATED;
336 337
337 updated(); 338 updated();
338} 339}
339 340
340void Todo::setStatus(int status) 341void Todo::setStatus(int status)
341{ 342{
342 if (mReadOnly) return; 343 if (mReadOnly) return;
343 mStatus = status; 344 mStatus = status;
344 updated(); 345 updated();
345} 346}
346 347
347int Todo::status() const 348int Todo::status() const
348{ 349{
349 return mStatus; 350 return mStatus;
350} 351}
351 352
352QString Todo::statusStr() const 353QString Todo::statusStr() const
353{ 354{
354 switch(mStatus) { 355 switch(mStatus) {
355 case NEEDS_ACTION: 356 case NEEDS_ACTION:
356 return QString("NEEDS ACTION"); 357 return QString("NEEDS ACTION");
357 break; 358 break;
358 case ACCEPTED: 359 case ACCEPTED:
359 return QString("ACCEPTED"); 360 return QString("ACCEPTED");
360 break; 361 break;
361 case SENT: 362 case SENT:
362 return QString("SENT"); 363 return QString("SENT");
363 break; 364 break;
364 case TENTATIVE: 365 case TENTATIVE:
365 return QString("TENTATIVE"); 366 return QString("TENTATIVE");
366 break; 367 break;
367 case CONFIRMED: 368 case CONFIRMED:
368 return QString("CONFIRMED"); 369 return QString("CONFIRMED");
369 break; 370 break;
370 case DECLINED: 371 case DECLINED:
371 return QString("DECLINED"); 372 return QString("DECLINED");
372 break; 373 break;
373 case COMPLETED: 374 case COMPLETED:
374 return QString("COMPLETED"); 375 return QString("COMPLETED");
375 break; 376 break;
376 case DELEGATED: 377 case DELEGATED:
377 return QString("DELEGATED"); 378 return QString("DELEGATED");
378 break; 379 break;
379 } 380 }
380 return QString(""); 381 return QString("");
381} 382}
382#endif 383#endif
383 384
384bool Todo::isCompleted() const 385bool Todo::isCompleted() const
385{ 386{
386 if (mPercentComplete == 100) { 387 if (mPercentComplete == 100) {
387 return true; 388 return true;
388 } 389 }
389 else return false; 390 else return false;
390} 391}
391 392
392void Todo::setCompleted(bool completed) 393void Todo::setCompleted(bool completed)
393{ 394{
394 if ( mHasRecurrenceID && completed && mPercentComplete != 100 ) { 395 if ( mHasRecurrenceID && completed && mPercentComplete != 100 ) {
395 if ( !setRecurDates() ) 396 if ( !setRecurDates() )
396 completed = false; 397 completed = false;
397 } 398 }
398 if (completed) mPercentComplete = 100; 399 if (completed) mPercentComplete = 100;
399 else { 400 else {
400 mPercentComplete = 0; 401 mPercentComplete = 0;
401 mHasCompletedDate = false; 402 mHasCompletedDate = false;
402 } 403 }
403 updated(); 404 updated();
404} 405}
405 406
406QDateTime Todo::completed() const 407QDateTime Todo::completed() const
407{ 408{
408 return mCompleted; 409 return mCompleted;
409} 410}
410 411
411QString Todo::completedStr( bool shortF ) const 412QString Todo::completedStr( bool shortF ) const
412{ 413{
413 return KGlobal::locale()->formatDateTime(mCompleted, shortF); 414 return KGlobal::locale()->formatDateTime(mCompleted, shortF);
414} 415}
415 416
416void Todo::setCompleted(const QDateTime &completed) 417void Todo::setCompleted(const QDateTime &completed)
417{ 418{
418 //qDebug("Todo::setCompleted "); 419 //qDebug("Todo::setCompleted ");
419 if ( mHasCompletedDate ) { 420 if ( mHasCompletedDate ) {
420 // qDebug("has completed data - return "); 421 // qDebug("has completed data - return ");
421 return; 422 return;
422 } 423 }
423 mHasCompletedDate = true; 424 mHasCompletedDate = true;
424 mPercentComplete = 100; 425 mPercentComplete = 100;
425 mCompleted = getEvenTime(completed); 426 mCompleted = getEvenTime(completed);
426 updated(); 427 updated();
427} 428}
428 429
429bool Todo::hasCompletedDate() const 430bool Todo::hasCompletedDate() const
430{ 431{
431 return mHasCompletedDate; 432 return mHasCompletedDate;
432} 433}
433 434
434int Todo::percentComplete() const 435int Todo::percentComplete() const
435{ 436{
436 return mPercentComplete; 437 return mPercentComplete;
437} 438}
438bool Todo::setRecurDates() 439bool Todo::setRecurDates()
439{ 440{
440 if ( !mHasRecurrenceID ) 441 if ( !mHasRecurrenceID )
441 return true; 442 return true;
442 int secs = mDtStart.secsTo( dtDue() ); 443 int secs = mDtStart.secsTo( dtDue() );
443 bool ok; 444 bool ok;
444 qDebug("T:setRecurDates() "); 445 qDebug("T:setRecurDates() ");
445 //qDebug("%s %s %s ",mDtStart.toString().latin1(), dtDue().toString().latin1(),mRecurrenceID.toString().latin1() ); 446 //qDebug("%s %s %s ",mDtStart.toString().latin1(), dtDue().toString().latin1(),mRecurrenceID.toString().latin1() );
446 QDateTime next = getNextOccurence( mRecurrenceID, &ok ); 447 QDateTime next = getNextOccurence( mRecurrenceID, &ok );
447 if ( ok ) { 448 if ( ok ) {
448 mRecurrenceID = next; 449 mRecurrenceID = next;
449 mDtStart = next; 450 mDtStart = next;
450 setDtDue( next.addSecs( secs ) ); 451 setDtDue( next.addSecs( secs ) );
451 if ( QDateTime::currentDateTime() > next) 452 if ( QDateTime::currentDateTime() > next)
452 return false; 453 return false;
453 } else { 454 } else {
454 setHasRecurrenceID( false ); 455 setHasRecurrenceID( false );
455 recurrence()->unsetRecurs(); 456 recurrence()->unsetRecurs();
456 } 457 }
457 return true; 458 return true;
458} 459}
459void Todo::setPercentComplete(int v) 460void Todo::setPercentComplete(int v)
460{ 461{
461 if ( mHasRecurrenceID && v == 100 && mPercentComplete != 100 ) { 462 if ( mHasRecurrenceID && v == 100 && mPercentComplete != 100 ) {
462 if ( !setRecurDates() ) 463 if ( !setRecurDates() )
463 v = 0; 464 v = 0;
464 } 465 }
465 mPercentComplete = v; 466 mPercentComplete = v;
466 if ( v != 100 ) 467 if ( v != 100 )
467 mHasCompletedDate = false; 468 mHasCompletedDate = false;
468 updated(); 469 updated();
469} 470}
470QDateTime Todo::getNextAlarmDateTime( bool * ok, int * offset ) const 471QDateTime Todo::getNextAlarmDateTime( bool * ok, int * offset ) const
471{ 472{
472 if ( isCompleted() || ! hasDueDate() || cancelled() ) { 473 if ( isCompleted() || ! hasDueDate() || cancelled() ) {
473 *ok = false; 474 *ok = false;
474 return QDateTime (); 475 return QDateTime ();
475 } 476 }