summaryrefslogtreecommitdiffabout
path: root/libkcal
authorzautrix <zautrix>2005-01-31 16:29:05 (UTC)
committer zautrix <zautrix>2005-01-31 16:29:05 (UTC)
commitec037c4616342c1b3976c55db98b775f48e0d455 (patch) (unidiff)
tree9d568c8f6ad6005f822c12644596b7a553837c7f /libkcal
parent5d52c81be9b43887c13f8534a04164d3b44b821f (diff)
downloadkdepimpi-ec037c4616342c1b3976c55db98b775f48e0d455.zip
kdepimpi-ec037c4616342c1b3976c55db98b775f48e0d455.tar.gz
kdepimpi-ec037c4616342c1b3976c55db98b775f48e0d455.tar.bz2
fix
Diffstat (limited to 'libkcal') (more/less context) (ignore whitespace changes)
-rw-r--r--libkcal/calendarlocal.cpp1
-rw-r--r--libkcal/incidence.cpp3
2 files changed, 2 insertions, 2 deletions
diff --git a/libkcal/calendarlocal.cpp b/libkcal/calendarlocal.cpp
index 0eba6a9..e75154b 100644
--- a/libkcal/calendarlocal.cpp
+++ b/libkcal/calendarlocal.cpp
@@ -1,724 +1,725 @@
1/* 1/*
2 This file is part of libkcal. 2 This file is part of libkcal.
3 3
4 Copyright (c) 1998 Preston Brown 4 Copyright (c) 1998 Preston Brown
5 Copyright (c) 2001,2003 Cornelius Schumacher <schumacher@kde.org> 5 Copyright (c) 2001,2003 Cornelius Schumacher <schumacher@kde.org>
6 6
7 This library is free software; you can redistribute it and/or 7 This library is free software; you can redistribute it and/or
8 modify it under the terms of the GNU Library General Public 8 modify it under the terms of the GNU Library General Public
9 License as published by the Free Software Foundation; either 9 License as published by the Free Software Foundation; either
10 version 2 of the License, or (at your option) any later version. 10 version 2 of the License, or (at your option) any later version.
11 11
12 This library is distributed in the hope that it will be useful, 12 This library is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of 13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 Library General Public License for more details. 15 Library General Public License for more details.
16 16
17 You should have received a copy of the GNU Library General Public License 17 You should have received a copy of the GNU Library General Public License
18 along with this library; see the file COPYING.LIB. If not, write to 18 along with this library; see the file COPYING.LIB. If not, write to
19 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 19 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. 20 Boston, MA 02111-1307, USA.
21*/ 21*/
22 22
23#include <qdatetime.h> 23#include <qdatetime.h>
24#include <qstring.h> 24#include <qstring.h>
25#include <qptrlist.h> 25#include <qptrlist.h>
26 26
27#include <kdebug.h> 27#include <kdebug.h>
28#include <kconfig.h> 28#include <kconfig.h>
29#include <kglobal.h> 29#include <kglobal.h>
30#include <klocale.h> 30#include <klocale.h>
31 31
32#include "vcaldrag.h" 32#include "vcaldrag.h"
33#include "vcalformat.h" 33#include "vcalformat.h"
34#include "icalformat.h" 34#include "icalformat.h"
35#include "exceptions.h" 35#include "exceptions.h"
36#include "incidence.h" 36#include "incidence.h"
37#include "journal.h" 37#include "journal.h"
38#include "filestorage.h" 38#include "filestorage.h"
39#include "calfilter.h" 39#include "calfilter.h"
40 40
41#include "calendarlocal.h" 41#include "calendarlocal.h"
42 42
43// #ifndef DESKTOP_VERSION 43// #ifndef DESKTOP_VERSION
44// #include <qtopia/alarmserver.h> 44// #include <qtopia/alarmserver.h>
45// #endif 45// #endif
46using namespace KCal; 46using namespace KCal;
47 47
48CalendarLocal::CalendarLocal() 48CalendarLocal::CalendarLocal()
49 : Calendar() 49 : Calendar()
50{ 50{
51 init(); 51 init();
52} 52}
53 53
54CalendarLocal::CalendarLocal(const QString &timeZoneId) 54CalendarLocal::CalendarLocal(const QString &timeZoneId)
55 : Calendar(timeZoneId) 55 : Calendar(timeZoneId)
56{ 56{
57 init(); 57 init();
58} 58}
59 59
60void CalendarLocal::init() 60void CalendarLocal::init()
61{ 61{
62 mNextAlarmIncidence = 0; 62 mNextAlarmIncidence = 0;
63} 63}
64 64
65 65
66CalendarLocal::~CalendarLocal() 66CalendarLocal::~CalendarLocal()
67{ 67{
68 close(); 68 close();
69} 69}
70 70
71bool CalendarLocal::load( const QString &fileName ) 71bool CalendarLocal::load( const QString &fileName )
72{ 72{
73 FileStorage storage( this, fileName ); 73 FileStorage storage( this, fileName );
74 return storage.load(); 74 return storage.load();
75} 75}
76 76
77bool CalendarLocal::save( const QString &fileName, CalFormat *format ) 77bool CalendarLocal::save( const QString &fileName, CalFormat *format )
78{ 78{
79 FileStorage storage( this, fileName, format ); 79 FileStorage storage( this, fileName, format );
80 return storage.save(); 80 return storage.save();
81} 81}
82 82
83void CalendarLocal::close() 83void CalendarLocal::close()
84{ 84{
85 mEventList.setAutoDelete( true ); 85 mEventList.setAutoDelete( true );
86 mTodoList.setAutoDelete( true ); 86 mTodoList.setAutoDelete( true );
87 mJournalList.setAutoDelete( false ); 87 mJournalList.setAutoDelete( false );
88 88
89 mEventList.clear(); 89 mEventList.clear();
90 mTodoList.clear(); 90 mTodoList.clear();
91 mJournalList.clear(); 91 mJournalList.clear();
92 92
93 mEventList.setAutoDelete( false ); 93 mEventList.setAutoDelete( false );
94 mTodoList.setAutoDelete( false ); 94 mTodoList.setAutoDelete( false );
95 mJournalList.setAutoDelete( false ); 95 mJournalList.setAutoDelete( false );
96 96
97 setModified( false ); 97 setModified( false );
98} 98}
99 99
100bool CalendarLocal::addAnniversaryNoDup( Event *event ) 100bool CalendarLocal::addAnniversaryNoDup( Event *event )
101{ 101{
102 QString cat; 102 QString cat;
103 bool isBirthday = true; 103 bool isBirthday = true;
104 if( event->categoriesStr() == i18n( "Anniversary" ) ) { 104 if( event->categoriesStr() == i18n( "Anniversary" ) ) {
105 isBirthday = false; 105 isBirthday = false;
106 cat = i18n( "Anniversary" ); 106 cat = i18n( "Anniversary" );
107 } else if( event->categoriesStr() == i18n( "Birthday" ) ) { 107 } else if( event->categoriesStr() == i18n( "Birthday" ) ) {
108 isBirthday = true; 108 isBirthday = true;
109 cat = i18n( "Birthday" ); 109 cat = i18n( "Birthday" );
110 } else { 110 } else {
111 qDebug("addAnniversaryNoDup called without fitting category! "); 111 qDebug("addAnniversaryNoDup called without fitting category! ");
112 return false; 112 return false;
113 } 113 }
114 Event * eve; 114 Event * eve;
115 for ( eve = mEventList.first(); eve ; eve = mEventList.next() ) { 115 for ( eve = mEventList.first(); eve ; eve = mEventList.next() ) {
116 if ( !(eve->categories().contains( cat ) )) 116 if ( !(eve->categories().contains( cat ) ))
117 continue; 117 continue;
118 // now we have an event with fitting category 118 // now we have an event with fitting category
119 if ( eve->dtStart().date() != event->dtStart().date() ) 119 if ( eve->dtStart().date() != event->dtStart().date() )
120 continue; 120 continue;
121 // now we have an event with fitting category+date 121 // now we have an event with fitting category+date
122 if ( eve->summary() != event->summary() ) 122 if ( eve->summary() != event->summary() )
123 continue; 123 continue;
124 // now we have an event with fitting category+date+summary 124 // now we have an event with fitting category+date+summary
125 return false; 125 return false;
126 } 126 }
127 return addEvent( event ); 127 return addEvent( event );
128 128
129} 129}
130bool CalendarLocal::addEventNoDup( Event *event ) 130bool CalendarLocal::addEventNoDup( Event *event )
131{ 131{
132 Event * eve; 132 Event * eve;
133 for ( eve = mEventList.first(); eve ; eve = mEventList.next() ) { 133 for ( eve = mEventList.first(); eve ; eve = mEventList.next() ) {
134 if ( *eve == *event ) { 134 if ( *eve == *event ) {
135 //qDebug("CalendarLocal::Duplicate event found! Not inserted! "); 135 //qDebug("CalendarLocal::Duplicate event found! Not inserted! ");
136 return false; 136 return false;
137 } 137 }
138 } 138 }
139 return addEvent( event ); 139 return addEvent( event );
140} 140}
141 141
142bool CalendarLocal::addEvent( Event *event ) 142bool CalendarLocal::addEvent( Event *event )
143{ 143{
144 insertEvent( event ); 144 insertEvent( event );
145 145
146 event->registerObserver( this ); 146 event->registerObserver( this );
147 147
148 setModified( true ); 148 setModified( true );
149 149
150 return true; 150 return true;
151} 151}
152 152
153void CalendarLocal::deleteEvent( Event *event ) 153void CalendarLocal::deleteEvent( Event *event )
154{ 154{
155 if ( mUndoIncidence ) delete mUndoIncidence; 155 if ( mUndoIncidence ) delete mUndoIncidence;
156 mUndoIncidence = event->clone(); 156 mUndoIncidence = event->clone();
157 if ( mEventList.removeRef( event ) ) { 157 if ( mEventList.removeRef( event ) ) {
158 setModified( true ); 158 setModified( true );
159 } 159 }
160} 160}
161 161
162 162
163Event *CalendarLocal::event( const QString &uid ) 163Event *CalendarLocal::event( const QString &uid )
164{ 164{
165 165
166 Event *event; 166 Event *event;
167 167
168 for ( event = mEventList.first(); event; event = mEventList.next() ) { 168 for ( event = mEventList.first(); event; event = mEventList.next() ) {
169 if ( event->uid() == uid ) { 169 if ( event->uid() == uid ) {
170 return event; 170 return event;
171 } 171 }
172 } 172 }
173 173
174 return 0; 174 return 0;
175} 175}
176bool CalendarLocal::addTodoNoDup( Todo *todo ) 176bool CalendarLocal::addTodoNoDup( Todo *todo )
177{ 177{
178 Todo * eve; 178 Todo * eve;
179 for ( eve = mTodoList.first(); eve ; eve = mTodoList.next() ) { 179 for ( eve = mTodoList.first(); eve ; eve = mTodoList.next() ) {
180 if ( *eve == *todo ) { 180 if ( *eve == *todo ) {
181 //qDebug("duplicate todo found! not inserted! "); 181 //qDebug("duplicate todo found! not inserted! ");
182 return false; 182 return false;
183 } 183 }
184 } 184 }
185 return addTodo( todo ); 185 return addTodo( todo );
186} 186}
187bool CalendarLocal::addTodo( Todo *todo ) 187bool CalendarLocal::addTodo( Todo *todo )
188{ 188{
189 mTodoList.append( todo ); 189 mTodoList.append( todo );
190 190
191 todo->registerObserver( this ); 191 todo->registerObserver( this );
192 192
193 // Set up subtask relations 193 // Set up subtask relations
194 setupRelations( todo ); 194 setupRelations( todo );
195 195
196 setModified( true ); 196 setModified( true );
197 197
198 return true; 198 return true;
199} 199}
200 200
201void CalendarLocal::deleteTodo( Todo *todo ) 201void CalendarLocal::deleteTodo( Todo *todo )
202{ 202{
203 // Handle orphaned children 203 // Handle orphaned children
204 if ( mUndoIncidence ) delete mUndoIncidence; 204 if ( mUndoIncidence ) delete mUndoIncidence;
205 removeRelations( todo ); 205 removeRelations( todo );
206 mUndoIncidence = todo->clone(); 206 mUndoIncidence = todo->clone();
207 207
208 if ( mTodoList.removeRef( todo ) ) { 208 if ( mTodoList.removeRef( todo ) ) {
209 setModified( true ); 209 setModified( true );
210 } 210 }
211} 211}
212 212
213QPtrList<Todo> CalendarLocal::rawTodos() 213QPtrList<Todo> CalendarLocal::rawTodos()
214{ 214{
215 return mTodoList; 215 return mTodoList;
216} 216}
217Todo *CalendarLocal::todo( QString syncProf, QString id ) 217Todo *CalendarLocal::todo( QString syncProf, QString id )
218{ 218{
219 Todo *todo; 219 Todo *todo;
220 for ( todo = mTodoList.first(); todo; todo = mTodoList.next() ) { 220 for ( todo = mTodoList.first(); todo; todo = mTodoList.next() ) {
221 if ( todo->getID( syncProf ) == id ) return todo; 221 if ( todo->getID( syncProf ) == id ) return todo;
222 } 222 }
223 223
224 return 0; 224 return 0;
225} 225}
226void CalendarLocal::removeSyncInfo( QString syncProfile) 226void CalendarLocal::removeSyncInfo( QString syncProfile)
227{ 227{
228 QPtrList<Incidence> all = rawIncidences() ; 228 QPtrList<Incidence> all = rawIncidences() ;
229 Incidence *inc; 229 Incidence *inc;
230 for ( inc = all.first(); inc; inc = all.next() ) { 230 for ( inc = all.first(); inc; inc = all.next() ) {
231 inc->removeID( syncProfile ); 231 inc->removeID( syncProfile );
232 } 232 }
233 if ( syncProfile.isEmpty() ) { 233 if ( syncProfile.isEmpty() ) {
234 QPtrList<Event> el; 234 QPtrList<Event> el;
235 Event *todo; 235 Event *todo;
236 for ( todo = mEventList.first(); todo; todo = mEventList.next() ) { 236 for ( todo = mEventList.first(); todo; todo = mEventList.next() ) {
237 if ( todo->uid().left( 15 ) == QString("last-syncEvent-") ) 237 if ( todo->uid().left( 15 ) == QString("last-syncEvent-") )
238 el.append( todo ); 238 el.append( todo );
239 } 239 }
240 for ( todo = el.first(); todo; todo = el.next() ) { 240 for ( todo = el.first(); todo; todo = el.next() ) {
241 deleteIncidence ( todo ); 241 deleteIncidence ( todo );
242 } 242 }
243 } else { 243 } else {
244 Event *lse = event( "last-syncEvent-"+ syncProfile); 244 Event *lse = event( "last-syncEvent-"+ syncProfile);
245 deleteIncidence ( lse ); 245 deleteIncidence ( lse );
246 } 246 }
247} 247}
248QPtrList<Event> CalendarLocal::getExternLastSyncEvents() 248QPtrList<Event> CalendarLocal::getExternLastSyncEvents()
249{ 249{
250 QPtrList<Event> el; 250 QPtrList<Event> el;
251 Event *todo; 251 Event *todo;
252 for ( todo = mEventList.first(); todo; todo = mEventList.next() ) { 252 for ( todo = mEventList.first(); todo; todo = mEventList.next() ) {
253 if ( todo->uid().left( 15 ) == QString("last-syncEvent-") ) 253 if ( todo->uid().left( 15 ) == QString("last-syncEvent-") )
254 if ( todo->summary().left(3) == "E: " ) 254 if ( todo->summary().left(3) == "E: " )
255 el.append( todo ); 255 el.append( todo );
256 } 256 }
257 257
258 return el; 258 return el;
259 259
260} 260}
261Event *CalendarLocal::event( QString syncProf, QString id ) 261Event *CalendarLocal::event( QString syncProf, QString id )
262{ 262{
263 Event *todo; 263 Event *todo;
264 for ( todo = mEventList.first(); todo; todo = mEventList.next() ) { 264 for ( todo = mEventList.first(); todo; todo = mEventList.next() ) {
265 if ( todo->getID( syncProf ) == id ) return todo; 265 if ( todo->getID( syncProf ) == id ) return todo;
266 } 266 }
267 267
268 return 0; 268 return 0;
269} 269}
270Todo *CalendarLocal::todo( const QString &uid ) 270Todo *CalendarLocal::todo( const QString &uid )
271{ 271{
272 Todo *todo; 272 Todo *todo;
273 for ( todo = mTodoList.first(); todo; todo = mTodoList.next() ) { 273 for ( todo = mTodoList.first(); todo; todo = mTodoList.next() ) {
274 if ( todo->uid() == uid ) return todo; 274 if ( todo->uid() == uid ) return todo;
275 } 275 }
276 276
277 return 0; 277 return 0;
278} 278}
279QString CalendarLocal::nextSummary() const 279QString CalendarLocal::nextSummary() const
280{ 280{
281 return mNextSummary; 281 return mNextSummary;
282} 282}
283QDateTime CalendarLocal::nextAlarmEventDateTime() const 283QDateTime CalendarLocal::nextAlarmEventDateTime() const
284{ 284{
285 return mNextAlarmEventDateTime; 285 return mNextAlarmEventDateTime;
286} 286}
287void CalendarLocal::checkAlarmForIncidence( Incidence * incidence, bool deleted) 287void CalendarLocal::checkAlarmForIncidence( Incidence * incidence, bool deleted)
288{ 288{
289 //mNextAlarmIncidence 289 //mNextAlarmIncidence
290 //mNextAlarmDateTime 290 //mNextAlarmDateTime
291 //return mNextSummary; 291 //return mNextSummary;
292 //return mNextAlarmEventDateTime; 292 //return mNextAlarmEventDateTime;
293 bool newNextAlarm = false; 293 bool newNextAlarm = false;
294 bool computeNextAlarm = false; 294 bool computeNextAlarm = false;
295 bool ok; 295 bool ok;
296 int offset; 296 int offset;
297 QDateTime nextA; 297 QDateTime nextA;
298 // QString nextSum; 298 // QString nextSum;
299 //QDateTime nextEvent; 299 //QDateTime nextEvent;
300 if ( mNextAlarmIncidence == 0 || incidence == 0 ) { 300 if ( mNextAlarmIncidence == 0 || incidence == 0 ) {
301 computeNextAlarm = true; 301 computeNextAlarm = true;
302 } else { 302 } else {
303 if ( ! deleted ) { 303 if ( ! deleted ) {
304 nextA = incidence->getNextAlarmDateTime(& ok, &offset ) ; 304 nextA = incidence->getNextAlarmDateTime(& ok, &offset ) ;
305 if ( ok ) { 305 if ( ok ) {
306 if ( nextA < mNextAlarmDateTime ) { 306 if ( nextA < mNextAlarmDateTime ) {
307 deRegisterAlarm(); 307 deRegisterAlarm();
308 mNextAlarmDateTime = nextA; 308 mNextAlarmDateTime = nextA;
309 mNextSummary = incidence->summary(); 309 mNextSummary = incidence->summary();
310 mNextAlarmEventDateTime = nextA.addSecs(offset ) ; 310 mNextAlarmEventDateTime = nextA.addSecs(offset ) ;
311 mNextAlarmEventDateTimeString = KGlobal::locale()->formatDateTime(mNextAlarmEventDateTime); 311 mNextAlarmEventDateTimeString = KGlobal::locale()->formatDateTime(mNextAlarmEventDateTime);
312 newNextAlarm = true; 312 newNextAlarm = true;
313 mNextAlarmIncidence = incidence; 313 mNextAlarmIncidence = incidence;
314 } else { 314 } else {
315 if ( incidence == mNextAlarmIncidence ) { 315 if ( incidence == mNextAlarmIncidence ) {
316 computeNextAlarm = true; 316 computeNextAlarm = true;
317 } 317 }
318 } 318 }
319 } else { 319 } else {
320 if ( mNextAlarmIncidence == incidence ) { 320 if ( mNextAlarmIncidence == incidence ) {
321 computeNextAlarm = true; 321 computeNextAlarm = true;
322 } 322 }
323 } 323 }
324 } else { // deleted 324 } else { // deleted
325 if ( incidence == mNextAlarmIncidence ) { 325 if ( incidence == mNextAlarmIncidence ) {
326 computeNextAlarm = true; 326 computeNextAlarm = true;
327 } 327 }
328 } 328 }
329 } 329 }
330 if ( computeNextAlarm ) { 330 if ( computeNextAlarm ) {
331 deRegisterAlarm(); 331 deRegisterAlarm();
332 nextA = nextAlarm( 1000 ); 332 nextA = nextAlarm( 1000 );
333 if (! mNextAlarmIncidence ) { 333 if (! mNextAlarmIncidence ) {
334 return; 334 return;
335 } 335 }
336 newNextAlarm = true; 336 newNextAlarm = true;
337 } 337 }
338 if ( newNextAlarm ) 338 if ( newNextAlarm )
339 registerAlarm(); 339 registerAlarm();
340} 340}
341QString CalendarLocal:: getAlarmNotification() 341QString CalendarLocal:: getAlarmNotification()
342{ 342{
343 QString ret; 343 QString ret;
344 // this should not happen 344 // this should not happen
345 if (! mNextAlarmIncidence ) 345 if (! mNextAlarmIncidence )
346 return "cal_alarm"+ mNextSummary.left( 25 )+"\n"+mNextAlarmEventDateTimeString; 346 return "cal_alarm"+ mNextSummary.left( 25 )+"\n"+mNextAlarmEventDateTimeString;
347 Alarm* alarm = mNextAlarmIncidence->alarms().first(); 347 Alarm* alarm = mNextAlarmIncidence->alarms().first();
348 if ( alarm->type() == Alarm::Procedure ) { 348 if ( alarm->type() == Alarm::Procedure ) {
349 ret = "proc_alarm" + alarm->programFile()+"+++"; 349 ret = "proc_alarm" + alarm->programFile()+"+++";
350 } else { 350 } else {
351 ret = "audio_alarm" +alarm->audioFile() +"+++"; 351 ret = "audio_alarm" +alarm->audioFile() +"+++";
352 } 352 }
353 ret += "cal_alarm"+ mNextSummary.left( 25 ); 353 ret += "cal_alarm"+ mNextSummary.left( 25 );
354 if ( mNextSummary.length() > 25 ) 354 if ( mNextSummary.length() > 25 )
355 ret += "\n" + mNextSummary.mid(25, 25 ); 355 ret += "\n" + mNextSummary.mid(25, 25 );
356 ret+= "\n"+mNextAlarmEventDateTimeString; 356 ret+= "\n"+mNextAlarmEventDateTimeString;
357 return ret; 357 return ret;
358} 358}
359void CalendarLocal::registerAlarm() 359void CalendarLocal::registerAlarm()
360{ 360{
361 mLastAlarmNotificationString = getAlarmNotification(); 361 mLastAlarmNotificationString = getAlarmNotification();
362 // qDebug("++ register Alarm %s %s",mNextAlarmDateTime.toString().latin1(), mLastAlarmNotificationString.latin1() ); 362 // qDebug("++ register Alarm %s %s",mNextAlarmDateTime.toString().latin1(), mLastAlarmNotificationString.latin1() );
363 emit addAlarm ( mNextAlarmDateTime, mLastAlarmNotificationString ); 363 emit addAlarm ( mNextAlarmDateTime, mLastAlarmNotificationString );
364// #ifndef DESKTOP_VERSION 364// #ifndef DESKTOP_VERSION
365// AlarmServer::addAlarm ( mNextAlarmDateTime,"koalarm", mLastAlarmNotificationString.latin1() ); 365// AlarmServer::addAlarm ( mNextAlarmDateTime,"koalarm", mLastAlarmNotificationString.latin1() );
366// #endif 366// #endif
367} 367}
368void CalendarLocal::deRegisterAlarm() 368void CalendarLocal::deRegisterAlarm()
369{ 369{
370 if ( mLastAlarmNotificationString.isNull() ) 370 if ( mLastAlarmNotificationString.isNull() )
371 return; 371 return;
372 //qDebug("-- deregister Alarm %s ", mLastAlarmNotificationString.latin1() ); 372 //qDebug("-- deregister Alarm %s ", mLastAlarmNotificationString.latin1() );
373 373
374 emit removeAlarm ( mNextAlarmDateTime, mLastAlarmNotificationString ); 374 emit removeAlarm ( mNextAlarmDateTime, mLastAlarmNotificationString );
375// #ifndef DESKTOP_VERSION 375// #ifndef DESKTOP_VERSION
376// AlarmServer::deleteAlarm (mNextAlarmDateTime ,"koalarm" ,mLastAlarmNotificationString.latin1() ); 376// AlarmServer::deleteAlarm (mNextAlarmDateTime ,"koalarm" ,mLastAlarmNotificationString.latin1() );
377// #endif 377// #endif
378} 378}
379 379
380QPtrList<Todo> CalendarLocal::todos( const QDate &date ) 380QPtrList<Todo> CalendarLocal::todos( const QDate &date )
381{ 381{
382 QPtrList<Todo> todos; 382 QPtrList<Todo> todos;
383 383
384 Todo *todo; 384 Todo *todo;
385 for ( todo = mTodoList.first(); todo; todo = mTodoList.next() ) { 385 for ( todo = mTodoList.first(); todo; todo = mTodoList.next() ) {
386 if ( todo->hasDueDate() && todo->dtDue().date() == date ) { 386 if ( todo->hasDueDate() && todo->dtDue().date() == date ) {
387 todos.append( todo ); 387 todos.append( todo );
388 } 388 }
389 } 389 }
390 390
391 filter()->apply( &todos ); 391 filter()->apply( &todos );
392 return todos; 392 return todos;
393} 393}
394void CalendarLocal::reInitAlarmSettings() 394void CalendarLocal::reInitAlarmSettings()
395{ 395{
396 if ( !mNextAlarmIncidence ) { 396 if ( !mNextAlarmIncidence ) {
397 nextAlarm( 1000 ); 397 nextAlarm( 1000 );
398 } 398 }
399 deRegisterAlarm(); 399 deRegisterAlarm();
400 mNextAlarmIncidence = 0; 400 mNextAlarmIncidence = 0;
401 checkAlarmForIncidence( 0, false ); 401 checkAlarmForIncidence( 0, false );
402 402
403} 403}
404 404
405 405
406 406
407QDateTime CalendarLocal::nextAlarm( int daysTo ) 407QDateTime CalendarLocal::nextAlarm( int daysTo )
408{ 408{
409 QDateTime nextA = QDateTime::currentDateTime().addDays( daysTo ); 409 QDateTime nextA = QDateTime::currentDateTime().addDays( daysTo );
410 QDateTime start = QDateTime::currentDateTime().addSecs( 30 ); 410 QDateTime start = QDateTime::currentDateTime().addSecs( 30 );
411 QDateTime next; 411 QDateTime next;
412 Event *e; 412 Event *e;
413 bool ok; 413 bool ok;
414 bool found = false; 414 bool found = false;
415 int offset; 415 int offset;
416 mNextAlarmIncidence = 0; 416 mNextAlarmIncidence = 0;
417 for( e = mEventList.first(); e; e = mEventList.next() ) { 417 for( e = mEventList.first(); e; e = mEventList.next() ) {
418 next = e->getNextAlarmDateTime(& ok, &offset ) ; 418 next = e->getNextAlarmDateTime(& ok, &offset ) ;
419 if ( ok ) { 419 if ( ok ) {
420 if ( next < nextA ) { 420 if ( next < nextA ) {
421 nextA = next; 421 nextA = next;
422 found = true; 422 found = true;
423 mNextSummary = e->summary(); 423 mNextSummary = e->summary();
424 mNextAlarmEventDateTime = next.addSecs(offset ) ; 424 mNextAlarmEventDateTime = next.addSecs(offset ) ;
425 mNextAlarmIncidence = (Incidence *) e; 425 mNextAlarmIncidence = (Incidence *) e;
426 } 426 }
427 } 427 }
428 } 428 }
429 Todo *t; 429 Todo *t;
430 for( t = mTodoList.first(); t; t = mTodoList.next() ) { 430 for( t = mTodoList.first(); t; t = mTodoList.next() ) {
431 next = t->getNextAlarmDateTime(& ok, &offset ) ; 431 next = t->getNextAlarmDateTime(& ok, &offset ) ;
432 if ( ok ) { 432 if ( ok ) {
433 if ( next < nextA ) { 433 if ( next < nextA ) {
434 nextA = next; 434 nextA = next;
435 found = true; 435 found = true;
436 mNextSummary = t->summary(); 436 mNextSummary = t->summary();
437 mNextAlarmEventDateTime = next.addSecs(offset ); 437 mNextAlarmEventDateTime = next.addSecs(offset );
438 mNextAlarmIncidence = (Incidence *) t; 438 mNextAlarmIncidence = (Incidence *) t;
439 } 439 }
440 } 440 }
441 } 441 }
442 if ( mNextAlarmIncidence ) { 442 if ( mNextAlarmIncidence ) {
443 mNextAlarmEventDateTimeString = KGlobal::locale()->formatDateTime(mNextAlarmEventDateTime); 443 mNextAlarmEventDateTimeString = KGlobal::locale()->formatDateTime(mNextAlarmEventDateTime);
444 mNextAlarmDateTime = nextA; 444 mNextAlarmDateTime = nextA;
445 } 445 }
446 return nextA; 446 return nextA;
447} 447}
448Alarm::List CalendarLocal::alarmsTo( const QDateTime &to ) 448Alarm::List CalendarLocal::alarmsTo( const QDateTime &to )
449{ 449{
450 return alarms( QDateTime( QDate( 1900, 1, 1 ) ), to ); 450 return alarms( QDateTime( QDate( 1900, 1, 1 ) ), to );
451} 451}
452 452
453Alarm::List CalendarLocal::alarms( const QDateTime &from, const QDateTime &to ) 453Alarm::List CalendarLocal::alarms( const QDateTime &from, const QDateTime &to )
454{ 454{
455 kdDebug(5800) << "CalendarLocal::alarms(" << from.toString() << " - " 455 kdDebug(5800) << "CalendarLocal::alarms(" << from.toString() << " - "
456 << to.toString() << ")\n"; 456 << to.toString() << ")\n";
457 457
458 Alarm::List alarms; 458 Alarm::List alarms;
459 459
460 Event *e; 460 Event *e;
461 461
462 for( e = mEventList.first(); e; e = mEventList.next() ) { 462 for( e = mEventList.first(); e; e = mEventList.next() ) {
463 if ( e->doesRecur() ) appendRecurringAlarms( alarms, e, from, to ); 463 if ( e->doesRecur() ) appendRecurringAlarms( alarms, e, from, to );
464 else appendAlarms( alarms, e, from, to ); 464 else appendAlarms( alarms, e, from, to );
465 } 465 }
466 466
467 Todo *t; 467 Todo *t;
468 for( t = mTodoList.first(); t; t = mTodoList.next() ) { 468 for( t = mTodoList.first(); t; t = mTodoList.next() ) {
469 appendAlarms( alarms, t, from, to ); 469 appendAlarms( alarms, t, from, to );
470 } 470 }
471 471
472 return alarms; 472 return alarms;
473} 473}
474 474
475void CalendarLocal::appendAlarms( Alarm::List &alarms, Incidence *incidence, 475void CalendarLocal::appendAlarms( Alarm::List &alarms, Incidence *incidence,
476 const QDateTime &from, const QDateTime &to ) 476 const QDateTime &from, const QDateTime &to )
477{ 477{
478 QPtrList<Alarm> alarmList = incidence->alarms(); 478 QPtrList<Alarm> alarmList = incidence->alarms();
479 Alarm *alarm; 479 Alarm *alarm;
480 for( alarm = alarmList.first(); alarm; alarm = alarmList.next() ) { 480 for( alarm = alarmList.first(); alarm; alarm = alarmList.next() ) {
481// kdDebug(5800) << "CalendarLocal::appendAlarms() '" << alarm->text() 481// kdDebug(5800) << "CalendarLocal::appendAlarms() '" << alarm->text()
482// << "': " << alarm->time().toString() << " - " << alarm->enabled() << endl; 482// << "': " << alarm->time().toString() << " - " << alarm->enabled() << endl;
483 if ( alarm->enabled() ) { 483 if ( alarm->enabled() ) {
484 if ( alarm->time() >= from && alarm->time() <= to ) { 484 if ( alarm->time() >= from && alarm->time() <= to ) {
485 kdDebug(5800) << "CalendarLocal::appendAlarms() '" << incidence->summary() 485 kdDebug(5800) << "CalendarLocal::appendAlarms() '" << incidence->summary()
486 << "': " << alarm->time().toString() << endl; 486 << "': " << alarm->time().toString() << endl;
487 alarms.append( alarm ); 487 alarms.append( alarm );
488 } 488 }
489 } 489 }
490 } 490 }
491} 491}
492 492
493void CalendarLocal::appendRecurringAlarms( Alarm::List &alarms, 493void CalendarLocal::appendRecurringAlarms( Alarm::List &alarms,
494 Incidence *incidence, 494 Incidence *incidence,
495 const QDateTime &from, 495 const QDateTime &from,
496 const QDateTime &to ) 496 const QDateTime &to )
497{ 497{
498 498
499 QPtrList<Alarm> alarmList = incidence->alarms(); 499 QPtrList<Alarm> alarmList = incidence->alarms();
500 Alarm *alarm; 500 Alarm *alarm;
501 QDateTime qdt; 501 QDateTime qdt;
502 for( alarm = alarmList.first(); alarm; alarm = alarmList.next() ) { 502 for( alarm = alarmList.first(); alarm; alarm = alarmList.next() ) {
503 if (incidence->recursOn(from.date())) { 503 if (incidence->recursOn(from.date())) {
504 qdt.setTime(alarm->time().time()); 504 qdt.setTime(alarm->time().time());
505 qdt.setDate(from.date()); 505 qdt.setDate(from.date());
506 } 506 }
507 else qdt = alarm->time(); 507 else qdt = alarm->time();
508 // qDebug("1 %s %s %s", qdt.toString().latin1(), from.toString().latin1(), to.toString().latin1()); 508 // qDebug("1 %s %s %s", qdt.toString().latin1(), from.toString().latin1(), to.toString().latin1());
509 if ( alarm->enabled() ) { 509 if ( alarm->enabled() ) {
510 if ( qdt >= from && qdt <= to ) { 510 if ( qdt >= from && qdt <= to ) {
511 alarms.append( alarm ); 511 alarms.append( alarm );
512 } 512 }
513 } 513 }
514 } 514 }
515} 515}
516 516
517 517
518/****************************** PROTECTED METHODS ****************************/ 518/****************************** PROTECTED METHODS ****************************/
519 519
520// after changes are made to an event, this should be called. 520// after changes are made to an event, this should be called.
521void CalendarLocal::update( IncidenceBase *incidence ) 521void CalendarLocal::update( IncidenceBase *incidence )
522{ 522{
523 incidence->setSyncStatus( Event::SYNCMOD ); 523 incidence->setSyncStatus( Event::SYNCMOD );
524 incidence->setLastModified( QDateTime::currentDateTime() ); 524 incidence->setLastModified( QDateTime::currentDateTime() );
525 // we should probably update the revision number here, 525 // we should probably update the revision number here,
526 // or internally in the Event itself when certain things change. 526 // or internally in the Event itself when certain things change.
527 // need to verify with ical documentation. 527 // need to verify with ical documentation.
528 528
529 setModified( true ); 529 setModified( true );
530} 530}
531 531
532void CalendarLocal::insertEvent( Event *event ) 532void CalendarLocal::insertEvent( Event *event )
533{ 533{
534 if ( mEventList.findRef( event ) < 0 ) mEventList.append( event ); 534 if ( mEventList.findRef( event ) < 0 ) mEventList.append( event );
535} 535}
536 536
537 537
538QPtrList<Event> CalendarLocal::rawEventsForDate( const QDate &qd, bool sorted ) 538QPtrList<Event> CalendarLocal::rawEventsForDate( const QDate &qd, bool sorted )
539{ 539{
540 QPtrList<Event> eventList; 540 QPtrList<Event> eventList;
541 541
542 Event *event; 542 Event *event;
543 for( event = mEventList.first(); event; event = mEventList.next() ) { 543 for( event = mEventList.first(); event; event = mEventList.next() ) {
544 if ( event->doesRecur() ) { 544 if ( event->doesRecur() ) {
545 if ( event->isMultiDay() ) { 545 if ( event->isMultiDay() ) {
546 int extraDays = event->dtStart().date().daysTo( event->dtEnd().date() ); 546 int extraDays = event->dtStart().date().daysTo( event->dtEnd().date() );
547 int i; 547 int i;
548 for ( i = 0; i <= extraDays; i++ ) { 548 for ( i = 0; i <= extraDays; i++ ) {
549 if ( event->recursOn( qd.addDays( -i ) ) ) { 549 if ( event->recursOn( qd.addDays( -i ) ) ) {
550 eventList.append( event ); 550 eventList.append( event );
551 break; 551 break;
552 } 552 }
553 } 553 }
554 } else { 554 } else {
555 if ( event->recursOn( qd ) ) 555 if ( event->recursOn( qd ) )
556 eventList.append( event ); 556 eventList.append( event );
557 } 557 }
558 } else { 558 } else {
559 if ( event->dtStart().date() <= qd && event->dtEnd().date() >= qd ) { 559 if ( event->dtStart().date() <= qd && event->dtEnd().date() >= qd ) {
560 eventList.append( event ); 560 eventList.append( event );
561 } 561 }
562 } 562 }
563 } 563 }
564 564
565 if ( !sorted ) { 565 if ( !sorted ) {
566 return eventList; 566 return eventList;
567 } 567 }
568 568
569 // kdDebug(5800) << "Sorting events for date\n" << endl; 569 // kdDebug(5800) << "Sorting events for date\n" << endl;
570 // now, we have to sort it based on dtStart.time() 570 // now, we have to sort it based on dtStart.time()
571 QPtrList<Event> eventListSorted; 571 QPtrList<Event> eventListSorted;
572 Event *sortEvent; 572 Event *sortEvent;
573 for ( event = eventList.first(); event; event = eventList.next() ) { 573 for ( event = eventList.first(); event; event = eventList.next() ) {
574 sortEvent = eventListSorted.first(); 574 sortEvent = eventListSorted.first();
575 int i = 0; 575 int i = 0;
576 while ( sortEvent && event->dtStart().time()>=sortEvent->dtStart().time() ) 576 while ( sortEvent && event->dtStart().time()>=sortEvent->dtStart().time() )
577 { 577 {
578 i++; 578 i++;
579 sortEvent = eventListSorted.next(); 579 sortEvent = eventListSorted.next();
580 } 580 }
581 eventListSorted.insert( i, event ); 581 eventListSorted.insert( i, event );
582 } 582 }
583 return eventListSorted; 583 return eventListSorted;
584} 584}
585 585
586 586
587QPtrList<Event> CalendarLocal::rawEvents( const QDate &start, const QDate &end, 587QPtrList<Event> CalendarLocal::rawEvents( const QDate &start, const QDate &end,
588 bool inclusive ) 588 bool inclusive )
589{ 589{
590 qDebug("CalendarLocal::rawEvents called ");
590 Event *event = 0; 591 Event *event = 0;
591 592
592 QPtrList<Event> eventList; 593 QPtrList<Event> eventList;
593 594
594 // Get non-recurring events 595 // Get non-recurring events
595 for( event = mEventList.first(); event; event = mEventList.next() ) { 596 for( event = mEventList.first(); event; event = mEventList.next() ) {
596 if ( event->doesRecur() ) { 597 if ( event->doesRecur() ) {
597 QDate rStart = event->dtStart().date(); 598 QDate rStart = event->dtStart().date();
598 bool found = false; 599 bool found = false;
599 if ( inclusive ) { 600 if ( inclusive ) {
600 if ( rStart >= start && rStart <= end ) { 601 if ( rStart >= start && rStart <= end ) {
601 // Start date of event is in range. Now check for end date. 602 // Start date of event is in range. Now check for end date.
602 // if duration is negative, event recurs forever, so do not include it. 603 // if duration is negative, event recurs forever, so do not include it.
603 if ( event->recurrence()->duration() == 0 ) { // End date set 604 if ( event->recurrence()->duration() == 0 ) { // End date set
604 QDate rEnd = event->recurrence()->endDate(); 605 QDate rEnd = event->recurrence()->endDate();
605 if ( rEnd >= start && rEnd <= end ) { // End date within range 606 if ( rEnd >= start && rEnd <= end ) { // End date within range
606 found = true; 607 found = true;
607 } 608 }
608 } else if ( event->recurrence()->duration() > 0 ) { // Duration set 609 } else if ( event->recurrence()->duration() > 0 ) { // Duration set
609 // TODO: Calculate end date from duration. Should be done in Event 610 // TODO: Calculate end date from duration. Should be done in Event
610 // For now exclude all events with a duration. 611 // For now exclude all events with a duration.
611 } 612 }
612 } 613 }
613 } else { 614 } else {
614 bool founOne; 615 bool founOne;
615 QDate next = event->getNextOccurence( start, &founOne ).date(); 616 QDate next = event->getNextOccurence( start, &founOne ).date();
616 if ( founOne ) { 617 if ( founOne ) {
617 if ( next <= end ) { 618 if ( next <= end ) {
618 found = true; 619 found = true;
619 } 620 }
620 } 621 }
621 622
622 /* 623 /*
623 // crap !!! 624 // crap !!!
624 if ( rStart <= end ) { // Start date not after range 625 if ( rStart <= end ) { // Start date not after range
625 if ( rStart >= start ) { // Start date within range 626 if ( rStart >= start ) { // Start date within range
626 found = true; 627 found = true;
627 } else if ( event->recurrence()->duration() == -1 ) { // Recurs forever 628 } else if ( event->recurrence()->duration() == -1 ) { // Recurs forever
628 found = true; 629 found = true;
629 } else if ( event->recurrence()->duration() == 0 ) { // End date set 630 } else if ( event->recurrence()->duration() == 0 ) { // End date set
630 QDate rEnd = event->recurrence()->endDate(); 631 QDate rEnd = event->recurrence()->endDate();
631 if ( rEnd >= start && rEnd <= end ) { // End date within range 632 if ( rEnd >= start && rEnd <= end ) { // End date within range
632 found = true; 633 found = true;
633 } 634 }
634 } else { // Duration set 635 } else { // Duration set
635 // TODO: Calculate end date from duration. Should be done in Event 636 // TODO: Calculate end date from duration. Should be done in Event
636 // For now include all events with a duration. 637 // For now include all events with a duration.
637 found = true; 638 found = true;
638 } 639 }
639 } 640 }
640 */ 641 */
641 642
642 } 643 }
643 644
644 if ( found ) eventList.append( event ); 645 if ( found ) eventList.append( event );
645 } else { 646 } else {
646 QDate s = event->dtStart().date(); 647 QDate s = event->dtStart().date();
647 QDate e = event->dtEnd().date(); 648 QDate e = event->dtEnd().date();
648 649
649 if ( inclusive ) { 650 if ( inclusive ) {
650 if ( s >= start && e <= end ) { 651 if ( s >= start && e <= end ) {
651 eventList.append( event ); 652 eventList.append( event );
652 } 653 }
653 } else { 654 } else {
654 if ( ( s >= start && s <= end ) || ( e >= start && e <= end ) ) { 655 if ( ( s >= start && s <= end ) || ( e >= start && e <= end ) ) {
655 eventList.append( event ); 656 eventList.append( event );
656 } 657 }
657 } 658 }
658 } 659 }
659 } 660 }
660 661
661 return eventList; 662 return eventList;
662} 663}
663 664
664QPtrList<Event> CalendarLocal::rawEventsForDate( const QDateTime &qdt ) 665QPtrList<Event> CalendarLocal::rawEventsForDate( const QDateTime &qdt )
665{ 666{
666 return rawEventsForDate( qdt.date() ); 667 return rawEventsForDate( qdt.date() );
667} 668}
668 669
669QPtrList<Event> CalendarLocal::rawEvents() 670QPtrList<Event> CalendarLocal::rawEvents()
670{ 671{
671 return mEventList; 672 return mEventList;
672} 673}
673 674
674bool CalendarLocal::addJournal(Journal *journal) 675bool CalendarLocal::addJournal(Journal *journal)
675{ 676{
676 if ( journal->dtStart().isValid()) 677 if ( journal->dtStart().isValid())
677 kdDebug(5800) << "Adding Journal on " << journal->dtStart().toString() << endl; 678 kdDebug(5800) << "Adding Journal on " << journal->dtStart().toString() << endl;
678 else 679 else
679 kdDebug(5800) << "Adding Journal without a DTSTART" << endl; 680 kdDebug(5800) << "Adding Journal without a DTSTART" << endl;
680 681
681 mJournalList.append(journal); 682 mJournalList.append(journal);
682 683
683 journal->registerObserver( this ); 684 journal->registerObserver( this );
684 685
685 setModified( true ); 686 setModified( true );
686 687
687 return true; 688 return true;
688} 689}
689 690
690void CalendarLocal::deleteJournal( Journal *journal ) 691void CalendarLocal::deleteJournal( Journal *journal )
691{ 692{
692 if ( mUndoIncidence ) delete mUndoIncidence; 693 if ( mUndoIncidence ) delete mUndoIncidence;
693 mUndoIncidence = journal->clone(); 694 mUndoIncidence = journal->clone();
694 mUndoIncidence->setSummary( mUndoIncidence->description().left(25)); 695 mUndoIncidence->setSummary( mUndoIncidence->description().left(25));
695 if ( mJournalList.removeRef(journal) ) { 696 if ( mJournalList.removeRef(journal) ) {
696 setModified( true ); 697 setModified( true );
697 } 698 }
698} 699}
699 700
700Journal *CalendarLocal::journal( const QDate &date ) 701Journal *CalendarLocal::journal( const QDate &date )
701{ 702{
702// kdDebug(5800) << "CalendarLocal::journal() " << date.toString() << endl; 703// kdDebug(5800) << "CalendarLocal::journal() " << date.toString() << endl;
703 704
704 for ( Journal *it = mJournalList.first(); it; it = mJournalList.next() ) 705 for ( Journal *it = mJournalList.first(); it; it = mJournalList.next() )
705 if ( it->dtStart().date() == date ) 706 if ( it->dtStart().date() == date )
706 return it; 707 return it;
707 708
708 return 0; 709 return 0;
709} 710}
710 711
711Journal *CalendarLocal::journal( const QString &uid ) 712Journal *CalendarLocal::journal( const QString &uid )
712{ 713{
713 for ( Journal *it = mJournalList.first(); it; it = mJournalList.next() ) 714 for ( Journal *it = mJournalList.first(); it; it = mJournalList.next() )
714 if ( it->uid() == uid ) 715 if ( it->uid() == uid )
715 return it; 716 return it;
716 717
717 return 0; 718 return 0;
718} 719}
719 720
720QPtrList<Journal> CalendarLocal::journals() 721QPtrList<Journal> CalendarLocal::journals()
721{ 722{
722 return mJournalList; 723 return mJournalList;
723} 724}
724 725
diff --git a/libkcal/incidence.cpp b/libkcal/incidence.cpp
index 28402ae..f9e1e9e 100644
--- a/libkcal/incidence.cpp
+++ b/libkcal/incidence.cpp
@@ -1,617 +1,616 @@
1/* 1/*
2 This file is part of libkcal. 2 This file is part of libkcal.
3 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org> 3 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org>
4 4
5 This library is free software; you can redistribute it and/or 5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Library General Public 6 modify it under the terms of the GNU Library General Public
7 License as published by the Free Software Foundation; either 7 License as published by the Free Software Foundation; either
8 version 2 of the License, or (at your option) any later version. 8 version 2 of the License, or (at your option) any later version.
9 9
10 This library is distributed in the hope that it will be useful, 10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Library General Public License for more details. 13 Library General Public License for more details.
14 14
15 You should have received a copy of the GNU Library General Public License 15 You should have received a copy of the GNU Library General Public License
16 along with this library; see the file COPYING.LIB. If not, write to 16 along with this library; see the file COPYING.LIB. If not, write to
17 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 17 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 Boston, MA 02111-1307, USA. 18 Boston, MA 02111-1307, USA.
19*/ 19*/
20 20
21#include <kglobal.h> 21#include <kglobal.h>
22#include <klocale.h> 22#include <klocale.h>
23#include <kdebug.h> 23#include <kdebug.h>
24 24
25#include "calformat.h" 25#include "calformat.h"
26 26
27#include "incidence.h" 27#include "incidence.h"
28#include "todo.h" 28#include "todo.h"
29 29
30using namespace KCal; 30using namespace KCal;
31 31
32Incidence::Incidence() : 32Incidence::Incidence() :
33 IncidenceBase(), 33 IncidenceBase(),
34 mRelatedTo(0), mSecrecy(SecrecyPublic), mPriority(3) 34 mRelatedTo(0), mSecrecy(SecrecyPublic), mPriority(3)
35{ 35{
36 mRecurrence = new Recurrence(this); 36 mRecurrence = new Recurrence(this);
37 mCancelled = false; 37 mCancelled = false;
38 recreate(); 38 recreate();
39 mHasStartDate = true; 39 mHasStartDate = true;
40 mAlarms.setAutoDelete(true); 40 mAlarms.setAutoDelete(true);
41 mAttachments.setAutoDelete(true); 41 mAttachments.setAutoDelete(true);
42} 42}
43 43
44Incidence::Incidence( const Incidence &i ) : IncidenceBase( i ) 44Incidence::Incidence( const Incidence &i ) : IncidenceBase( i )
45{ 45{
46// TODO: reenable attributes currently commented out. 46// TODO: reenable attributes currently commented out.
47 mRevision = i.mRevision; 47 mRevision = i.mRevision;
48 mCreated = i.mCreated; 48 mCreated = i.mCreated;
49 mDescription = i.mDescription; 49 mDescription = i.mDescription;
50 mSummary = i.mSummary; 50 mSummary = i.mSummary;
51 mCategories = i.mCategories; 51 mCategories = i.mCategories;
52// Incidence *mRelatedTo; Incidence *mRelatedTo; 52// Incidence *mRelatedTo; Incidence *mRelatedTo;
53 mRelatedTo = 0; 53 mRelatedTo = 0;
54 mRelatedToUid = i.mRelatedToUid; 54 mRelatedToUid = i.mRelatedToUid;
55// QPtrList<Incidence> mRelations; QPtrList<Incidence> mRelations; 55// QPtrList<Incidence> mRelations; QPtrList<Incidence> mRelations;
56 mExDates = i.mExDates; 56 mExDates = i.mExDates;
57 mAttachments = i.mAttachments; 57 mAttachments = i.mAttachments;
58 mResources = i.mResources; 58 mResources = i.mResources;
59 mSecrecy = i.mSecrecy; 59 mSecrecy = i.mSecrecy;
60 mPriority = i.mPriority; 60 mPriority = i.mPriority;
61 mLocation = i.mLocation; 61 mLocation = i.mLocation;
62 mCancelled = i.mCancelled; 62 mCancelled = i.mCancelled;
63 mHasStartDate = i.mHasStartDate; 63 mHasStartDate = i.mHasStartDate;
64 QPtrListIterator<Alarm> it( i.mAlarms ); 64 QPtrListIterator<Alarm> it( i.mAlarms );
65 const Alarm *a; 65 const Alarm *a;
66 while( (a = it.current()) ) { 66 while( (a = it.current()) ) {
67 Alarm *b = new Alarm( *a ); 67 Alarm *b = new Alarm( *a );
68 b->setParent( this ); 68 b->setParent( this );
69 mAlarms.append( b ); 69 mAlarms.append( b );
70 70
71 ++it; 71 ++it;
72 } 72 }
73 mAlarms.setAutoDelete(true); 73 mAlarms.setAutoDelete(true);
74 74
75 mRecurrence = new Recurrence( *(i.mRecurrence), this ); 75 mRecurrence = new Recurrence( *(i.mRecurrence), this );
76} 76}
77 77
78Incidence::~Incidence() 78Incidence::~Incidence()
79{ 79{
80 80
81 Incidence *ev; 81 Incidence *ev;
82 QPtrList<Incidence> Relations = relations(); 82 QPtrList<Incidence> Relations = relations();
83 for (ev=Relations.first();ev;ev=Relations.next()) { 83 for (ev=Relations.first();ev;ev=Relations.next()) {
84 if (ev->relatedTo() == this) ev->setRelatedTo(0); 84 if (ev->relatedTo() == this) ev->setRelatedTo(0);
85 } 85 }
86 if (relatedTo()) relatedTo()->removeRelation(this); 86 if (relatedTo()) relatedTo()->removeRelation(this);
87 delete mRecurrence; 87 delete mRecurrence;
88 88
89} 89}
90 90
91bool Incidence::cancelled() const 91bool Incidence::cancelled() const
92{ 92{
93 return mCancelled; 93 return mCancelled;
94} 94}
95void Incidence::setCancelled( bool b ) 95void Incidence::setCancelled( bool b )
96{ 96{
97 mCancelled = b; 97 mCancelled = b;
98 updated(); 98 updated();
99} 99}
100bool Incidence::hasStartDate() const 100bool Incidence::hasStartDate() const
101{ 101{
102 return mHasStartDate; 102 return mHasStartDate;
103} 103}
104 104
105void Incidence::setHasStartDate(bool f) 105void Incidence::setHasStartDate(bool f)
106{ 106{
107 if (mReadOnly) return; 107 if (mReadOnly) return;
108 mHasStartDate = f; 108 mHasStartDate = f;
109 updated(); 109 updated();
110} 110}
111 111
112// A string comparison that considers that null and empty are the same 112// A string comparison that considers that null and empty are the same
113static bool stringCompare( const QString& s1, const QString& s2 ) 113static bool stringCompare( const QString& s1, const QString& s2 )
114{ 114{
115 if ( s1.isEmpty() && s2.isEmpty() ) 115 if ( s1.isEmpty() && s2.isEmpty() )
116 return true; 116 return true;
117 return s1 == s2; 117 return s1 == s2;
118} 118}
119 119
120bool KCal::operator==( const Incidence& i1, const Incidence& i2 ) 120bool KCal::operator==( const Incidence& i1, const Incidence& i2 )
121{ 121{
122 122
123 if( i1.alarms().count() != i2.alarms().count() ) { 123 if( i1.alarms().count() != i2.alarms().count() ) {
124 return false; // no need to check further 124 return false; // no need to check further
125 } 125 }
126 if ( i1.alarms().count() > 0 ) { 126 if ( i1.alarms().count() > 0 ) {
127 if ( !( *(i1.alarms().first()) == *(i2.alarms().first())) ) 127 if ( !( *(i1.alarms().first()) == *(i2.alarms().first())) )
128 { 128 {
129 qDebug("alarm not equal "); 129 qDebug("alarm not equal ");
130 return false; 130 return false;
131 } 131 }
132 } 132 }
133#if 0 133#if 0
134 QPtrListIterator<Alarm> a1( i1.alarms() ); 134 QPtrListIterator<Alarm> a1( i1.alarms() );
135 QPtrListIterator<Alarm> a2( i2.alarms() ); 135 QPtrListIterator<Alarm> a2( i2.alarms() );
136 for( ; a1.current() && a2.current(); ++a1, ++a2 ) { 136 for( ; a1.current() && a2.current(); ++a1, ++a2 ) {
137 if( *a1.current() == *a2.current() ) { 137 if( *a1.current() == *a2.current() ) {
138 continue; 138 continue;
139 } 139 }
140 else { 140 else {
141 return false; 141 return false;
142 } 142 }
143 } 143 }
144#endif 144#endif
145 145
146 if ( ! operator==( (const IncidenceBase&)i1, (const IncidenceBase&)i2 ) ) 146 if ( ! operator==( (const IncidenceBase&)i1, (const IncidenceBase&)i2 ) )
147 return false; 147 return false;
148 if ( i1.hasStartDate() == i2.hasStartDate() ) { 148 if ( i1.hasStartDate() == i2.hasStartDate() ) {
149 if ( i1.hasStartDate() ) { 149 if ( i1.hasStartDate() ) {
150 if ( i1.dtStart() != i2.dtStart() ) 150 if ( i1.dtStart() != i2.dtStart() )
151 return false; 151 return false;
152 } 152 }
153 } else { 153 } else {
154 return false; 154 return false;
155 } 155 }
156 if (!( *i1.recurrence() == *i2.recurrence()) ) { 156 if (!( *i1.recurrence() == *i2.recurrence()) ) {
157 qDebug("recurrence is NOT equal "); 157 qDebug("recurrence is NOT equal ");
158 return false; 158 return false;
159 } 159 }
160 return 160 return
161 // i1.created() == i2.created() && 161 // i1.created() == i2.created() &&
162 stringCompare( i1.description(), i2.description() ) && 162 stringCompare( i1.description(), i2.description() ) &&
163 stringCompare( i1.summary(), i2.summary() ) && 163 stringCompare( i1.summary(), i2.summary() ) &&
164 i1.categories() == i2.categories() && 164 i1.categories() == i2.categories() &&
165 // no need to compare mRelatedTo 165 // no need to compare mRelatedTo
166 stringCompare( i1.relatedToUid(), i2.relatedToUid() ) && 166 stringCompare( i1.relatedToUid(), i2.relatedToUid() ) &&
167 // i1.relations() == i2.relations() && 167 // i1.relations() == i2.relations() &&
168 i1.exDates() == i2.exDates() && 168 i1.exDates() == i2.exDates() &&
169 i1.attachments() == i2.attachments() && 169 i1.attachments() == i2.attachments() &&
170 i1.resources() == i2.resources() && 170 i1.resources() == i2.resources() &&
171 i1.secrecy() == i2.secrecy() && 171 i1.secrecy() == i2.secrecy() &&
172 i1.priority() == i2.priority() && 172 i1.priority() == i2.priority() &&
173 stringCompare( i1.location(), i2.location() ); 173 stringCompare( i1.location(), i2.location() );
174} 174}
175 175
176Incidence* Incidence::recreateCloneException( QDate d ) 176Incidence* Incidence::recreateCloneException( QDate d )
177{ 177{
178 Incidence* newInc = clone(); 178 Incidence* newInc = clone();
179 newInc->recreate(); 179 newInc->recreate();
180 if ( doesRecur() ) { 180 if ( doesRecur() ) {
181 addExDate( d ); 181 addExDate( d );
182 newInc->recurrence()->unsetRecurs(); 182 newInc->recurrence()->unsetRecurs();
183 int len = dtStart().secsTo( ((Event*)this)->dtEnd()); 183 int len = dtStart().secsTo( ((Event*)this)->dtEnd());
184 QTime tim = dtStart().time(); 184 QTime tim = dtStart().time();
185 newInc->setDtStart( QDateTime(d, tim) ); 185 newInc->setDtStart( QDateTime(d, tim) );
186 ((Event*)newInc)->setDtEnd( newInc->dtStart().addSecs( len ) ); 186 ((Event*)newInc)->setDtEnd( newInc->dtStart().addSecs( len ) );
187 } 187 }
188 return newInc; 188 return newInc;
189} 189}
190 190
191void Incidence::recreate() 191void Incidence::recreate()
192{ 192{
193 setCreated(QDateTime::currentDateTime()); 193 setCreated(QDateTime::currentDateTime());
194 194
195 setUid(CalFormat::createUniqueId()); 195 setUid(CalFormat::createUniqueId());
196 196
197 setRevision(0); 197 setRevision(0);
198 setIDStr( ":" ); 198 setIDStr( ":" );
199 setLastModified(QDateTime::currentDateTime()); 199 setLastModified(QDateTime::currentDateTime());
200} 200}
201 201
202void Incidence::setReadOnly( bool readOnly ) 202void Incidence::setReadOnly( bool readOnly )
203{ 203{
204 IncidenceBase::setReadOnly( readOnly ); 204 IncidenceBase::setReadOnly( readOnly );
205 recurrence()->setRecurReadOnly( readOnly); 205 recurrence()->setRecurReadOnly( readOnly);
206} 206}
207 207
208void Incidence::setCreated(QDateTime created) 208void Incidence::setCreated(QDateTime created)
209{ 209{
210 if (mReadOnly) return; 210 if (mReadOnly) return;
211 mCreated = getEvenTime(created); 211 mCreated = getEvenTime(created);
212} 212}
213 213
214QDateTime Incidence::created() const 214QDateTime Incidence::created() const
215{ 215{
216 return mCreated; 216 return mCreated;
217} 217}
218 218
219void Incidence::setRevision(int rev) 219void Incidence::setRevision(int rev)
220{ 220{
221 if (mReadOnly) return; 221 if (mReadOnly) return;
222 mRevision = rev; 222 mRevision = rev;
223 223
224 updated(); 224 updated();
225} 225}
226 226
227int Incidence::revision() const 227int Incidence::revision() const
228{ 228{
229 return mRevision; 229 return mRevision;
230} 230}
231 231
232void Incidence::setDtStart(const QDateTime &dtStart) 232void Incidence::setDtStart(const QDateTime &dtStart)
233{ 233{
234 234
235 QDateTime dt = getEvenTime(dtStart); 235 QDateTime dt = getEvenTime(dtStart);
236 recurrence()->setRecurStart( dt); 236 recurrence()->setRecurStart( dt);
237 IncidenceBase::setDtStart( dt ); 237 IncidenceBase::setDtStart( dt );
238} 238}
239 239
240void Incidence::setDescription(const QString &description) 240void Incidence::setDescription(const QString &description)
241{ 241{
242 if (mReadOnly) return; 242 if (mReadOnly) return;
243 mDescription = description; 243 mDescription = description;
244 updated(); 244 updated();
245} 245}
246 246
247QString Incidence::description() const 247QString Incidence::description() const
248{ 248{
249 return mDescription; 249 return mDescription;
250} 250}
251 251
252 252
253void Incidence::setSummary(const QString &summary) 253void Incidence::setSummary(const QString &summary)
254{ 254{
255 if (mReadOnly) return; 255 if (mReadOnly) return;
256 mSummary = summary; 256 mSummary = summary;
257 updated(); 257 updated();
258} 258}
259 259
260QString Incidence::summary() const 260QString Incidence::summary() const
261{ 261{
262 return mSummary; 262 return mSummary;
263} 263}
264 264
265void Incidence::setCategories(const QStringList &categories) 265void Incidence::setCategories(const QStringList &categories)
266{ 266{
267 if (mReadOnly) return; 267 if (mReadOnly) return;
268 mCategories = categories; 268 mCategories = categories;
269 updated(); 269 updated();
270} 270}
271 271
272// TODO: remove setCategories(QString) function 272// TODO: remove setCategories(QString) function
273void Incidence::setCategories(const QString &catStr) 273void Incidence::setCategories(const QString &catStr)
274{ 274{
275 if (mReadOnly) return; 275 if (mReadOnly) return;
276 mCategories.clear(); 276 mCategories.clear();
277 277
278 if (catStr.isEmpty()) return; 278 if (catStr.isEmpty()) return;
279 279
280 mCategories = QStringList::split(",",catStr); 280 mCategories = QStringList::split(",",catStr);
281 281
282 QStringList::Iterator it; 282 QStringList::Iterator it;
283 for(it = mCategories.begin();it != mCategories.end(); ++it) { 283 for(it = mCategories.begin();it != mCategories.end(); ++it) {
284 *it = (*it).stripWhiteSpace(); 284 *it = (*it).stripWhiteSpace();
285 } 285 }
286 286
287 updated(); 287 updated();
288} 288}
289 289
290QStringList Incidence::categories() const 290QStringList Incidence::categories() const
291{ 291{
292 return mCategories; 292 return mCategories;
293} 293}
294 294
295QString Incidence::categoriesStr() 295QString Incidence::categoriesStr()
296{ 296{
297 return mCategories.join(","); 297 return mCategories.join(",");
298} 298}
299 299
300void Incidence::setRelatedToUid(const QString &relatedToUid) 300void Incidence::setRelatedToUid(const QString &relatedToUid)
301{ 301{
302 if (mReadOnly) return; 302 if (mReadOnly) return;
303 mRelatedToUid = relatedToUid; 303 mRelatedToUid = relatedToUid;
304} 304}
305 305
306QString Incidence::relatedToUid() const 306QString Incidence::relatedToUid() const
307{ 307{
308 return mRelatedToUid; 308 return mRelatedToUid;
309} 309}
310 310
311void Incidence::setRelatedTo(Incidence *relatedTo) 311void Incidence::setRelatedTo(Incidence *relatedTo)
312{ 312{
313 //qDebug("Incidence::setRelatedTo %d ", relatedTo); 313 //qDebug("Incidence::setRelatedTo %d ", relatedTo);
314 //qDebug("setRelatedTo(Incidence *relatedTo) %s %s", summary().latin1(), relatedTo->summary().latin1() ); 314 //qDebug("setRelatedTo(Incidence *relatedTo) %s %s", summary().latin1(), relatedTo->summary().latin1() );
315 if (mReadOnly || mRelatedTo == relatedTo) return; 315 if (mReadOnly || mRelatedTo == relatedTo) return;
316 if(mRelatedTo) { 316 if(mRelatedTo) {
317 // updated(); 317 // updated();
318 mRelatedTo->removeRelation(this); 318 mRelatedTo->removeRelation(this);
319 } 319 }
320 mRelatedTo = relatedTo; 320 mRelatedTo = relatedTo;
321 if (mRelatedTo) mRelatedTo->addRelation(this); 321 if (mRelatedTo) mRelatedTo->addRelation(this);
322} 322}
323 323
324Incidence *Incidence::relatedTo() const 324Incidence *Incidence::relatedTo() const
325{ 325{
326 return mRelatedTo; 326 return mRelatedTo;
327} 327}
328 328
329QPtrList<Incidence> Incidence::relations() const 329QPtrList<Incidence> Incidence::relations() const
330{ 330{
331 return mRelations; 331 return mRelations;
332} 332}
333 333
334void Incidence::addRelation(Incidence *event) 334void Incidence::addRelation(Incidence *event)
335{ 335{
336 if( mRelations.findRef( event ) == -1 ) { 336 if( mRelations.findRef( event ) == -1 ) {
337 mRelations.append(event); 337 mRelations.append(event);
338 //updated(); 338 //updated();
339 } 339 }
340} 340}
341 341
342void Incidence::removeRelation(Incidence *event) 342void Incidence::removeRelation(Incidence *event)
343{ 343{
344 344
345 mRelations.removeRef(event); 345 mRelations.removeRef(event);
346 346
347// if (event->getRelatedTo() == this) event->setRelatedTo(0); 347// if (event->getRelatedTo() == this) event->setRelatedTo(0);
348} 348}
349 349
350bool Incidence::recursOn(const QDate &qd) const 350bool Incidence::recursOn(const QDate &qd) const
351{ 351{
352 if (recurrence()->recursOnPure(qd) && !isException(qd)) return true; 352 if (recurrence()->recursOnPure(qd) && !isException(qd)) return true;
353 else return false; 353 else return false;
354} 354}
355 355
356void Incidence::setExDates(const DateList &exDates) 356void Incidence::setExDates(const DateList &exDates)
357{ 357{
358 if (mReadOnly) return; 358 if (mReadOnly) return;
359 mExDates = exDates; 359 mExDates = exDates;
360 360
361 recurrence()->setRecurExDatesCount(mExDates.count()); 361 recurrence()->setRecurExDatesCount(mExDates.count());
362 362
363 updated(); 363 updated();
364} 364}
365 365
366void Incidence::addExDate(const QDate &date) 366void Incidence::addExDate(const QDate &date)
367{ 367{
368 if (mReadOnly) return; 368 if (mReadOnly) return;
369 mExDates.append(date); 369 mExDates.append(date);
370 370
371 recurrence()->setRecurExDatesCount(mExDates.count()); 371 recurrence()->setRecurExDatesCount(mExDates.count());
372 372
373 updated(); 373 updated();
374} 374}
375 375
376DateList Incidence::exDates() const 376DateList Incidence::exDates() const
377{ 377{
378 return mExDates; 378 return mExDates;
379} 379}
380 380
381bool Incidence::isException(const QDate &date) const 381bool Incidence::isException(const QDate &date) const
382{ 382{
383 DateList::ConstIterator it; 383 DateList::ConstIterator it;
384 for( it = mExDates.begin(); it != mExDates.end(); ++it ) { 384 for( it = mExDates.begin(); it != mExDates.end(); ++it ) {
385 if ( (*it) == date ) { 385 if ( (*it) == date ) {
386 return true; 386 return true;
387 } 387 }
388 } 388 }
389 389
390 return false; 390 return false;
391} 391}
392 392
393void Incidence::addAttachment(Attachment *attachment) 393void Incidence::addAttachment(Attachment *attachment)
394{ 394{
395 if (mReadOnly || !attachment) return; 395 if (mReadOnly || !attachment) return;
396 mAttachments.append(attachment); 396 mAttachments.append(attachment);
397 updated(); 397 updated();
398} 398}
399 399
400void Incidence::deleteAttachment(Attachment *attachment) 400void Incidence::deleteAttachment(Attachment *attachment)
401{ 401{
402 mAttachments.removeRef(attachment); 402 mAttachments.removeRef(attachment);
403} 403}
404 404
405void Incidence::deleteAttachments(const QString& mime) 405void Incidence::deleteAttachments(const QString& mime)
406{ 406{
407 Attachment *at = mAttachments.first(); 407 Attachment *at = mAttachments.first();
408 while (at) { 408 while (at) {
409 if (at->mimeType() == mime) 409 if (at->mimeType() == mime)
410 mAttachments.remove(); 410 mAttachments.remove();
411 else 411 else
412 at = mAttachments.next(); 412 at = mAttachments.next();
413 } 413 }
414} 414}
415 415
416QPtrList<Attachment> Incidence::attachments() const 416QPtrList<Attachment> Incidence::attachments() const
417{ 417{
418 return mAttachments; 418 return mAttachments;
419} 419}
420 420
421QPtrList<Attachment> Incidence::attachments(const QString& mime) const 421QPtrList<Attachment> Incidence::attachments(const QString& mime) const
422{ 422{
423 QPtrList<Attachment> attachments; 423 QPtrList<Attachment> attachments;
424 QPtrListIterator<Attachment> it( mAttachments ); 424 QPtrListIterator<Attachment> it( mAttachments );
425 Attachment *at; 425 Attachment *at;
426 while ( (at = it.current()) ) { 426 while ( (at = it.current()) ) {
427 if (at->mimeType() == mime) 427 if (at->mimeType() == mime)
428 attachments.append(at); 428 attachments.append(at);
429 ++it; 429 ++it;
430 } 430 }
431 431
432 return attachments; 432 return attachments;
433} 433}
434 434
435void Incidence::setResources(const QStringList &resources) 435void Incidence::setResources(const QStringList &resources)
436{ 436{
437 if (mReadOnly) return; 437 if (mReadOnly) return;
438 mResources = resources; 438 mResources = resources;
439 updated(); 439 updated();
440} 440}
441 441
442QStringList Incidence::resources() const 442QStringList Incidence::resources() const
443{ 443{
444 return mResources; 444 return mResources;
445} 445}
446 446
447 447
448void Incidence::setPriority(int priority) 448void Incidence::setPriority(int priority)
449{ 449{
450 if (mReadOnly) return; 450 if (mReadOnly) return;
451 mPriority = priority; 451 mPriority = priority;
452 updated(); 452 updated();
453} 453}
454 454
455int Incidence::priority() const 455int Incidence::priority() const
456{ 456{
457 return mPriority; 457 return mPriority;
458} 458}
459 459
460void Incidence::setSecrecy(int sec) 460void Incidence::setSecrecy(int sec)
461{ 461{
462 if (mReadOnly) return; 462 if (mReadOnly) return;
463 mSecrecy = sec; 463 mSecrecy = sec;
464 updated(); 464 updated();
465} 465}
466 466
467int Incidence::secrecy() const 467int Incidence::secrecy() const
468{ 468{
469 return mSecrecy; 469 return mSecrecy;
470} 470}
471 471
472QString Incidence::secrecyStr() const 472QString Incidence::secrecyStr() const
473{ 473{
474 return secrecyName(mSecrecy); 474 return secrecyName(mSecrecy);
475} 475}
476 476
477QString Incidence::secrecyName(int secrecy) 477QString Incidence::secrecyName(int secrecy)
478{ 478{
479 switch (secrecy) { 479 switch (secrecy) {
480 case SecrecyPublic: 480 case SecrecyPublic:
481 return i18n("Public"); 481 return i18n("Public");
482 break; 482 break;
483 case SecrecyPrivate: 483 case SecrecyPrivate:
484 return i18n("Private"); 484 return i18n("Private");
485 break; 485 break;
486 case SecrecyConfidential: 486 case SecrecyConfidential:
487 return i18n("Confidential"); 487 return i18n("Confidential");
488 break; 488 break;
489 default: 489 default:
490 return i18n("Undefined"); 490 return i18n("Undefined");
491 break; 491 break;
492 } 492 }
493} 493}
494 494
495QStringList Incidence::secrecyList() 495QStringList Incidence::secrecyList()
496{ 496{
497 QStringList list; 497 QStringList list;
498 list << secrecyName(SecrecyPublic); 498 list << secrecyName(SecrecyPublic);
499 list << secrecyName(SecrecyPrivate); 499 list << secrecyName(SecrecyPrivate);
500 list << secrecyName(SecrecyConfidential); 500 list << secrecyName(SecrecyConfidential);
501 501
502 return list; 502 return list;
503} 503}
504 504
505 505
506QPtrList<Alarm> Incidence::alarms() const 506QPtrList<Alarm> Incidence::alarms() const
507{ 507{
508 return mAlarms; 508 return mAlarms;
509} 509}
510 510
511Alarm* Incidence::newAlarm() 511Alarm* Incidence::newAlarm()
512{ 512{
513 Alarm* alarm = new Alarm(this); 513 Alarm* alarm = new Alarm(this);
514 mAlarms.append(alarm); 514 mAlarms.append(alarm);
515// updated(); 515// updated();
516 return alarm; 516 return alarm;
517} 517}
518 518
519void Incidence::addAlarm(Alarm *alarm) 519void Incidence::addAlarm(Alarm *alarm)
520{ 520{
521 mAlarms.append(alarm); 521 mAlarms.append(alarm);
522 updated(); 522 updated();
523} 523}
524 524
525void Incidence::removeAlarm(Alarm *alarm) 525void Incidence::removeAlarm(Alarm *alarm)
526{ 526{
527 mAlarms.removeRef(alarm); 527 mAlarms.removeRef(alarm);
528 updated(); 528 updated();
529} 529}
530 530
531void Incidence::clearAlarms() 531void Incidence::clearAlarms()
532{ 532{
533 mAlarms.clear(); 533 mAlarms.clear();
534 updated(); 534 updated();
535} 535}
536 536
537bool Incidence::isAlarmEnabled() const 537bool Incidence::isAlarmEnabled() const
538{ 538{
539 Alarm* alarm; 539 Alarm* alarm;
540 for (QPtrListIterator<Alarm> it(mAlarms); (alarm = it.current()) != 0; ++it) { 540 for (QPtrListIterator<Alarm> it(mAlarms); (alarm = it.current()) != 0; ++it) {
541 if (alarm->enabled()) 541 if (alarm->enabled())
542 return true; 542 return true;
543 } 543 }
544 return false; 544 return false;
545} 545}
546 546
547Recurrence *Incidence::recurrence() const 547Recurrence *Incidence::recurrence() const
548{ 548{
549 return mRecurrence; 549 return mRecurrence;
550} 550}
551void Incidence::setRecurrence( Recurrence * r) 551void Incidence::setRecurrence( Recurrence * r)
552{ 552{
553 delete mRecurrence; 553 delete mRecurrence;
554 mRecurrence = r; 554 mRecurrence = r;
555} 555}
556 556
557void Incidence::setLocation(const QString &location) 557void Incidence::setLocation(const QString &location)
558{ 558{
559 if (mReadOnly) return; 559 if (mReadOnly) return;
560 mLocation = location; 560 mLocation = location;
561 updated(); 561 updated();
562} 562}
563 563
564QString Incidence::location() const 564QString Incidence::location() const
565{ 565{
566 return mLocation; 566 return mLocation;
567} 567}
568 568
569ushort Incidence::doesRecur() const 569ushort Incidence::doesRecur() const
570{ 570{
571 if ( mRecurrence ) return mRecurrence->doesRecur(); 571 if ( mRecurrence ) return mRecurrence->doesRecur();
572 else return Recurrence::rNone; 572 else return Recurrence::rNone;
573} 573}
574 574
575QDateTime Incidence::getNextOccurence( const QDateTime& dt, bool* ok ) const 575QDateTime Incidence::getNextOccurence( const QDateTime& dt, bool* ok ) const
576{ 576{
577 QDateTime incidenceStart = dt; 577 QDateTime incidenceStart = dt;
578 *ok = false; 578 *ok = false;
579 if ( doesRecur() ) { 579 if ( doesRecur() ) {
580 bool last; 580 bool last;
581 recurrence()->getPreviousDateTime( incidenceStart , &last ); 581 recurrence()->getPreviousDateTime( incidenceStart , &last );
582 int count = 0; 582 int count = 0;
583 if ( !last ) { 583 if ( !last ) {
584 while ( !last ) { 584 while ( !last ) {
585 ++count; 585 ++count;
586 incidenceStart = recurrence()->getNextDateTime( incidenceStart, &last ); 586 incidenceStart = recurrence()->getNextDateTime( incidenceStart, &last );
587 if ( recursOn( incidenceStart.date() ) ) { 587 if ( recursOn( incidenceStart.date() ) ) {
588 last = true; // exit while llop 588 last = true; // exit while llop
589 } else { 589 } else {
590 if ( last ) { // no alarm on last recurrence 590 if ( last ) { // no alarm on last recurrence
591 return QDateTime (); 591 return QDateTime ();
592 } 592 }
593 int year = incidenceStart.date().year(); 593 int year = incidenceStart.date().year();
594 // workaround for bug in recurrence 594 // workaround for bug in recurrence
595 if ( count == 100 || year < 1980 || year > 5000 ) { 595 if ( count == 100 || year < 1000 || year > 5000 ) {
596 return QDateTime (); 596 return QDateTime ();
597 } 597 }
598 incidenceStart = incidenceStart.addSecs( 1 ); 598 incidenceStart = incidenceStart.addSecs( 1 );
599 } 599 }
600 } 600 }
601 } else { 601 } else {
602 return QDateTime (); 602 return QDateTime ();
603 } 603 }
604 } else { 604 } else {
605 if ( hasStartDate () ) { 605 if ( hasStartDate () ) {
606 incidenceStart = dtStart(); 606 incidenceStart = dtStart();
607 } 607 }
608 if ( type() =="Todo" ) { 608 if ( type() =="Todo" ) {
609 if ( ((Todo*)this)->hasDueDate() ) 609 if ( ((Todo*)this)->hasDueDate() )
610 incidenceStart = ((Todo*)this)->dtDue(); 610 incidenceStart = ((Todo*)this)->dtDue();
611
612 } 611 }
613 } 612 }
614 if ( incidenceStart > dt ) 613 if ( incidenceStart > dt )
615 *ok = true; 614 *ok = true;
616 return incidenceStart; 615 return incidenceStart;
617} 616}