void TodoTest::testRoles() { const KDateTime today = KDateTime::currentUtcDateTime(); const KDateTime yesterday = today.addDays(-1); Todo todo; todo.setDtStart(today.addDays(-1)); todo.setDtDue(today); QCOMPARE(todo.dateTime(Incidence::RoleDisplayStart), today); QCOMPARE(todo.dateTime(Incidence::RoleDisplayEnd), today); todo.setDtDue(KDateTime()); QCOMPARE(todo.dateTime(Incidence::RoleDisplayStart), yesterday); QCOMPARE(todo.dateTime(Incidence::RoleDisplayEnd), yesterday); }
void TodoTest::testSetCompleted() { Todo todo1, todo2, todo3; todo1.setSummary(QStringLiteral("Todo Summary")); todo2.setSummary(QStringLiteral("Todo Summary")); todo3.setSummary(QStringLiteral("Todo Summary")); KDateTime today = KDateTime::currentUtcDateTime(); // due yesterday KDateTime originalDueDate = today.addDays(-1); todo1.setDtStart(originalDueDate); todo1.setDtDue(originalDueDate); todo1.recurrence()->setDaily(1); todo1.setCompleted(today); todo2.setCompleted(true); todo3.setStatus(Incidence::StatusCompleted); QVERIFY(originalDueDate != todo1.dtDue()); QVERIFY(!todo1.isCompleted()); QVERIFY(todo2.isCompleted()); QCOMPARE(todo2.status(), Incidence::StatusCompleted); QVERIFY(todo3.isCompleted()); todo2.setCompleted(false); QVERIFY(!todo2.isCompleted()); }
void VisualFreeBusyWidget::slotUpdateIncidenceStartEnd( const KDateTime &dtFrom, const KDateTime &dtTo ) { mDtStart = dtFrom; mDtEnd = dtTo; QDateTime horizonStart = QDateTime( dtFrom.addDays( -15 ).date() ); KDGantt::DateTimeGrid *grid = static_cast<KDGantt::DateTimeGrid*>( mGanttGraphicsView->grid() ); grid->setStartDateTime( horizonStart ); slotCenterOnStart(); mGanttGrid->setStartDateTime( horizonStart ); }
QStringList KOAlarmClient::dumpAlarms() { KDateTime start = KDateTime( QDateTime::currentDateTime().date(), QTime( 0, 0 ), KDateTime::LocalZone ); KDateTime end = start.addDays( 1 ).addSecs( -1 ); QStringList lst; // Don't translate, this is for debugging purposes. lst << QString( "AlarmDeamon::dumpAlarms() from " ) + start.toString() + " to " + end.toString(); QList<Alarm *> alarms = mCalendar->alarms( start, end ); QList<Alarm *>::ConstIterator it; for ( it = alarms.constBegin(); it != alarms.constEnd(); ++it ) { Alarm *a = *it; lst << QString( " " ) + a->parent()->summary() + " (" + a->time().toString() + ')'; } return lst; }
void TodoTest::testStatus() { KDateTime today = KDateTime::currentUtcDateTime(); KDateTime yesterday = today.addDays(-1); Todo todo1; todo1.setDtStart(yesterday); todo1.setDtDue(today); todo1.setPercentComplete(50); QVERIFY(todo1.isInProgress(false)); QVERIFY(!todo1.isNotStarted(false)); QVERIFY(!todo1.isOverdue()); todo1.setPercentComplete(100); QVERIFY(todo1.isCompleted()); Todo todo2 = todo1; todo2.setPercentComplete(33); todo2.setDtDue(KDateTime()); QVERIFY(todo2.isOpenEnded()); }
void TimelineItem::insertIncidence( KCal::Incidence *incidence, const KDateTime & _start, const KDateTime & _end ) { KDateTime start = incidence->dtStart().toTimeSpec( KOPrefs::instance()->timeSpec() ); KDateTime end = incidence->dtEnd().toTimeSpec( KOPrefs::instance()->timeSpec() ); if ( _start.isValid() ) { start = _start; } if ( _end.isValid() ) { end = _end; } if ( incidence->allDay() ) { end = end.addDays( 1 ); } typedef QList<TimelineSubItem*> ItemList; ItemList list = mItemMap[incidence]; for ( ItemList::ConstIterator it = list.constBegin(); it != list.constEnd(); ++it ) { if ( KDateTime( (*it)->startTime() ) == start && KDateTime( (*it)->endTime() ) == end ) { return; } } TimelineSubItem * item = new TimelineSubItem( mCalendar, incidence, this ); QColor c1, c2, c3; colors( c1, c2, c3 ); item->setColors( c1, c2, c3 ); item->setStartTime( start.dateTime() ); item->setOriginalStart( start ); item->setEndTime( end.dateTime() ); mItemMap[incidence].append( item ); }
Incidence::Ptr pasteIncidence( const Incidence::Ptr &incidence, KDateTime newDateTime, const QFlags<PasteFlag> &pasteOptions ) { Incidence::Ptr inc( incidence ); if ( inc ) { inc = Incidence::Ptr( inc->clone() ); inc->recreate(); } if ( inc && newDateTime.isValid() ) { if ( inc->type() == Incidence::TypeEvent ) { Event::Ptr event = inc.staticCast<Event>(); if ( pasteOptions & FlagPasteAtOriginalTime ) { // Set date and preserve time and timezone stuff const QDate date = newDateTime.date(); newDateTime = event->dtStart(); newDateTime.setDate( date ); } // in seconds const int durationInSeconds = event->dtStart().secsTo( event->dtEnd() ); const int durationInDays = event->dtStart().daysTo( event->dtEnd() ); event->setDtStart( newDateTime ); if ( newDateTime.isDateOnly() ) { event->setDtEnd( newDateTime.addDays( durationInDays ) ); } else { event->setDtEnd( newDateTime.addSecs( durationInSeconds ) ); } } else if ( inc->type() == Incidence::TypeTodo ) { Todo::Ptr aTodo = inc.staticCast<Todo>(); const bool pasteAtDtStart = ( pasteOptions & FlagTodosPasteAtDtStart ); if ( pasteOptions & FlagPasteAtOriginalTime ) { // Set date and preserve time and timezone stuff const QDate date = newDateTime.date(); newDateTime = pasteAtDtStart ? aTodo->dtStart() : aTodo->dtDue(); newDateTime.setDate( date ); } if ( pasteAtDtStart ) { aTodo->setDtStart( newDateTime ); } else { aTodo->setDtDue( newDateTime ); } } else if ( inc->type() == Incidence::TypeJournal ) { if ( pasteOptions & FlagPasteAtOriginalTime ) { // Set date and preserve time and timezone stuff const QDate date = newDateTime.date(); newDateTime = inc->dtStart(); newDateTime.setDate( date ); } inc->setDtStart( newDateTime ); } else { kDebug() << "Trying to paste unknown incidence of type" << int( inc->type() ); } } return inc; }
//@cond PRIVATE void FreeBusy::Private::init( const Event::List &eventList, const KDateTime &start, const KDateTime &end ) { int extraDays, i, x, duration; duration = start.daysTo( end ); QDate day; KDateTime tmpStart; KDateTime tmpEnd; // Loops through every event in the calendar Event::List::ConstIterator it; for ( it = eventList.constBegin(); it != eventList.constEnd(); ++it ) { Event::Ptr event = *it; // If this event is transparent it shouldn't be in the freebusy list. if ( event->transparency() == Event::Transparent ) { continue; } // The code below can not handle all-day events. Fixing this resulted // in a lot of duplicated code. Instead, make a copy of the event and // set the period to the full day(s). This trick works for recurring, // multiday, and single day all-day events. Event::Ptr allDayEvent; if ( event->allDay() ) { // addDay event. Do the hack kDebug() << "All-day event"; allDayEvent = Event::Ptr( new Event( *event ) ); // Set the start and end times to be on midnight KDateTime st = allDayEvent->dtStart(); st.setTime( QTime( 0, 0 ) ); KDateTime nd = allDayEvent->dtEnd(); nd.setTime( QTime( 23, 59, 59, 999 ) ); allDayEvent->setAllDay( false ); allDayEvent->setDtStart( st ); allDayEvent->setDtEnd( nd ); kDebug() << "Use:" << st.toString() << "to" << nd.toString(); // Finally, use this event for the setting below event = allDayEvent; } // This whole for loop is for recurring events, it loops through // each of the days of the freebusy request for ( i = 0; i <= duration; ++i ) { day = start.addDays( i ).date(); tmpStart.setDate( day ); tmpEnd.setDate( day ); if ( event->recurs() ) { if ( event->isMultiDay() ) { // FIXME: This doesn't work for sub-daily recurrences or recurrences with // a different time than the original event. extraDays = event->dtStart().daysTo( event->dtEnd() ); for ( x = 0; x <= extraDays; ++x ) { if ( event->recursOn( day.addDays( -x ), start.timeSpec() ) ) { tmpStart.setDate( day.addDays( -x ) ); tmpStart.setTime( event->dtStart().time() ); tmpEnd = event->duration().end( tmpStart ); addLocalPeriod( q, tmpStart, tmpEnd ); break; } } } else { if ( event->recursOn( day, start.timeSpec() ) ) { tmpStart.setTime( event->dtStart().time() ); tmpEnd.setTime( event->dtEnd().time() ); addLocalPeriod ( q, tmpStart, tmpEnd ); } } } } // Non-recurring events addLocalPeriod( q, event->dtStart(), event->dtEnd() ); } q->sortList(); }
void TodoTest::testSerializer_data() { QTest::addColumn<KCalCore::Todo::Ptr>("todo"); KDateTime today = KDateTime::currentUtcDateTime(); KDateTime yesterday = today.addDays(-1); Todo::Ptr todo1 = Todo::Ptr(new Todo()); Todo::Ptr todo2 = Todo::Ptr(new Todo()); Todo::Ptr todo3 = Todo::Ptr(new Todo()); Todo::Ptr todo4 = Todo::Ptr(new Todo()); Todo::Ptr todo5 = Todo::Ptr(new Todo()); Todo::Ptr todo6 = Todo::Ptr(new Todo()); todo1->setSummary(QStringLiteral("Summary"), false); todo1->setDescription(QStringLiteral("description"), false); todo1->setCreated(yesterday); todo1->setRevision(50); todo1->setDtDue(yesterday); todo1->setDtStart(today); todo1->setPercentComplete(50); todo1->setLocation(QStringLiteral("<b>location</b>"), false); todo2->setDescription(QStringLiteral("<b>description</b>"), true); todo2->setSummary(QStringLiteral("<b>Summary2</b>"), true); todo2->setLocation(QStringLiteral("<b>location</b>"), true); todo2->setDtDue(yesterday); todo2->setPercentComplete(100); todo3->setDtStart(today); todo3->setPercentComplete(100); todo3->setCategories(QStringList() << QStringLiteral("a") << QStringLiteral("b") << QStringLiteral("c") << QStringLiteral("d")); todo3->setResources(QStringList() << QStringLiteral("a") << QStringLiteral("b") << QStringLiteral("c") << QStringLiteral("d")); todo3->setPriority(5); QVERIFY(!todo4->dirtyFields().contains(IncidenceBase::FieldRecurrence)); todo4->recurrence()->setDaily(1); QVERIFY(todo4->dirtyFields().contains(IncidenceBase::FieldRecurrence)); Attachment::Ptr attachment = Attachment::Ptr(new Attachment(QStringLiteral("http://www.kde.org"))); todo4->addAttachment(attachment); todo5->recurrence()->setDaily(1); todo5->setCompleted(today); todo5->setStatus(Incidence::StatusDraft); todo5->setSecrecy(Incidence::SecrecyPrivate); todo5->setRelatedTo(QStringLiteral("uid1"), Incidence::RelTypeParent); todo5->setHasGeo(true); todo5->setGeoLatitude(40); todo5->setGeoLongitude(40); todo5->setOrganizer(QStringLiteral("*****@*****.**")); todo6->recurrence()->setDaily(1); todo6->setCompleted(today); todo6->setRecurrenceId(yesterday); todo6->setStatus(Incidence::StatusDraft); todo6->setSecrecy(Incidence::SecrecyPrivate); todo6->setRelatedTo(QStringLiteral("uid1"), Incidence::RelTypeParent); todo6->setHasGeo(true); todo6->setGeoLatitude(40); todo6->setGeoLongitude(40); todo6->setUid(QStringLiteral("uid22")); todo6->setLastModified(today); todo6->addContact(QStringLiteral("addContact")); // Remaining properties tested in testevent.cpp QTest::newRow("todo1") << todo1; QTest::newRow("todo2") << todo2; QTest::newRow("todo3") << todo3; QTest::newRow("todo4") << todo4; QTest::newRow("todo5") << todo5; QTest::newRow("todo6") << todo6; }
ngwt__Appointment* IncidenceConverter::convertToAppointment( KCal::Event* event ) { kDebug() <<"IncidenceConverter::convertToAppointment()"; if ( !event ) return 0; ngwt__Appointment* appointment = soap_new_ngwt__Appointment( soap(), -1 ); appointment->startDate = 0; appointment->endDate = 0; appointment->startDay = 0; appointment->endDay = 0; appointment->acceptLevel = 0; appointment->alarm = 0; appointment->allDayEvent = 0; appointment->place = 0; appointment->timezone = 0; if ( !convertToCalendarItem( event, appointment ) ) { soap_dealloc( soap(), appointment ); return 0; } if ( event->allDay () ) { bool *allDayEvent = (bool*)soap_malloc( soap(), 1 ); (*allDayEvent ) = true; appointment->allDayEvent = allDayEvent; if ( event->dtStart().isValid() ) { /* kDebug() << " convertToAppointment() raw start date: " << event->dtStart().toString();*/ KDateTime start = event->dtStart(); start.setTime( QTime( 0, 0, 0 ) ); appointment->startDate = kDateTimeToChar( start, mTimeSpec ); //appointment->startDay = qDateToString( event->dtStart().date()/*.addDays( -1 )*/ ); /* kDebug() << " converted start date: " << appointment->startDate;*/ } else kDebug() << " event start date not valid "; if ( event->hasEndDate() ) { // kDebug() << " convertToAppointment() raw end date: " << event->dtEnd().toString(); KDateTime end = event->dtEnd(); end = end.addDays( 1 ); end.setTime( QTime( 0, 0, 0 ) ); appointment->endDate = kDateTimeToChar( end, mTimeSpec ); //appointment->endDay = qDateToString( event->dtEnd().date() ); // kDebug() << " converted end date:" << appointment->endDate; } else kDebug() << " event end date not valid "; } else { appointment->allDayEvent = 0; if ( event->dtStart().isValid() ) appointment->startDate = kDateTimeToChar( event->dtStart(), mTimeSpec ); if ( event->hasEndDate() ) appointment->endDate = kDateTimeToChar( event->dtEnd(), mTimeSpec ); } enum ngwt__AcceptLevel * al = (enum ngwt__AcceptLevel*)soap_malloc(soap(), sizeof(enum ngwt__AcceptLevel)); *al = Busy; appointment->acceptLevel = al; KCal::Alarm::List alarms = event->alarms(); if ( !alarms.isEmpty() ) { ngwt__Alarm* alarm = soap_new_ngwt__Alarm( soap(), -1 ); alarm->__item = alarms.first()->startOffset().asSeconds() * -1; bool * enabled = (bool *)soap_malloc(soap(), sizeof(bool)); *enabled = alarms.first()->enabled(); alarm->enabled = enabled; appointment->alarm = alarm; } else appointment->alarm = 0; if ( !event->location().isEmpty() ) { std::string* location = qStringToString( event->location() ); appointment->place = location; } else appointment->place = 0; appointment->timezone = 0; return appointment; }