/* Copyright (C) 2004 SKYRIX Software AG This file is part of OpenGroupware.org. OGo is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. OGo is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with OGo; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ // $Id$ #include "SOGoAptFormatter.h" #include "common.h" @interface SOGoAptFormatter(PrivateAPI) - (NSString *)titleForApt:(id)_apt :(NSCalendarDate *)_refDate; - (NSString *)shortTitleForApt:(id)_apt :(NSCalendarDate *)_refDate; - (NSTimeZone *)displayTZ; - (void)appendTimeInfoForDate:(NSCalendarDate *)_date usingReferenceDate:(NSCalendarDate *)_refDate toBuffer:(NSMutableString *)_buf; - (void)appendTimeInfoFromApt:(id)_apt usingReferenceDate:(NSCalendarDate *)_refDate toBuffer:(NSMutableString *)_buf; @end // TODO: Clean this up, put it into NGExtensions! @interface NSCalendarDate (UIxCalMonthOverviewExtensions_UsedPrivates) - (BOOL)isDateInSameMonth:(NSCalendarDate *)_other; @end @implementation SOGoAptFormatter - (id)initWithDisplayTimeZone:(NSTimeZone *)_tz { if ((self = [super init])) { self->tz = [_tz retain]; [self setFullDetails]; } return self; } - (void)dealloc { [self->tz release]; [self->privateTitle release]; [super dealloc]; } /* accessors */ - (void)setTooltip { self->formatAction = @selector(tooltipForApt::); } - (void)setSingleLineFullDetails { self->formatAction = @selector(singleLineFullDetailsForApt::); } - (void)setFullDetails { self->formatAction = @selector(fullDetailsForApt::); } - (void)setPrivateTooltip { self->formatAction = @selector(tooltipForPrivateApt::); } - (void)setPrivateDetails { self->formatAction = @selector(detailsForPrivateApt::); } - (void)setTitleOnly { self->formatAction = @selector(titleForApt::); } - (void)setShortTitleOnly { self->formatAction = @selector(shortTitleForApt::); } - (void)setPrivateSuppressAll { self->formatAction = @selector(suppressApt::); } - (void)setPrivateTitleOnly { self->formatAction = @selector(titleOnlyForPrivateApt::); } - (void)setPrivateTitle:(NSString *)_privateTitle { ASSIGN(self->privateTitle, _privateTitle); } - (NSString *)privateTitle { return self->privateTitle; } - (void)setOmitsEndDate { self->omitsEndDate = YES; } - (NSString *)stringForObjectValue:(id)_obj { [self warnWithFormat:@"%s called, please use " @"stringForObjectValue:referenceDate: instead!", __PRETTY_FUNCTION__]; return [self stringForObjectValue:_obj referenceDate:nil]; } - (NSString *)stringForObjectValue:(id)_obj referenceDate:(NSCalendarDate *)_refDate { return [self performSelector:self->formatAction withObject:_obj withObject:_refDate]; } /* Private */ - (NSTimeZone *)displayTZ { return self->tz; } - (void)appendTimeInfoForDate:(NSCalendarDate *)_date usingReferenceDate:(NSCalendarDate *)_refDate toBuffer:(NSMutableString *)_buf { /* several cases: * 12:00 * 12:00 - 13:00 * 12:00 (07-05) - 13:00 (07-07) * 12:00 (12-30-2004) - 13:00 (01-01-2005) */ [_buf appendFormat:@"%02i:%02i", [_date hourOfDay], [_date minuteOfHour]]; if (_refDate && ![_date isDateOnSameDay:_refDate]) { [_buf appendFormat:@" (%02i-%02i", [_date monthOfYear], [_date dayOfMonth]]; if ([_date yearOfCommonEra] != [_refDate yearOfCommonEra]) [_buf appendFormat:@"-%04i", [_date yearOfCommonEra]]; [_buf appendString:@")"]; } } - (void)appendTimeInfoFromApt:(id)_apt usingReferenceDate:(NSCalendarDate *)_refDate toBuffer:(NSMutableString *)_buf { NSCalendarDate *startDate, *endDate, *date; NSTimeZone *dtz; BOOL spansRange; spansRange = NO; dtz = [self displayTZ]; startDate = [_apt valueForKey:@"startDate"]; [startDate setTimeZone:dtz]; endDate = [_apt valueForKey:@"endDate"]; if(endDate != nil) { [endDate setTimeZone:dtz]; spansRange = ![endDate isEqualToDate:startDate]; } if (_refDate) [_refDate setTimeZone:dtz]; #if 0 if (!_refDate || [startDate isDateOnSameDay:_refDate]) date = startDate; else date = [startDate hour:0 minute:0]; #else date = startDate; #endif [self appendTimeInfoForDate:date usingReferenceDate:_refDate toBuffer:_buf]; if (spansRange && !self->omitsEndDate) { [_buf appendString:@" - "]; #if 0 if (!_refDate || [endDate isDateOnSameDay:_refDate]) date = endDate; else date = [endDate hour:23 minute:59]; #else date = endDate; #endif [self appendTimeInfoForDate:date usingReferenceDate:_refDate toBuffer:_buf]; } } - (NSString *)titleForApt:(id)_apt :(NSCalendarDate *)_refDate { return [_apt valueForKey:@"title"]; } - (NSString *)shortTitleForApt:(id)_apt :(NSCalendarDate *)_refDate { NSString *title; title = [self titleForApt:_apt :_refDate]; if ([title length] > 12) title = [[title substringToIndex:11] stringByAppendingString:@"..."]; return title; } - (NSString *)singleLineFullDetailsForApt:(id)_apt :(NSCalendarDate *)_refDate { NSMutableString *aptDescr; NSString *s; aptDescr = [NSMutableString stringWithCapacity:60]; [self appendTimeInfoFromApt:_apt usingReferenceDate:_refDate toBuffer:aptDescr]; if ((s = [_apt valueForKey:@"location"]) != nil) { [aptDescr appendFormat:@"; (%@)", s]; } if ((s = [_apt valueForKey:@"title"]) != nil) [aptDescr appendFormat:@"; %@", [self titleForApt:_apt :_refDate]]; return aptDescr; } - (NSString *)fullDetailsForApt:(id)_apt :(NSCalendarDate *)_refDate { NSMutableString *aptDescr; NSString *s; aptDescr = [NSMutableString stringWithCapacity:60]; [self appendTimeInfoFromApt:_apt usingReferenceDate:_refDate toBuffer:aptDescr]; if ((s = [_apt valueForKey:@"location"]) != nil) { if([s length] > 12) s = [[s substringToIndex:11] stringByAppendingString:@"..."]; [aptDescr appendFormat:@" (%@)", s]; } if ((s = [_apt valueForKey:@"title"]) != nil) [aptDescr appendFormat:@"
%@", [self shortTitleForApt:_apt :_refDate]]; return aptDescr; } - (NSString *)detailsForPrivateApt:(id)_apt :(NSCalendarDate *)_refDate { NSMutableString *aptDescr; NSString *s; aptDescr = [NSMutableString stringWithCapacity:40]; [self appendTimeInfoFromApt:_apt usingReferenceDate:_refDate toBuffer:aptDescr]; if ((s = [self privateTitle]) != nil) [aptDescr appendFormat:@"
%@", s]; return aptDescr; } - (NSString *)titleOnlyForPrivateApt:(id)_apt :(NSCalendarDate *)_refDate { NSString *s; s = [self privateTitle]; if(!s) return @""; return s; } - (NSString *)tooltipForApt:(id)_apt :(NSCalendarDate *)_refDate { NSMutableString *aptDescr; NSString *s; aptDescr = [NSMutableString stringWithCapacity:60]; [self appendTimeInfoFromApt:_apt usingReferenceDate:_refDate toBuffer:aptDescr]; if ((s = [_apt valueForKey:@"title"]) != nil) [aptDescr appendFormat:@"\n%@", s]; if ((s = [_apt valueForKey:@"location"]) != nil) [aptDescr appendFormat:@"\n%@", s]; return aptDescr; } - (NSString *)tooltipForPrivateApt:(id)_apt :(NSCalendarDate *)_refDate { NSMutableString *aptDescr; NSString *s; aptDescr = [NSMutableString stringWithCapacity:25]; [self appendTimeInfoFromApt:_apt usingReferenceDate:_refDate toBuffer:aptDescr]; if ((s = [self privateTitle]) != nil) [aptDescr appendFormat:@"\n%@", s]; return aptDescr; } - (NSString *)suppressApt:(id)_apt :(NSCalendarDate *)_refDate { return @""; } @end /* SOGoAptFormatter */