]> err.no Git - scalable-opengroupware.org/blob - UI/Scheduler/UIxCalMonthView.m
git-svn-id: http://svn.opengroupware.org/SOGo/inverse/trunk@1032 d1b88da0-ebda-0310...
[scalable-opengroupware.org] / UI / Scheduler / UIxCalMonthView.m
1 /* UIxCalMonthView.m - this file is part of SOGo
2  *
3  * Copyright (C) 2006, 2007 Inverse groupe conseil
4  *
5  * Author: Wolfgang Sourdeau <wsourdeau@inverse.ca>
6  *
7  * This file is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2, or (at your option)
10  * any later version.
11  *
12  * This file is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; see the file COPYING.  If not, write to
19  * the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20  * Boston, MA 02111-1307, USA.
21  */
22
23 #import <Foundation/NSArray.h>
24 #import <Foundation/NSCalendarDate.h>
25 #import <Foundation/NSString.h>
26
27 #import <NGExtensions/NSCalendarDate+misc.h>
28 #import <SoObjects/SOGo/NSCalendarDate+SOGo.h>
29
30 #import <SOGoUI/SOGoAptFormatter.h>
31 #import <SOGoUI/SOGoDateFormatter.h>
32
33 #import "UIxCalMonthView.h"
34
35 @implementation UIxCalMonthView
36
37 - (id) init
38 {
39   NSTimeZone *tz;
40
41   if ((self = [super init]))
42     {
43       tz = [[self clientObject] userTimeZone];
44  
45       monthAptFormatter
46         = [[SOGoAptFormatter alloc] initWithDisplayTimeZone: tz];
47       [monthAptFormatter setShortMonthTitleOnly];
48       dateFormatter = [[SOGoDateFormatter alloc]
49                         initWithLocale: [self locale]];
50       sortedAppointments = [NSMutableDictionary new];
51       daysToDisplay = nil;
52     }
53
54   return self;
55 }
56
57 - (SOGoAptFormatter *) monthAptFormatter
58 {
59   return monthAptFormatter;
60 }
61
62 - (void) dealloc
63 {
64   [daysToDisplay release];
65   [monthAptFormatter release];
66   [dateFormatter release];
67   [sortedAppointments release];
68   [super dealloc];
69 }
70
71 - (void) _addEventToSortedEvents: (NSDictionary *) newEvent
72 {
73   NSMutableArray *eventArray;
74   NSString *dayId;
75
76   dayId = [[newEvent objectForKey: @"startDate"] shortDateString];
77   eventArray = [sortedAppointments objectForKey: dayId];
78   if (!eventArray)
79     {
80       eventArray = [NSMutableArray new];
81       [eventArray autorelease];
82       [sortedAppointments setObject: eventArray forKey: dayId];
83     }
84   [eventArray addObject: newEvent];
85 }
86
87 - (id <WOActionResults>) defaultAction
88 {
89   NSEnumerator *events;
90   NSDictionary *currentEvent;
91
92   events = [[self fetchCoreAppointmentsInfos] objectEnumerator];
93   currentEvent = [events nextObject];
94   while (currentEvent)
95     {
96       [self _addEventToSortedEvents: currentEvent];
97       currentEvent = [events nextObject];
98 //       NSLog (@"event:\n'%@'", currentEvent);
99     }
100
101   return self;
102 }
103
104 - (NSArray *) headerDaysToDisplay
105 {
106   NSMutableArray *headerDaysToDisplay;
107   unsigned int counter;
108
109   headerDaysToDisplay = [NSMutableArray arrayWithCapacity: 7];
110   currentTableDay = [[self selectedDate] mondayOfWeek];
111   for (counter = 0; counter < 7; counter++)
112     {
113       [headerDaysToDisplay addObject: currentTableDay];
114       currentTableDay = [currentTableDay tomorrow];
115     }
116
117   return headerDaysToDisplay;
118 }
119
120 - (NSArray *) daysToDisplay
121 {
122   NSMutableArray *days[7];
123   unsigned int counter;
124   NSCalendarDate *firstOfAllDays, *lastDayOfMonth;
125
126   if (!daysToDisplay)
127     {
128       firstOfAllDays = [[[self selectedDate] firstDayOfMonth] mondayOfWeek];
129       lastDayOfMonth  = [[self selectedDate] lastDayOfMonth];
130       for (counter = 0; counter < 7; counter++)
131         {
132           days[counter] = [NSMutableArray new];
133           [days[counter] autorelease];
134         }
135       currentTableDay = firstOfAllDays;
136       while ([currentTableDay earlierDate: lastDayOfMonth] == currentTableDay)
137         for (counter = 0; counter < 7; counter++)
138           {
139             [days[counter] addObject: currentTableDay];
140             currentTableDay = [currentTableDay tomorrow];
141           }
142       daysToDisplay = [NSArray arrayWithObjects: days count: 7];
143       [daysToDisplay retain];
144     }
145
146   return daysToDisplay;
147 }
148
149 - (NSString *) labelForCurrentDayToDisplay
150 {
151   return [dateFormatter fullDayOfWeek: [currentTableDay dayOfWeek]];
152 }
153
154 - (NSDictionary *) _dateQueryParametersWithOffset: (int) monthsOffset
155 {
156   NSCalendarDate *date;
157   
158   date = [[self selectedDate] dateByAddingYears: 0 months: monthsOffset
159                               days: 0 hours: 0 minutes: 0 seconds: 0];
160
161   return [self queryParametersBySettingSelectedDate: date];
162 }
163
164 - (NSDictionary *) monthBeforePrevMonthQueryParameters
165 {
166   return [self _dateQueryParametersWithOffset: -2];
167 }
168
169 - (NSDictionary *) prevMonthQueryParameters
170 {
171   return [self _dateQueryParametersWithOffset: -1];
172 }
173
174 - (NSDictionary *) nextMonthQueryParameters
175 {
176   return [self _dateQueryParametersWithOffset: 1];
177 }
178
179 - (NSDictionary *) monthAfterNextMonthQueryParameters
180 {
181   return [self _dateQueryParametersWithOffset: 2];
182 }
183
184 - (NSString *) _monthNameWithOffsetFromThisMonth: (int) offset
185 {
186   NSCalendarDate *date;
187
188   date = [[self selectedDate] dateByAddingYears: 0 months: offset days: 0];
189
190   return [self localizedNameForMonthOfYear: [date monthOfYear]];
191 }
192
193 - (NSString *) monthNameOfTwoMonthAgo
194 {
195   return [self _monthNameWithOffsetFromThisMonth: -2];
196 }
197
198 - (NSString *) monthNameOfOneMonthAgo
199 {
200   return [self _monthNameWithOffsetFromThisMonth: -1];
201 }
202
203 - (NSString *) monthNameOfThisMonth
204 {
205   return [self _monthNameWithOffsetFromThisMonth: 0];
206 }
207
208 - (NSString *) monthNameOfNextMonth
209 {
210   return [self _monthNameWithOffsetFromThisMonth: 1];
211 }
212
213 - (NSString *) monthNameOfTheMonthAfterNextMonth
214 {
215   return [self _monthNameWithOffsetFromThisMonth: 2];
216 }
217
218 /* template accessors */
219 - (void) setCurrentTableDay: (NSCalendarDate *) newCurrentTableDay
220 {
221   currentTableDay = newCurrentTableDay;
222 }
223
224 - (NSCalendarDate *) currentTableDay
225 {
226   return currentTableDay;
227 }
228
229 - (void) setCurrentTableColumn: (NSArray *) newCurrentTableColumn
230 {
231   currentTableColumn = newCurrentTableColumn;
232 }
233
234 - (NSArray *) currentTableColumn
235 {
236   return currentTableColumn;
237 }
238
239 - (NSString *) labelForCurrentDayCell
240 {
241   NSCalendarDate *lastDayOfMonth;
242   NSString *label, *monthOfYear;
243   int dayOfMonth;
244
245   dayOfMonth = [currentTableDay dayOfMonth];
246   lastDayOfMonth = [currentTableDay lastDayOfMonth];
247   if (dayOfMonth == 1
248       || [currentTableDay isDateOnSameDay: lastDayOfMonth])
249     {
250       monthOfYear
251         = [dateFormatter shortMonthOfYear: [currentTableDay monthOfYear]];
252       label = [NSString stringWithFormat: @"%d %@", dayOfMonth, monthOfYear];
253     }
254   else
255     label = [NSString stringWithFormat: @"%d", dayOfMonth];
256
257   return label;
258 }
259
260 - (NSString *) headerDayCellClasses
261 {
262   return [NSString stringWithFormat: @"headerDay day%d",
263                    [currentTableDay dayOfWeek]];
264 }
265
266 - (NSString *) dayHeaderNumber
267 {
268   NSString *nameOfMonth, *dayHeaderNumber;
269   unsigned int dayOfMonth;
270
271   dayOfMonth = [currentTableDay dayOfMonth];
272   if (dayOfMonth == 1
273       || [currentTableDay isDateOnSameDay: [currentTableDay lastDayOfMonth]])
274     {
275       nameOfMonth
276         = [self localizedNameForMonthOfYear: [currentTableDay monthOfYear]];
277       dayHeaderNumber = [NSString stringWithFormat: @"%d %@", dayOfMonth,
278                                   nameOfMonth];
279     }
280   else
281     dayHeaderNumber = [NSString stringWithFormat: @"%d", dayOfMonth];
282
283   return dayHeaderNumber;
284 }
285
286 - (NSString *) dayCellClasses
287 {
288   NSMutableString *classes;
289   NSCalendarDate *selectedDate;
290   int dayOfWeek, numberOfWeeks;
291
292   classes = [NSMutableString new];
293   [classes autorelease];
294
295   dayOfWeek = [currentTableDay dayOfWeek];
296   numberOfWeeks = [currentTableColumn count];
297
298   [classes appendFormat: @"day weekOf%d week%dof%d day%d",
299            numberOfWeeks,
300            [currentTableColumn indexOfObject: currentTableDay],
301            numberOfWeeks, dayOfWeek];
302   if (dayOfWeek == 0 || dayOfWeek == 6)
303     [classes appendString: @" weekEndDay"];
304   selectedDate = [self selectedDate];
305   if (![[currentTableDay firstDayOfMonth]
306          isDateOnSameDay: [selectedDate firstDayOfMonth]])
307     [classes appendString: @" dayOfAnotherMonth"];
308   if ([currentTableDay isToday])
309     [classes appendString: @" dayOfToday"];
310   if ([selectedDate isDateOnSameDay: currentTableDay])
311     [classes appendString: @" selectedDay"];
312
313   return classes;
314 }
315
316 - (NSArray *) _rangeOf7DaysForWeekStartingOn: (NSCalendarDate *) weekStart
317 {
318   unsigned int count;
319   NSMutableArray *range;
320   NSCalendarDate *currentDate;
321
322   range = [NSMutableArray arrayWithCapacity: 7];
323   currentDate = weekStart;
324   for (count = 0; count < 7; count++)
325     {
326       [range addObject: currentDate];
327       currentDate = [currentDate dateByAddingYears: 0 months: 0 days: 1];
328     }
329
330   return range;
331 }
332
333 - (NSCalendarDate *) startDate
334 {
335   NSCalendarDate *firstDayOfMonth;
336
337   firstDayOfMonth = [[self selectedDate] firstDayOfMonth];
338
339   return [firstDayOfMonth mondayOfWeek];
340 }
341
342 - (NSCalendarDate *) endDate
343 {
344   NSCalendarDate *lastDayOfMonth;
345
346   lastDayOfMonth = [[self selectedDate] lastDayOfMonth];
347
348   return [[lastDayOfMonth mondayOfWeek] dateByAddingYears: 0 months: 0 days: 6];
349 }
350
351 - (NSArray *) aptsForCurrentDate
352 {
353   return [sortedAppointments objectForKey: [currentTableDay shortDateString]];
354 }
355
356 @end