00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
#include <stdlib.h>
00024
00025
#include <kdebug.h>
00026
#include <klocale.h>
00027
00028
#include "exceptions.h"
00029
#include "calfilter.h"
00030
00031
#include "calendar.h"
00032
00033
using namespace KCal;
00034
00035 Calendar::Calendar()
00036 {
00037 mTimeZoneId = QString::fromLatin1(
"UTC" );
00038 mLocalTime =
false;
00039
00040 init();
00041 }
00042
00043 Calendar::Calendar(
const QString &timeZoneId )
00044 {
00045 mTimeZoneId = timeZoneId;
00046 mLocalTime =
false;
00047
00048 init();
00049 }
00050
00051
void Calendar::init()
00052 {
00053 mObserver = 0;
00054 mNewObserver =
false;
00055
00056 mModified =
false;
00057
00058
00059 mDefaultFilter =
new CalFilter;
00060 mFilter = mDefaultFilter;
00061 mFilter->
setEnabled(
false);
00062
00063
00064
00065
00066
00067
00068
setOwner(i18n(
"Unknown Name"));
00069
setEmail(i18n(
"unknown@nowhere"));
00070
00071
#if 0
00072
tmpStr = KOPrefs::instance()->mTimeZone;
00073
00074
int dstSetting = KOPrefs::instance()->mDaylightSavings;
00075
extern long int timezone;
00076
struct tm *now;
00077 time_t curtime;
00078 curtime = time(0);
00079 now = localtime(&curtime);
00080
int hourOff = - ((timezone / 60) / 60);
00081
if (now->tm_isdst)
00082 hourOff += 1;
00083 QString tzStr;
00084 tzStr.sprintf(
"%.2d%.2d",
00085 hourOff,
00086 abs((timezone / 60) % 60));
00087
00088
00089
if (tmpStr.isEmpty()) {
00090
00091 }
else {
00092 tzStr = tmpStr;
00093 }
00094
00095
00096
00097
if ((now->tm_isdst && !dstSetting) ||
00098 (!now->tm_isdst && dstSetting)) {
00099 KOPrefs::instance()->mTimeZone = tzStr;
00100 KOPrefs::instance()->mDaylightSavings = now->tm_isdst;
00101 }
00102
00103 setTimeZone(tzStr);
00104
#endif
00105
00106
00107 }
00108
00109 Calendar::~Calendar()
00110 {
00111
delete mDefaultFilter;
00112 }
00113
00114 const QString &
Calendar::getOwner()
const
00115
{
00116
return mOwner;
00117 }
00118
00119 void Calendar::setOwner(
const QString &os)
00120 {
00121
int i;
00122 mOwner = os;
00123 i = mOwner.find(
',');
00124
if (i != -1)
00125 mOwner = mOwner.left(i);
00126
00127 setModified(
true );
00128 }
00129
00130 void Calendar::setTimeZoneId(
const QString &
id)
00131 {
00132 mTimeZoneId =
id;
00133 mLocalTime =
false;
00134
00135 setModified(
true );
00136
doSetTimeZoneId(
id );
00137 }
00138
00139 QString
Calendar::timeZoneId()
const
00140
{
00141
return mTimeZoneId;
00142 }
00143
00144 void Calendar::setLocalTime()
00145 {
00146 mLocalTime =
true;
00147 mTimeZone = 0;
00148 mTimeZoneId =
"";
00149
00150 setModified(
true );
00151 }
00152
00153 bool Calendar::isLocalTime()
const
00154
{
00155
return mLocalTime;
00156 }
00157
00158 const QString &
Calendar::getEmail()
00159 {
00160
return mOwnerEmail;
00161 }
00162
00163 void Calendar::setEmail(
const QString &e)
00164 {
00165 mOwnerEmail = e;
00166
00167 setModified(
true );
00168 }
00169
00170 void Calendar::setFilter(CalFilter *filter)
00171 {
00172 mFilter = filter;
00173 }
00174
00175 CalFilter *
Calendar::filter()
00176 {
00177
return mFilter;
00178 }
00179
00180 Incidence::List Calendar::incidences()
00181 {
00182
return mergeIncidenceList(
events(),
todos(),
journals() );
00183 }
00184
00185 Incidence::List Calendar::rawIncidences()
00186 {
00187
return mergeIncidenceList(
rawEvents(),
rawTodos(),
journals() );
00188 }
00189
00190 Event::List Calendar::events(
const QDate &date,
bool sorted )
00191 {
00192
Event::List el =
rawEventsForDate( date, sorted );
00193
00194 mFilter->
apply(&el);
00195
00196
return el;
00197 }
00198
00199 Event::List Calendar::events(
const QDateTime &qdt )
00200 {
00201
Event::List el =
rawEventsForDate(qdt);
00202 mFilter->
apply(&el);
00203
return el;
00204 }
00205
00206 Event::List Calendar::events(
const QDate &start,
const QDate &end,
00207
bool inclusive)
00208 {
00209
Event::List el =
rawEvents(start,end,inclusive);
00210 mFilter->
apply(&el);
00211
return el;
00212 }
00213
00214 Event::List Calendar::events()
00215 {
00216
Event::List el =
rawEvents();
00217 mFilter->
apply(&el);
00218
return el;
00219 }
00220
00221
00222 bool Calendar::addIncidence(
Incidence *i)
00223 {
00224
Incidence::AddVisitor<Calendar> v(
this);
00225
00226
return i->
accept(v);
00227 }
00228
00229 bool Calendar::deleteIncidence(
Incidence *i )
00230 {
00231
Incidence::DeleteVisitor<Calendar> v(
this );
00232
return i->
accept( v );
00233 }
00234
00235 Incidence *Calendar::incidence(
const QString& uid )
00236 {
00237
Incidence *i =
event( uid );
00238
if ( i )
return i;
00239 i =
todo( uid );
00240
if ( i )
return i;
00241 i =
journal( uid );
00242
return i;
00243 }
00244
00245 Todo::List Calendar::todos()
00246 {
00247
Todo::List tl =
rawTodos();
00248 mFilter->
apply( &tl );
00249
return tl;
00250 }
00251
00252
00253
00254 void Calendar::setupRelations(
Incidence *incidence )
00255 {
00256 QString uid = incidence->
uid();
00257
00258
00259
while(
Incidence* i = mOrphans[ uid ] ) {
00260 mOrphans.remove( uid );
00261 i->
setRelatedTo( incidence );
00262 incidence->
addRelation( i );
00263 mOrphanUids.remove( i->
uid() );
00264 }
00265
00266
00267
if( !incidence->
relatedTo() && !incidence->
relatedToUid().isEmpty() ) {
00268
00269
00270
Incidence* parent = this->incidence( incidence->
relatedToUid() );
00271
if( parent ) {
00272
00273 incidence->
setRelatedTo( parent );
00274 parent->
addRelation( incidence );
00275 }
else {
00276
00277 mOrphans.insert( incidence->
relatedToUid(), incidence );
00278 mOrphanUids.insert( incidence->
uid(), incidence );
00279 }
00280 }
00281 }
00282
00283
00284 void Calendar::removeRelations(
Incidence *incidence )
00285 {
00286
if( !incidence ) {
00287 kdDebug(5800) <<
"Warning: Calendar::removeRelations( 0 )!\n";
00288
return;
00289 }
00290
00291 QString uid = incidence->
uid();
00292
00293
Incidence::List relations = incidence->
relations();
00294 Incidence::List::ConstIterator it;
00295
for( it = relations.begin(); it != relations.end(); ++it ) {
00296
Incidence *i = *it;
00297
if( !mOrphanUids.find( i->
uid() ) ) {
00298 mOrphans.insert( uid, i );
00299 mOrphanUids.insert( i->
uid(), i );
00300 i->
setRelatedTo( 0 );
00301 i->
setRelatedToUid( uid );
00302 }
00303 }
00304
00305
00306
if( incidence->
relatedTo() )
00307 incidence->
relatedTo()->
removeRelation( incidence );
00308
00309
00310
if( mOrphanUids.remove( uid ) )
00311
00312
if( !( incidence->
relatedTo() != 0 && mOrphans.remove( incidence->
relatedTo()->
uid() ) ) ) {
00313
00314
for( QDictIterator<Incidence> it( mOrphans ); it.current(); ++it ) {
00315
if( it.current()->uid() == uid ) {
00316 mOrphans.remove( it.currentKey() );
00317
break;
00318 }
00319 }
00320 }
00321 }
00322
00323
void Calendar::registerObserver( Observer *observer )
00324 {
00325 mObserver = observer;
00326 mNewObserver =
true;
00327 }
00328
00329
void Calendar::setModified(
bool modified )
00330 {
00331
if ( modified != mModified || mNewObserver ) {
00332 mNewObserver =
false;
00333
if ( mObserver ) mObserver->calendarModified( modified,
this );
00334 mModified = modified;
00335 }
00336 }
00337
00338 void Calendar::setLoadedProductId(
const QString &
id )
00339 {
00340 mLoadedProductId =
id;
00341 }
00342
00343 QString
Calendar::loadedProductId()
00344 {
00345
return mLoadedProductId;
00346 }
00347
00348 Incidence::List Calendar::mergeIncidenceList(
const Event::List &e,
00349
const Todo::List &t,
00350
const Journal::List &j )
00351 {
00352
Incidence::List incidences;
00353
00354 Event::List::ConstIterator it1;
00355
for( it1 = e.begin(); it1 != e.end(); ++it1 ) incidences.append( *it1 );
00356
00357 Todo::List::ConstIterator it2;
00358
for( it2 = t.begin(); it2 != t.end(); ++it2 ) incidences.append( *it2 );
00359
00360 Journal::List::ConstIterator it3;
00361
for( it3 = j.begin(); it3 != j.end(); ++it3 ) incidences.append( *it3 );
00362
00363
return incidences;
00364 }
00365
00366
bool Calendar::beginChange(
Incidence * )
00367 {
00368
return true;
00369 }
00370
00371
bool Calendar::endChange(
Incidence * )
00372 {
00373
return true;
00374 }
00375
00376
#include "calendar.moc"