]> err.no Git - scalable-opengroupware.org/blob - UI/Scheduler/UIxCalDayView.m
git-svn-id: http://svn.opengroupware.org/SOGo/inverse/trunk@1032 d1b88da0-ebda-0310...
[scalable-opengroupware.org] / UI / Scheduler / UIxCalDayView.m
1 /*
2   Copyright (C) 2004 SKYRIX Software AG
3
4   This file is part of OpenGroupware.org.
5
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
9   later version.
10
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.
15
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
19   02111-1307, USA.
20 */
21 // $Id$
22
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>
29
30 #import <EOControl/EOQualifier.h>
31
32 #import <NGExtensions/NSCalendarDate+misc.h>
33 #import <NGExtensions/NGCalendarDateRange.h>
34
35 #import <SOGoUI/SOGoDateFormatter.h>
36
37 #import "UIxCalDayView.h"
38
39 @interface UIxCalDayView (PrivateAPI)
40 - (BOOL)isCurrentDateInApt:(id)_apt;
41 - (NSArray *)_getDatesFrom:(NSCalendarDate *)_from to:(NSCalendarDate *)_to;
42 @end
43
44 @implementation UIxCalDayView
45
46 - (void) dealloc
47 {
48   [self->currentDate release];
49   [super dealloc];
50 }
51
52 - (void) setCurrentDate: (NSCalendarDate *) _date
53 {
54   ASSIGN(self->currentDate, _date);
55 }
56
57 - (NSCalendarDate *) currentDate
58 {
59   return self->currentDate;
60 }
61
62 - (BOOL) isCurrentDateInApt
63 {
64   return [self isCurrentDateInApt: [self appointment]];
65 }
66
67 - (BOOL) isCurrentDateInApt: (id) _apt
68 {
69   NSCalendarDate *dateStart, *dateEnd, *aptStart, *aptEnd;
70   NGCalendarDateRange *dateRange, *aptRange;
71     
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
76                                    endDate:dateEnd];
77   aptStart = [self->appointment valueForKey:@"startDate"];
78   aptEnd   = [self->appointment valueForKey:@"endDate"];
79   aptRange = [NGCalendarDateRange calendarDateRangeWithStartDate:aptStart
80                                   endDate:aptEnd];
81
82   return [dateRange doesIntersectWithDateRange:aptRange];
83 }
84
85 - (NSArray *) dateRange
86 {
87   /* default range is from dayStartHour to dayEndHour. Any values before
88      or after are also fine */
89
90   NSCalendarDate *min, *max;
91   NSArray        *aptDateRanges;
92
93   min = [[self startDate] hour:[self dayStartHour] minute:0];
94   max = [[self startDate] hour:[self dayEndHour]   minute:0];
95
96   aptDateRanges = [[self appointments] valueForKey: @"startDate"];
97   if([aptDateRanges count] != 0) {
98     NSCalendarDate *d;
99
100     aptDateRanges
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];
108   }
109   
110   return [self _getDatesFrom:min to:max];
111 }
112
113 - (NSArray *) _getDatesFrom: (NSCalendarDate *) _from
114                          to: (NSCalendarDate *) _to
115 {
116   NSMutableArray *dates;
117   unsigned       i, count, offset;
118
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;
124         
125     date = [_from hour:offset + i minute:0];
126     [dates addObject:date];
127   }
128   return [dates autorelease];
129 }
130
131 /* URLs */
132
133 - (NSDictionary *) dayBeforePrevDayQueryParameters
134 {
135   return [self _dateQueryParametersWithOffset: -2];
136 }
137
138 - (NSDictionary *) prevDayQueryParameters
139 {
140   return [self _dateQueryParametersWithOffset: -1];
141 }
142
143 - (NSDictionary *) nextDayQueryParameters
144 {
145   return [self _dateQueryParametersWithOffset: 1];
146 }
147
148 - (NSDictionary *) dayAfterNextDayQueryParameters
149 {
150   return [self _dateQueryParametersWithOffset: 2];
151 }
152
153 - (NSDictionary *) currentDateQueryParameters
154 {
155   NSMutableDictionary *qp;
156   NSString *hmString;
157   NSCalendarDate *date;
158     
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];
166 }
167
168 /* fetching */
169
170 - (NSCalendarDate *) startDate
171 {
172   return [[self selectedDate] beginOfDay];
173 }
174
175 - (NSCalendarDate *) endDate
176 {
177   return [[self selectedDate] endOfDay];
178 }
179
180 /* appointments */
181
182 - (NSArray *) appointments
183 {
184   return [self fetchCoreAppointmentsInfos];
185 }
186
187 - (NSArray *)aptsForCurrentDate {
188   NSArray        *apts;
189   NSMutableArray *filtered;
190   unsigned       i, count;
191   NSCalendarDate *start, *end;
192
193   start = self->currentDate;
194   end   = [start dateByAddingYears:0
195                             months:0
196                               days:0
197                              hours:0
198                            minutes:59
199                            seconds:59];
200   
201   apts     = [self appointments];
202   filtered = [[NSMutableArray alloc] initWithCapacity:1];
203   count    = [apts count];
204   for (i = 0; i < count; i++) {
205     id apt;
206     NSCalendarDate *aptStartDate;
207     
208     apt = [apts objectAtIndex:i];
209     aptStartDate = [apt valueForKey:@"startDate"];
210     if([aptStartDate isGreaterThanOrEqualTo:start] &&
211        [aptStartDate isLessThan:end])
212     {
213       [filtered addObject:apt];
214     }
215   }
216   
217   return [filtered autorelease];
218 }
219
220 - (NSArray *)allDayApts {
221   NSCalendarDate *start;
222   NSArray        *apts;
223   NSMutableArray *filtered;
224   unsigned       i, count;
225   
226   if (self->allDayApts)
227     return self->allDayApts;
228
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++) {
234     id       apt;
235     NSNumber *bv;
236     
237     apt = [apts objectAtIndex:i];
238     bv  = [apt valueForKey:@"isallday"];
239     if ([bv boolValue]) {
240       [filtered addObject:apt];
241     }
242     else {
243       NSCalendarDate *aptStartDate;
244
245       aptStartDate = [apt valueForKey:@"startDate"];
246       if([aptStartDate isLessThan:start]) {
247         [filtered addObject:apt];
248       }
249     }
250   }
251   
252   ASSIGN(self->allDayApts, filtered);
253   [filtered release];
254   return self->allDayApts;
255 }
256
257 - (BOOL) hasAptsForCurrentDate
258 {
259   return [[self aptsForCurrentDate] count] != 0;
260 }
261
262 - (NSString *) _dayNameWithOffsetFromToday: (int) offset
263 {
264   NSCalendarDate *date;
265
266   date = [[self selectedDate] dateByAddingYears: 0
267                               months: 0
268                               days: offset];
269
270   return [self localizedNameForDayOfWeek: [date dayOfWeek]];
271 }
272
273 - (NSString *) dayBeforeYesterdayName
274 {
275   return [self _dayNameWithOffsetFromToday: -2];
276 }
277
278 - (NSString *) yesterdayName
279 {
280   return [self _dayNameWithOffsetFromToday: -1];
281 }
282
283 - (NSString *) currentDayName
284 {
285   return [self _dayNameWithOffsetFromToday: 0];
286 }
287
288 - (NSString *) tomorrowName
289 {
290   return [self _dayNameWithOffsetFromToday: 1];
291 }
292
293 - (NSString *) dayAfterTomorrowName
294 {
295   return [self _dayNameWithOffsetFromToday: 2];
296 }
297
298 @end