42 #include <QtCore/QDate>
43 #include <QtCore/QHash>
44 #include <QtCore/QMultiHash>
45 #include <QtCore/QString>
48 #include <kdatetime.h>
50 #include <kmessagebox.h>
59 class KCal::CalendarLocal::Private
62 Private() : mFormat(0) {}
66 QHash<QString, Event *>mEvents;
67 QMultiHash<QString, Event *>mEventsForDate;
68 QHash<QString, Todo *>mTodos;
69 QMultiHash<QString, Todo*>mTodosForDate;
70 QHash<QString, Journal *>mJournals;
71 QMultiHash<QString, Journal *>mJournalsForDate;
73 void insertEvent(
Event *event );
74 void insertTodo(
Todo *todo );
75 void insertJournal(
Journal *journal );
81 void removeIncidenceFromMultiHashByUID( QMultiHash< QString, T >& container,
85 const QList<T> values = container.values( key );
86 QListIterator<T> it(values);
87 while ( it.hasNext() ) {
88 T
const inc = it.next();
89 if ( inc->uid() == uid ) {
90 container.remove( key, inc );
117 d->mFileName = fileName;
119 return storage.
load();
124 const QString filename = d->mFileName;
127 d->mFileName = filename;
129 return storage.
load();
134 if ( d->mFileName.isEmpty() ) {
139 FileStorage storage(
this, d->mFileName, d->mFormat );
140 return storage.
save();
150 if ( d->mFileName != fileName ||
isModified() ) {
152 return storage.
save();
161 d->mFileName.clear();
174 d->insertEvent( event );
176 event->registerObserver(
this );
187 const QString uid =
event->uid();
188 if ( d->mEvents.remove( uid ) ) {
192 removeIncidenceFromMultiHashByUID<Event *>(
193 d->mEventsForDate,
event->dtStart().date().toString(),
event->uid() );
197 kWarning() <<
"Event not found.";
204 QHashIterator<QString, Event *>i( d->mEvents );
205 while ( i.hasNext() ) {
210 i.value()->startUpdates();
212 qDeleteAll( d->mEvents );
214 d->mEventsForDate.clear();
219 return d->mEvents.value( uid );
224 d->insertTodo( todo );
239 void CalendarLocal::Private::insertTodo(
Todo *todo )
241 QString uid = todo->
uid();
242 if ( !mTodos.contains( uid ) ) {
243 mTodos.insert( uid, todo );
245 mTodosForDate.insert( todo->
dtDue().date().toString(), todo );
252 Q_ASSERT( mTodos.value( uid ) == todo );
263 if ( d->mTodos.remove( todo->
uid() ) ) {
267 removeIncidenceFromMultiHashByUID<Todo *>(
268 d->mTodosForDate, todo->
dtDue().date().toString(), todo->
uid() );
272 kWarning() <<
"Todo not found.";
279 QHashIterator<QString, Todo *>i( d->mTodos );
280 while ( i.hasNext() ) {
285 i.value()->startUpdates();
287 qDeleteAll( d->mTodos );
289 d->mTodosForDate.clear();
294 return d->mTodos.value( uid );
301 QHashIterator<QString, Todo *>i( d->mTodos );
302 while ( i.hasNext() ) {
304 todoList.append( i.value() );
306 return sortTodos( &todoList, sortField, sortDirection );
314 QString dateStr = date.toString();
315 QMultiHash<QString, Todo *>::const_iterator it = d->mTodosForDate.constFind( dateStr );
316 while ( it != d->mTodosForDate.constEnd() && it.key() == dateStr ) {
318 todoList.append( t );
326 return alarms( KDateTime( QDate( 1900, 1, 1 ) ), to );
332 QHashIterator<QString, Event *>ie( d->mEvents );
334 while ( ie.hasNext() ) {
344 QHashIterator<QString, Todo *>it( d->mTodos );
346 while ( it.hasNext() ) {
362 void CalendarLocal::Private::insertEvent(
Event *event )
364 QString uid =
event->uid();
365 if ( !mEvents.contains( uid ) ) {
366 mEvents.insert( uid, event );
367 if ( !event->
recurs() && !
event->isMultiDay() ) {
368 mEventsForDate.insert( event->
dtStart().date().toString(), event );
374 Q_ASSERT( mEvents.value( uid ) == event );
382 KDateTime nowUTC = KDateTime::currentUtcDateTime();
388 if ( incidence->
type() ==
"Event" ) {
390 removeIncidenceFromMultiHashByUID<Event *>(
391 d->mEventsForDate,
event->dtStart().date().toString(),
event->uid() );
392 if ( !event->
recurs() && !
event->isMultiDay() ) {
393 d->mEventsForDate.insert( event->
dtStart().date().toString(),
event );
395 }
else if ( incidence->
type() ==
"Todo" ) {
397 removeIncidenceFromMultiHashByUID<Todo *>(
398 d->mTodosForDate, todo->
dtDue().date().toString(), todo->
uid() );
400 d->mTodosForDate.insert( todo->
dtDue().date().toString(),
todo );
402 }
else if ( incidence->
type() ==
"Journal" ) {
404 removeIncidenceFromMultiHashByUID<Journal *>(
405 d->mJournalsForDate, journal->
dtStart().date().toString(), journal->
uid() );
406 d->mJournalsForDate.insert( journal->
dtStart().date().toString(),
journal );
418 const KDateTime::Spec ×pec,
426 QString dateStr = date.toString();
427 QMultiHash<QString, Event *>::const_iterator it = d->mEventsForDate.constFind( dateStr );
429 KDateTime::Spec ts = timespec.isValid() ? timespec :
timeSpec();
430 KDateTime kdt( date, ts );
431 while ( it != d->mEventsForDate.constEnd() && it.key() == dateStr ) {
433 KDateTime end( ev->
dtEnd().toTimeSpec( ev->
dtStart() ) );
435 end.setDateOnly(
true );
437 end = end.addSecs( -1 );
440 eventList.append( ev );
446 QHashIterator<QString, Event *>i( d->mEvents );
447 while ( i.hasNext() ) {
452 int extraDays = ev->
dtStart().date().daysTo( ev->
dtEnd().date() );
453 for (
int i = 0; i <= extraDays; ++i ) {
454 if ( ev->
recursOn( date.addDays( -i ), ts ) ) {
455 eventList.append( ev );
461 eventList.append( ev );
466 if ( ev->
dtStart().date() <= date && ev->
dtEnd().date() >= date ) {
467 eventList.append( ev );
473 return sortEventsForDate( &eventList, date, timespec, sortField, sortDirection );
477 const KDateTime::Spec ×pec,
bool inclusive )
480 KDateTime::Spec ts = timespec.isValid() ? timespec :
timeSpec();
481 KDateTime st( start, ts );
482 KDateTime nd( end, ts );
483 KDateTime yesterStart = st.addDays( -1 );
486 QHashIterator<QString, Event *>i( d->mEvents );
488 while ( i.hasNext() ) {
491 KDateTime rStart =
event->
dtStart();
495 if ( inclusive && rStart < st ) {
500 KDateTime rEnd =
event->dtEnd();
504 if ( inclusive && nd < rEnd ) {
517 if ( !rEnd.isValid() ) {
523 if ( inclusive && nd < rEnd ) {
530 eventList.append( event );
545 QHashIterator<QString, Event *>i( d->mEvents );
546 while ( i.hasNext() ) {
548 eventList.append( i.value() );
550 return sortEvents( &eventList, sortField, sortDirection );
555 d->insertJournal( journal );
567 void CalendarLocal::Private::insertJournal(
Journal *journal )
569 QString uid = journal->
uid();
570 if ( !mJournals.contains( uid ) ) {
571 mJournals.insert( uid, journal );
572 mJournalsForDate.insert( journal->
dtStart().date().toString(), journal );
577 Q_ASSERT( mJournals.value( uid ) == journal );
585 if ( d->mJournals.remove( journal->
uid() ) ) {
588 removeIncidenceFromMultiHashByUID<Journal *>(
589 d->mJournalsForDate, journal->
dtStart().date().toString(), journal->
uid() );
592 kWarning() <<
"Journal not found.";
599 QHashIterator<QString, Journal *>i( d->mJournals );
600 while ( i.hasNext() ) {
605 i.value()->startUpdates();
607 qDeleteAll( d->mJournals );
608 d->mJournals.clear();
609 d->mJournalsForDate.clear();
614 return d->mJournals.value( uid );
621 QHashIterator<QString, Journal *>i( d->mJournals );
622 while ( i.hasNext() ) {
624 journalList.append( i.value() );
626 return sortJournals( &journalList, sortField, sortDirection );
634 QString dateStr = date.toString();
635 QMultiHash<QString, Journal *>::const_iterator it = d->mJournalsForDate.constFind( dateStr );
637 while ( it != d->mJournalsForDate.constEnd() && it.key() == dateStr ) {
639 journalList.append( j );