1 /* UIxCalMonthView.m - this file is part of SOGo
3 * Copyright (C) 2006, 2007 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 <SoObjects/SOGo/SOGoDateFormatter.h>
33 #import "UIxCalMonthView.h"
35 @implementation UIxCalMonthView
41 if ((self = [super init]))
44 // = [[SOGoAptFormatter alloc] initWithDisplayTimeZone: timeZone];
45 // [monthAptFormatter setShortMonthTitleOnly];
46 // dateFormatter = [[SOGoDateFormatter alloc]
47 // initWithLocale: [self locale]];
48 locale = [context valueForKey: @"locale"];
49 dayNames = [locale objectForKey: NSWeekDayNameArray];
51 monthNames = [locale objectForKey: NSMonthNameArray];
53 sortedAppointments = [NSMutableDictionary new];
60 // - (SOGoAptFormatter *) monthAptFormatter
62 // return monthAptFormatter;
69 [daysToDisplay release];
70 // [monthAptFormatter release];
71 // [dateFormatter release];
72 [sortedAppointments release];
76 - (NSArray *) headerDaysToDisplay
78 NSMutableArray *headerDaysToDisplay;
81 headerDaysToDisplay = [NSMutableArray arrayWithCapacity: 7];
82 currentTableDay = [[self selectedDate] mondayOfWeek];
83 for (counter = 0; counter < 7; counter++)
85 [headerDaysToDisplay addObject: currentTableDay];
86 currentTableDay = [currentTableDay tomorrow];
89 return headerDaysToDisplay;
92 - (NSArray *) daysToDisplay
94 NSMutableArray *days[7];
96 NSCalendarDate *firstOfAllDays, *lastDayOfMonth;
100 firstOfAllDays = [[[self selectedDate] firstDayOfMonth] mondayOfWeek];
101 lastDayOfMonth = [[self selectedDate] lastDayOfMonth];
102 for (counter = 0; counter < 7; counter++)
104 days[counter] = [NSMutableArray new];
105 [days[counter] autorelease];
107 currentTableDay = firstOfAllDays;
108 while ([currentTableDay earlierDate: lastDayOfMonth] == currentTableDay)
109 for (counter = 0; counter < 7; counter++)
111 [days[counter] addObject: currentTableDay];
112 currentTableDay = [currentTableDay tomorrow];
114 daysToDisplay = [NSArray arrayWithObjects: days count: 7];
115 [daysToDisplay retain];
118 return daysToDisplay;
121 - (NSString *) labelForCurrentDayToDisplay
123 return [dayNames objectAtIndex: [currentTableDay dayOfWeek]];
126 - (NSDictionary *) _dateQueryParametersWithOffset: (int) monthsOffset
128 NSCalendarDate *date;
130 date = [[self selectedDate] dateByAddingYears: 0 months: monthsOffset
131 days: 0 hours: 0 minutes: 0 seconds: 0];
133 return [self queryParametersBySettingSelectedDate: date];
136 - (NSDictionary *) monthBeforePrevMonthQueryParameters
138 return [self _dateQueryParametersWithOffset: -2];
141 - (NSDictionary *) prevMonthQueryParameters
143 return [self _dateQueryParametersWithOffset: -1];
146 - (NSDictionary *) nextMonthQueryParameters
148 return [self _dateQueryParametersWithOffset: 1];
151 - (NSDictionary *) monthAfterNextMonthQueryParameters
153 return [self _dateQueryParametersWithOffset: 2];
156 - (NSString *) _monthNameWithOffsetFromThisMonth: (int) offset
158 NSCalendarDate *date;
160 date = [[self selectedDate] dateByAddingYears: 0 months: offset days: 0];
162 return [self localizedNameForMonthOfYear: [date monthOfYear]];
165 - (NSString *) monthNameOfTwoMonthAgo
167 return [self _monthNameWithOffsetFromThisMonth: -2];
170 - (NSString *) monthNameOfOneMonthAgo
172 return [self _monthNameWithOffsetFromThisMonth: -1];
175 - (NSString *) monthNameOfThisMonth
177 return [self _monthNameWithOffsetFromThisMonth: 0];
180 - (NSString *) monthNameOfNextMonth
182 return [self _monthNameWithOffsetFromThisMonth: 1];
185 - (NSString *) monthNameOfTheMonthAfterNextMonth
187 return [self _monthNameWithOffsetFromThisMonth: 2];
190 /* template accessors */
191 - (void) setCurrentTableDay: (NSCalendarDate *) newCurrentTableDay
193 currentTableDay = newCurrentTableDay;
196 - (NSCalendarDate *) currentTableDay
198 return currentTableDay;
201 - (void) setCurrentTableColumn: (NSArray *) newCurrentTableColumn
203 currentTableColumn = newCurrentTableColumn;
206 - (NSArray *) currentTableColumn
208 return currentTableColumn;
211 - (NSString *) labelForCurrentDayCell
213 NSCalendarDate *lastDayOfMonth;
214 NSString *label, *monthOfYear;
217 dayOfMonth = [currentTableDay dayOfMonth];
218 lastDayOfMonth = [currentTableDay lastDayOfMonth];
220 || [currentTableDay isDateOnSameDay: lastDayOfMonth])
223 = [monthNames objectAtIndex: [currentTableDay monthOfYear]];
224 label = [NSString stringWithFormat: @"%d %@", dayOfMonth, monthOfYear];
227 label = [NSString stringWithFormat: @"%d", dayOfMonth];
232 - (NSString *) headerDayCellClasses
234 return [NSString stringWithFormat: @"headerDay day%d",
235 [currentTableDay dayOfWeek]];
238 - (NSString *) dayHeaderNumber
240 NSString *nameOfMonth, *dayHeaderNumber;
241 unsigned int dayOfMonth;
243 dayOfMonth = [currentTableDay dayOfMonth];
245 || [currentTableDay isDateOnSameDay: [currentTableDay lastDayOfMonth]])
248 = [self localizedNameForMonthOfYear: [currentTableDay monthOfYear]];
249 dayHeaderNumber = [NSString stringWithFormat: @"%d %@", dayOfMonth,
253 dayHeaderNumber = [NSString stringWithFormat: @"%d", dayOfMonth];
255 return dayHeaderNumber;
258 - (NSString *) dayCellClasses
260 NSMutableString *classes;
261 NSCalendarDate *selectedDate;
262 int dayOfWeek, numberOfWeeks;
264 classes = [NSMutableString new];
265 [classes autorelease];
267 dayOfWeek = [currentTableDay dayOfWeek];
268 numberOfWeeks = [currentTableColumn count];
270 [classes appendFormat: @"day weekOf%d week%dof%d day%d",
272 [currentTableColumn indexOfObject: currentTableDay],
273 numberOfWeeks, dayOfWeek];
274 if (dayOfWeek == 0 || dayOfWeek == 6)
275 [classes appendString: @" weekEndDay"];
276 selectedDate = [self selectedDate];
277 if (![[currentTableDay firstDayOfMonth]
278 isDateOnSameDay: [selectedDate firstDayOfMonth]])
279 [classes appendString: @" dayOfAnotherMonth"];
280 if ([currentTableDay isToday])
281 [classes appendString: @" dayOfToday"];
282 if ([selectedDate isDateOnSameDay: currentTableDay])
283 [classes appendString: @" selectedDay"];
288 - (NSArray *) _rangeOf7DaysForWeekStartingOn: (NSCalendarDate *) weekStart
291 NSMutableArray *range;
292 NSCalendarDate *currentDate;
294 range = [NSMutableArray arrayWithCapacity: 7];
295 currentDate = weekStart;
296 for (count = 0; count < 7; count++)
298 [range addObject: currentDate];
299 currentDate = [currentDate dateByAddingYears: 0 months: 0 days: 1];
305 - (NSCalendarDate *) startDate
307 NSCalendarDate *firstDayOfMonth;
309 firstDayOfMonth = [[self selectedDate] firstDayOfMonth];
311 return [firstDayOfMonth mondayOfWeek];
314 - (NSCalendarDate *) endDate
316 NSCalendarDate *lastDayOfMonth;
318 lastDayOfMonth = [[self selectedDate] lastDayOfMonth];
320 return [[lastDayOfMonth mondayOfWeek] dateByAddingYears: 0 months: 0 days: 6];
323 - (NSArray *) aptsForCurrentDate
325 return [sortedAppointments objectForKey: [currentTableDay shortDateString]];