diff --git a/SOPE/NGCards/ChangeLog b/SOPE/NGCards/ChangeLog index 82c5bfe13..8ba8a3f91 100644 --- a/SOPE/NGCards/ChangeLog +++ b/SOPE/NGCards/ChangeLog @@ -1,5 +1,12 @@ 2011-03-22 Wolfgang Sourdeau + * iCalEvent.m (-firstRecurrenceStartDate): new method that makes + use of the new one below. + + * iCalRepeatableEntityObject.m + (-firstRecurrenceStartDateWithEndDate:): new method that returns + the first occurrence of a recurring entity. + * iCalByDayMask.m (-occursOnDay:withWeekOccurrence:): fixed method to return true only when it is valid to do so... (-weekDayOccurrences): new method that returns a reference to the diff --git a/SOPE/NGCards/iCalEvent.h b/SOPE/NGCards/iCalEvent.h index 0dabe1806..4383a8d9f 100644 --- a/SOPE/NGCards/iCalEvent.h +++ b/SOPE/NGCards/iCalEvent.h @@ -50,7 +50,6 @@ - (NSCalendarDate *) endDate; - (BOOL) hasEndDate; -- (void) setDuration: (NSString *) _value; - (NSString *) duration; - (BOOL) hasDuration; - (NSTimeInterval) durationAsTimeInterval; @@ -74,6 +73,8 @@ - (id) propertyValue: (NSString *) property; +- (NSCalendarDate *) firstRecurrenceStartDate; + @end #endif /* __NGCards_iCalEvent_H__ */ diff --git a/SOPE/NGCards/iCalEvent.m b/SOPE/NGCards/iCalEvent.m index 3afe3b071..be80b3766 100644 --- a/SOPE/NGCards/iCalEvent.m +++ b/SOPE/NGCards/iCalEvent.m @@ -29,6 +29,8 @@ #import "iCalEventChanges.h" #import "iCalDateTime.h" +#import "iCalRecurrenceRule.h" +#import "iCalRecurrenceCalculator.h" #import "iCalEvent.h" @@ -288,4 +290,10 @@ return [self performSelector: NSSelectorFromString (method)]; } +- (NSCalendarDate *) firstRecurrenceStartDate +{ + return [self firstRecurrenceStartDateWithEndDate: [self endDate]]; +} + + @end /* iCalEvent */ diff --git a/SOPE/NGCards/iCalRepeatableEntityObject.h b/SOPE/NGCards/iCalRepeatableEntityObject.h index 4e4e577b8..c1d5bae02 100644 --- a/SOPE/NGCards/iCalRepeatableEntityObject.h +++ b/SOPE/NGCards/iCalRepeatableEntityObject.h @@ -68,6 +68,8 @@ /* this is the outmost bound possible, not necessarily the real last date */ - (NSCalendarDate *)lastPossibleRecurrenceStartDateUsingFirstInstanceCalendarDateRange:(NGCalendarDateRange *)_r; +- (NSCalendarDate *) firstRecurrenceStartDateWithEndDate: (NSCalendarDate *) endDate; + @end #endif /* __NGCards_iCalRepeatableEntityObject_H_ */ diff --git a/SOPE/NGCards/iCalRepeatableEntityObject.m b/SOPE/NGCards/iCalRepeatableEntityObject.m index 35fd63394..fab9c379f 100644 --- a/SOPE/NGCards/iCalRepeatableEntityObject.m +++ b/SOPE/NGCards/iCalRepeatableEntityObject.m @@ -259,4 +259,74 @@ lastPossibleRecurrenceStartDateUsingFirstInstanceCalendarDateRange: (NGCalendarD return date; } +- (NSCalendarDate *) firstRecurrenceStartDateWithEndDate: (NSCalendarDate *) endDate +{ + NSCalendarDate *startDate, *firstOccurrenceStartDate, *endOfFirstRange; + NGCalendarDateRange *range, *firstInstanceRange; + iCalRecurrenceFrequency frequency; + iCalRecurrenceRule *rule; + NSArray *rules, *recurrences; + uint32_t units; + + firstOccurrenceStartDate = nil; + + rules = [self recurrenceRules]; + if ([rules count] > 0) + { + rule = [rules objectAtIndex: 0]; + frequency = [rule frequency]; + units = [rule repeatInterval]; + + startDate = [self startDate]; + switch (frequency) + { + /* second-based units */ + case iCalRecurrenceFrequenceWeekly: + units *= 7; + case iCalRecurrenceFrequenceDaily: + units *= 24; + case iCalRecurrenceFrequenceHourly: + units *= 60; + case iCalRecurrenceFrequenceMinutely: + units *= 60; + case iCalRecurrenceFrequenceSecondly: + endOfFirstRange = [startDate dateByAddingYears: 0 months: 0 days: 0 + hours: 0 minutes: 0 + seconds: units]; + break; + + /* month-based units */ + case iCalRecurrenceFrequenceYearly: + units *= 12; + case iCalRecurrenceFrequenceMonthly: + endOfFirstRange = [startDate dateByAddingYears: 0 months: (units + 1) + days: 0 + hours: 0 minutes: 0 + seconds: 0]; + break; + + default: + endOfFirstRange = nil; + } + + if (endOfFirstRange) + { + range = [NGCalendarDateRange calendarDateRangeWithStartDate: startDate + endDate: endOfFirstRange]; + firstInstanceRange = [NGCalendarDateRange calendarDateRangeWithStartDate: startDate + endDate: endDate]; + recurrences = [iCalRecurrenceCalculator recurrenceRangesWithinCalendarDateRange: range + firstInstanceCalendarDateRange: firstInstanceRange + recurrenceRules: rules + exceptionRules: nil + exceptionDates: nil]; + if ([recurrences count] > 0) + firstOccurrenceStartDate = [[recurrences objectAtIndex: 0] + startDate]; + } + } + + return firstOccurrenceStartDate; +} + @end