diff --git a/UI/Scheduler/UIxCalView.m b/UI/Scheduler/UIxCalView.m index c89699083..b057d0619 100644 --- a/UI/Scheduler/UIxCalView.m +++ b/UI/Scheduler/UIxCalView.m @@ -11,43 +11,48 @@ #include "UIxComponent+Agenor.h" @interface UIxCalView (PrivateAPI) -- (NSString *)_userFolderURI; +- (NSString *) _userFolderURI; @end @implementation UIxCalView static BOOL shouldDisplayWeekend = NO; -+ (void)initialize { - static BOOL didInit = NO; ++ (void) initialize +{ + static BOOL didInit = NO; NSUserDefaults *ud; if (didInit) return; - ud = [NSUserDefaults standardUserDefaults]; - shouldDisplayWeekend = [ud boolForKey:@"SOGoShouldDisplayWeekend"]; + ud = [NSUserDefaults standardUserDefaults]; + shouldDisplayWeekend = [ud boolForKey: @"SOGoShouldDisplayWeekend"]; + didInit = YES; } -- (id)init { +- (id) init +{ self = [super init]; - if(self) { - NSTimeZone *tz; + if (self) + { + NSTimeZone *tz; - tz = [self viewTimeZone]; - self->aptFormatter = - [[SOGoAptFormatter alloc] initWithDisplayTimeZone:tz]; - self->aptTooltipFormatter = - [[SOGoAptFormatter alloc] initWithDisplayTimeZone:tz]; - self->privateAptFormatter = - [[SOGoAptFormatter alloc] initWithDisplayTimeZone:tz]; - self->privateAptTooltipFormatter = - [[SOGoAptFormatter alloc] initWithDisplayTimeZone:tz]; - [self configureFormatters]; - } + tz = [self viewTimeZone]; + self->aptFormatter + = [[SOGoAptFormatter alloc] initWithDisplayTimeZone: tz]; + self->aptTooltipFormatter + = [[SOGoAptFormatter alloc] initWithDisplayTimeZone: tz]; + self->privateAptFormatter + = [[SOGoAptFormatter alloc] initWithDisplayTimeZone: tz]; + self->privateAptTooltipFormatter + = [[SOGoAptFormatter alloc] initWithDisplayTimeZone: tz]; + [self configureFormatters]; + } return self; } -- (void)dealloc { +- (void) dealloc +{ [self->appointments release]; [self->allDayApts release]; [self->appointment release]; @@ -60,7 +65,8 @@ static BOOL shouldDisplayWeekend = NO; } /* subclasses should override this */ -- (void)configureFormatters { +- (void) configureFormatters +{ NSString *title; [self->aptFormatter setFullDetails]; @@ -68,71 +74,78 @@ static BOOL shouldDisplayWeekend = NO; [self->privateAptFormatter setPrivateDetails]; [self->privateAptTooltipFormatter setPrivateTooltip]; - title = [self labelForKey:@"empty title"]; - [self->aptFormatter setTitlePlaceholder:title]; - [self->aptTooltipFormatter setTitlePlaceholder:title]; + title = [self labelForKey: @"empty title"]; + [self->aptFormatter setTitlePlaceholder: title]; + [self->aptTooltipFormatter setTitlePlaceholder: title]; - title = [self labelForKey:@"private appointment"]; - [self->privateAptFormatter setPrivateTitle:title]; - [self->privateAptTooltipFormatter setPrivateTitle:title]; + title = [self labelForKey: @"private appointment"]; + [self->privateAptFormatter setPrivateTitle: title]; + [self->privateAptTooltipFormatter setPrivateTitle: title]; } -- (NSArray *)filterAppointments:(NSArray *)_apts { +- (NSArray *) filterAppointments:(NSArray *) _apts +{ NSMutableArray *filtered; unsigned i, count; NSString *email; - count = [_apts count]; + count = [_apts count]; if (!count) return _apts; if ([self shouldDisplayRejectedAppointments]) return _apts; - filtered = [[[NSMutableArray alloc] initWithCapacity:count] autorelease]; - email = [self emailForUser]; + filtered = [[[NSMutableArray alloc] initWithCapacity: count] autorelease]; + email = [self emailForUser]; - for (i = 0; i < count; i++) { - NSDictionary *info; - NSArray *partmails; - unsigned p, pCount; - BOOL shouldAdd; + for (i = 0; i < count; i++) + { + NSDictionary *info; + NSArray *partmails; + unsigned p, pCount; + BOOL shouldAdd; - shouldAdd = YES; - info = [_apts objectAtIndex:i]; - partmails = [[info objectForKey:@"partmails"] - componentsSeparatedByString:@"\n"]; - pCount = [partmails count]; - for (p = 0; p < pCount; p++) { - NSString *pEmail; + shouldAdd = YES; + info = [_apts objectAtIndex: i]; + partmails = [[info objectForKey: @"partmails"] + componentsSeparatedByString: @"\n"]; + pCount = [partmails count]; + for (p = 0; p < pCount; p++) + { + NSString *pEmail; - pEmail = [partmails objectAtIndex:p]; - if ([pEmail isEqualToString:email]) { - NSArray *partstates; - NSString *state; + pEmail = [partmails objectAtIndex: p]; + if ([pEmail isEqualToString: email]) + { + NSArray *partstates; + NSString *state; - partstates = [[info objectForKey:@"partstates"] - componentsSeparatedByString:@"\n"]; - state = [partstates objectAtIndex:p]; - if ([state intValue] == iCalPersonPartStatDeclined) - shouldAdd = NO; - break; - } + partstates = [[info objectForKey: @"partstates"] + componentsSeparatedByString: @"\n"]; + state = [partstates objectAtIndex: p]; + if ([state intValue] == iCalPersonPartStatDeclined) + shouldAdd = NO; + break; + } + } + if (shouldAdd) + [filtered addObject: info]; } - if (shouldAdd) - [filtered addObject:info]; - } return filtered; } /* accessors */ -- (void)setAppointments:(NSArray *)_apts { - _apts = [self filterAppointments:_apts]; +- (void) setAppointments:(NSArray *) _apts +{ + _apts = [self filterAppointments: _apts]; ASSIGN(self->appointments, _apts); } -- (NSArray *)appointments { +- (NSArray *) appointments +{ return self->appointments; } -- (void)setAppointment:(id)_apt { +- (void) setAppointment:(id) _apt +{ NSString *mailtoChunk; NSString *myEmail; @@ -140,113 +153,132 @@ static BOOL shouldDisplayWeekend = NO; /* cache some info about apt for faster access */ - mailtoChunk = [_apt valueForKey:@"orgmail"]; - myEmail = [self emailForUser]; - if ([mailtoChunk rangeOfString:myEmail].length > 0) { - self->aptFlags.isMyApt = YES; - self->aptFlags.canAccessApt = YES; - } - else { - NSString *partmails; - - self->aptFlags.isMyApt = NO; - - partmails = [_apt valueForKey:@"partmails"]; - if ([partmails rangeOfString:myEmail].length) + mailtoChunk = [_apt valueForKey: @"orgmail"]; + myEmail = [self emailForUser]; + if ([mailtoChunk rangeOfString: myEmail].length > 0) + { + self->aptFlags.isMyApt = YES; self->aptFlags.canAccessApt = YES; - else - self->aptFlags.canAccessApt = [[_apt valueForKey:@"ispublic"] boolValue]; - } + } + else + { + NSString *partmails; + + self->aptFlags.isMyApt = NO; + + partmails = [_apt valueForKey: @"partmails"]; + if ([partmails rangeOfString: myEmail].length) + self->aptFlags.canAccessApt = YES; + else + self->aptFlags.canAccessApt = [[_apt valueForKey: @"ispublic"] boolValue]; + } } -- (id)appointment { +- (id) appointment +{ return self->appointment; } -- (BOOL)isMyApt { +- (BOOL) isMyApt +{ return self->aptFlags.isMyApt ? YES : NO; } -- (BOOL)canAccessApt { +- (BOOL) canAccessApt +{ return self->aptFlags.canAccessApt ? YES : NO; } -- (BOOL)canNotAccessApt { +- (BOOL) canNotAccessApt +{ return self->aptFlags.canAccessApt ? NO : YES; } -- (NSDictionary *)aptTypeDict { +- (NSDictionary *) aptTypeDict +{ return nil; } -- (NSString *)aptTypeLabel { +- (NSString *) aptTypeLabel +{ return @"aptLabel"; } -- (NSString *)aptTypeIcon { +- (NSString *) aptTypeIcon +{ return @""; } -- (SOGoAptFormatter *)aptFormatter { - if(self->aptFlags.canAccessApt) +- (SOGoAptFormatter *) aptFormatter +{ + if (self->aptFlags.canAccessApt) return self->aptFormatter; return self->privateAptFormatter; } -- (SOGoAptFormatter *)aptTooltipFormatter { - if(self->aptFlags.canAccessApt) +- (SOGoAptFormatter *) aptTooltipFormatter +{ + if (self->aptFlags.canAccessApt) return self->aptTooltipFormatter; return self->privateAptTooltipFormatter; } /* TODO: remove this */ -- (NSString *)shortTextForApt { - [self warnWithFormat:@"%s IS DEPRECATED!", __PRETTY_FUNCTION__]; +- (NSString *) shortTextForApt +{ + [self warnWithFormat: @"%s IS DEPRECATED!", __PRETTY_FUNCTION__]; if (![self canAccessApt]) return @""; - return [[self aptFormatter] stringForObjectValue:self->appointment]; + return [[self aptFormatter] stringForObjectValue: self->appointment]; } -- (NSString *)shortTitleForApt { +- (NSString *) shortTitleForApt +{ NSString *title; - [self warnWithFormat:@"%s IS DEPRECATED!", __PRETTY_FUNCTION__]; + [self warnWithFormat: @"%s IS DEPRECATED!", __PRETTY_FUNCTION__]; if (![self canAccessApt]) return @""; - title = [self->appointment valueForKey:@"title"]; + title = [self->appointment valueForKey: @"title"]; if ([title length] > 12) - title = [[title substringToIndex:11] stringByAppendingString:@"..."]; + title = [[title substringToIndex: 11] stringByAppendingString: @"..."]; return title; } -- (NSString *)tooltipForApt { - [self warnWithFormat:@"%s IS DEPRECATED!", __PRETTY_FUNCTION__]; - return [[self aptTooltipFormatter] stringForObjectValue:self->appointment - referenceDate:[self currentDay]]; +- (NSString *) tooltipForApt +{ + [self warnWithFormat: @"%s IS DEPRECATED!", __PRETTY_FUNCTION__]; + return [[self aptTooltipFormatter] stringForObjectValue: self->appointment + referenceDate: [self currentDay]]; } -- (NSString *)aptStyle { +- (NSString *) aptStyle +{ return nil; } -- (NSCalendarDate *)referenceDateForFormatter { +- (NSCalendarDate *) referenceDateForFormatter +{ return [self selectedDate]; } -- (NSCalendarDate *)thisMonth { +- (NSCalendarDate *) thisMonth +{ return [self selectedDate]; } -- (NSCalendarDate *)nextMonth { +- (NSCalendarDate *) nextMonth +{ NSCalendarDate *date = [self thisMonth]; - return [date dateByAddingYears:0 months:1 days:0 - hours:0 minutes:0 seconds:0]; + return [date dateByAddingYears: 0 months: 1 days: 0 + hours: 0 minutes: 0 seconds: 0]; } -- (NSCalendarDate *)prevMonth { +- (NSCalendarDate *) prevMonth +{ NSCalendarDate *date = [self thisMonth]; - return [date dateByAddingYears:0 months:-1 days:0 - hours:0 minutes:0 seconds:0]; + return [date dateByAddingYears: 0 months:-1 days: 0 + hours: 0 minutes: 0 seconds: 0]; } - (NSString *) prevMonthAsString @@ -261,12 +293,14 @@ static BOOL shouldDisplayWeekend = NO; /* current day related */ -- (void)setCurrentDay:(NSCalendarDate *)_day { - [_day setTimeZone:[self viewTimeZone]]; +- (void) setCurrentDay:(NSCalendarDate *) _day +{ + [_day setTimeZone: [self viewTimeZone]]; ASSIGN(self->currentDay, _day); } -- (NSCalendarDate *) currentDay { +- (NSCalendarDate *) currentDay +{ return self->currentDay; } @@ -275,11 +309,13 @@ static BOOL shouldDisplayWeekend = NO; return [self localizedNameForDayOfWeek: [self->currentDay dayOfWeek]]; } -- (id)holidayInfo { +- (id) holidayInfo +{ return nil; } -- (NSArray *)allDayApts { +- (NSArray *) allDayApts +{ NSArray *apts; NSMutableArray *filtered; unsigned i, count; @@ -287,18 +323,19 @@ static BOOL shouldDisplayWeekend = NO; if (self->allDayApts) return self->allDayApts; - apts = [self appointments]; - count = [apts count]; - filtered = [[NSMutableArray alloc] initWithCapacity:3]; - for (i = 0; i < count; i++) { - id apt; - NSNumber *bv; + apts = [self appointments]; + count = [apts count]; + filtered = [[NSMutableArray alloc] initWithCapacity: 3]; + for (i = 0; i < count; i++) + { + id apt; + NSNumber *bv; - apt = [apts objectAtIndex:i]; - bv = [apt valueForKey:@"isallday"]; - if ([bv boolValue]) - [filtered addObject:apt]; - } + apt = [apts objectAtIndex: i]; + bv = [apt valueForKey: @"isallday"]; + if ([bv boolValue]) + [filtered addObject: apt]; + } ASSIGN(self->allDayApts, filtered); [filtered release]; @@ -308,85 +345,100 @@ static BOOL shouldDisplayWeekend = NO; /* special appointments */ -- (BOOL)hasDayInfo { +- (BOOL) hasDayInfo +{ return [self hasHoldidayInfo] || [self hasAllDayApts]; } -- (BOOL)hasHoldidayInfo { +- (BOOL) hasHoldidayInfo +{ return [self holidayInfo] != nil; } -- (BOOL)hasAllDayApts { +- (BOOL) hasAllDayApts +{ return [[self allDayApts] count] != 0; } /* defaults */ -- (BOOL)showFullNames { +- (BOOL) showFullNames +{ return YES; } -- (BOOL)showAMPMDates { +- (BOOL) showAMPMDates +{ return NO; } -- (unsigned)dayStartHour { +- (unsigned) dayStartHour +{ return 8; } -- (unsigned)dayEndHour { +- (unsigned) dayEndHour +{ return 18; } -- (BOOL)shouldDisplayWeekend { +- (BOOL) shouldDisplayWeekend +{ return shouldDisplayWeekend; } -- (BOOL)shouldHideWeekend { +- (BOOL) shouldHideWeekend +{ return ![self shouldDisplayWeekend]; } /* URLs */ -- (NSString *)appointmentViewURL { +- (NSString *) appointmentViewURL +{ id pkey; - if (![(pkey = [[self appointment] valueForKey:@"uid"]) isNotNull]) + if (![(pkey = [[self appointment] valueForKey: @"uid"]) isNotNull]) return nil; - return [[[self clientObject] baseURLForAptWithUID:[pkey stringValue] - inContext:[self context]] - stringByAppendingString:@"/view"]; + return [[[self clientObject] baseURLForAptWithUID: [pkey stringValue] + inContext: [self context]] + stringByAppendingString: @"/view"]; } /* fetching */ -- (NSCalendarDate *)startDate { +- (NSCalendarDate *) startDate +{ return [self selectedDate]; } -- (NSCalendarDate *)endDate { +- (NSCalendarDate *) endDate +{ return [[self startDate] tomorrow]; } -- (NSArray *)fetchCoreInfos { - if (!self->appointments) { - id folder; - NSCalendarDate *sd, *ed; +- (NSArray *) fetchCoreInfos +{ + if (!self->appointments) + { + id folder; + NSCalendarDate *sd, *ed; - folder = [self clientObject]; - sd = [self startDate]; - ed = [self endDate]; - [self setAppointments:[folder fetchOverviewInfosFrom:sd to:ed]]; - } + folder = [self clientObject]; + sd = [self startDate]; + ed = [self endDate]; + [self setAppointments: [folder fetchOverviewInfosFrom: sd to: ed]]; + } return self->appointments; } /* query parameters */ -- (BOOL)shouldDisplayRejectedAppointments { +- (BOOL) shouldDisplayRejectedAppointments +{ NSString *bv; bv = [self queryParameterForKey: @"dr"]; @@ -394,17 +446,19 @@ static BOOL shouldDisplayWeekend = NO; return [bv boolValue]; } -- (NSDictionary *)toggleShowRejectedAptsQueryParameters { +- (NSDictionary *) toggleShowRejectedAptsQueryParameters +{ NSMutableDictionary *qp; BOOL shouldDisplay; shouldDisplay = ![self shouldDisplayRejectedAppointments]; qp = [[[self queryParameters] mutableCopy] autorelease]; - [qp setObject:shouldDisplay ? @"1" : @"0" forKey:@"dr"]; + [qp setObject: shouldDisplay ? @"1" : @"0" forKey: @"dr"]; return qp; } -- (NSString *)toggleShowRejectedAptsLabel { +- (NSString *) toggleShowRejectedAptsLabel +{ if (![self shouldDisplayRejectedAppointments]) return @"show_rejected_apts"; return @"hide_rejected_apts"; @@ -418,102 +472,111 @@ static BOOL shouldDisplayWeekend = NO; date = [[self startDate] dateByAddingYears: 0 months: 0 days: daysOffset - hours:0 minutes:0 seconds:0]; - return [self queryParametersBySettingSelectedDate:date]; + hours: 0 minutes: 0 seconds: 0]; + return [self queryParametersBySettingSelectedDate: date]; } -- (NSDictionary *)todayQueryParameters { +- (NSDictionary *) todayQueryParameters +{ NSCalendarDate *date; date = [NSCalendarDate date]; /* today */ - return [self queryParametersBySettingSelectedDate:date]; + return [self queryParametersBySettingSelectedDate: date]; } -- (NSDictionary *)currentDayQueryParameters { - return [self queryParametersBySettingSelectedDate:self->currentDay]; +- (NSDictionary *) currentDayQueryParameters +{ + return [self queryParametersBySettingSelectedDate: self->currentDay]; } /* calendarUIDs */ -- (NSString *)formattedCalendarUIDs { - return [[[self clientObject] calendarUIDs] - componentsJoinedByString:@", "]; +- (NSString *) formattedCalendarUIDs +{ + return [[[self clientObject] calendarUIDs] + componentsJoinedByString: @", "]; } /* Actions */ -- (NSString *)_userFolderURI { +- (NSString *) _userFolderURI +{ WOContext *ctx; id obj; NSURL *url; ctx = [self context]; - obj = [[ctx objectTraversalStack] objectAtIndex:1]; - url = [NSURL URLWithString:[obj baseURLInContext:ctx]]; + obj = [[ctx objectTraversalStack] objectAtIndex: 1]; + url = [NSURL URLWithString: [obj baseURLInContext: ctx]]; return [[url path] stringByUnescapingURL]; } -- (id)redirectForUIDsAction { +- (id) redirectForUIDsAction +{ NSMutableString *uri; - NSString *uidsString, *loc, *prevMethod, *userFolderID; + NSString *uidsString, *loc, *prevMethod, *userFolderID; id r; BOOL useGroups; unsigned index; - uidsString = [self queryParameterForKey:@"userUIDString"]; + uidsString = [self queryParameterForKey: @"userUIDString"]; uidsString = [uidsString stringByTrimmingWhiteSpaces]; [self setQueryParameter: nil forKey: @"userUIDString"]; - prevMethod = [self queryParameterForKey:@"previousMethod"]; - if(prevMethod == nil) + prevMethod = [self queryParameterForKey: @"previousMethod"]; + if (prevMethod == nil) prevMethod = @""; - uri = [[NSMutableString alloc] initWithString:[self _userFolderURI]]; + uri = [[NSMutableString alloc] initWithString: [self _userFolderURI]]; /* if we have more than one entry, use groups - otherwise don't */ - useGroups = [uidsString rangeOfString:@","].length > 0; + useGroups = [uidsString rangeOfString: @","].length > 0; userFolderID = [uri lastPathComponent]; - if(useGroups) { - NSArray *uids; + if (useGroups) + { + NSArray *uids; - uids = [uidsString componentsSeparatedByString:@","]; - /* guarantee that our id is the first */ - if(((index = [uids indexOfObject:userFolderID]) != NSNotFound) && - (index != 0)) { - uids = [[uids mutableCopy] autorelease]; - [(NSMutableArray *)uids removeObjectAtIndex:index]; - [(NSMutableArray *)uids insertObject:userFolderID atIndex:0]; - uidsString = [uids componentsJoinedByString:@","]; + uids = [uidsString componentsSeparatedByString: @","]; + /* guarantee that our id is the first */ + if (((index = [uids indexOfObject: userFolderID]) != NSNotFound) + && (index != 0)) + { + uids = [[uids mutableCopy] autorelease]; + [(NSMutableArray *) uids removeObjectAtIndex: index]; + [(NSMutableArray *) uids insertObject: userFolderID atIndex: 0]; + uidsString = [uids componentsJoinedByString: @","]; + } + [uri appendString: @"Groups/_custom_"]; + [uri appendString: uidsString]; + [uri appendString: @"/"]; + NSLog (@"Group URI = '%@'", uri); } - [uri appendString:@"Groups/_custom_"]; - [uri appendString:uidsString]; - [uri appendString:@"/"]; - NSLog (@"Group URI = '%@'", uri); - } - else { + else + { /* check if lastPathComponent is the base that we want to have */ - if((([uidsString length] != 0) && - (![userFolderID isEqualToString:uidsString]))) { + if ((([uidsString length] != 0) + && (![userFolderID isEqualToString: uidsString]))) + { NSRange r; /* uri ends with an '/', so we have to adjust the range a little */ r = NSMakeRange(0, [uri length] - 1); - r = [uri rangeOfString:@"/" - options:NSBackwardsSearch - range:r]; + r = [uri rangeOfString: @"/" + options: NSBackwardsSearch + range: r]; r = NSMakeRange(r.location + 1, [uri length] - r.location - 2); - [uri replaceCharactersInRange:r withString:uidsString]; - } - } - [uri appendString:@"Calendar/"]; - [uri appendString:prevMethod]; + [uri replaceCharactersInRange: r withString: uidsString]; + } + } + [uri appendString: @"Calendar/"]; + [uri appendString: prevMethod]; #if 0 NSLog(@"%s redirect uri:%@", - __PRETTY_FUNCTION__, - uri); + __PRETTY_FUNCTION__, + uri); #endif - loc = [self completeHrefForMethod:uri]; /* this might return uri! */ - r = [self redirectToLocation:loc]; + loc = [self completeHrefForMethod: uri]; /* this might return uri! */ + r = [self redirectToLocation: loc]; [uri release]; return r; }