2 Copyright (C) 2004 SKYRIX Software AG
4 This file is part of OpenGroupware.org.
6 OGo is free software; you can redistribute it and/or modify it under
7 the terms of the GNU Lesser General Public License as published by the
8 Free Software Foundation; either version 2, or (at your option) any
11 OGo is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
14 License for more details.
16 You should have received a copy of the GNU Lesser General Public
17 License along with OGo; see the file COPYING. If not, write to the
18 Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
23 #import <Foundation/NSArray.h>
24 #import <Foundation/NSCalendarDate.h>
25 #import <Foundation/NSDictionary.h>
26 #import <Foundation/NSKeyValueCoding.h>
27 #import <Foundation/NSString.h>
28 #import <Foundation/NSValue.h>
30 #import <EOControl/EOQualifier.h>
32 #import <NGExtensions/NSCalendarDate+misc.h>
33 #import <NGExtensions/NGCalendarDateRange.h>
35 #import <SOGoUI/SOGoDateFormatter.h>
37 #import "UIxCalDayView.h"
39 @interface UIxCalDayView (PrivateAPI)
40 - (BOOL)isCurrentDateInApt:(id)_apt;
41 - (NSArray *)_getDatesFrom:(NSCalendarDate *)_from to:(NSCalendarDate *)_to;
44 @implementation UIxCalDayView
48 [self->currentDate release];
52 - (void) setCurrentDate: (NSCalendarDate *) _date
54 ASSIGN(self->currentDate, _date);
57 - (NSCalendarDate *) currentDate
59 return self->currentDate;
62 - (BOOL) isCurrentDateInApt
64 return [self isCurrentDateInApt: [self appointment]];
67 - (BOOL) isCurrentDateInApt: (id) _apt
69 NSCalendarDate *dateStart, *dateEnd, *aptStart, *aptEnd;
70 NGCalendarDateRange *dateRange, *aptRange;
72 dateStart = self->currentDate;
73 dateEnd = [dateStart dateByAddingYears:0 months:0 days:0
74 hours:1 minutes:0 seconds:0];
75 dateRange = [NGCalendarDateRange calendarDateRangeWithStartDate:dateStart
77 aptStart = [self->appointment valueForKey:@"startDate"];
78 aptEnd = [self->appointment valueForKey:@"endDate"];
79 aptRange = [NGCalendarDateRange calendarDateRangeWithStartDate:aptStart
82 return [dateRange doesIntersectWithDateRange:aptRange];
85 - (NSArray *) dateRange
87 /* default range is from dayStartHour to dayEndHour. Any values before
88 or after are also fine */
90 NSCalendarDate *min, *max;
91 NSArray *aptDateRanges;
93 min = [[self startDate] hour:[self dayStartHour] minute:0];
94 max = [[self startDate] hour:[self dayEndHour] minute:0];
96 aptDateRanges = [[self appointments] valueForKey: @"startDate"];
97 if([aptDateRanges count] != 0) {
101 = [aptDateRanges sortedArrayUsingSelector: @selector(compareAscending:)];
102 d = [aptDateRanges objectAtIndex:0];
103 if ([d isDateOnSameDay:min])
104 min = (NSCalendarDate *)[d earlierDate:min];
105 d = [aptDateRanges objectAtIndex:[aptDateRanges count] - 1];
106 if ([d isDateOnSameDay:max])
107 max = (NSCalendarDate *)[d laterDate:max];
110 return [self _getDatesFrom:min to:max];
113 - (NSArray *) _getDatesFrom: (NSCalendarDate *) _from
114 to: (NSCalendarDate *) _to
116 NSMutableArray *dates;
117 unsigned i, count, offset;
119 offset = [_from hourOfDay];
120 count = ([_to hourOfDay] + 1) - offset;
121 dates = [[NSMutableArray alloc] initWithCapacity:count];
122 for(i = 0; i < count; i++) {
123 NSCalendarDate *date;
125 date = [_from hour:offset + i minute:0];
126 [dates addObject:date];
128 return [dates autorelease];
133 - (NSDictionary *) dayBeforePrevDayQueryParameters
135 return [self _dateQueryParametersWithOffset: -2];
138 - (NSDictionary *) prevDayQueryParameters
140 return [self _dateQueryParametersWithOffset: -1];
143 - (NSDictionary *) nextDayQueryParameters
145 return [self _dateQueryParametersWithOffset: 1];
148 - (NSDictionary *) dayAfterNextDayQueryParameters
150 return [self _dateQueryParametersWithOffset: 2];
153 - (NSDictionary *) currentDateQueryParameters
155 NSMutableDictionary *qp;
157 NSCalendarDate *date;
159 date = [self currentDate];
160 hmString = [NSString stringWithFormat:@"%.2d%.2d",
161 [date hourOfDay], [date minuteOfHour]];
162 qp = [[self queryParameters] mutableCopy];
163 [self setSelectedDateQueryParameter:date inDictionary:qp];
164 [qp setObject:hmString forKey:@"hm"];
165 return [qp autorelease];
170 - (NSCalendarDate *) startDate
172 return [[self selectedDate] beginOfDay];
175 - (NSCalendarDate *) endDate
177 return [[self selectedDate] endOfDay];
182 - (NSArray *) appointments
184 return [self fetchCoreAppointmentsInfos];
187 - (NSArray *)aptsForCurrentDate {
189 NSMutableArray *filtered;
191 NSCalendarDate *start, *end;
193 start = self->currentDate;
194 end = [start dateByAddingYears:0
201 apts = [self appointments];
202 filtered = [[NSMutableArray alloc] initWithCapacity:1];
203 count = [apts count];
204 for (i = 0; i < count; i++) {
206 NSCalendarDate *aptStartDate;
208 apt = [apts objectAtIndex:i];
209 aptStartDate = [apt valueForKey:@"startDate"];
210 if([aptStartDate isGreaterThanOrEqualTo:start] &&
211 [aptStartDate isLessThan:end])
213 [filtered addObject:apt];
217 return [filtered autorelease];
220 - (NSArray *)allDayApts {
221 NSCalendarDate *start;
223 NSMutableArray *filtered;
226 if (self->allDayApts)
227 return self->allDayApts;
229 start = [self startDate];
230 apts = [self appointments];
231 filtered = [[NSMutableArray alloc] initWithCapacity:1];
232 count = [apts count];
233 for (i = 0; i < count; i++) {
237 apt = [apts objectAtIndex:i];
238 bv = [apt valueForKey:@"isallday"];
239 if ([bv boolValue]) {
240 [filtered addObject:apt];
243 NSCalendarDate *aptStartDate;
245 aptStartDate = [apt valueForKey:@"startDate"];
246 if([aptStartDate isLessThan:start]) {
247 [filtered addObject:apt];
252 ASSIGN(self->allDayApts, filtered);
254 return self->allDayApts;
257 - (BOOL) hasAptsForCurrentDate
259 return [[self aptsForCurrentDate] count] != 0;
262 - (NSString *) _dayNameWithOffsetFromToday: (int) offset
264 NSCalendarDate *date;
266 date = [[self selectedDate] dateByAddingYears: 0
270 return [self localizedNameForDayOfWeek: [date dayOfWeek]];
273 - (NSString *) dayBeforeYesterdayName
275 return [self _dayNameWithOffsetFromToday: -2];
278 - (NSString *) yesterdayName
280 return [self _dayNameWithOffsetFromToday: -1];
283 - (NSString *) currentDayName
285 return [self _dayNameWithOffsetFromToday: 0];
288 - (NSString *) tomorrowName
290 return [self _dayNameWithOffsetFromToday: 1];
293 - (NSString *) dayAfterTomorrowName
295 return [self _dayNameWithOffsetFromToday: 2];