diff --git a/SOPE/NGCards/ChangeLog b/SOPE/NGCards/ChangeLog index 684eb0857..ec7083fbe 100644 --- a/SOPE/NGCards/ChangeLog +++ b/SOPE/NGCards/ChangeLog @@ -1,3 +1,12 @@ +2012-04-20 Wolfgang Sourdeau + + * iCalTrigger.m (-nextAlarmDate): new method including most of + the old code from -[iCalAlarm nextAlarmDate]. Added support for + DATE-TIME values. + + * iCalAlarm.m (-nextAlarmDate): now a proxy method for + -[iCalTrigger nextAlarmDate]. + 2012-04-18 Wolfgang Sourdeau * iCalRecurrenceRule.m (-orderOfValueKeys): overrriden method. diff --git a/SOPE/NGCards/iCalAlarm.m b/SOPE/NGCards/iCalAlarm.m index 7922f567a..943167bcb 100644 --- a/SOPE/NGCards/iCalAlarm.m +++ b/SOPE/NGCards/iCalAlarm.m @@ -142,45 +142,20 @@ - (NSCalendarDate *) nextAlarmDate { - iCalTrigger *aTrigger; - NSCalendarDate *relationDate, *nextAlarmDate; - NSString *relation; - NSTimeInterval anInterval; + NSCalendarDate *nextAlarmDate; // We currently have the following limitations for alarms: // - the alarm's trigger value type must be DURATION; - nextAlarmDate = nil; - if ([parent isKindOfClass: [iCalEvent class]] || [parent isKindOfClass: [iCalToDo class]]) - { - aTrigger = [self trigger]; - - if ([[aTrigger valueType] caseInsensitiveCompare: @"DURATION"] - == NSOrderedSame) - { - relation = [aTrigger relationType]; - anInterval = [[aTrigger flattenedValuesForKey: @""] - durationAsTimeInterval]; - if ([relation caseInsensitiveCompare: @"END"] == NSOrderedSame) - { - if ([parent isKindOfClass: [iCalEvent class]]) - relationDate = [(iCalEvent *) parent endDate]; - else - relationDate = [(iCalToDo *) parent due]; - } - else - relationDate = [(iCalEntityObject *) parent startDate]; - - // Compute the next alarm date with respect to the reference date - if ([relationDate isNotNull]) - nextAlarmDate = [relationDate addTimeInterval: anInterval]; - } - } + nextAlarmDate = [[self trigger] nextAlarmDate]; else - [self warnWithFormat: @"alarms not handled for elements of class '%@'", - NSStringFromClass ([parent class])]; + { + nextAlarmDate = nil; + [self errorWithFormat: @"alarms not handled for elements of class '%@'", + NSStringFromClass ([parent class])]; + } return nextAlarmDate; } diff --git a/SOPE/NGCards/iCalTrigger.h b/SOPE/NGCards/iCalTrigger.h index e1a446fcd..8f2a7c1b7 100644 --- a/SOPE/NGCards/iCalTrigger.h +++ b/SOPE/NGCards/iCalTrigger.h @@ -32,6 +32,8 @@ - (void) setRelationType: (NSString *) theRelationType; - (NSString *) relationType; +- (NSCalendarDate *) nextAlarmDate; + @end #endif /* __NGCards_iCalTrigger_H__ */ diff --git a/SOPE/NGCards/iCalTrigger.m b/SOPE/NGCards/iCalTrigger.m index 11efcd4e2..7db8a50ec 100644 --- a/SOPE/NGCards/iCalTrigger.m +++ b/SOPE/NGCards/iCalTrigger.m @@ -21,7 +21,11 @@ #import +#import "iCalEvent.h" #import "iCalTrigger.h" +#import "iCalToDo.h" + +#import "NSString+NGCards.h" @implementation iCalTrigger @@ -47,4 +51,46 @@ return [self value: 0 ofAttribute: @"related"]; } +- (NSCalendarDate *) nextAlarmDate +{ + NSCalendarDate *relationDate, *nextAlarmDate; + NSString *relation, *triggerValue; + NSTimeInterval anInterval; + id grandParent; + + triggerValue = [[self valueType] uppercaseString]; + if ([triggerValue length] == 0) + triggerValue = @"DURATION"; + + if ([triggerValue isEqualToString: @"DURATION"]) + { + relation = [[self relationType] uppercaseString]; + + grandParent = [parent parent]; + if ([relation isEqualToString: @"END"]) + { + if ([grandParent isKindOfClass: [iCalEvent class]]) + relationDate = [(iCalEvent *) grandParent endDate]; + else + relationDate = [(iCalToDo *) grandParent due]; + } + else + relationDate = [(iCalEntityObject *) grandParent startDate]; + + // Compute the next alarm date with respect to the reference date + if (relationDate) + { + anInterval = [[self flattenedValuesForKey: @""] + durationAsTimeInterval]; + nextAlarmDate = [relationDate addTimeInterval: anInterval]; + } + } + else if ([triggerValue isEqualToString: @"DATE-TIME"]) + nextAlarmDate = [[self flattenedValuesForKey: @""] asCalendarDate]; + else + nextAlarmDate = nil; + + return nextAlarmDate; +} + @end /* iCalTrigger */ diff --git a/SoObjects/Appointments/iCalEvent+SOGo.m b/SoObjects/Appointments/iCalEvent+SOGo.m index 6f2cdc9f1..b2be072e6 100644 --- a/SoObjects/Appointments/iCalEvent+SOGo.m +++ b/SoObjects/Appointments/iCalEvent+SOGo.m @@ -234,7 +234,6 @@ // - the component must not be recurrent; // - only the first alarm is considered; // - the alarm's action must be of type DISPLAY; - // - the alarm's trigger value type must be DURATION; // // Morever, we don't update the quick table if the property X-WebStatus // of the trigger is set to "triggered".