summaryrefslogtreecommitdiffabout
path: root/libkcal
authorzautrix <zautrix>2005-02-13 17:05:02 (UTC)
committer zautrix <zautrix>2005-02-13 17:05:02 (UTC)
commit293271fe9e6a9061da329183f8f488d79580f7da (patch) (unidiff)
tree3a0234eabdf58440a484e960b5eef912a63d0056 /libkcal
parent0a33f91e166747406ca2ccb5819881feeecfdb40 (diff)
downloadkdepimpi-293271fe9e6a9061da329183f8f488d79580f7da.zip
kdepimpi-293271fe9e6a9061da329183f8f488d79580f7da.tar.gz
kdepimpi-293271fe9e6a9061da329183f8f488d79580f7da.tar.bz2
todo rec fixes
Diffstat (limited to 'libkcal') (more/less context) (ignore whitespace changes)
-rw-r--r--libkcal/incidence.cpp9
-rw-r--r--libkcal/incidence.h5
-rw-r--r--libkcal/incidencebase.cpp1
-rw-r--r--libkcal/incidencebase.h4
-rw-r--r--libkcal/todo.cpp51
-rw-r--r--libkcal/todo.h2
6 files changed, 64 insertions, 8 deletions
diff --git a/libkcal/incidence.cpp b/libkcal/incidence.cpp
index dbc159c..0684af2 100644
--- a/libkcal/incidence.cpp
+++ b/libkcal/incidence.cpp
@@ -554,96 +554,105 @@ void Incidence::addAlarm(Alarm *alarm)
554 mAlarms.append(alarm); 554 mAlarms.append(alarm);
555 updated(); 555 updated();
556} 556}
557 557
558void Incidence::removeAlarm(Alarm *alarm) 558void Incidence::removeAlarm(Alarm *alarm)
559{ 559{
560 mAlarms.removeRef(alarm); 560 mAlarms.removeRef(alarm);
561 updated(); 561 updated();
562} 562}
563 563
564void Incidence::clearAlarms() 564void Incidence::clearAlarms()
565{ 565{
566 mAlarms.clear(); 566 mAlarms.clear();
567 updated(); 567 updated();
568} 568}
569 569
570bool Incidence::isAlarmEnabled() const 570bool Incidence::isAlarmEnabled() const
571{ 571{
572 Alarm* alarm; 572 Alarm* alarm;
573 for (QPtrListIterator<Alarm> it(mAlarms); (alarm = it.current()) != 0; ++it) { 573 for (QPtrListIterator<Alarm> it(mAlarms); (alarm = it.current()) != 0; ++it) {
574 if (alarm->enabled()) 574 if (alarm->enabled())
575 return true; 575 return true;
576 } 576 }
577 return false; 577 return false;
578} 578}
579 579
580Recurrence *Incidence::recurrence() const 580Recurrence *Incidence::recurrence() const
581{ 581{
582 return mRecurrence; 582 return mRecurrence;
583} 583}
584void Incidence::setRecurrence( Recurrence * r) 584void Incidence::setRecurrence( Recurrence * r)
585{ 585{
586 delete mRecurrence; 586 delete mRecurrence;
587 mRecurrence = r; 587 mRecurrence = r;
588} 588}
589 589
590void Incidence::setLocation(const QString &location) 590void Incidence::setLocation(const QString &location)
591{ 591{
592 if (mReadOnly) return; 592 if (mReadOnly) return;
593 mLocation = location; 593 mLocation = location;
594 updated(); 594 updated();
595} 595}
596 596
597QString Incidence::location() const 597QString Incidence::location() const
598{ 598{
599 return mLocation; 599 return mLocation;
600} 600}
601 601
602ushort Incidence::doesRecur() const 602ushort Incidence::doesRecur() const
603{ 603{
604 if ( mRecurrence ) return mRecurrence->doesRecur(); 604 if ( mRecurrence ) return mRecurrence->doesRecur();
605 else return Recurrence::rNone; 605 else return Recurrence::rNone;
606} 606}
607 607
608QDateTime Incidence::getNextOccurence( const QDateTime& dt, bool* ok ) const 608QDateTime Incidence::getNextOccurence( const QDateTime& dt, bool* ok ) const
609{ 609{
610 QDateTime incidenceStart = dt; 610 QDateTime incidenceStart = dt;
611 *ok = false; 611 *ok = false;
612 if ( doesRecur() ) { 612 if ( doesRecur() ) {
613 bool last; 613 bool last;
614 recurrence()->getPreviousDateTime( incidenceStart , &last ); 614 recurrence()->getPreviousDateTime( incidenceStart , &last );
615 int count = 0; 615 int count = 0;
616 if ( !last ) { 616 if ( !last ) {
617 while ( !last ) { 617 while ( !last ) {
618 ++count; 618 ++count;
619 incidenceStart = recurrence()->getNextDateTime( incidenceStart, &last ); 619 incidenceStart = recurrence()->getNextDateTime( incidenceStart, &last );
620 if ( recursOn( incidenceStart.date() ) ) { 620 if ( recursOn( incidenceStart.date() ) ) {
621 last = true; // exit while llop 621 last = true; // exit while llop
622 } else { 622 } else {
623 if ( last ) { // no alarm on last recurrence 623 if ( last ) { // no alarm on last recurrence
624 return QDateTime (); 624 return QDateTime ();
625 } 625 }
626 int year = incidenceStart.date().year(); 626 int year = incidenceStart.date().year();
627 // workaround for bug in recurrence 627 // workaround for bug in recurrence
628 if ( count == 100 || year < 1000 || year > 5000 ) { 628 if ( count == 100 || year < 1000 || year > 5000 ) {
629 return QDateTime (); 629 return QDateTime ();
630 } 630 }
631 incidenceStart = incidenceStart.addSecs( 1 ); 631 incidenceStart = incidenceStart.addSecs( 1 );
632 } 632 }
633 } 633 }
634 } else { 634 } else {
635 return QDateTime (); 635 return QDateTime ();
636 } 636 }
637 } else { 637 } else {
638 if ( hasStartDate () ) { 638 if ( hasStartDate () ) {
639 incidenceStart = dtStart(); 639 incidenceStart = dtStart();
640 } 640 }
641 if ( type() =="Todo" ) { 641 if ( type() =="Todo" ) {
642 if ( ((Todo*)this)->hasDueDate() ) 642 if ( ((Todo*)this)->hasDueDate() )
643 incidenceStart = ((Todo*)this)->dtDue(); 643 incidenceStart = ((Todo*)this)->dtDue();
644 } 644 }
645 } 645 }
646 if ( incidenceStart > dt ) 646 if ( incidenceStart > dt )
647 *ok = true; 647 *ok = true;
648 return incidenceStart; 648 return incidenceStart;
649} 649}
650QDateTime Incidence::dtStart() const
651{
652 if ( doesRecur() ) {
653 if ( type() == "Todo" ) {
654 ((Todo*)this)->checkSetCompletedFalse();
655 }
656 }
657 return mDtStart;
658}
diff --git a/libkcal/incidence.h b/libkcal/incidence.h
index 38d2aaa..0ae9656 100644
--- a/libkcal/incidence.h
+++ b/libkcal/incidence.h
@@ -176,133 +176,134 @@ class Incidence : public IncidenceBase
176 void addRelation(Incidence *); 176 void addRelation(Incidence *);
177 /** Remove event that is related to this event */ 177 /** Remove event that is related to this event */
178 void removeRelation(Incidence *); 178 void removeRelation(Incidence *);
179 179
180 /** returns the list of dates which are exceptions to the recurrence rule */ 180 /** returns the list of dates which are exceptions to the recurrence rule */
181 DateList exDates() const; 181 DateList exDates() const;
182 /** sets the list of dates which are exceptions to the recurrence rule */ 182 /** sets the list of dates which are exceptions to the recurrence rule */
183 void setExDates(const DateList &_exDates); 183 void setExDates(const DateList &_exDates);
184 void setExDates(const char *dates); 184 void setExDates(const char *dates);
185 /** Add a date to the list of exceptions of the recurrence rule. */ 185 /** Add a date to the list of exceptions of the recurrence rule. */
186 void addExDate(const QDate &date); 186 void addExDate(const QDate &date);
187 187
188 /** returns true if there is an exception for this date in the recurrence 188 /** returns true if there is an exception for this date in the recurrence
189 rule set, or false otherwise. */ 189 rule set, or false otherwise. */
190 bool isException(const QDate &qd) const; 190 bool isException(const QDate &qd) const;
191 191
192 /** add attachment to this event */ 192 /** add attachment to this event */
193 void addAttachment(Attachment *attachment); 193 void addAttachment(Attachment *attachment);
194 /** remove and delete a specific attachment */ 194 /** remove and delete a specific attachment */
195 void deleteAttachment(Attachment *attachment); 195 void deleteAttachment(Attachment *attachment);
196 /** remove and delete all attachments with this mime type */ 196 /** remove and delete all attachments with this mime type */
197 void deleteAttachments(const QString& mime); 197 void deleteAttachments(const QString& mime);
198 /** return list of all associated attachments */ 198 /** return list of all associated attachments */
199 QPtrList<Attachment> attachments() const; 199 QPtrList<Attachment> attachments() const;
200 /** find a list of attachments with this mime type */ 200 /** find a list of attachments with this mime type */
201 QPtrList<Attachment> attachments(const QString& mime) const; 201 QPtrList<Attachment> attachments(const QString& mime) const;
202 202
203 /** sets the event's status the value specified. See the enumeration 203 /** sets the event's status the value specified. See the enumeration
204 * above for possible values. */ 204 * above for possible values. */
205 void setSecrecy(int); 205 void setSecrecy(int);
206 /** return the event's secrecy. */ 206 /** return the event's secrecy. */
207 int secrecy() const; 207 int secrecy() const;
208 /** return the event's secrecy in string format. */ 208 /** return the event's secrecy in string format. */
209 QString secrecyStr() const; 209 QString secrecyStr() const;
210 /** return list of all availbale secrecy classes */ 210 /** return list of all availbale secrecy classes */
211 static QStringList secrecyList(); 211 static QStringList secrecyList();
212 /** return human-readable name of secrecy class */ 212 /** return human-readable name of secrecy class */
213 static QString secrecyName(int); 213 static QString secrecyName(int);
214 214
215 /** returns TRUE if the date specified is one on which the event will 215 /** returns TRUE if the date specified is one on which the event will
216 * recur. */ 216 * recur. */
217 bool recursOn(const QDate &qd) const; 217 bool recursOn(const QDate &qd) const;
218 218
219 // VEVENT and VTODO, but not VJOURNAL (move to EventBase class?): 219 // VEVENT and VTODO, but not VJOURNAL (move to EventBase class?):
220 220
221 /** set resources used, such as Office, Car, etc. */ 221 /** set resources used, such as Office, Car, etc. */
222 void setResources(const QStringList &resources); 222 void setResources(const QStringList &resources);
223 /** return list of current resources */ 223 /** return list of current resources */
224 QStringList resources() const; 224 QStringList resources() const;
225 225
226 /** set the event's priority, 0 is undefined, 1 highest (decreasing order) */ 226 /** set the event's priority, 0 is undefined, 1 highest (decreasing order) */
227 void setPriority(int priority); 227 void setPriority(int priority);
228 /** get the event's priority */ 228 /** get the event's priority */
229 int priority() const; 229 int priority() const;
230 230
231 /** All alarms that are associated with this incidence */ 231 /** All alarms that are associated with this incidence */
232 QPtrList<Alarm> alarms() const; 232 QPtrList<Alarm> alarms() const;
233 /** Create a new alarm which is associated with this incidence */ 233 /** Create a new alarm which is associated with this incidence */
234 Alarm* newAlarm(); 234 Alarm* newAlarm();
235 /** Add an alarm which is associated with this incidence */ 235 /** Add an alarm which is associated with this incidence */
236 void addAlarm(Alarm*); 236 void addAlarm(Alarm*);
237 /** Remove an alarm that is associated with this incidence */ 237 /** Remove an alarm that is associated with this incidence */
238 void removeAlarm(Alarm*); 238 void removeAlarm(Alarm*);
239 /** Remove all alarms that are associated with this incidence */ 239 /** Remove all alarms that are associated with this incidence */
240 void clearAlarms(); 240 void clearAlarms();
241 /** return whether any alarm associated with this incidence is enabled */ 241 /** return whether any alarm associated with this incidence is enabled */
242 bool isAlarmEnabled() const; 242 bool isAlarmEnabled() const;
243 243
244 /** 244 /**
245 Return the recurrence rule associated with this incidence. If there is 245 Return the recurrence rule associated with this incidence. If there is
246 none, returns an appropriate (non-0) object. 246 none, returns an appropriate (non-0) object.
247 */ 247 */
248 Recurrence *recurrence() const; 248 Recurrence *recurrence() const;
249 void setRecurrence(Recurrence * r); 249 void setRecurrence(Recurrence * r);
250 /** 250 /**
251 Forward to Recurrence::doesRecur(). 251 Forward to Recurrence::doesRecur().
252 */ 252 */
253 ushort doesRecur() const; 253 ushort doesRecur() const;
254 254
255 /** set the event's/todo's location. Do _not_ use it with journal */ 255 /** set the event's/todo's location. Do _not_ use it with journal */
256 void setLocation(const QString &location); 256 void setLocation(const QString &location);
257 /** return the event's/todo's location. Do _not_ use it with journal */ 257 /** return the event's/todo's location. Do _not_ use it with journal */
258 QString location() const; 258 QString location() const;
259 /** returns TRUE or FALSE depending on whether the todo has a start date */ 259 /** returns TRUE or FALSE depending on whether the todo has a start date */
260 bool hasStartDate() const; 260 bool hasStartDate() const;
261 /** sets the event's hasStartDate value. */ 261 /** sets the event's hasStartDate value. */
262 void setHasStartDate(bool f); 262 void setHasStartDate(bool f);
263 QDateTime getNextOccurence( const QDateTime& dt, bool* yes ) const; 263 QDateTime getNextOccurence( const QDateTime& dt, bool* yes ) const;
264 bool cancelled() const; 264 bool cancelled() const;
265 void setCancelled( bool b ); 265 void setCancelled( bool b );
266 266
267 bool hasRecurrenceID() const; 267 bool hasRecurrenceID() const;
268 void setHasRecurrenceID( bool b ); 268 void setHasRecurrenceID( bool b );
269 269
270 void setRecurrenceID(QDateTime); 270 void setRecurrenceID(QDateTime);
271 QDateTime recurrenceID () const; 271 QDateTime recurrenceID () const;
272 QDateTime dtStart() const;
272 273
273 274
274protected: 275protected:
275 QPtrList<Alarm> mAlarms; 276 QPtrList<Alarm> mAlarms;
276 QPtrList<Incidence> mRelations; 277 QPtrList<Incidence> mRelations;
278 QDateTime mRecurrenceID;
279 bool mHasRecurrenceID;
277 private: 280 private:
278 int mRevision; 281 int mRevision;
279 bool mCancelled; 282 bool mCancelled;
280 283
281 // base components of jounal, event and todo 284 // base components of jounal, event and todo
282 QDateTime mRecurrenceID;
283 bool mHasRecurrenceID;
284 QDateTime mCreated; 285 QDateTime mCreated;
285 QString mDescription; 286 QString mDescription;
286 QString mSummary; 287 QString mSummary;
287 QStringList mCategories; 288 QStringList mCategories;
288 Incidence *mRelatedTo; 289 Incidence *mRelatedTo;
289 QString mRelatedToUid; 290 QString mRelatedToUid;
290 DateList mExDates; 291 DateList mExDates;
291 QPtrList<Attachment> mAttachments; 292 QPtrList<Attachment> mAttachments;
292 QStringList mResources; 293 QStringList mResources;
293 bool mHasStartDate; // if todo has associated start date 294 bool mHasStartDate; // if todo has associated start date
294 295
295 int mSecrecy; 296 int mSecrecy;
296 int mPriority; // 1 = highest, 2 = less, etc. 297 int mPriority; // 1 = highest, 2 = less, etc.
297 298
298 //QPtrList<Alarm> mAlarms; 299 //QPtrList<Alarm> mAlarms;
299 Recurrence *mRecurrence; 300 Recurrence *mRecurrence;
300 301
301 QString mLocation; 302 QString mLocation;
302}; 303};
303 304
304bool operator==( const Incidence&, const Incidence& ); 305bool operator==( const Incidence&, const Incidence& );
305 306
306} 307}
307 308
308#endif 309#endif
diff --git a/libkcal/incidencebase.cpp b/libkcal/incidencebase.cpp
index 7525a4a..51f2e9d 100644
--- a/libkcal/incidencebase.cpp
+++ b/libkcal/incidencebase.cpp
@@ -86,192 +86,193 @@ bool KCal::operator==( const IncidenceBase& i1, const IncidenceBase& i2 )
86 if ( i1.attendees().count() > 0 ) { 86 if ( i1.attendees().count() > 0 ) {
87 Attendee * a1 = i1.attendees().first(), *a2 =i2.attendees().first() ; 87 Attendee * a1 = i1.attendees().first(), *a2 =i2.attendees().first() ;
88 while ( a1 ) { 88 while ( a1 ) {
89 if ( !( (*a1) == (*a2)) ) 89 if ( !( (*a1) == (*a2)) )
90 { 90 {
91 //qDebug("Attendee not equal "); 91 //qDebug("Attendee not equal ");
92 return false; 92 return false;
93 } 93 }
94 a1 = i1.attendees().next(); 94 a1 = i1.attendees().next();
95 a2 = i2.attendees().next(); 95 a2 = i2.attendees().next();
96 } 96 }
97 } 97 }
98 //if ( i1.dtStart() != i2.dtStart() ) 98 //if ( i1.dtStart() != i2.dtStart() )
99 // return false; 99 // return false;
100#if 0 100#if 0
101 qDebug("1 %d ",i1.doesFloat() == i2.doesFloat() ); 101 qDebug("1 %d ",i1.doesFloat() == i2.doesFloat() );
102 qDebug("1 %d ",i1.duration() == i2.duration() ); 102 qDebug("1 %d ",i1.duration() == i2.duration() );
103 qDebug("3 %d ",i1.hasDuration() == i2.hasDuration() ); 103 qDebug("3 %d ",i1.hasDuration() == i2.hasDuration() );
104 qDebug("1 %d ",i1.pilotId() == i2.pilotId() ); 104 qDebug("1 %d ",i1.pilotId() == i2.pilotId() );
105 qDebug("1 %d %d %d",i1.syncStatus() == i2.syncStatus() , i1.syncStatus(),i2.syncStatus() ); 105 qDebug("1 %d %d %d",i1.syncStatus() == i2.syncStatus() , i1.syncStatus(),i2.syncStatus() );
106 qDebug("6 %d ",i1.organizer() == i2.organizer() ); 106 qDebug("6 %d ",i1.organizer() == i2.organizer() );
107 107
108#endif 108#endif
109 return ( i1.organizer() == i2.organizer() && 109 return ( i1.organizer() == i2.organizer() &&
110 // i1.uid() == i2.uid() && 110 // i1.uid() == i2.uid() &&
111 // Don't compare lastModified, otherwise the operator is not 111 // Don't compare lastModified, otherwise the operator is not
112 // of much use. We are not comparing for identity, after all. 112 // of much use. We are not comparing for identity, after all.
113 i1.doesFloat() == i2.doesFloat() && 113 i1.doesFloat() == i2.doesFloat() &&
114 i1.duration() == i2.duration() && 114 i1.duration() == i2.duration() &&
115 i1.hasDuration() == i2.hasDuration() && 115 i1.hasDuration() == i2.hasDuration() &&
116 i1.pilotId() == i2.pilotId() );// && i1.syncStatus() == i2.syncStatus() ); 116 i1.pilotId() == i2.pilotId() );// && i1.syncStatus() == i2.syncStatus() );
117 // no need to compare mObserver 117 // no need to compare mObserver
118} 118}
119 119
120 120
121QDateTime IncidenceBase::getEvenTime( QDateTime dt ) 121QDateTime IncidenceBase::getEvenTime( QDateTime dt )
122{ 122{
123 QTime t = dt.time(); 123 QTime t = dt.time();
124 dt.setTime( QTime (t.hour (), t.minute (), t.second () ) ); 124 dt.setTime( QTime (t.hour (), t.minute (), t.second () ) );
125 return dt; 125 return dt;
126} 126}
127 127
128 128
129void IncidenceBase::setUid(const QString &uid) 129void IncidenceBase::setUid(const QString &uid)
130{ 130{
131 mUid = uid; 131 mUid = uid;
132 updated(); 132 updated();
133} 133}
134 134
135QString IncidenceBase::uid() const 135QString IncidenceBase::uid() const
136{ 136{
137 return mUid; 137 return mUid;
138} 138}
139 139
140void IncidenceBase::setLastModified(const QDateTime &lm) 140void IncidenceBase::setLastModified(const QDateTime &lm)
141{ 141{
142 // DON'T! updated() because we call this from 142 // DON'T! updated() because we call this from
143 // Calendar::updateEvent(). 143 // Calendar::updateEvent().
144 mLastModified = getEvenTime(lm); 144 mLastModified = getEvenTime(lm);
145 //qDebug("IncidenceBase::setLastModified %s ",lm.toString().latin1()); 145 //qDebug("IncidenceBase::setLastModified %s ",lm.toString().latin1());
146} 146}
147 147
148QDateTime IncidenceBase::lastModified() const 148QDateTime IncidenceBase::lastModified() const
149{ 149{
150 return mLastModified; 150 return mLastModified;
151} 151}
152 152
153void IncidenceBase::setOrganizer(const QString &o) 153void IncidenceBase::setOrganizer(const QString &o)
154{ 154{
155 // we don't check for readonly here, because it is 155 // we don't check for readonly here, because it is
156 // possible that by setting the organizer we are changing 156 // possible that by setting the organizer we are changing
157 // the event's readonly status... 157 // the event's readonly status...
158 mOrganizer = o; 158 mOrganizer = o;
159 if (mOrganizer.left(7).upper() == "MAILTO:") 159 if (mOrganizer.left(7).upper() == "MAILTO:")
160 mOrganizer = mOrganizer.remove(0,7); 160 mOrganizer = mOrganizer.remove(0,7);
161 161
162 updated(); 162 updated();
163} 163}
164 164
165QString IncidenceBase::organizer() const 165QString IncidenceBase::organizer() const
166{ 166{
167 return mOrganizer; 167 return mOrganizer;
168} 168}
169 169
170void IncidenceBase::setReadOnly( bool readOnly ) 170void IncidenceBase::setReadOnly( bool readOnly )
171{ 171{
172 mReadOnly = readOnly; 172 mReadOnly = readOnly;
173} 173}
174 174
175void IncidenceBase::setDtStart(const QDateTime &dtStart) 175void IncidenceBase::setDtStart(const QDateTime &dtStart)
176{ 176{
177// if (mReadOnly) return; 177// if (mReadOnly) return;
178 mDtStart = getEvenTime(dtStart); 178 mDtStart = getEvenTime(dtStart);
179 updated(); 179 updated();
180} 180}
181 181
182
182QDateTime IncidenceBase::dtStart() const 183QDateTime IncidenceBase::dtStart() const
183{ 184{
184 return mDtStart; 185 return mDtStart;
185} 186}
186 187
187QString IncidenceBase::dtStartTimeStr() const 188QString IncidenceBase::dtStartTimeStr() const
188{ 189{
189 return KGlobal::locale()->formatTime(dtStart().time()); 190 return KGlobal::locale()->formatTime(dtStart().time());
190} 191}
191 192
192QString IncidenceBase::dtStartDateStr(bool shortfmt) const 193QString IncidenceBase::dtStartDateStr(bool shortfmt) const
193{ 194{
194 return KGlobal::locale()->formatDate(dtStart().date(),shortfmt); 195 return KGlobal::locale()->formatDate(dtStart().date(),shortfmt);
195} 196}
196 197
197QString IncidenceBase::dtStartStr(bool shortfmt) const 198QString IncidenceBase::dtStartStr(bool shortfmt) const
198{ 199{
199 return KGlobal::locale()->formatDateTime(dtStart(), shortfmt); 200 return KGlobal::locale()->formatDateTime(dtStart(), shortfmt);
200} 201}
201 202
202 203
203bool IncidenceBase::doesFloat() const 204bool IncidenceBase::doesFloat() const
204{ 205{
205 return mFloats; 206 return mFloats;
206} 207}
207 208
208void IncidenceBase::setFloats(bool f) 209void IncidenceBase::setFloats(bool f)
209{ 210{
210 if (mReadOnly) return; 211 if (mReadOnly) return;
211 mFloats = f; 212 mFloats = f;
212 updated(); 213 updated();
213} 214}
214 215
215 216
216bool IncidenceBase::addAttendee(Attendee *a, bool doupdate) 217bool IncidenceBase::addAttendee(Attendee *a, bool doupdate)
217{ 218{
218 if (mReadOnly) return false; 219 if (mReadOnly) return false;
219 if (a->name().left(7).upper() == "MAILTO:") 220 if (a->name().left(7).upper() == "MAILTO:")
220 a->setName(a->name().remove(0,7)); 221 a->setName(a->name().remove(0,7));
221 222
222 QPtrListIterator<Attendee> qli(mAttendees); 223 QPtrListIterator<Attendee> qli(mAttendees);
223 224
224 qli.toFirst(); 225 qli.toFirst();
225 while (qli) { 226 while (qli) {
226 if (*qli.current() == *a) 227 if (*qli.current() == *a)
227 return false; 228 return false;
228 ++qli; 229 ++qli;
229 } 230 }
230 mAttendees.append(a); 231 mAttendees.append(a);
231 if (doupdate) updated(); 232 if (doupdate) updated();
232 return true; 233 return true;
233} 234}
234 235
235#if 0 236#if 0
236void IncidenceBase::removeAttendee(Attendee *a) 237void IncidenceBase::removeAttendee(Attendee *a)
237{ 238{
238 if (mReadOnly) return; 239 if (mReadOnly) return;
239 mAttendees.removeRef(a); 240 mAttendees.removeRef(a);
240 updated(); 241 updated();
241} 242}
242 243
243void IncidenceBase::removeAttendee(const char *n) 244void IncidenceBase::removeAttendee(const char *n)
244{ 245{
245 Attendee *a; 246 Attendee *a;
246 247
247 if (mReadOnly) return; 248 if (mReadOnly) return;
248 for (a = mAttendees.first(); a; a = mAttendees.next()) 249 for (a = mAttendees.first(); a; a = mAttendees.next())
249 if (a->getName() == n) { 250 if (a->getName() == n) {
250 mAttendees.remove(); 251 mAttendees.remove();
251 break; 252 break;
252 } 253 }
253} 254}
254#endif 255#endif
255 256
256void IncidenceBase::clearAttendees() 257void IncidenceBase::clearAttendees()
257{ 258{
258 if (mReadOnly) return; 259 if (mReadOnly) return;
259 mAttendees.clear(); 260 mAttendees.clear();
260} 261}
261 262
262#if 0 263#if 0
263Attendee *IncidenceBase::getAttendee(const char *n) const 264Attendee *IncidenceBase::getAttendee(const char *n) const
264{ 265{
265 QPtrListIterator<Attendee> qli(mAttendees); 266 QPtrListIterator<Attendee> qli(mAttendees);
266 267
267 qli.toFirst(); 268 qli.toFirst();
268 while (qli) { 269 while (qli) {
269 if (qli.current()->getName() == n) 270 if (qli.current()->getName() == n)
270 return qli.current(); 271 return qli.current();
271 ++qli; 272 ++qli;
272 } 273 }
273 return 0L; 274 return 0L;
274} 275}
275#endif 276#endif
276 277
277Attendee *IncidenceBase::attendeeByMail(const QString &email) 278Attendee *IncidenceBase::attendeeByMail(const QString &email)
diff --git a/libkcal/incidencebase.h b/libkcal/incidencebase.h
index f9a6558..8624786 100644
--- a/libkcal/incidencebase.h
+++ b/libkcal/incidencebase.h
@@ -1,172 +1,172 @@
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#ifndef KCAL_INCIDENCEBASE_H 20#ifndef KCAL_INCIDENCEBASE_H
21#define KCAL_INCIDENCEBASE_H 21#define KCAL_INCIDENCEBASE_H
22// 22//
23// Incidence - base class of calendaring components 23// Incidence - base class of calendaring components
24// 24//
25 25
26#include <qdatetime.h> 26#include <qdatetime.h>
27#include <qstringlist.h> 27#include <qstringlist.h>
28#include <qvaluelist.h> 28#include <qvaluelist.h>
29#include <qptrlist.h> 29#include <qptrlist.h>
30 30
31#include "customproperties.h" 31#include "customproperties.h"
32#include "attendee.h" 32#include "attendee.h"
33 33
34namespace KCal { 34namespace KCal {
35 35
36typedef QValueList<QDate> DateList; 36typedef QValueList<QDate> DateList;
37 37
38/** 38/**
39 This class provides the base class common to all calendar components. 39 This class provides the base class common to all calendar components.
40*/ 40*/
41class IncidenceBase : public CustomProperties 41class IncidenceBase : public CustomProperties
42{ 42{
43 public: 43 public:
44 class Observer { 44 class Observer {
45 public: 45 public:
46 virtual void incidenceUpdated( IncidenceBase * ) = 0; 46 virtual void incidenceUpdated( IncidenceBase * ) = 0;
47 }; 47 };
48 48
49 IncidenceBase(); 49 IncidenceBase();
50 IncidenceBase(const IncidenceBase &); 50 IncidenceBase(const IncidenceBase &);
51 virtual ~IncidenceBase(); 51 virtual ~IncidenceBase();
52 52
53 virtual QCString type() const = 0; 53 virtual QCString type() const = 0;
54 54
55 /** Set the unique id for the event */ 55 /** Set the unique id for the event */
56 void setUid(const QString &); 56 void setUid(const QString &);
57 /** Return the unique id for the event */ 57 /** Return the unique id for the event */
58 QString uid() const; 58 QString uid() const;
59 59
60 /** Sets the time the incidence was last modified. */ 60 /** Sets the time the incidence was last modified. */
61 void setLastModified(const QDateTime &lm); 61 void setLastModified(const QDateTime &lm);
62 /** Return the time the incidence was last modified. */ 62 /** Return the time the incidence was last modified. */
63 QDateTime lastModified() const; 63 QDateTime lastModified() const;
64 64
65 /** sets the organizer for the event */ 65 /** sets the organizer for the event */
66 void setOrganizer(const QString &o); 66 void setOrganizer(const QString &o);
67 QString organizer() const; 67 QString organizer() const;
68 68
69 /** Set readonly status. */ 69 /** Set readonly status. */
70 virtual void setReadOnly( bool ); 70 virtual void setReadOnly( bool );
71 /** Return if the object is read-only. */ 71 /** Return if the object is read-only. */
72 bool isReadOnly() const { return mReadOnly; } 72 bool isReadOnly() const { return mReadOnly; }
73 73
74 /** for setting the event's starting date/time with a QDateTime. */ 74 /** for setting the event's starting date/time with a QDateTime. */
75 virtual void setDtStart(const QDateTime &dtStart); 75 virtual void setDtStart(const QDateTime &dtStart);
76 /** returns an event's starting date/time as a QDateTime. */ 76 /** returns an event's starting date/time as a QDateTime. */
77 QDateTime dtStart() const; 77 virtual QDateTime dtStart() const;
78 /** returns an event's starting time as a string formatted according to the 78 /** returns an event's starting time as a string formatted according to the
79 users locale settings */ 79 users locale settings */
80 QString dtStartTimeStr() const; 80 QString dtStartTimeStr() const;
81 /** returns an event's starting date as a string formatted according to the 81 /** returns an event's starting date as a string formatted according to the
82 users locale settings */ 82 users locale settings */
83 QString dtStartDateStr(bool shortfmt=true) const; 83 QString dtStartDateStr(bool shortfmt=true) const;
84 /** returns an event's starting date and time as a string formatted according 84 /** returns an event's starting date and time as a string formatted according
85 to the users locale settings */ 85 to the users locale settings */
86 QString dtStartStr(bool shortfmt=true) const; 86 QString dtStartStr(bool shortfmt=true) const;
87 87
88 virtual void setDuration(int seconds); 88 virtual void setDuration(int seconds);
89 int duration() const; 89 int duration() const;
90 void setHasDuration(bool); 90 void setHasDuration(bool);
91 bool hasDuration() const; 91 bool hasDuration() const;
92 92
93 /** Return true or false depending on whether the incidence "floats," 93 /** Return true or false depending on whether the incidence "floats,"
94 * i.e. has a date but no time attached to it. */ 94 * i.e. has a date but no time attached to it. */
95 bool doesFloat() const; 95 bool doesFloat() const;
96 /** Set whether the incidence floats, i.e. has a date but no time attached to it. */ 96 /** Set whether the incidence floats, i.e. has a date but no time attached to it. */
97 void setFloats(bool f); 97 void setFloats(bool f);
98 98
99 /** 99 /**
100 Add Attendee to this incidence. IncidenceBase takes ownership of the 100 Add Attendee to this incidence. IncidenceBase takes ownership of the
101 Attendee object. 101 Attendee object.
102 */ 102 */
103 bool addAttendee(Attendee *a, bool doupdate=true ); 103 bool addAttendee(Attendee *a, bool doupdate=true );
104// void removeAttendee(Attendee *a); 104// void removeAttendee(Attendee *a);
105// void removeAttendee(const char *n); 105// void removeAttendee(const char *n);
106 /** Remove all Attendees. */ 106 /** Remove all Attendees. */
107 void clearAttendees(); 107 void clearAttendees();
108 /** Return list of attendees. */ 108 /** Return list of attendees. */
109 QPtrList<Attendee> attendees() const { return mAttendees; }; 109 QPtrList<Attendee> attendees() const { return mAttendees; };
110 /** Return number of attendees. */ 110 /** Return number of attendees. */
111 int attendeeCount() const { return mAttendees.count(); }; 111 int attendeeCount() const { return mAttendees.count(); };
112 /** Return the Attendee with this email */ 112 /** Return the Attendee with this email */
113 Attendee* attendeeByMail(const QString &); 113 Attendee* attendeeByMail(const QString &);
114 /** Return first Attendee with one of this emails */ 114 /** Return first Attendee with one of this emails */
115 Attendee* attendeeByMails(const QStringList &, const QString& email = QString::null); 115 Attendee* attendeeByMails(const QStringList &, const QString& email = QString::null);
116 116
117 /** pilot syncronization states */ 117 /** pilot syncronization states */
118 enum { SYNCNONE = 0, SYNCMOD = 1, SYNCDEL = 3 }; 118 enum { SYNCNONE = 0, SYNCMOD = 1, SYNCDEL = 3 };
119 /** Set synchronisation satus. */ 119 /** Set synchronisation satus. */
120 void setSyncStatus(int stat); 120 void setSyncStatus(int stat);
121 /** Return synchronisation status. */ 121 /** Return synchronisation status. */
122 int syncStatus() const; 122 int syncStatus() const;
123 123
124 /** Set Pilot Id. */ 124 /** Set Pilot Id. */
125 void setPilotId(int id); 125 void setPilotId(int id);
126 /** Return Pilot Id. */ 126 /** Return Pilot Id. */
127 int pilotId() const; 127 int pilotId() const;
128 128
129 void setTempSyncStat(int id); 129 void setTempSyncStat(int id);
130 int tempSyncStat() const; 130 int tempSyncStat() const;
131 void setIDStr( const QString & ); 131 void setIDStr( const QString & );
132 QString IDStr() const; 132 QString IDStr() const;
133 void setID( const QString &, const QString & ); 133 void setID( const QString &, const QString & );
134 QString getID( const QString & ); 134 QString getID( const QString & );
135 void setCsum( const QString &, const QString & ); 135 void setCsum( const QString &, const QString & );
136 QString getCsum( const QString & ); 136 QString getCsum( const QString & );
137 void removeID(const QString &); 137 void removeID(const QString &);
138 138
139 void registerObserver( Observer * ); 139 void registerObserver( Observer * );
140 void unRegisterObserver( Observer * ); 140 void unRegisterObserver( Observer * );
141 void updated(); 141 void updated();
142 142
143 protected: 143 protected:
144 QDateTime mDtStart;
144 bool mReadOnly; 145 bool mReadOnly;
145 QDateTime getEvenTime( QDateTime ); 146 QDateTime getEvenTime( QDateTime );
146 147
147 private: 148 private:
148 // base components 149 // base components
149 QDateTime mDtStart;
150 QString mOrganizer; 150 QString mOrganizer;
151 QString mUid; 151 QString mUid;
152 QDateTime mLastModified; 152 QDateTime mLastModified;
153 QPtrList<Attendee> mAttendees; 153 QPtrList<Attendee> mAttendees;
154 154
155 bool mFloats; 155 bool mFloats;
156 156
157 int mDuration; 157 int mDuration;
158 bool mHasDuration; 158 bool mHasDuration;
159 QString mExternalId; 159 QString mExternalId;
160 int mTempSyncStat; 160 int mTempSyncStat;
161 161
162 // PILOT SYNCHRONIZATION STUFF 162 // PILOT SYNCHRONIZATION STUFF
163 int mPilotId; // unique id for pilot sync 163 int mPilotId; // unique id for pilot sync
164 int mSyncStatus; // status (for sync) 164 int mSyncStatus; // status (for sync)
165 165
166 QPtrList<Observer> mObservers; 166 QPtrList<Observer> mObservers;
167}; 167};
168 168
169bool operator==( const IncidenceBase&, const IncidenceBase& ); 169bool operator==( const IncidenceBase&, const IncidenceBase& );
170} 170}
171 171
172#endif 172#endif
diff --git a/libkcal/todo.cpp b/libkcal/todo.cpp
index 9c04a7e..1f54c2f 100644
--- a/libkcal/todo.cpp
+++ b/libkcal/todo.cpp
@@ -218,197 +218,240 @@ int Todo::hasDueSubTodoForDate( const QDate & date, bool checkSubtodos )
218 retval = 1; 218 retval = 1;
219 } 219 }
220 } 220 }
221 return retval; 221 return retval;
222} 222}
223int Todo::hasDueSubTodo( bool checkSubtodos ) //= true 223int Todo::hasDueSubTodo( bool checkSubtodos ) //= true
224{ 224{
225 return hasDueSubTodoForDate(QDate::currentDate(), checkSubtodos ); 225 return hasDueSubTodoForDate(QDate::currentDate(), checkSubtodos );
226} 226}
227bool Todo::hasDueDate() const 227bool Todo::hasDueDate() const
228{ 228{
229 return mHasDueDate; 229 return mHasDueDate;
230} 230}
231 231
232void Todo::setHasDueDate(bool f) 232void Todo::setHasDueDate(bool f)
233{ 233{
234 if (mReadOnly) return; 234 if (mReadOnly) return;
235 mHasDueDate = f; 235 mHasDueDate = f;
236 updated(); 236 updated();
237} 237}
238 238
239 239
240#if 0 240#if 0
241void Todo::setStatus(const QString &statStr) 241void Todo::setStatus(const QString &statStr)
242{ 242{
243 if (mReadOnly) return; 243 if (mReadOnly) return;
244 QString ss(statStr.upper()); 244 QString ss(statStr.upper());
245 245
246 if (ss == "X-ACTION") 246 if (ss == "X-ACTION")
247 mStatus = NEEDS_ACTION; 247 mStatus = NEEDS_ACTION;
248 else if (ss == "NEEDS ACTION") 248 else if (ss == "NEEDS ACTION")
249 mStatus = NEEDS_ACTION; 249 mStatus = NEEDS_ACTION;
250 else if (ss == "ACCEPTED") 250 else if (ss == "ACCEPTED")
251 mStatus = ACCEPTED; 251 mStatus = ACCEPTED;
252 else if (ss == "SENT") 252 else if (ss == "SENT")
253 mStatus = SENT; 253 mStatus = SENT;
254 else if (ss == "TENTATIVE") 254 else if (ss == "TENTATIVE")
255 mStatus = TENTATIVE; 255 mStatus = TENTATIVE;
256 else if (ss == "CONFIRMED") 256 else if (ss == "CONFIRMED")
257 mStatus = CONFIRMED; 257 mStatus = CONFIRMED;
258 else if (ss == "DECLINED") 258 else if (ss == "DECLINED")
259 mStatus = DECLINED; 259 mStatus = DECLINED;
260 else if (ss == "COMPLETED") 260 else if (ss == "COMPLETED")
261 mStatus = COMPLETED; 261 mStatus = COMPLETED;
262 else if (ss == "DELEGATED") 262 else if (ss == "DELEGATED")
263 mStatus = DELEGATED; 263 mStatus = DELEGATED;
264 264
265 updated(); 265 updated();
266} 266}
267 267
268void Todo::setStatus(int status) 268void Todo::setStatus(int status)
269{ 269{
270 if (mReadOnly) return; 270 if (mReadOnly) return;
271 mStatus = status; 271 mStatus = status;
272 updated(); 272 updated();
273} 273}
274 274
275int Todo::status() const 275int Todo::status() const
276{ 276{
277 return mStatus; 277 return mStatus;
278} 278}
279 279
280QString Todo::statusStr() const 280QString Todo::statusStr() const
281{ 281{
282 switch(mStatus) { 282 switch(mStatus) {
283 case NEEDS_ACTION: 283 case NEEDS_ACTION:
284 return QString("NEEDS ACTION"); 284 return QString("NEEDS ACTION");
285 break; 285 break;
286 case ACCEPTED: 286 case ACCEPTED:
287 return QString("ACCEPTED"); 287 return QString("ACCEPTED");
288 break; 288 break;
289 case SENT: 289 case SENT:
290 return QString("SENT"); 290 return QString("SENT");
291 break; 291 break;
292 case TENTATIVE: 292 case TENTATIVE:
293 return QString("TENTATIVE"); 293 return QString("TENTATIVE");
294 break; 294 break;
295 case CONFIRMED: 295 case CONFIRMED:
296 return QString("CONFIRMED"); 296 return QString("CONFIRMED");
297 break; 297 break;
298 case DECLINED: 298 case DECLINED:
299 return QString("DECLINED"); 299 return QString("DECLINED");
300 break; 300 break;
301 case COMPLETED: 301 case COMPLETED:
302 return QString("COMPLETED"); 302 return QString("COMPLETED");
303 break; 303 break;
304 case DELEGATED: 304 case DELEGATED:
305 return QString("DELEGATED"); 305 return QString("DELEGATED");
306 break; 306 break;
307 } 307 }
308 return QString(""); 308 return QString("");
309} 309}
310#endif 310#endif
311 311
312bool Todo::isCompleted() const 312bool Todo::isCompleted() const
313{ 313{
314 if (mPercentComplete == 100) return true; 314 if (mPercentComplete == 100) {
315 else return false; 315 return true;
316 }
317 else return false;
316} 318}
317 319
318void Todo::setCompleted(bool completed) 320void Todo::setCompleted(bool completed)
319{ 321{
322 if ( mHasRecurrenceID && completed && mPercentComplete != 100 ) {
323 if ( !setRecurDates() )
324 completed = false;
325 }
320 if (completed) mPercentComplete = 100; 326 if (completed) mPercentComplete = 100;
321 else { 327 else {
322 mPercentComplete = 0; 328 mPercentComplete = 0;
323 mHasCompletedDate = false; 329 mHasCompletedDate = false;
324 } 330 }
325 updated(); 331 updated();
326} 332}
327 333
328QDateTime Todo::completed() const 334QDateTime Todo::completed() const
329{ 335{
330 return mCompleted; 336 return mCompleted;
331} 337}
332 338
333QString Todo::completedStr( bool shortF ) const 339QString Todo::completedStr( bool shortF ) const
334{ 340{
335 return KGlobal::locale()->formatDateTime(mCompleted, shortF); 341 return KGlobal::locale()->formatDateTime(mCompleted, shortF);
336} 342}
337 343
338void Todo::setCompleted(const QDateTime &completed) 344void Todo::setCompleted(const QDateTime &completed)
339{ 345{
340 //qDebug("Todo::setCompleted "); 346 //qDebug("Todo::setCompleted ");
341 if ( mHasCompletedDate ) { 347 if ( mHasCompletedDate ) {
342 // qDebug("has completed data - return "); 348 // qDebug("has completed data - return ");
343 return; 349 return;
344 } 350 }
345 mHasCompletedDate = true; 351 mHasCompletedDate = true;
346 mPercentComplete = 100; 352 mPercentComplete = 100;
347 mCompleted = getEvenTime(completed); 353 mCompleted = getEvenTime(completed);
348 updated(); 354 updated();
349} 355}
350 356
351bool Todo::hasCompletedDate() const 357bool Todo::hasCompletedDate() const
352{ 358{
353 return mHasCompletedDate; 359 return mHasCompletedDate;
354} 360}
355 361
356int Todo::percentComplete() const 362int Todo::percentComplete() const
357{ 363{
358 return mPercentComplete; 364 return mPercentComplete;
359} 365}
360 366bool Todo::setRecurDates()
361void Todo::setPercentComplete(int v)
362{ 367{
368 if ( !mHasRecurrenceID )
369 return true;
370 int secs = mDtStart.secsTo( dtDue() );
371 bool ok;
372 qDebug("--------------------setRecurDates() ");
373 //qDebug("%s %s %s ",mDtStart.toString().latin1(), dtDue().toString().latin1(),mRecurrenceID.toString().latin1() );
374 QDateTime next = getNextOccurence( mRecurrenceID, &ok );
375 if ( ok ) {
376 mRecurrenceID = next;
377 mDtStart = next;
378 setDtDue( next.addSecs( secs ) );
379 if ( QDateTime::currentDateTime() > next)
380 return false;
381 } else {
382 setHasRecurrenceID( false );
383 recurrence()->unsetRecurs();
384 }
385 return true;
386}
387void Todo::setPercentComplete(int v)
388{
389 if ( mHasRecurrenceID && v == 100 && mPercentComplete != 100 ) {
390 if ( !setRecurDates() )
391 v = 0;
392 }
363 mPercentComplete = v; 393 mPercentComplete = v;
364 if ( v != 100 ) 394 if ( v != 100 )
365 mHasCompletedDate = false; 395 mHasCompletedDate = false;
366 updated(); 396 updated();
367} 397}
368QDateTime Todo::getNextAlarmDateTime( bool * ok, int * offset ) const 398QDateTime Todo::getNextAlarmDateTime( bool * ok, int * offset ) const
369{ 399{
370 if ( isCompleted() || ! hasDueDate() || cancelled() ) { 400 if ( isCompleted() || ! hasDueDate() || cancelled() ) {
371 *ok = false; 401 *ok = false;
372 return QDateTime (); 402 return QDateTime ();
373 } 403 }
374 QDateTime incidenceStart; 404 QDateTime incidenceStart;
375 incidenceStart = dtDue(); 405 incidenceStart = dtDue();
376 bool enabled = false; 406 bool enabled = false;
377 Alarm* alarm; 407 Alarm* alarm;
378 int off = 0; 408 int off = 0;
379 QDateTime alarmStart = QDateTime::currentDateTime().addDays( 3650 );; 409 QDateTime alarmStart = QDateTime::currentDateTime().addDays( 3650 );;
380 // if ( QDateTime::currentDateTime() > incidenceStart ){ 410 // if ( QDateTime::currentDateTime() > incidenceStart ){
381// *ok = false; 411// *ok = false;
382// return incidenceStart; 412// return incidenceStart;
383// } 413// }
384 for (QPtrListIterator<Alarm> it(mAlarms); (alarm = it.current()) != 0; ++it) { 414 for (QPtrListIterator<Alarm> it(mAlarms); (alarm = it.current()) != 0; ++it) {
385 if (alarm->enabled()) { 415 if (alarm->enabled()) {
386 if ( alarm->hasTime () ) { 416 if ( alarm->hasTime () ) {
387 if ( alarm->time() < alarmStart ) { 417 if ( alarm->time() < alarmStart ) {
388 alarmStart = alarm->time(); 418 alarmStart = alarm->time();
389 enabled = true; 419 enabled = true;
390 off = alarmStart.secsTo( incidenceStart ); 420 off = alarmStart.secsTo( incidenceStart );
391 } 421 }
392 422
393 } else { 423 } else {
394 int secs = alarm->startOffset().asSeconds(); 424 int secs = alarm->startOffset().asSeconds();
395 if ( incidenceStart.addSecs( secs ) < alarmStart ) { 425 if ( incidenceStart.addSecs( secs ) < alarmStart ) {
396 alarmStart = incidenceStart.addSecs( secs ); 426 alarmStart = incidenceStart.addSecs( secs );
397 enabled = true; 427 enabled = true;
398 off = -secs; 428 off = -secs;
399 } 429 }
400 } 430 }
401 } 431 }
402 } 432 }
403 if ( enabled ) { 433 if ( enabled ) {
404 if ( alarmStart > QDateTime::currentDateTime() ) { 434 if ( alarmStart > QDateTime::currentDateTime() ) {
405 *ok = true; 435 *ok = true;
406 * offset = off; 436 * offset = off;
407 return alarmStart; 437 return alarmStart;
408 } 438 }
409 } 439 }
410 *ok = false; 440 *ok = false;
411 return QDateTime (); 441 return QDateTime ();
412 442
413} 443}
414 444
445void Todo::checkSetCompletedFalse()
446{
447 if ( !hasRecurrenceID() ) {
448 qDebug("ERROR 1 in Todo::checkSetCompletedFalse");
449 }
450 // qDebug("Todo::checkSetCompletedFalse()");
451 //qDebug("%s %s %s ",mDtStart.toString().latin1(), dtDue().toString().latin1(),mRecurrenceID.toString().latin1() );
452 if ( mPercentComplete == 100 && mDtStart == mRecurrenceID && QDateTime::currentDateTime() > mDtStart) {
453 qDebug("%s %s %s ",mDtStart.toString().latin1(), dtDue().toString().latin1(),mRecurrenceID.toString().latin1() );
454 setCompleted( false );
455 qDebug("Todo::checkSetCompletedFalse++++++++++++++++++++++++++++ ");
456 }
457}
diff --git a/libkcal/todo.h b/libkcal/todo.h
index 137b252..a22d4b7 100644
--- a/libkcal/todo.h
+++ b/libkcal/todo.h
@@ -19,116 +19,118 @@
19*/ 19*/
20#ifndef TODO_H 20#ifndef TODO_H
21#define TODO_H 21#define TODO_H
22// 22//
23// Todo component, representing a VTODO object 23// Todo component, representing a VTODO object
24// 24//
25 25
26#include "incidence.h" 26#include "incidence.h"
27 27
28namespace KCal { 28namespace KCal {
29 29
30/** 30/**
31 This class provides a Todo in the sense of RFC2445. 31 This class provides a Todo in the sense of RFC2445.
32*/ 32*/
33class Todo : public Incidence 33class Todo : public Incidence
34{ 34{
35 public: 35 public:
36 Todo(); 36 Todo();
37 Todo(const Todo &); 37 Todo(const Todo &);
38 ~Todo(); 38 ~Todo();
39 typedef ListBase<Todo> List; 39 typedef ListBase<Todo> List;
40 QCString type() const { return "Todo"; } 40 QCString type() const { return "Todo"; }
41 41
42 /** Return an exact copy of this todo. */ 42 /** Return an exact copy of this todo. */
43 Incidence *clone(); 43 Incidence *clone();
44 QDateTime getNextAlarmDateTime( bool * ok, int * offset ) const; 44 QDateTime getNextAlarmDateTime( bool * ok, int * offset ) const;
45 45
46 /** for setting the todo's due date/time with a QDateTime. */ 46 /** for setting the todo's due date/time with a QDateTime. */
47 void setDtDue(const QDateTime &dtDue); 47 void setDtDue(const QDateTime &dtDue);
48 /** returns an event's Due date/time as a QDateTime. */ 48 /** returns an event's Due date/time as a QDateTime. */
49 QDateTime dtDue() const; 49 QDateTime dtDue() const;
50 /** returns an event's due time as a string formatted according to the 50 /** returns an event's due time as a string formatted according to the
51 users locale settings */ 51 users locale settings */
52 QString dtDueTimeStr() const; 52 QString dtDueTimeStr() const;
53 /** returns an event's due date as a string formatted according to the 53 /** returns an event's due date as a string formatted according to the
54 users locale settings */ 54 users locale settings */
55 QString dtDueDateStr(bool shortfmt=true) const; 55 QString dtDueDateStr(bool shortfmt=true) const;
56 /** returns an event's due date and time as a string formatted according 56 /** returns an event's due date and time as a string formatted according
57 to the users locale settings */ 57 to the users locale settings */
58 QString dtDueStr(bool shortfmt=true) const; 58 QString dtDueStr(bool shortfmt=true) const;
59 59
60 /** returns TRUE or FALSE depending on whether the todo has a due date */ 60 /** returns TRUE or FALSE depending on whether the todo has a due date */
61 bool hasDueDate() const; 61 bool hasDueDate() const;
62 /** sets the event's hasDueDate value. */ 62 /** sets the event's hasDueDate value. */
63 void setHasDueDate(bool f); 63 void setHasDueDate(bool f);
64 64
65 /* 65 /*
66 Looks for a subtodo (including itself ) which is not complete and is 66 Looks for a subtodo (including itself ) which is not complete and is
67 - overdue, or 67 - overdue, or
68 - due today. 68 - due today.
69 It returns 0 for nothing found, 69 It returns 0 for nothing found,
70 1 for found a todo which is due today and no overdue found 70 1 for found a todo which is due today and no overdue found
71 2 for found a overdue todo 71 2 for found a overdue todo
72 */ 72 */
73 int hasDueSubTodo( bool checkSubtodos = true ); 73 int hasDueSubTodo( bool checkSubtodos = true );
74 /* same as above, but a specific date can be specified*/ 74 /* same as above, but a specific date can be specified*/
75 int hasDueSubTodoForDate( const QDate & date, bool checkSubtodos ); 75 int hasDueSubTodoForDate( const QDate & date, bool checkSubtodos );
76 76
77 77
78 /** sets the event's status to the string specified. The string 78 /** sets the event's status to the string specified. The string
79 * must be a recognized value for the status field, i.e. a string 79 * must be a recognized value for the status field, i.e. a string
80 * equivalent of the possible status enumerations previously described. */ 80 * equivalent of the possible status enumerations previously described. */
81// void setStatus(const QString &statStr); 81// void setStatus(const QString &statStr);
82 /** sets the event's status to the value specified. See the enumeration 82 /** sets the event's status to the value specified. See the enumeration
83 * above for possible values. */ 83 * above for possible values. */
84// void setStatus(int); 84// void setStatus(int);
85 /** return the event's status. */ 85 /** return the event's status. */
86// int status() const; 86// int status() const;
87 /** return the event's status in string format. */ 87 /** return the event's status in string format. */
88// QString statusStr() const; 88// QString statusStr() const;
89 89
90 /** return, if this todo is completed */ 90 /** return, if this todo is completed */
91 bool isCompleted() const; 91 bool isCompleted() const;
92 /** set completed state of this todo */ 92 /** set completed state of this todo */
93 void setCompleted(bool); 93 void setCompleted(bool);
94 94
95 /** 95 /**
96 Return how many percent of the task are completed. Returns a value 96 Return how many percent of the task are completed. Returns a value
97 between 0 and 100. 97 between 0 and 100.
98 */ 98 */
99 int percentComplete() const; 99 int percentComplete() const;
100 /** 100 /**
101 Set how many percent of the task are completed. Valid values are in the 101 Set how many percent of the task are completed. Valid values are in the
102 range from 0 to 100. 102 range from 0 to 100.
103 */ 103 */
104 void setPercentComplete(int); 104 void setPercentComplete(int);
105 105
106 /** return date and time when todo was completed */ 106 /** return date and time when todo was completed */
107 QDateTime completed() const; 107 QDateTime completed() const;
108 QString completedStr(bool shortF = true) const; 108 QString completedStr(bool shortF = true) const;
109 /** set date and time of completion */ 109 /** set date and time of completion */
110 void setCompleted(const QDateTime &completed); 110 void setCompleted(const QDateTime &completed);
111 111
112 /** Return true, if todo has a date associated with completion */ 112 /** Return true, if todo has a date associated with completion */
113 bool hasCompletedDate() const; 113 bool hasCompletedDate() const;
114 bool contains ( Todo*); 114 bool contains ( Todo*);
115 void checkSetCompletedFalse();
116 bool setRecurDates();
115 117
116 private: 118 private:
117 bool accept(Visitor &v) { return v.visit(this); } 119 bool accept(Visitor &v) { return v.visit(this); }
118 120
119 QDateTime mDtDue; // due date of todo 121 QDateTime mDtDue; // due date of todo
120 122
121 bool mHasDueDate; // if todo has associated due date 123 bool mHasDueDate; // if todo has associated due date
122 124
123// int mStatus; // confirmed/delegated/tentative/etc 125// int mStatus; // confirmed/delegated/tentative/etc
124 126
125 QDateTime mCompleted; 127 QDateTime mCompleted;
126 bool mHasCompletedDate; 128 bool mHasCompletedDate;
127 129
128 int mPercentComplete; 130 int mPercentComplete;
129}; 131};
130 132
131 bool operator==( const Todo&, const Todo& ); 133 bool operator==( const Todo&, const Todo& );
132} 134}
133 135
134#endif 136#endif