35 #include "calendarresources.moc"
38 #include "resourcecalendar.h"
40 #include "kresources/manager.h"
41 #include "kresources/selectdialog.h"
42 #include "kabc/lock.h"
45 #include <kdatetime.h>
46 #include <kstandarddirs.h>
49 #include <QtCore/QString>
50 #include <QtCore/QList>
61 class KCal::CalendarResources::Private
64 Private(
const QString &family )
65 : mAddingInProgress( false ),
66 mLastUsedResource( 0 ),
68 mStandardPolicy( new StandardDestinationPolicy( mManager ) ),
69 mDestinationPolicy( mStandardPolicy ),
70 mAskPolicy( new AskDestinationPolicy( mManager ) ),
72 mPendingDeleteFromResourceMap( false )
77 delete mStandardPolicy;
80 bool mAddingInProgress;
86 QMap <Incidence*, ResourceCalendar*> mResourceMap;
88 StandardDestinationPolicy *mStandardPolicy;
89 DestinationPolicy *mDestinationPolicy;
90 AskDestinationPolicy *mAskPolicy;
92 QMap<ResourceCalendar *, Ticket *> mTickets;
93 QMap<ResourceCalendar *, int> mChangeCounts;
97 bool mPendingDeleteFromResourceMap;
99 template<
class Inc
idenceList >
100 void appendIncidences( IncidenceList &result,
const IncidenceList &extra,
104 class KCal::CalendarResources::DestinationPolicy::Private
108 : mManager( manager ),
115 class KCal::CalendarResources::StandardDestinationPolicy::Private
122 class KCal::CalendarResources::AskDestinationPolicy::Private
129 class KCal::CalendarResources::Ticket::Private
133 : mResource( resource )
139 CalendarResources::DestinationPolicy::DestinationPolicy(
141 : d( new KCal::
CalendarResources::DestinationPolicy::Private( manager, parent ) )
145 CalendarResources::DestinationPolicy::~DestinationPolicy()
150 QWidget *CalendarResources::DestinationPolicy::parent()
155 void CalendarResources::DestinationPolicy::setParent( QWidget *parent )
165 bool CalendarResources::DestinationPolicy::hasCalendarResources()
168 for ( it = resourceManager()->activeBegin();
169 it != resourceManager()->activeEnd(); ++it ) {
170 if ( !(*it)->readOnly() ) {
171 if ( resourceManager()->standardResource() == *it ) {
181 CalendarResources::StandardDestinationPolicy::StandardDestinationPolicy(
183 : DestinationPolicy( manager, parent ),
188 CalendarResources::StandardDestinationPolicy::~StandardDestinationPolicy()
195 Q_UNUSED( incidence );
196 return resourceManager()->standardResource();
199 CalendarResources::AskDestinationPolicy::AskDestinationPolicy(
201 : DestinationPolicy( manager, parent ),
206 CalendarResources::AskDestinationPolicy::~AskDestinationPolicy()
213 Q_UNUSED( incidence );
214 QList<KRES::Resource*> list;
217 for ( it = resourceManager()->activeBegin();
218 it != resourceManager()->activeEnd(); ++it ) {
219 if ( !(*it)->readOnly() ) {
221 if ( resourceManager()->standardResource() == *it ) {
222 list.insert( 0, *it );
235 const QString &family )
243 d->mManager->addObserver(
this );
247 const QString &family )
254 d->mManager->addObserver(
this );
266 delete d->mException;
272 return d->mException;
277 d->mManager->readConfig( config );
280 for ( it = d->mManager->begin(); it != d->mManager->end(); ++it ) {
287 if ( !d->mManager->standardResource() ) {
288 kDebug() <<
"Warning! No standard resource yet.";
294 for ( i1 = d->mManager->begin(); i1 != d->mManager->end(); ++i1 ) {
298 QList<ResourceCalendar *> failed;
302 for ( it = d->mManager->activeBegin(); it != d->mManager->activeEnd(); ++it ) {
303 if ( !(*it)->load() ) {
304 failed.append( *it );
307 Incidence::List::Iterator incit;
308 for ( incit = incidences.begin(); incit != incidences.end(); ++incit ) {
309 (*incit)->registerObserver(
this );
314 QList<ResourceCalendar *>::ConstIterator it2;
315 for ( it2 = failed.constBegin(); it2 != failed.constEnd(); ++it2 ) {
316 (*it2)->setActive(
false );
339 d->mDestinationPolicy = d->mStandardPolicy;
344 d->mDestinationPolicy = d->mAskPolicy;
349 return d->mDestinationPolicy->parent();
354 d->mDestinationPolicy->setParent( parent );
361 for ( it = d->mManager->activeBegin(); it != d->mManager->activeEnd(); ++it ) {
376 for ( it = d->mManager->activeBegin(); it != d->mManager->activeEnd(); ++it ) {
377 status = (*it)->save() || status;
388 for ( it = d->mManager->activeBegin(); it != d->mManager->activeEnd(); ++it ) {
389 if ( (*it)->isSaving() ) {
400 bool validRes =
false;
402 for ( it = d->mManager->activeBegin(); it != d->mManager->activeEnd(); ++it ) {
409 if ( d->mResourceMap.contains( incidence ) ) {
410 oldResource = d->mResourceMap[
incidence];
423 d->mResourceMap[
incidence] = oldResource;
425 d->mResourceMap.remove( incidence );
438 if ( !d->mAddingInProgress || d->mLastUsedResource == 0 ) {
439 resource = d->mDestinationPolicy->destination( incidence );
455 d->mResourceMap.remove( incidence );
477 if ( d->mResourceMap.find( event ) != d->mResourceMap.end() ) {
478 status = d->mResourceMap[
event]->deleteEvent( event );
480 d->mPendingDeleteFromResourceMap =
true;
485 for ( it = d->mManager->activeBegin(); it != d->mManager->activeEnd(); ++it ) {
486 status = (*it)->deleteEvent( event ) || status;
500 for ( it = d->mManager->activeBegin(); it != d->mManager->activeEnd(); ++it ) {
501 (*it)->deleteAllEvents();
508 for ( it = d->mManager->activeBegin(); it != d->mManager->activeEnd(); ++it ) {
509 Event *
event = (*it)->event( uid );
511 d->mResourceMap[
event] = *it;
533 if ( d->mResourceMap.find( todo ) != d->mResourceMap.end() ) {
534 status = d->mResourceMap[
todo]->deleteTodo( todo );
536 d->mPendingDeleteFromResourceMap =
true;
541 for ( it = d->mManager->activeBegin(); it != d->mManager->activeEnd(); ++it ) {
542 status = (*it)->deleteTodo( todo ) || status;
553 for ( it = d->mManager->activeBegin(); it != d->mManager->activeEnd(); ++it ) {
554 (*it)->deleteAllTodos();
564 for ( it = d->mManager->activeBegin(); it != d->mManager->activeEnd(); ++it ) {
568 return sortTodos( &result, sortField, sortDirection );
574 for ( it = d->mManager->activeBegin(); it != d->mManager->activeEnd(); ++it ) {
577 d->mResourceMap[
todo] = *it;
591 for ( it = d->mManager->activeBegin(); it != d->mManager->activeEnd(); ++it ) {
593 (*it)->rawTodosForDate( date ), *it );
602 for ( it = d->mManager->activeBegin(); it != d->mManager->activeEnd(); ++it ) {
603 result += (*it)->alarmsTo( to );
609 const KDateTime &to )
613 for ( it = d->mManager->activeBegin(); it != d->mManager->activeEnd(); ++it ) {
614 result += (*it)->alarms( from, to );
621 return d->mDestinationPolicy->hasCalendarResources();
627 const KDateTime::Spec &timeSpec,
633 for ( it = d->mManager->activeBegin(); it != d->mManager->activeEnd(); ++it ) {
635 (*it)->rawEventsForDate( date, timeSpec ), *it );
641 const KDateTime::Spec &timeSpec,
bool inclusive )
645 for ( it = d->mManager->activeBegin(); it != d->mManager->activeEnd(); ++it ) {
647 (*it)->rawEvents( start, end, timeSpec, inclusive ), *it );
657 for ( it = d->mManager->activeBegin(); it != d->mManager->activeEnd(); ++it ) {
659 (*it)->rawEventsForDate( kdt ), *it );
669 for ( it = d->mManager->activeBegin(); it != d->mManager->activeEnd(); ++it ) {
673 return sortEvents( &result, sortField, sortDirection );
689 if ( d->mResourceMap.find( journal ) != d->mResourceMap.end() ) {
690 status = d->mResourceMap[
journal]->deleteJournal( journal );
692 d->mPendingDeleteFromResourceMap =
true;
697 for ( it = d->mManager->activeBegin(); it != d->mManager->activeEnd(); ++it ) {
698 status = (*it)->deleteJournal( journal ) || status;
709 for ( it = d->mManager->activeBegin(); it != d->mManager->activeEnd(); ++it ) {
710 (*it)->deleteAllJournals();
717 for ( it = d->mManager->activeBegin(); it != d->mManager->activeEnd(); ++it ) {
720 d->mResourceMap[
journal] = *it;
734 for ( it = d->mManager->activeBegin(); it != d->mManager->activeEnd(); ++it ) {
738 return sortJournals( &result, sortField, sortDirection );
747 for ( it = d->mManager->activeBegin(); it != d->mManager->activeEnd(); ++it ) {
749 (*it)->rawJournalsForDate( date ), *it );
755 template<
class Inc
idenceList >
756 void CalendarResources::Private::appendIncidences( IncidenceList &result,
757 const IncidenceList &extra,
761 for (
typename IncidenceList::ConstIterator it = extra.begin();
764 mResourceMap[ *it ] = resource;
784 if ( d->mResourceMap.find( incidence ) != d->mResourceMap.end() ) {
796 if ( resource->
open() ) {
820 for ( i1 = d->mManager->begin(); i1 != d->mManager->end(); ++i1 ) {
821 (*i1)->setTimeSpec( timeSpec );
830 CalendarResources::Ticket::~Ticket()
837 KABC::Lock *lock = resource->
lock();
841 if ( lock->lock() ) {
842 return new Ticket( resource );
855 if ( !ticket || !ticket->resource() ) {
860 if ( ticket->resource()->save( incidence ) ) {
870 ticket->resource()->lock()->unlock();
878 r = d->mDestinationPolicy->destination( incidence );
880 kError() <<
"Unable to get destination resource.";
885 d->mPendingDeleteFromResourceMap =
false;
891 kDebug() <<
"unable to get ticket.";
895 d->mTickets[ r ] = ticket;
911 if ( d->mPendingDeleteFromResourceMap ) {
912 d->mResourceMap.remove( incidence );
913 d->mPendingDeleteFromResourceMap =
false;
917 bool ok =
save( d->mTickets[ r ], incidence );
919 d->mTickets.remove( r );
930 d->mAddingInProgress =
true;
935 d->mAddingInProgress =
false;
936 d->mLastUsedResource = 0;
941 if ( !d->mChangeCounts.contains( r ) ) {
942 d->mChangeCounts.insert( r, 0 );
945 int count = d->mChangeCounts[ r ];
947 d->mChangeCounts[ r ] = count;
954 if ( !d->mChangeCounts.contains( r ) ) {
955 kError() <<
"No change count for resource.";
959 int count = d->mChangeCounts[ r ];
962 kError() <<
"Can't decrement change count. It already is 0.";
965 d->mChangeCounts[ r ] = count;