summaryrefslogtreecommitdiffabout
path: root/libkcal/todo.cpp
authorzautrix <zautrix>2005-07-28 10:38:58 (UTC)
committer zautrix <zautrix>2005-07-28 10:38:58 (UTC)
commitfee4c893fe8fd01af1b55c1ccd40213fc18a36b4 (patch) (unidiff)
tree83a3018d54d60e880d441a6f91ef8fe54254aaff /libkcal/todo.cpp
parent27ffa2e08ebb38e71f613af3a214750442418e2c (diff)
downloadkdepimpi-fee4c893fe8fd01af1b55c1ccd40213fc18a36b4.zip
kdepimpi-fee4c893fe8fd01af1b55c1ccd40213fc18a36b4.tar.gz
kdepimpi-fee4c893fe8fd01af1b55c1ccd40213fc18a36b4.tar.bz2
fixxxx
Diffstat (limited to 'libkcal/todo.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--libkcal/todo.cpp10
1 files changed, 10 insertions, 0 deletions
diff --git a/libkcal/todo.cpp b/libkcal/todo.cpp
index 7bf756a..e4508a0 100644
--- a/libkcal/todo.cpp
+++ b/libkcal/todo.cpp
@@ -233,384 +233,394 @@ bool Todo::contains ( Todo* from )
233 } 233 }
234 } 234 }
235 235
236 QStringList cat = categories(); 236 QStringList cat = categories();
237 QStringList catFrom = from->categories(); 237 QStringList catFrom = from->categories();
238 QString nCat; 238 QString nCat;
239 unsigned int iii; 239 unsigned int iii;
240 for ( iii = 0; iii < catFrom.count();++iii ) { 240 for ( iii = 0; iii < catFrom.count();++iii ) {
241 nCat = catFrom[iii]; 241 nCat = catFrom[iii];
242 if ( !nCat.isEmpty() ) 242 if ( !nCat.isEmpty() )
243 if ( !cat.contains( nCat )) { 243 if ( !cat.contains( nCat )) {
244 return false; 244 return false;
245 } 245 }
246 } 246 }
247 if ( from->isCompleted() ) { 247 if ( from->isCompleted() ) {
248 if ( !isCompleted() ) 248 if ( !isCompleted() )
249 return false; 249 return false;
250 } 250 }
251 if( priority() != from->priority() ) 251 if( priority() != from->priority() )
252 return false; 252 return false;
253 253
254 254
255 return true; 255 return true;
256 256
257} 257}
258bool KCal::operator==( const Todo& t1, const Todo& t2 ) 258bool KCal::operator==( const Todo& t1, const Todo& t2 )
259{ 259{
260 260
261 bool ret = operator==( (const Incidence&)t1, (const Incidence&)t2 ); 261 bool ret = operator==( (const Incidence&)t1, (const Incidence&)t2 );
262 if ( ! ret ) 262 if ( ! ret )
263 return false; 263 return false;
264 if ( t1.hasDueDate() == t2.hasDueDate() ) { 264 if ( t1.hasDueDate() == t2.hasDueDate() ) {
265 if ( t1.hasDueDate() ) { 265 if ( t1.hasDueDate() ) {
266 if ( t1.doesFloat() == t2.doesFloat() ) { 266 if ( t1.doesFloat() == t2.doesFloat() ) {
267 if ( t1.doesFloat() ) { 267 if ( t1.doesFloat() ) {
268 if ( t1.dtDue().date() != t2.dtDue().date() ) 268 if ( t1.dtDue().date() != t2.dtDue().date() )
269 return false; 269 return false;
270 } else 270 } else
271 if ( t1.dtDue() != t2.dtDue() ) 271 if ( t1.dtDue() != t2.dtDue() )
272 return false; 272 return false;
273 } else 273 } else
274 return false;// float != 274 return false;// float !=
275 } 275 }
276 276
277 } else 277 } else
278 return false; 278 return false;
279 if ( t1.percentComplete() != t2.percentComplete() ) 279 if ( t1.percentComplete() != t2.percentComplete() )
280 return false; 280 return false;
281 if ( t1.isCompleted() ) { 281 if ( t1.isCompleted() ) {
282 if ( t1.hasCompletedDate() == t2.hasCompletedDate() ) { 282 if ( t1.hasCompletedDate() == t2.hasCompletedDate() ) {
283 if ( t1.hasCompletedDate() ) { 283 if ( t1.hasCompletedDate() ) {
284 if ( t1.completed() != t2.completed() ) 284 if ( t1.completed() != t2.completed() )
285 return false; 285 return false;
286 } 286 }
287 287
288 } else 288 } else
289 return false; 289 return false;
290 } 290 }
291 return true; 291 return true;
292 292
293} 293}
294 294
295void Todo::setDtDue(const QDateTime &dtDue) 295void Todo::setDtDue(const QDateTime &dtDue)
296{ 296{
297 //int diffsecs = mDtDue.secsTo(dtDue); 297 //int diffsecs = mDtDue.secsTo(dtDue);
298 298
299 /*if (mReadOnly) return; 299 /*if (mReadOnly) return;
300 const QPtrList<Alarm>& alarms = alarms(); 300 const QPtrList<Alarm>& alarms = alarms();
301 for (Alarm* alarm = alarms.first(); alarm; alarm = alarms.next()) { 301 for (Alarm* alarm = alarms.first(); alarm; alarm = alarms.next()) {
302 if (alarm->enabled()) { 302 if (alarm->enabled()) {
303 alarm->setTime(alarm->time().addSecs(diffsecs)); 303 alarm->setTime(alarm->time().addSecs(diffsecs));
304 } 304 }
305 }*/ 305 }*/
306 mDtDue = getEvenTime(dtDue); 306 mDtDue = getEvenTime(dtDue);
307 307
308 //kdDebug(5800) << "setDtDue says date is " << mDtDue.toString() << endl; 308 //kdDebug(5800) << "setDtDue says date is " << mDtDue.toString() << endl;
309 309
310 /*const QPtrList<Alarm>& alarms = alarms(); 310 /*const QPtrList<Alarm>& alarms = alarms();
311 for (Alarm* alarm = alarms.first(); alarm; alarm = alarms.next()) 311 for (Alarm* alarm = alarms.first(); alarm; alarm = alarms.next())
312 alarm->setAlarmStart(mDtDue);*/ 312 alarm->setAlarmStart(mDtDue);*/
313 updated(); 313 updated();
314} 314}
315 315
316QDateTime Todo::dtDue() const 316QDateTime Todo::dtDue() const
317{ 317{
318 return mDtDue; 318 return mDtDue;
319} 319}
320 320
321QString Todo::dtDueTimeStr() const 321QString Todo::dtDueTimeStr() const
322{ 322{
323 return KGlobal::locale()->formatTime(mDtDue.time()); 323 return KGlobal::locale()->formatTime(mDtDue.time());
324} 324}
325 325
326QString Todo::dtDueDateStr(bool shortfmt) const 326QString Todo::dtDueDateStr(bool shortfmt) const
327{ 327{
328 return KGlobal::locale()->formatDate(mDtDue.date(),shortfmt); 328 return KGlobal::locale()->formatDate(mDtDue.date(),shortfmt);
329} 329}
330 330
331QString Todo::dtDueStr(bool shortfmt) const 331QString Todo::dtDueStr(bool shortfmt) const
332{ 332{
333 if ( doesFloat() ) 333 if ( doesFloat() )
334 return KGlobal::locale()->formatDate(mDtDue.date(),shortfmt); 334 return KGlobal::locale()->formatDate(mDtDue.date(),shortfmt);
335 return KGlobal::locale()->formatDateTime(mDtDue, shortfmt); 335 return KGlobal::locale()->formatDateTime(mDtDue, shortfmt);
336} 336}
337// retval 0 : no found 337// retval 0 : no found
338// 1 : due for date found 338// 1 : due for date found
339// 2 : overdue for date found 339// 2 : overdue for date found
340int Todo::hasDueSubTodoForDate( const QDate & date, bool checkSubtodos ) 340int Todo::hasDueSubTodoForDate( const QDate & date, bool checkSubtodos )
341{ 341{
342 int retval = 0; 342 int retval = 0;
343 if ( isCompleted() ) 343 if ( isCompleted() )
344 return 0; 344 return 0;
345 if ( hasDueDate() ) { 345 if ( hasDueDate() ) {
346 if ( dtDue().date() < date ) 346 if ( dtDue().date() < date )
347 return 2; 347 return 2;
348 // we do not return, because we may find an overdue sub todo 348 // we do not return, because we may find an overdue sub todo
349 if ( dtDue().date() == date ) 349 if ( dtDue().date() == date )
350 retval = 1; 350 retval = 1;
351 } 351 }
352 if ( checkSubtodos ) { 352 if ( checkSubtodos ) {
353 Incidence *aTodo; 353 Incidence *aTodo;
354 for (aTodo = mRelations.first(); aTodo; aTodo = mRelations.next()) { 354 for (aTodo = mRelations.first(); aTodo; aTodo = mRelations.next()) {
355 int ret = ((Todo*)aTodo)->hasDueSubTodoForDate( date ,checkSubtodos ); 355 int ret = ((Todo*)aTodo)->hasDueSubTodoForDate( date ,checkSubtodos );
356 if ( ret == 2 ) 356 if ( ret == 2 )
357 return 2; 357 return 2;
358 if ( ret == 1) 358 if ( ret == 1)
359 retval = 1; 359 retval = 1;
360 } 360 }
361 } 361 }
362 return retval; 362 return retval;
363} 363}
364int Todo::hasDueSubTodo( bool checkSubtodos ) //= true 364int Todo::hasDueSubTodo( bool checkSubtodos ) //= true
365{ 365{
366 return hasDueSubTodoForDate(QDate::currentDate(), checkSubtodos ); 366 return hasDueSubTodoForDate(QDate::currentDate(), checkSubtodos );
367} 367}
368bool Todo::hasDueDate() const 368bool Todo::hasDueDate() const
369{ 369{
370 return mHasDueDate; 370 return mHasDueDate;
371} 371}
372 372
373void Todo::setHasDueDate(bool f) 373void Todo::setHasDueDate(bool f)
374{ 374{
375 if (mReadOnly) return; 375 if (mReadOnly) return;
376 mHasDueDate = f; 376 mHasDueDate = f;
377 updated(); 377 updated();
378} 378}
379 379
380 380
381#if 0 381#if 0
382void Todo::setStatus(const QString &statStr) 382void Todo::setStatus(const QString &statStr)
383{ 383{
384 if (mReadOnly) return; 384 if (mReadOnly) return;
385 QString ss(statStr.upper()); 385 QString ss(statStr.upper());
386 386
387 if (ss == "X-ACTION") 387 if (ss == "X-ACTION")
388 mStatus = NEEDS_ACTION; 388 mStatus = NEEDS_ACTION;
389 else if (ss == "NEEDS ACTION") 389 else if (ss == "NEEDS ACTION")
390 mStatus = NEEDS_ACTION; 390 mStatus = NEEDS_ACTION;
391 else if (ss == "ACCEPTED") 391 else if (ss == "ACCEPTED")
392 mStatus = ACCEPTED; 392 mStatus = ACCEPTED;
393 else if (ss == "SENT") 393 else if (ss == "SENT")
394 mStatus = SENT; 394 mStatus = SENT;
395 else if (ss == "TENTATIVE") 395 else if (ss == "TENTATIVE")
396 mStatus = TENTATIVE; 396 mStatus = TENTATIVE;
397 else if (ss == "CONFIRMED") 397 else if (ss == "CONFIRMED")
398 mStatus = CONFIRMED; 398 mStatus = CONFIRMED;
399 else if (ss == "DECLINED") 399 else if (ss == "DECLINED")
400 mStatus = DECLINED; 400 mStatus = DECLINED;
401 else if (ss == "COMPLETED") 401 else if (ss == "COMPLETED")
402 mStatus = COMPLETED; 402 mStatus = COMPLETED;
403 else if (ss == "DELEGATED") 403 else if (ss == "DELEGATED")
404 mStatus = DELEGATED; 404 mStatus = DELEGATED;
405 405
406 updated(); 406 updated();
407} 407}
408 408
409void Todo::setStatus(int status) 409void Todo::setStatus(int status)
410{ 410{
411 if (mReadOnly) return; 411 if (mReadOnly) return;
412 mStatus = status; 412 mStatus = status;
413 updated(); 413 updated();
414} 414}
415 415
416int Todo::status() const 416int Todo::status() const
417{ 417{
418 return mStatus; 418 return mStatus;
419} 419}
420 420
421QString Todo::statusStr() const 421QString Todo::statusStr() const
422{ 422{
423 switch(mStatus) { 423 switch(mStatus) {
424 case NEEDS_ACTION: 424 case NEEDS_ACTION:
425 return QString("NEEDS ACTION"); 425 return QString("NEEDS ACTION");
426 break; 426 break;
427 case ACCEPTED: 427 case ACCEPTED:
428 return QString("ACCEPTED"); 428 return QString("ACCEPTED");
429 break; 429 break;
430 case SENT: 430 case SENT:
431 return QString("SENT"); 431 return QString("SENT");
432 break; 432 break;
433 case TENTATIVE: 433 case TENTATIVE:
434 return QString("TENTATIVE"); 434 return QString("TENTATIVE");
435 break; 435 break;
436 case CONFIRMED: 436 case CONFIRMED:
437 return QString("CONFIRMED"); 437 return QString("CONFIRMED");
438 break; 438 break;
439 case DECLINED: 439 case DECLINED:
440 return QString("DECLINED"); 440 return QString("DECLINED");
441 break; 441 break;
442 case COMPLETED: 442 case COMPLETED:
443 return QString("COMPLETED"); 443 return QString("COMPLETED");
444 break; 444 break;
445 case DELEGATED: 445 case DELEGATED:
446 return QString("DELEGATED"); 446 return QString("DELEGATED");
447 break; 447 break;
448 } 448 }
449 return QString(""); 449 return QString("");
450} 450}
451#endif 451#endif
452 452
453bool Todo::isCompleted() const 453bool Todo::isCompleted() const
454{ 454{
455 if (mPercentComplete == 100) { 455 if (mPercentComplete == 100) {
456 return true; 456 return true;
457 } 457 }
458 else return false; 458 else return false;
459} 459}
460 460
461void Todo::setCompleted(bool completed) 461void Todo::setCompleted(bool completed)
462{ 462{
463 if ( mHasRecurrenceID && completed && mPercentComplete != 100 ) { 463 if ( mHasRecurrenceID && completed && mPercentComplete != 100 ) {
464 if ( !setRecurDates() ) 464 if ( !setRecurDates() )
465 completed = false; 465 completed = false;
466 } 466 }
467 if (completed) mPercentComplete = 100; 467 if (completed) mPercentComplete = 100;
468 else { 468 else {
469 mPercentComplete = 0; 469 mPercentComplete = 0;
470 mHasCompletedDate = false; 470 mHasCompletedDate = false;
471 } 471 }
472 updated(); 472 updated();
473} 473}
474 474
475QDateTime Todo::completed() const 475QDateTime Todo::completed() const
476{ 476{
477 return mCompleted; 477 return mCompleted;
478} 478}
479 479
480QString Todo::completedStr( bool shortF ) const 480QString Todo::completedStr( bool shortF ) const
481{ 481{
482 return KGlobal::locale()->formatDateTime(mCompleted, shortF); 482 return KGlobal::locale()->formatDateTime(mCompleted, shortF);
483} 483}
484 484
485void Todo::setCompleted(const QDateTime &completed) 485void Todo::setCompleted(const QDateTime &completed)
486{ 486{
487 //qDebug("Todo::setCompleted "); 487 //qDebug("Todo::setCompleted ");
488 if ( mHasCompletedDate ) { 488 if ( mHasCompletedDate ) {
489 // qDebug("has completed data - return "); 489 // qDebug("has completed data - return ");
490 return; 490 return;
491 } 491 }
492 mHasCompletedDate = true; 492 mHasCompletedDate = true;
493 mPercentComplete = 100; 493 mPercentComplete = 100;
494 mCompleted = getEvenTime(completed); 494 mCompleted = getEvenTime(completed);
495 updated(); 495 updated();
496} 496}
497 497
498bool Todo::hasCompletedDate() const 498bool Todo::hasCompletedDate() const
499{ 499{
500 return mHasCompletedDate; 500 return mHasCompletedDate;
501} 501}
502 502
503int Todo::percentComplete() const 503int Todo::percentComplete() const
504{ 504{
505 return mPercentComplete; 505 return mPercentComplete;
506} 506}
507bool Todo::setRecurDates() 507bool Todo::setRecurDates()
508{ 508{
509 if ( !mHasRecurrenceID ) 509 if ( !mHasRecurrenceID )
510 return true; 510 return true;
511 int secs = mDtStart.secsTo( dtDue() ); 511 int secs = mDtStart.secsTo( dtDue() );
512 bool ok; 512 bool ok;
513 qDebug("T:setRecurDates() "); 513 qDebug("T:setRecurDates() ");
514 //qDebug("%s %s %s ",mDtStart.toString().latin1(), dtDue().toString().latin1(),mRecurrenceID.toString().latin1() ); 514 //qDebug("%s %s %s ",mDtStart.toString().latin1(), dtDue().toString().latin1(),mRecurrenceID.toString().latin1() );
515 QDateTime next = getNextOccurence( mRecurrenceID, &ok ); 515 QDateTime next = getNextOccurence( mRecurrenceID, &ok );
516 if ( ok ) { 516 if ( ok ) {
517 mRecurrenceID = next; 517 mRecurrenceID = next;
518 mDtStart = next; 518 mDtStart = next;
519 setDtDue( next.addSecs( secs ) ); 519 setDtDue( next.addSecs( secs ) );
520 if ( QDateTime::currentDateTime() > next) 520 if ( QDateTime::currentDateTime() > next)
521 return false; 521 return false;
522 } else { 522 } else {
523 setHasRecurrenceID( false ); 523 setHasRecurrenceID( false );
524 recurrence()->unsetRecurs(); 524 recurrence()->unsetRecurs();
525 } 525 }
526 return true; 526 return true;
527} 527}
528void Todo::setPercentComplete(int v) 528void Todo::setPercentComplete(int v)
529{ 529{
530 if ( mHasRecurrenceID && v == 100 && mPercentComplete != 100 ) { 530 if ( mHasRecurrenceID && v == 100 && mPercentComplete != 100 ) {
531 if ( !setRecurDates() ) 531 if ( !setRecurDates() )
532 v = 0; 532 v = 0;
533 } 533 }
534 mPercentComplete = v; 534 mPercentComplete = v;
535 if ( v != 100 ) 535 if ( v != 100 )
536 mHasCompletedDate = false; 536 mHasCompletedDate = false;
537 updated(); 537 updated();
538} 538}
539QDateTime Todo::getNextAlarmDateTime( bool * ok, int * offset, QDateTime start_dt ) const 539QDateTime Todo::getNextAlarmDateTime( bool * ok, int * offset, QDateTime start_dt ) const
540{ 540{
541 *ok = false; 541 *ok = false;
542 if ( ! hasDueDate() || cancelled() || !alarmEnabled() ) { 542 if ( ! hasDueDate() || cancelled() || !alarmEnabled() ) {
543 return QDateTime (); 543 return QDateTime ();
544 } 544 }
545 // if the recurring todo is set to complete and requested time < start time of todo 545 // if the recurring todo is set to complete and requested time < start time of todo
546 // we want to get the alarm. 546 // we want to get the alarm.
547 bool iscompleted = isCompleted(); 547 bool iscompleted = isCompleted();
548 if ( iscompleted && doesRecur() ) { 548 if ( iscompleted && doesRecur() ) {
549 Todo * to = (Todo*) this; 549 Todo * to = (Todo*) this;
550 to->checkSetCompletedFalse(); 550 to->checkSetCompletedFalse();
551 iscompleted = isCompleted(); 551 iscompleted = isCompleted();
552 if ( hasStartDate() && start_dt < dtStart() ){ 552 if ( hasStartDate() && start_dt < dtStart() ){
553 iscompleted = false; 553 iscompleted = false;
554 } 554 }
555 } 555 }
556 if ( iscompleted ) { 556 if ( iscompleted ) {
557 return QDateTime (); 557 return QDateTime ();
558 } 558 }
559 QDateTime incidenceStart; 559 QDateTime incidenceStart;
560 incidenceStart = dtDue(); 560 incidenceStart = dtDue();
561 bool enabled = false; 561 bool enabled = false;
562 Alarm* alarm; 562 Alarm* alarm;
563 int off = 0; 563 int off = 0;
564 QDateTime alarmStart = QDateTime::currentDateTime().addDays( 3650 );; 564 QDateTime alarmStart = QDateTime::currentDateTime().addDays( 3650 );;
565 // if ( QDateTime::currentDateTime() > incidenceStart ){ 565 // if ( QDateTime::currentDateTime() > incidenceStart ){
566// *ok = false; 566// *ok = false;
567// return incidenceStart; 567// return incidenceStart;
568// } 568// }
569 for (QPtrListIterator<Alarm> it(mAlarms); (alarm = it.current()) != 0; ++it) { 569 for (QPtrListIterator<Alarm> it(mAlarms); (alarm = it.current()) != 0; ++it) {
570 if (alarm->enabled()) { 570 if (alarm->enabled()) {
571 if ( alarm->hasTime () ) { 571 if ( alarm->hasTime () ) {
572 if ( alarm->time() < alarmStart ) { 572 if ( alarm->time() < alarmStart ) {
573 alarmStart = alarm->time(); 573 alarmStart = alarm->time();
574 enabled = true; 574 enabled = true;
575 off = alarmStart.secsTo( incidenceStart ); 575 off = alarmStart.secsTo( incidenceStart );
576 } 576 }
577 577
578 } else { 578 } else {
579 int secs = alarm->startOffset().asSeconds(); 579 int secs = alarm->startOffset().asSeconds();
580 if ( incidenceStart.addSecs( secs ) < alarmStart ) { 580 if ( incidenceStart.addSecs( secs ) < alarmStart ) {
581 alarmStart = incidenceStart.addSecs( secs ); 581 alarmStart = incidenceStart.addSecs( secs );
582 enabled = true; 582 enabled = true;
583 off = -secs; 583 off = -secs;
584 } 584 }
585 } 585 }
586 } 586 }
587 } 587 }
588 if ( enabled ) { 588 if ( enabled ) {
589 if ( alarmStart > start_dt ) { 589 if ( alarmStart > start_dt ) {
590 *ok = true; 590 *ok = true;
591 * offset = off; 591 * offset = off;
592 return alarmStart; 592 return alarmStart;
593 } 593 }
594 } 594 }
595 *ok = false; 595 *ok = false;
596 return QDateTime (); 596 return QDateTime ();
597 597
598} 598}
599 599
600void Todo::checkSetCompletedFalse() 600void Todo::checkSetCompletedFalse()
601{ 601{
602 if ( !mHasRecurrenceID ) { 602 if ( !mHasRecurrenceID ) {
603 qDebug("ERROR 1 in Todo::checkSetCompletedFalse"); 603 qDebug("ERROR 1 in Todo::checkSetCompletedFalse");
604 return; 604 return;
605 } 605 }
606 // qDebug("Todo::checkSetCompletedFalse()"); 606 // qDebug("Todo::checkSetCompletedFalse()");
607 //qDebug("%s %s %s ",mDtStart.toString().latin1(), dtDue().toString().latin1(),mRecurrenceID.toString().latin1() ); 607 //qDebug("%s %s %s ",mDtStart.toString().latin1(), dtDue().toString().latin1(),mRecurrenceID.toString().latin1() );
608 if ( mPercentComplete == 100 ) { 608 if ( mPercentComplete == 100 ) {
609 QDateTime dt = QDateTime::currentDateTime(); 609 QDateTime dt = QDateTime::currentDateTime();
610 if ( dt > mDtStart && dt > mRecurrenceID ) { 610 if ( dt > mDtStart && dt > mRecurrenceID ) {
611 qDebug("start: %s --due: %s --recID: %s ",mDtStart.toString().latin1(), dtDue().toString().latin1(),mRecurrenceID.toString().latin1() ); 611 qDebug("start: %s --due: %s --recID: %s ",mDtStart.toString().latin1(), dtDue().toString().latin1(),mRecurrenceID.toString().latin1() );
612 setCompleted( false ); 612 setCompleted( false );
613 qDebug("Todo::checkSetCompletedFalse "); 613 qDebug("Todo::checkSetCompletedFalse ");
614 } 614 }
615 } 615 }
616} 616}
617QString Todo::durationText()
618{
619 if ( mHasDueDate && hasStartDate() ) {
620 int sec = dtStart().secsTo( dtDue() );
621 if ( doesFloat() )
622 sec += 86400;
623 return durationText4Time( sec );
624 }
625 return "---";
626}