37 using namespace KCalCore;
44 class KCalCore::Alarm::Private
49 mType(
Alarm::Invalid ),
50 mAlarmSnoozeTime( 5 ),
51 mAlarmRepeatCount( 0 ),
54 mAlarmEnabled( false ),
55 mHasLocationRadius ( false ),
58 Private(
const Private &other )
59 : mParent( other.mParent ),
61 mDescription( other.mDescription ),
63 mMailSubject( other.mMailSubject ),
64 mMailAttachFiles( other.mMailAttachFiles ),
65 mMailAddresses( other.mMailAddresses ),
66 mAlarmTime( other.mAlarmTime ),
67 mAlarmSnoozeTime( other.mAlarmSnoozeTime ),
68 mAlarmRepeatCount( other.mAlarmRepeatCount ),
69 mOffset( other.mOffset ),
70 mEndOffset( other.mEndOffset ),
71 mHasTime( other.mHasTime ),
72 mAlarmEnabled( other.mAlarmEnabled ),
73 mHasLocationRadius( other.mHasLocationRadius ),
74 mLocationRadius( other.mLocationRadius )
83 QStringList mMailAttachFiles;
89 int mAlarmRepeatCount;
98 bool mHasLocationRadius;
121 d->mParent = a.d->mParent;
122 d->mType = a.d->mType;
123 d->mDescription = a.d->mDescription;
124 d->mFile = a.d->mFile;
125 d->mMailAttachFiles = a.d->mMailAttachFiles;
126 d->mMailAddresses = a.d->mMailAddresses;
127 d->mMailSubject = a.d->mMailSubject;
128 d->mAlarmSnoozeTime = a.d->mAlarmSnoozeTime;
129 d->mAlarmRepeatCount = a.d->mAlarmRepeatCount;
130 d->mAlarmTime = a.d->mAlarmTime;
131 d->mOffset = a.d->mOffset;
132 d->mEndOffset = a.d->mEndOffset;
133 d->mHasTime = a.d->mHasTime;
134 d->mAlarmEnabled = a.d->mAlarmEnabled;
142 if ( d->mType != rhs.d->mType ||
143 d->mAlarmSnoozeTime != rhs.d->mAlarmSnoozeTime ||
144 d->mAlarmRepeatCount != rhs.d->mAlarmRepeatCount ||
145 d->mAlarmEnabled != rhs.d->mAlarmEnabled ||
146 d->mHasTime != rhs.d->mHasTime ||
147 d->mHasLocationRadius != rhs.d->mHasLocationRadius ||
148 d->mLocationRadius != rhs.d->mLocationRadius ) {
153 if ( d->mAlarmTime != rhs.d->mAlarmTime ) {
157 if ( d->mOffset != rhs.d->mOffset || d->mEndOffset != rhs.d->mEndOffset ) {
162 switch ( d->mType ) {
164 return d->mDescription == rhs.d->mDescription;
167 return d->mDescription == rhs.d->mDescription &&
168 d->mMailAttachFiles == rhs.d->mMailAttachFiles &&
169 d->mMailAddresses == rhs.d->mMailAddresses &&
170 d->mMailSubject == rhs.d->mMailSubject;
173 return d->mFile == rhs.d->mFile &&
174 d->mDescription == rhs.d->mDescription;
177 return d->mFile == rhs.d->mFile;
192 if ( type == d->mType ) {
197 d->mParent->update();
201 d->mDescription =
"";
204 d->mFile = d->mDescription =
"";
210 d->mMailSubject = d->mDescription =
"";
211 d->mMailAddresses.clear();
212 d->mMailAttachFiles.clear();
218 d->mParent->updated();
224 d->mParent->updated();
236 d->mParent->update();
241 d->mParent->updated();
247 if ( d->mType ==
Audio ) {
249 d->mParent->update();
253 d->mParent->updated();
260 return ( d->mType ==
Audio ) ? d->mFile : QString();
264 const QString &arguments )
267 d->mParent->update();
271 d->mDescription = arguments;
273 d->mParent->updated();
281 d->mParent->update();
285 d->mParent->updated();
292 return ( d->mType ==
Procedure ) ? d->mFile : QString();
299 d->mParent->update();
301 d->mDescription = arguments;
303 d->mParent->updated();
310 return ( d->mType ==
Procedure ) ? d->mDescription : QString();
315 const QStringList &attachments )
318 d->mParent->update();
321 d->mMailSubject = subject;
322 d->mDescription =
text;
323 d->mMailAddresses = addressees;
324 d->mMailAttachFiles = attachments;
326 d->mParent->updated();
332 if ( d->mType ==
Email ) {
334 d->mParent->update();
336 d->mMailAddresses.clear();
337 d->mMailAddresses.append( mailAddress );
339 d->mParent->updated();
346 if ( d->mType ==
Email ) {
348 d->mParent->update();
352 d->mParent->updated();
359 if ( d->mType ==
Email ) {
361 d->mParent->update();
363 d->mMailAddresses.append( mailAddress );
365 d->mParent->updated();
377 if ( d->mType ==
Email ) {
379 d->mParent->update();
381 d->mMailSubject = mailAlarmSubject;
383 d->mParent->updated();
390 return ( d->mType ==
Email ) ? d->mMailSubject : QString();
395 if ( d->mType ==
Email ) {
397 d->mParent->update();
399 d->mMailAttachFiles.clear();
400 d->mMailAttachFiles += mailAttachFile;
402 d->mParent->updated();
409 if ( d->mType ==
Email ) {
411 d->mParent->update();
413 d->mMailAttachFiles = mailAttachFiles;
415 d->mParent->updated();
422 if ( d->mType ==
Email ) {
424 d->mParent->update();
426 d->mMailAttachFiles += mailAttachFile;
428 d->mParent->updated();
435 return ( d->mType ==
Email ) ? d->mMailAttachFiles : QStringList();
440 if ( d->mType ==
Email ) {
442 d->mParent->update();
444 d->mDescription =
text;
446 d->mParent->updated();
453 return ( d->mType ==
Email ) ? d->mDescription : QString();
459 d->mParent->update();
462 if ( !text.isNull() ) {
463 d->mDescription =
text;
466 d->mParent->updated();
474 d->mParent->update();
476 d->mDescription =
text;
478 d->mParent->updated();
485 return ( d->mType ==
Display ) ? d->mDescription : QString();
491 d->mParent->update();
493 d->mAlarmTime = alarmTime;
497 d->mParent->updated();
504 return d->mAlarmTime;
505 }
else if ( d->mParent ) {
506 if ( d->mEndOffset ) {
508 return d->mOffset.end( dt );
511 return d->mOffset.end( dt );
520 if ( d->mParent && d->mParent->recurs() ) {
523 KDateTime dtStart = d->mParent->dtStart();
526 KDateTime alarmStart = d->mOffset.end( d->mEndOffset ? dtEnd : dtStart );
529 Duration alarmOffset( dtStart, alarmStart );
537 if ( alarmStart > preTime ) {
541 if ( d->mAlarmRepeatCount && !ignoreRepetitions ) {
544 KDateTime prevRecurrence = d->mParent->recurrence()->getPreviousDateTime( preTime );
545 if ( prevRecurrence.isValid() ) {
546 KDateTime prevLastRepeat = alarmOffset.
end(
duration().end( prevRecurrence ) );
549 if ( prevLastRepeat > preTime ) {
551 KDateTime prevAlarm = alarmOffset.
end( prevRecurrence );
558 KDateTime nextRecurrence = d->mParent->recurrence()->getNextDateTime( preTime );
559 if ( nextRecurrence.isValid() ) {
560 KDateTime nextAlarm = alarmOffset.
end( nextRecurrence );
565 if ( nextAlarm > preTime ) {
572 KDateTime alarmTime =
time();
573 if ( alarmTime > preTime ) {
586 const KDateTime::Spec &newSpec )
589 d->mParent->update();
591 d->mAlarmTime = d->mAlarmTime.toTimeSpec( oldSpec );
592 d->mAlarmTime.setTimeSpec( newSpec );
594 d->mParent->updated();
600 if ( alarmSnoozeTime.
value() > 0 ) {
602 d->mParent->update();
604 d->mAlarmSnoozeTime = alarmSnoozeTime;
606 d->mParent->updated();
613 return d->mAlarmSnoozeTime;
619 d->mParent->update();
621 d->mAlarmRepeatCount = alarmRepeatCount;
623 d->mParent->updated();
629 return d->mAlarmRepeatCount;
634 return Duration( d->mAlarmSnoozeTime.value() * d->mAlarmRepeatCount,
635 d->mAlarmSnoozeTime.type() );
641 if ( at > preTime ) {
644 if ( !d->mAlarmRepeatCount ) {
649 int interval = d->mAlarmSnoozeTime.value();
650 bool daily = d->mAlarmSnoozeTime.isDaily();
652 int daysTo = at.daysTo( preTime );
653 if ( !preTime.isDateOnly() && preTime.time() <= at.time() ) {
656 repetition = daysTo / interval + 1;
658 repetition = at.secsTo_long( preTime ) / interval + 1;
660 if ( repetition > d->mAlarmRepeatCount ) {
664 return daily ? at.addDays(
int( repetition * interval ) )
665 : at.addSecs( repetition * interval );
670 KDateTime at =
time();
671 if ( at >= afterTime ) {
675 if ( !d->mAlarmRepeatCount ) {
679 int interval = d->mAlarmSnoozeTime.value();
680 bool daily = d->mAlarmSnoozeTime.isDaily();
682 int daysTo = at.daysTo( afterTime );
683 if ( afterTime.isDateOnly() || afterTime.time() <= at.time() ) {
686 repetition = daysTo / interval;
688 repetition = ( at.secsTo_long( afterTime ) - 1 ) / interval;
690 if ( repetition > d->mAlarmRepeatCount ) {
691 repetition = d->mAlarmRepeatCount;
693 return daily ? at.addDays(
int( repetition * interval ) )
694 : at.addSecs( repetition * interval );
699 if ( !d->mAlarmRepeatCount ) {
702 if ( d->mAlarmSnoozeTime.isDaily() ) {
703 return time().addDays( d->mAlarmRepeatCount * d->mAlarmSnoozeTime.asDays() );
705 return time().addSecs( d->mAlarmRepeatCount * d->mAlarmSnoozeTime.asSeconds() );
712 d->mParent->update();
714 d->mAlarmEnabled = !d->mAlarmEnabled;
716 d->mParent->updated();
723 d->mParent->update();
725 d->mAlarmEnabled = enable;
727 d->mParent->updated();
733 return d->mAlarmEnabled;
739 d->mParent->update();
742 d->mEndOffset =
false;
745 d->mParent->updated();
751 return ( d->mHasTime || d->mEndOffset ) ?
Duration( 0 ) : d->mOffset;
756 return !d->mHasTime && !d->mEndOffset;
761 return !d->mHasTime && d->mEndOffset;
767 d->mParent->update();
770 d->mEndOffset =
true;
773 d->mParent->updated();
779 return ( d->mHasTime || !d->mEndOffset ) ?
Duration( 0 ) : d->mOffset;
789 return d->mParent ? d->mParent->uid() : QString();
795 d->mParent->update();
796 d->mParent->updated();
803 d->mParent->update();
806 if ( hasLocationRadius ) {
812 d->mParent->updated();
818 return d->mHasLocationRadius;
824 d->mParent->update();
828 d->mParent->updated();
834 return d->mLocationRadius;