diff --git a/UI/SOGoUI/SOGoAptFormatter.m b/UI/SOGoUI/SOGoAptFormatter.m index 6f0d91d1f..593ba15d2 100644 --- a/UI/SOGoUI/SOGoAptFormatter.m +++ b/UI/SOGoUI/SOGoAptFormatter.m @@ -289,14 +289,21 @@ NSString *s; aptDescr = [NSMutableString stringWithCapacity:60]; + [aptDescr appendString: @"Date: "]; [self appendTimeInfoFromApt:_apt usingReferenceDate:_refDate toBuffer:aptDescr]; if ((s = [self titleForApt:_apt :_refDate]) != nil) - [aptDescr appendFormat:@"\n%@", s]; + [aptDescr appendFormat: @"\n%@%@", + @"Title: ", + s]; if ((s = [_apt valueForKey:@"location"]) != nil) + [aptDescr appendFormat:@"\n%@%@", + @"Location: ", + s]; + if ((s = [_apt valueForKey:@"description"]) != nil) [aptDescr appendFormat:@"\n%@", s]; - + return aptDescr; } diff --git a/UI/Scheduler/UIxCalDayView.h b/UI/Scheduler/UIxCalDayView.h index 42c6de28d..d9e15ad52 100644 --- a/UI/Scheduler/UIxCalDayView.h +++ b/UI/Scheduler/UIxCalDayView.h @@ -29,7 +29,7 @@ @interface UIxCalDayView : UIxCalView { - NSCalendarDate *currentDate; + NSCalendarDate *currentDate; } - (void)setCurrentDate:(NSCalendarDate *)_date; diff --git a/UI/Scheduler/UIxCalDayView.m b/UI/Scheduler/UIxCalDayView.m index 757935eae..a8366ab56 100644 --- a/UI/Scheduler/UIxCalDayView.m +++ b/UI/Scheduler/UIxCalDayView.m @@ -34,128 +34,143 @@ @implementation UIxCalDayView -- (void)dealloc { - [self->currentDate release]; - [super dealloc]; +- (void) dealloc +{ + [self->currentDate release]; + [super dealloc]; } -- (void)setCurrentDate:(NSCalendarDate *)_date { - ASSIGN(self->currentDate, _date); -} -- (NSCalendarDate *)currentDate { - return self->currentDate; +- (void) setCurrentDate: (NSCalendarDate *) _date +{ + ASSIGN(self->currentDate, _date); } -- (BOOL)isCurrentDateInApt { - return [self isCurrentDateInApt:[self appointment]]; +- (NSCalendarDate *) currentDate +{ + return self->currentDate; } -- (BOOL)isCurrentDateInApt:(id)_apt { - NSCalendarDate *dateStart, *dateEnd, *aptStart, *aptEnd; - NGCalendarDateRange *dateRange, *aptRange; +- (BOOL) isCurrentDateInApt +{ + return [self isCurrentDateInApt: [self appointment]]; +} + +- (BOOL) isCurrentDateInApt: (id) _apt +{ + NSCalendarDate *dateStart, *dateEnd, *aptStart, *aptEnd; + NGCalendarDateRange *dateRange, *aptRange; - dateStart = self->currentDate; - dateEnd = [dateStart dateByAddingYears:0 months:0 days:0 - hours:1 minutes:0 seconds:0]; - dateRange = [NGCalendarDateRange calendarDateRangeWithStartDate:dateStart - endDate:dateEnd]; - aptStart = [self->appointment valueForKey:@"startDate"]; - aptEnd = [self->appointment valueForKey:@"endDate"]; - aptRange = [NGCalendarDateRange calendarDateRangeWithStartDate:aptStart - endDate:aptEnd]; - return [dateRange doesIntersectWithDateRange:aptRange]; + dateStart = self->currentDate; + dateEnd = [dateStart dateByAddingYears:0 months:0 days:0 + hours:1 minutes:0 seconds:0]; + dateRange = [NGCalendarDateRange calendarDateRangeWithStartDate:dateStart + endDate:dateEnd]; + aptStart = [self->appointment valueForKey:@"startDate"]; + aptEnd = [self->appointment valueForKey:@"endDate"]; + aptRange = [NGCalendarDateRange calendarDateRangeWithStartDate:aptStart + endDate:aptEnd]; + + return [dateRange doesIntersectWithDateRange:aptRange]; } -- (NSArray *)dateRange { - /* default range is from dayStartHour to dayEndHour. Any values before - or after are also fine */ +- (NSArray *) dateRange +{ + /* default range is from dayStartHour to dayEndHour. Any values before + or after are also fine */ - NSCalendarDate *min, *max; - NSArray *aptDateRanges; + NSCalendarDate *min, *max; + NSArray *aptDateRanges; - min = [[self startDate] hour:[self dayStartHour] minute:0]; - max = [[self startDate] hour:[self dayEndHour] minute:0]; + min = [[self startDate] hour:[self dayStartHour] minute:0]; + max = [[self startDate] hour:[self dayEndHour] minute:0]; - aptDateRanges = [[self appointments] valueForKey:@"startDate"]; - if([aptDateRanges count] != 0) { - NSCalendarDate *d; - - aptDateRanges = [aptDateRanges sortedArrayUsingSelector:@selector(compareAscending:)]; - d = [aptDateRanges objectAtIndex:0]; - if ([d isDateOnSameDay:min]) - min = (NSCalendarDate *)[d earlierDate:min]; - d = [aptDateRanges objectAtIndex:[aptDateRanges count] - 1]; - if ([d isDateOnSameDay:max]) - max = (NSCalendarDate *)[d laterDate:max]; - } - - return [self _getDatesFrom:min to:max]; + aptDateRanges = [[self appointments] valueForKey:@"startDate"]; + if([aptDateRanges count] != 0) { + NSCalendarDate *d; + + aptDateRanges = [aptDateRanges sortedArrayUsingSelector:@selector(compareAscending:)]; + d = [aptDateRanges objectAtIndex:0]; + if ([d isDateOnSameDay:min]) + min = (NSCalendarDate *)[d earlierDate:min]; + d = [aptDateRanges objectAtIndex:[aptDateRanges count] - 1]; + if ([d isDateOnSameDay:max]) + max = (NSCalendarDate *)[d laterDate:max]; + } + + return [self _getDatesFrom:min to:max]; } -- (NSArray *)_getDatesFrom:(NSCalendarDate *)_from to:(NSCalendarDate *)_to { - NSMutableArray *dates; - unsigned i, count, offset; +- (NSArray *) _getDatesFrom: (NSCalendarDate *) _from + to: (NSCalendarDate *) _to +{ + NSMutableArray *dates; + unsigned i, count, offset; - offset = [_from hourOfDay]; - count = ([_to hourOfDay] + 1) - offset; - dates = [[NSMutableArray alloc] initWithCapacity:count]; - for(i = 0; i < count; i++) { - NSCalendarDate *date; + offset = [_from hourOfDay]; + count = ([_to hourOfDay] + 1) - offset; + dates = [[NSMutableArray alloc] initWithCapacity:count]; + for(i = 0; i < count; i++) { + NSCalendarDate *date; - date = [_from hour:offset + i minute:0]; - [dates addObject:date]; - } - return [dates autorelease]; + date = [_from hour:offset + i minute:0]; + [dates addObject:date]; + } + return [dates autorelease]; } /* URLs */ -- (NSDictionary *)prevDayQueryParameters { - NSCalendarDate *date; - - date = [[self startDate] dateByAddingYears:0 months:0 days:-1 - hours:0 minutes:0 seconds:0]; - return [self queryParametersBySettingSelectedDate:date]; +- (NSDictionary *) dayBeforePrevDayQueryParameters +{ + return [self _dateQueryParametersWithOffset: -2]; } -- (NSDictionary *)nextDayQueryParameters { - NSCalendarDate *date; - - date = [[self startDate] dateByAddingYears:0 months:0 days:1 - hours:0 minutes:0 seconds:0]; - return [self queryParametersBySettingSelectedDate:date]; +- (NSDictionary *) prevDayQueryParameters +{ + return [self _dateQueryParametersWithOffset: -1]; } -- (NSDictionary *)currentDateQueryParameters { - NSMutableDictionary *qp; - NSString *hmString; - NSCalendarDate *date; - - date = [self currentDate]; - hmString = [NSString stringWithFormat:@"%02d%02d", - [date hourOfDay], [date minuteOfHour]]; - qp = [[self queryParameters] mutableCopy]; - [self setSelectedDateQueryParameter:date inDictionary:qp]; - [qp setObject:hmString forKey:@"hm"]; - return [qp autorelease]; +- (NSDictionary *) nextDayQueryParameters +{ + return [self _dateQueryParametersWithOffset: 1]; } +- (NSDictionary *) dayAfterNextDayQueryParameters +{ + return [self _dateQueryParametersWithOffset: 2]; +} + +- (NSDictionary *) currentDateQueryParameters +{ + NSMutableDictionary *qp; + NSString *hmString; + NSCalendarDate *date; + + date = [self currentDate]; + hmString = [NSString stringWithFormat:@"%02d%02d", + [date hourOfDay], [date minuteOfHour]]; + qp = [[self queryParameters] mutableCopy]; + [self setSelectedDateQueryParameter:date inDictionary:qp]; + [qp setObject:hmString forKey:@"hm"]; + return [qp autorelease]; +} /* fetching */ - (NSCalendarDate *)startDate { - return [[self selectedDate] beginOfDay]; + return [[self selectedDate] beginOfDay]; } - (NSCalendarDate *)endDate { - return [[self startDate] endOfDay]; + return [[self startDate] endOfDay]; } /* appointments */ -- (NSArray *)appointments { - return [self fetchCoreInfos]; +- (NSArray *) appointments +{ + return [self fetchCoreInfos]; } - (NSArray *)aptsForCurrentDate { @@ -175,17 +190,10 @@ apts = [self appointments]; filtered = [[NSMutableArray alloc] initWithCapacity:1]; count = [apts count]; - for(i = 0; i < count; i++) { + for (i = 0; i < count; i++) { id apt; NSCalendarDate *aptStartDate; - /* NOTE: appointments are totally opaque objects, we don't know much - about them. The reason for this is that they are backend-dependent - and we'd like to use UIx for SOGo *and* ZideStore also. - We have to accept the fact that we know just a little bit - of their API which is completely KVC driven. - */ - apt = [apts objectAtIndex:i]; aptStartDate = [apt valueForKey:@"startDate"]; if([aptStartDate isGreaterThanOrEqualTo:start] && @@ -193,26 +201,87 @@ { [filtered addObject:apt]; } - else { - /* multiple day range? */ - NSCalendarDate *aptEndDate; - - if ((aptEndDate = [apt valueForKey:@"endDate"])) { - if ([aptEndDate isLessThanOrEqualTo:end] || - ([aptStartDate isLessThan:start] && - [aptEndDate isGreaterThan:end])) - { - [filtered addObject:apt]; - } - } - } } - + return [filtered autorelease]; } -- (BOOL)hasAptsForCurrentDate { +- (NSArray *)allDayApts { + NSCalendarDate *start; + NSArray *apts; + NSMutableArray *filtered; + unsigned i, count; + + if (self->allDayApts) + return self->allDayApts; + + start = [self startDate]; + apts = [self appointments]; + filtered = [[NSMutableArray alloc] initWithCapacity:1]; + count = [apts count]; + for (i = 0; i < count; i++) { + id apt; + NSNumber *bv; + + apt = [apts objectAtIndex:i]; + bv = [apt valueForKey:@"isallday"]; + if ([bv boolValue]) { + [filtered addObject:apt]; + } + else { + NSCalendarDate *aptStartDate; + + aptStartDate = [apt valueForKey:@"startDate"]; + if([aptStartDate isLessThan:start]) { + [filtered addObject:apt]; + } + } + } + + ASSIGN(self->allDayApts, filtered); + [filtered release]; + return self->allDayApts; +} + +- (BOOL) hasAptsForCurrentDate +{ return [[self aptsForCurrentDate] count] != 0; } +- (NSString *) _dayNameWithOffsetFromToday: (int) offset +{ + NSCalendarDate *date; + + date = [[self selectedDate] dateByAddingYears: 0 + months: 0 + days: offset]; + + return [self localizedNameForDayOfWeek: [date dayOfWeek]]; +} + +- (NSString *) dayBeforeYesterdayName +{ + return [self _dayNameWithOffsetFromToday: -2]; +} + +- (NSString *) yesterdayName +{ + return [self _dayNameWithOffsetFromToday: -1]; +} + +- (NSString *) currentDayName +{ + return [self _dayNameWithOffsetFromToday: 0]; +} + +- (NSString *) tomorrowName +{ + return [self _dayNameWithOffsetFromToday: 1]; +} + +- (NSString *) dayAfterTomorrowName +{ + return [self _dayNameWithOffsetFromToday: 2]; +} + @end diff --git a/UI/Scheduler/UIxCalView.h b/UI/Scheduler/UIxCalView.h index 846aa14e9..2eae70fcb 100644 --- a/UI/Scheduler/UIxCalView.h +++ b/UI/Scheduler/UIxCalView.h @@ -101,6 +101,9 @@ - (NSString *)aptStyle; +/* protected methods */ +- (NSDictionary *) _dateQueryParametersWithOffset: (int) daysOffset; + @end #endif /* __SOGo_UIxCalView_H__ */ diff --git a/UI/Scheduler/UIxCalView.m b/UI/Scheduler/UIxCalView.m index fad16a365..c89699083 100644 --- a/UI/Scheduler/UIxCalView.m +++ b/UI/Scheduler/UIxCalView.m @@ -243,6 +243,21 @@ static BOOL shouldDisplayWeekend = NO; hours:0 minutes:0 seconds:0]; } +- (NSCalendarDate *)prevMonth { + NSCalendarDate *date = [self thisMonth]; + return [date dateByAddingYears:0 months:-1 days:0 + hours:0 minutes:0 seconds:0]; +} + +- (NSString *) prevMonthAsString +{ + return [self dateStringForDate: [self prevMonth]]; +} + +- (NSString *) nextMonthAsString +{ + return [self dateStringForDate: [self nextMonth]]; +} /* current day related */ @@ -250,12 +265,14 @@ static BOOL shouldDisplayWeekend = NO; [_day setTimeZone:[self viewTimeZone]]; ASSIGN(self->currentDay, _day); } -- (NSCalendarDate *)currentDay { + +- (NSCalendarDate *) currentDay { return self->currentDay; } -- (NSString *)currentDayName { - return [self localizedNameForDayOfWeek:[self->currentDay dayOfWeek]]; +- (NSString *) currentDayName +{ + return [self localizedNameForDayOfWeek: [self->currentDay dayOfWeek]]; } - (id)holidayInfo { @@ -363,6 +380,7 @@ static BOOL shouldDisplayWeekend = NO; ed = [self endDate]; [self setAppointments:[folder fetchOverviewInfosFrom:sd to:ed]]; } + return self->appointments; } @@ -394,6 +412,16 @@ static BOOL shouldDisplayWeekend = NO; /* date selection & conversion */ +- (NSDictionary *) _dateQueryParametersWithOffset: (int) daysOffset +{ + NSCalendarDate *date; + + date = [[self startDate] dateByAddingYears: 0 months: 0 + days: daysOffset + hours:0 minutes:0 seconds:0]; + return [self queryParametersBySettingSelectedDate:date]; +} + - (NSDictionary *)todayQueryParameters { NSCalendarDate *date;