1 /* UIxCalMonthView.m - this file is part of SOGo
3 * Copyright (C) 2006 Inverse groupe conseil
5 * Author: Wolfgang Sourdeau <wsourdeau@inverse.ca>
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)
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.
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.
23 #import <Foundation/NSArray.h>
24 #import <Foundation/NSCalendarDate.h>
25 #import <Foundation/NSString.h>
27 #import <NGExtensions/NSCalendarDate+misc.h>
28 #import <SoObjects/SOGo/NSCalendarDate+SOGo.h>
30 #import <SOGoUI/SOGoAptFormatter.h>
31 #import <SOGoUI/SOGoDateFormatter.h>
33 #import "UIxCalMonthView.h"
35 @implementation UIxCalMonthView
41 if ((self = [super init]))
43 tz = [[self clientObject] userTimeZone];
46 = [[SOGoAptFormatter alloc] initWithDisplayTimeZone: tz];
47 [monthAptFormatter setShortMonthTitleOnly];
48 dateFormatter = [[SOGoDateFormatter alloc]
49 initWithLocale: [self locale]];
50 sortedAppointments = [NSMutableDictionary new];
56 - (SOGoAptFormatter *) monthAptFormatter
58 return monthAptFormatter;
63 [monthAptFormatter release];
64 [dateFormatter release];
65 [sortedAppointments release];
69 - (void) _addEventToSortedEvents: (NSDictionary *) newEvent
71 NSMutableArray *eventArray;
74 dayId = [[newEvent objectForKey: @"startDate"] shortDateString];
75 eventArray = [sortedAppointments objectForKey: dayId];
78 eventArray = [NSMutableArray new];
79 [eventArray autorelease];
80 [sortedAppointments setObject: eventArray forKey: dayId];
82 [eventArray addObject: newEvent];
85 - (id <WOActionResults>) defaultAction
88 NSDictionary *currentEvent;
90 events = [[self fetchCoreAppointmentsInfos] objectEnumerator];
91 currentEvent = [events nextObject];
94 [self _addEventToSortedEvents: currentEvent];
95 currentEvent = [events nextObject];
96 // NSLog (@"event:\n'%@'", currentEvent);
102 - (NSArray *) daysToDisplay
104 NSMutableArray *daysToDisplay;
105 NSCalendarDate *currentDayToDisplay;
108 daysToDisplay = [NSMutableArray arrayWithCapacity: 7];
109 currentDayToDisplay = [[NSCalendarDate calendarDate] mondayOfWeek];
110 for (day = 0; day < 7; day++)
112 [daysToDisplay addObject: currentDayToDisplay];
114 = [currentDayToDisplay dateByAddingYears: 0 months: 0 days: 1];
117 return daysToDisplay;
120 - (NSString *) labelForCurrentDayToDisplay
122 return [dateFormatter fullDayOfWeek: [currentTableDay dayOfWeek]];
125 - (NSDictionary *) _dateQueryParametersWithOffset: (int) monthsOffset
127 NSCalendarDate *date;
129 date = [[self selectedDate] dateByAddingYears: 0 months: monthsOffset
130 days: 0 hours: 0 minutes: 0 seconds: 0];
132 return [self queryParametersBySettingSelectedDate: date];
135 - (NSDictionary *) monthBeforePrevMonthQueryParameters
137 return [self _dateQueryParametersWithOffset: -2];
140 - (NSDictionary *) prevMonthQueryParameters
142 return [self _dateQueryParametersWithOffset: -1];
145 - (NSDictionary *) nextMonthQueryParameters
147 return [self _dateQueryParametersWithOffset: 1];
150 - (NSDictionary *) monthAfterNextMonthQueryParameters
152 return [self _dateQueryParametersWithOffset: 2];
155 - (NSString *) _monthNameWithOffsetFromThisMonth: (int) offset
157 NSCalendarDate *date;
159 date = [[self selectedDate] dateByAddingYears: 0 months: offset days: 0];
161 return [self localizedNameForMonthOfYear: [date monthOfYear]];
164 - (NSString *) monthNameOfTwoMonthAgo
166 return [self _monthNameWithOffsetFromThisMonth: -2];
169 - (NSString *) monthNameOfOneMonthAgo
171 return [self _monthNameWithOffsetFromThisMonth: -1];
174 - (NSString *) monthNameOfThisMonth
176 return [self _monthNameWithOffsetFromThisMonth: 0];
179 - (NSString *) monthNameOfNextMonth
181 return [self _monthNameWithOffsetFromThisMonth: 1];
184 - (NSString *) monthNameOfTheMonthAfterNextMonth
186 return [self _monthNameWithOffsetFromThisMonth: 2];
189 /* template accessors */
190 - (void) setCurrentTableDay: (NSCalendarDate *) newCurrentTableDay
192 currentTableDay = newCurrentTableDay;
195 - (NSCalendarDate *) currentTableDay
197 return currentTableDay;
200 - (void) setCurrentRangeOf7Days: (NSArray *) newCurrentRangeOf7Days
202 currentRangeOf7Days = newCurrentRangeOf7Days;
205 - (NSArray *) currentRangeOf7Days
207 return currentRangeOf7Days;
210 - (NSString *) labelForCurrentDayCell
212 NSCalendarDate *lastDayOfMonth;
213 NSString *label, *monthOfYear;
216 dayOfMonth = [currentTableDay dayOfMonth];
217 lastDayOfMonth = [currentTableDay lastDayOfMonth];
219 || [currentTableDay isDateOnSameDay: lastDayOfMonth])
222 = [dateFormatter shortMonthOfYear: [currentTableDay monthOfYear]];
223 label = [NSString stringWithFormat: @"%d %@", dayOfMonth, monthOfYear];
226 label = [NSString stringWithFormat: @"%d", dayOfMonth];
231 - (NSString *) dayCellClasses
233 NSMutableString *classes;
234 NSCalendarDate *selectedDate;
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"];
255 - (NSArray *) _rangeOf7DaysForWeekStartingOn: (NSCalendarDate *) weekStart
258 NSMutableArray *range;
259 NSCalendarDate *currentDate;
261 range = [NSMutableArray arrayWithCapacity: 7];
262 currentDate = weekStart;
263 for (count = 0; count < 7; count++)
265 [range addObject: currentDate];
266 currentDate = [currentDate dateByAddingYears: 0 months: 0 days: 1];
272 - (NSCalendarDate *) startDate
274 NSCalendarDate *firstDayOfMonth;
276 firstDayOfMonth = [[self selectedDate] firstDayOfMonth];
278 return [firstDayOfMonth mondayOfWeek];
281 - (NSCalendarDate *) endDate
283 NSCalendarDate *lastDayOfMonth;
285 lastDayOfMonth = [[self selectedDate] lastDayOfMonth];
287 return [[lastDayOfMonth mondayOfWeek] dateByAddingYears: 0 months: 0 days: 6];
290 - (NSArray *) rangesOf7Days
292 NSCalendarDate *currentDate, *firstDayOfMonth, *lastDayOfMonth;
293 NSMutableArray *rangesOf7Days;
294 NSArray *currentRange;
297 rangesOf7Days = [NSMutableArray new];
298 [rangesOf7Days autorelease];
300 firstDayOfMonth = [[self selectedDate] firstDayOfMonth];
301 lastDayOfMonth = [firstDayOfMonth lastDayOfMonth];
302 currentDate = [firstDayOfMonth mondayOfWeek];
303 currentRange = [self _rangeOf7DaysForWeekStartingOn: currentDate];
304 [rangesOf7Days addObject: currentRange];
306 currentDate = [[currentRange objectAtIndex: 6] dateByAddingYears: 0
308 monthOfYear = [currentDate monthOfYear];
309 while ([currentDate monthOfYear] == monthOfYear)
311 currentRange = [self _rangeOf7DaysForWeekStartingOn: currentDate];
312 [rangesOf7Days addObject: currentRange];
313 currentDate = [[currentRange objectAtIndex: 6] dateByAddingYears: 0
317 return rangesOf7Days;
320 - (NSArray *) aptsForCurrentDate
322 return [sortedAppointments objectForKey: [currentTableDay shortDateString]];