]> err.no Git - scalable-opengroupware.org/blob - UI/Scheduler/UIxCalMonthView.m
git-svn-id: http://svn.opengroupware.org/SOGo/inverse/trunk@1017 d1b88da0-ebda-0310...
[scalable-opengroupware.org] / UI / Scheduler / UIxCalMonthView.m
1 /* UIxCalMonthView.m - this file is part of SOGo
2  *
3  * Copyright (C) 2006 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     }
52
53   return self;
54 }
55
56 - (SOGoAptFormatter *) monthAptFormatter
57 {
58   return monthAptFormatter;
59 }
60
61 - (void) dealloc
62 {
63   [monthAptFormatter release];
64   [dateFormatter release];
65   [sortedAppointments release];
66   [super dealloc];
67 }
68
69 - (void) _addEventToSortedEvents: (NSDictionary *) newEvent
70 {
71   NSMutableArray *eventArray;
72   NSString *dayId;
73
74   dayId = [[newEvent objectForKey: @"startDate"] shortDateString];
75   eventArray = [sortedAppointments objectForKey: dayId];
76   if (!eventArray)
77     {
78       eventArray = [NSMutableArray new];
79       [eventArray autorelease];
80       [sortedAppointments setObject: eventArray forKey: dayId];
81     }
82   [eventArray addObject: newEvent];
83 }
84
85 - (id <WOActionResults>) defaultAction
86 {
87   NSEnumerator *events;
88   NSDictionary *currentEvent;
89
90   events = [[self fetchCoreAppointmentsInfos] objectEnumerator];
91   currentEvent = [events nextObject];
92   while (currentEvent)
93     {
94       [self _addEventToSortedEvents: currentEvent];
95       currentEvent = [events nextObject];
96 //       NSLog (@"event:\n'%@'", currentEvent);
97     }
98
99   return self;
100 }
101
102 - (NSArray *) daysToDisplay
103 {
104   NSMutableArray *daysToDisplay;
105   NSCalendarDate *currentDayToDisplay;
106   unsigned int day;
107
108   daysToDisplay = [NSMutableArray arrayWithCapacity: 7];
109   currentDayToDisplay = [[NSCalendarDate calendarDate] mondayOfWeek];
110   for (day = 0; day < 7; day++)
111     {
112       [daysToDisplay addObject: currentDayToDisplay];
113       currentDayToDisplay
114         = [currentDayToDisplay dateByAddingYears: 0 months: 0 days: 1];
115     }
116
117   return daysToDisplay;
118 }
119
120 - (NSString *) labelForCurrentDayToDisplay
121 {
122   return [dateFormatter fullDayOfWeek: [currentTableDay dayOfWeek]];
123 }
124
125 - (NSDictionary *) _dateQueryParametersWithOffset: (int) monthsOffset
126 {
127   NSCalendarDate *date;
128   
129   date = [[self selectedDate] dateByAddingYears: 0 months: monthsOffset
130                               days: 0 hours: 0 minutes: 0 seconds: 0];
131
132   return [self queryParametersBySettingSelectedDate: date];
133 }
134
135 - (NSDictionary *) monthBeforePrevMonthQueryParameters
136 {
137   return [self _dateQueryParametersWithOffset: -2];
138 }
139
140 - (NSDictionary *) prevMonthQueryParameters
141 {
142   return [self _dateQueryParametersWithOffset: -1];
143 }
144
145 - (NSDictionary *) nextMonthQueryParameters
146 {
147   return [self _dateQueryParametersWithOffset: 1];
148 }
149
150 - (NSDictionary *) monthAfterNextMonthQueryParameters
151 {
152   return [self _dateQueryParametersWithOffset: 2];
153 }
154
155 - (NSString *) _monthNameWithOffsetFromThisMonth: (int) offset
156 {
157   NSCalendarDate *date;
158
159   date = [[self selectedDate] dateByAddingYears: 0 months: offset days: 0];
160
161   return [self localizedNameForMonthOfYear: [date monthOfYear]];
162 }
163
164 - (NSString *) monthNameOfTwoMonthAgo
165 {
166   return [self _monthNameWithOffsetFromThisMonth: -2];
167 }
168
169 - (NSString *) monthNameOfOneMonthAgo
170 {
171   return [self _monthNameWithOffsetFromThisMonth: -1];
172 }
173
174 - (NSString *) monthNameOfThisMonth
175 {
176   return [self _monthNameWithOffsetFromThisMonth: 0];
177 }
178
179 - (NSString *) monthNameOfNextMonth
180 {
181   return [self _monthNameWithOffsetFromThisMonth: 1];
182 }
183
184 - (NSString *) monthNameOfTheMonthAfterNextMonth
185 {
186   return [self _monthNameWithOffsetFromThisMonth: 2];
187 }
188
189 /* template accessors */
190 - (void) setCurrentTableDay: (NSCalendarDate *) newCurrentTableDay
191 {
192   currentTableDay = newCurrentTableDay;
193 }
194
195 - (NSCalendarDate *) currentTableDay
196 {
197   return currentTableDay;
198 }
199
200 - (void) setCurrentRangeOf7Days: (NSArray *) newCurrentRangeOf7Days
201 {
202   currentRangeOf7Days = newCurrentRangeOf7Days;
203 }
204
205 - (NSArray *) currentRangeOf7Days
206 {
207   return currentRangeOf7Days;
208 }
209
210 - (NSString *) labelForCurrentDayCell
211 {
212   NSCalendarDate *lastDayOfMonth;
213   NSString *label, *monthOfYear;
214   int dayOfMonth;
215
216   dayOfMonth = [currentTableDay dayOfMonth];
217   lastDayOfMonth = [currentTableDay lastDayOfMonth];
218   if (dayOfMonth == 1
219       || [currentTableDay isDateOnSameDay: lastDayOfMonth])
220     {
221       monthOfYear
222         = [dateFormatter shortMonthOfYear: [currentTableDay monthOfYear]];
223       label = [NSString stringWithFormat: @"%d %@", dayOfMonth, monthOfYear];
224     }
225   else
226     label = [NSString stringWithFormat: @"%d", dayOfMonth];
227
228   return label;
229 }
230
231 - (NSString *) dayCellClasses
232 {
233   NSMutableString *classes;
234   NSCalendarDate *selectedDate;
235   int dayOfWeek;
236
237   classes = [NSMutableString new];
238   [classes autorelease];
239   [classes appendString: @"day"];
240   dayOfWeek = [currentTableDay dayOfWeek];
241   if (dayOfWeek == 0 || dayOfWeek == 6)
242     [classes appendString: @" weekEndDay"];
243   selectedDate = [self selectedDate];
244   if (![[currentTableDay firstDayOfMonth]
245          isDateOnSameDay: [selectedDate firstDayOfMonth]])
246     [classes appendString: @" dayOfAnotherMonth"];
247   if ([currentTableDay isToday])
248     [classes appendString: @" dayOfToday"];
249   if ([selectedDate isDateOnSameDay: currentTableDay])
250     [classes appendString: @" selectedDay"];
251
252   return classes;
253 }
254
255 - (NSArray *) _rangeOf7DaysForWeekStartingOn: (NSCalendarDate *) weekStart
256 {
257   unsigned int count;
258   NSMutableArray *range;
259   NSCalendarDate *currentDate;
260
261   range = [NSMutableArray arrayWithCapacity: 7];
262   currentDate = weekStart;
263   for (count = 0; count < 7; count++)
264     {
265       [range addObject: currentDate];
266       currentDate = [currentDate dateByAddingYears: 0 months: 0 days: 1];
267     }
268
269   return range;
270 }
271
272 - (NSCalendarDate *) startDate
273 {
274   NSCalendarDate *firstDayOfMonth;
275
276   firstDayOfMonth = [[self selectedDate] firstDayOfMonth];
277
278   return [firstDayOfMonth mondayOfWeek];
279 }
280
281 - (NSCalendarDate *) endDate
282 {
283   NSCalendarDate *lastDayOfMonth;
284
285   lastDayOfMonth = [[self selectedDate] lastDayOfMonth];
286
287   return [[lastDayOfMonth mondayOfWeek] dateByAddingYears: 0 months: 0 days: 6];
288 }
289
290 - (NSArray *) rangesOf7Days
291 {
292   NSCalendarDate *currentDate, *firstDayOfMonth, *lastDayOfMonth;
293   NSMutableArray *rangesOf7Days;
294   NSArray *currentRange;
295   int monthOfYear;
296
297   rangesOf7Days = [NSMutableArray new];
298   [rangesOf7Days autorelease];
299
300   firstDayOfMonth = [[self selectedDate] firstDayOfMonth];
301   lastDayOfMonth = [firstDayOfMonth lastDayOfMonth];
302   currentDate = [firstDayOfMonth mondayOfWeek];
303   currentRange = [self _rangeOf7DaysForWeekStartingOn: currentDate];
304   [rangesOf7Days addObject: currentRange];
305
306   currentDate = [[currentRange objectAtIndex: 6] dateByAddingYears: 0
307                                                  months: 0 days: 1];
308   monthOfYear = [currentDate monthOfYear];
309   while ([currentDate monthOfYear] == monthOfYear)
310     {
311       currentRange = [self _rangeOf7DaysForWeekStartingOn: currentDate];
312       [rangesOf7Days addObject: currentRange];
313       currentDate = [[currentRange objectAtIndex: 6] dateByAddingYears: 0
314                                                      months: 0 days: 1];
315     }
316
317   return rangesOf7Days;
318 }
319
320 - (NSArray *) aptsForCurrentDate
321 {
322   return [sortedAppointments objectForKey: [currentTableDay shortDateString]];
323 }
324
325 @end