author | zautrix <zautrix> | 2005-02-13 17:05:02 (UTC) |
---|---|---|
committer | zautrix <zautrix> | 2005-02-13 17:05:02 (UTC) |
commit | 293271fe9e6a9061da329183f8f488d79580f7da (patch) (unidiff) | |
tree | 3a0234eabdf58440a484e960b5eef912a63d0056 /libkcal | |
parent | 0a33f91e166747406ca2ccb5819881feeecfdb40 (diff) | |
download | kdepimpi-293271fe9e6a9061da329183f8f488d79580f7da.zip kdepimpi-293271fe9e6a9061da329183f8f488d79580f7da.tar.gz kdepimpi-293271fe9e6a9061da329183f8f488d79580f7da.tar.bz2 |
todo rec fixes
-rw-r--r-- | libkcal/incidence.cpp | 9 | ||||
-rw-r--r-- | libkcal/incidence.h | 5 | ||||
-rw-r--r-- | libkcal/incidencebase.cpp | 1 | ||||
-rw-r--r-- | libkcal/incidencebase.h | 4 | ||||
-rw-r--r-- | libkcal/todo.cpp | 51 | ||||
-rw-r--r-- | libkcal/todo.h | 2 |
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 | ||
558 | void Incidence::removeAlarm(Alarm *alarm) | 558 | void Incidence::removeAlarm(Alarm *alarm) |
559 | { | 559 | { |
560 | mAlarms.removeRef(alarm); | 560 | mAlarms.removeRef(alarm); |
561 | updated(); | 561 | updated(); |
562 | } | 562 | } |
563 | 563 | ||
564 | void Incidence::clearAlarms() | 564 | void Incidence::clearAlarms() |
565 | { | 565 | { |
566 | mAlarms.clear(); | 566 | mAlarms.clear(); |
567 | updated(); | 567 | updated(); |
568 | } | 568 | } |
569 | 569 | ||
570 | bool Incidence::isAlarmEnabled() const | 570 | bool 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 | ||
580 | Recurrence *Incidence::recurrence() const | 580 | Recurrence *Incidence::recurrence() const |
581 | { | 581 | { |
582 | return mRecurrence; | 582 | return mRecurrence; |
583 | } | 583 | } |
584 | void Incidence::setRecurrence( Recurrence * r) | 584 | void Incidence::setRecurrence( Recurrence * r) |
585 | { | 585 | { |
586 | delete mRecurrence; | 586 | delete mRecurrence; |
587 | mRecurrence = r; | 587 | mRecurrence = r; |
588 | } | 588 | } |
589 | 589 | ||
590 | void Incidence::setLocation(const QString &location) | 590 | void 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 | ||
597 | QString Incidence::location() const | 597 | QString Incidence::location() const |
598 | { | 598 | { |
599 | return mLocation; | 599 | return mLocation; |
600 | } | 600 | } |
601 | 601 | ||
602 | ushort Incidence::doesRecur() const | 602 | ushort 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 | ||
608 | QDateTime Incidence::getNextOccurence( const QDateTime& dt, bool* ok ) const | 608 | QDateTime 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 | } |
650 | QDateTime 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 | ||
274 | protected: | 275 | protected: |
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 | ||
304 | bool operator==( const Incidence&, const Incidence& ); | 305 | bool 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 | ||
121 | QDateTime IncidenceBase::getEvenTime( QDateTime dt ) | 121 | QDateTime 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 | ||
129 | void IncidenceBase::setUid(const QString &uid) | 129 | void IncidenceBase::setUid(const QString &uid) |
130 | { | 130 | { |
131 | mUid = uid; | 131 | mUid = uid; |
132 | updated(); | 132 | updated(); |
133 | } | 133 | } |
134 | 134 | ||
135 | QString IncidenceBase::uid() const | 135 | QString IncidenceBase::uid() const |
136 | { | 136 | { |
137 | return mUid; | 137 | return mUid; |
138 | } | 138 | } |
139 | 139 | ||
140 | void IncidenceBase::setLastModified(const QDateTime &lm) | 140 | void 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 | ||
148 | QDateTime IncidenceBase::lastModified() const | 148 | QDateTime IncidenceBase::lastModified() const |
149 | { | 149 | { |
150 | return mLastModified; | 150 | return mLastModified; |
151 | } | 151 | } |
152 | 152 | ||
153 | void IncidenceBase::setOrganizer(const QString &o) | 153 | void 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 | ||
165 | QString IncidenceBase::organizer() const | 165 | QString IncidenceBase::organizer() const |
166 | { | 166 | { |
167 | return mOrganizer; | 167 | return mOrganizer; |
168 | } | 168 | } |
169 | 169 | ||
170 | void IncidenceBase::setReadOnly( bool readOnly ) | 170 | void IncidenceBase::setReadOnly( bool readOnly ) |
171 | { | 171 | { |
172 | mReadOnly = readOnly; | 172 | mReadOnly = readOnly; |
173 | } | 173 | } |
174 | 174 | ||
175 | void IncidenceBase::setDtStart(const QDateTime &dtStart) | 175 | void 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 | |||
182 | QDateTime IncidenceBase::dtStart() const | 183 | QDateTime IncidenceBase::dtStart() const |
183 | { | 184 | { |
184 | return mDtStart; | 185 | return mDtStart; |
185 | } | 186 | } |
186 | 187 | ||
187 | QString IncidenceBase::dtStartTimeStr() const | 188 | QString IncidenceBase::dtStartTimeStr() const |
188 | { | 189 | { |
189 | return KGlobal::locale()->formatTime(dtStart().time()); | 190 | return KGlobal::locale()->formatTime(dtStart().time()); |
190 | } | 191 | } |
191 | 192 | ||
192 | QString IncidenceBase::dtStartDateStr(bool shortfmt) const | 193 | QString 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 | ||
197 | QString IncidenceBase::dtStartStr(bool shortfmt) const | 198 | QString 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 | ||
203 | bool IncidenceBase::doesFloat() const | 204 | bool IncidenceBase::doesFloat() const |
204 | { | 205 | { |
205 | return mFloats; | 206 | return mFloats; |
206 | } | 207 | } |
207 | 208 | ||
208 | void IncidenceBase::setFloats(bool f) | 209 | void 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 | ||
216 | bool IncidenceBase::addAttendee(Attendee *a, bool doupdate) | 217 | bool 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 |
236 | void IncidenceBase::removeAttendee(Attendee *a) | 237 | void 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 | ||
243 | void IncidenceBase::removeAttendee(const char *n) | 244 | void 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 | ||
256 | void IncidenceBase::clearAttendees() | 257 | void 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 |
263 | Attendee *IncidenceBase::getAttendee(const char *n) const | 264 | Attendee *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 | ||
277 | Attendee *IncidenceBase::attendeeByMail(const QString &email) | 278 | Attendee *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 | ||
34 | namespace KCal { | 34 | namespace KCal { |
35 | 35 | ||
36 | typedef QValueList<QDate> DateList; | 36 | typedef 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 | */ |
41 | class IncidenceBase : public CustomProperties | 41 | class 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 | ||
169 | bool operator==( const IncidenceBase&, const IncidenceBase& ); | 169 | bool 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 | } |
223 | int Todo::hasDueSubTodo( bool checkSubtodos ) //= true | 223 | int Todo::hasDueSubTodo( bool checkSubtodos ) //= true |
224 | { | 224 | { |
225 | return hasDueSubTodoForDate(QDate::currentDate(), checkSubtodos ); | 225 | return hasDueSubTodoForDate(QDate::currentDate(), checkSubtodos ); |
226 | } | 226 | } |
227 | bool Todo::hasDueDate() const | 227 | bool Todo::hasDueDate() const |
228 | { | 228 | { |
229 | return mHasDueDate; | 229 | return mHasDueDate; |
230 | } | 230 | } |
231 | 231 | ||
232 | void Todo::setHasDueDate(bool f) | 232 | void 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 |
241 | void Todo::setStatus(const QString &statStr) | 241 | void 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 | ||
268 | void Todo::setStatus(int status) | 268 | void 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 | ||
275 | int Todo::status() const | 275 | int Todo::status() const |
276 | { | 276 | { |
277 | return mStatus; | 277 | return mStatus; |
278 | } | 278 | } |
279 | 279 | ||
280 | QString Todo::statusStr() const | 280 | QString 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 | ||
312 | bool Todo::isCompleted() const | 312 | bool 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 | ||
318 | void Todo::setCompleted(bool completed) | 320 | void 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 | ||
328 | QDateTime Todo::completed() const | 334 | QDateTime Todo::completed() const |
329 | { | 335 | { |
330 | return mCompleted; | 336 | return mCompleted; |
331 | } | 337 | } |
332 | 338 | ||
333 | QString Todo::completedStr( bool shortF ) const | 339 | QString 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 | ||
338 | void Todo::setCompleted(const QDateTime &completed) | 344 | void 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 | ||
351 | bool Todo::hasCompletedDate() const | 357 | bool Todo::hasCompletedDate() const |
352 | { | 358 | { |
353 | return mHasCompletedDate; | 359 | return mHasCompletedDate; |
354 | } | 360 | } |
355 | 361 | ||
356 | int Todo::percentComplete() const | 362 | int Todo::percentComplete() const |
357 | { | 363 | { |
358 | return mPercentComplete; | 364 | return mPercentComplete; |
359 | } | 365 | } |
360 | 366 | bool Todo::setRecurDates() | |
361 | void 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 | } | ||
387 | void 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 | } |
368 | QDateTime Todo::getNextAlarmDateTime( bool * ok, int * offset ) const | 398 | QDateTime 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 | ||
445 | void 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 | ||
28 | namespace KCal { | 28 | namespace 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 | */ |
33 | class Todo : public Incidence | 33 | class 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 |