1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175
|
/*
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.
*/
#import <Foundation/NSCalendarDate.h>
#import <NGExtensions/NSCalendarDate+misc.h>
#import <NGExtensions/NSNull+misc.h>
#import <NGExtensions/NSObject+Logs.h>
#import <Foundation/NSTimeZone.h>
#import "UIxMailFormatter.h"
static Class StrClass = Nil;
static Class CalDateClass = Nil;
@implementation UIxMailFormatter
static BOOL debugOn = YES;
+ (void)initialize {
StrClass = [NSString class];
CalDateClass = [NSCalendarDate class];
}
/* labels */
- (NSString *)labelForKey:(NSString *)_key {
// TODO: fetch labels from context
return _key;
}
/* debugging */
- (BOOL)isDebuggingEnabled {
return debugOn;
}
@end /* UIxMailFormatter */
@implementation UIxMailDateFormatter
- (id)init {
if ((self = [super init])) {
static NSTimeZone *met = nil;
if (met == nil) met = [[NSTimeZone timeZoneWithName:@"MET"] retain];
self->timeZone = [met retain];
self->dfFlags.showOnlyTimeForToday = 1;
self->dfFlags.showLabelsForNearDays = 1;
}
return self;
}
- (void)dealloc {
[self->timeZone release];
[self->now release];
[super dealloc];
}
/* configuration */
- (NSTimeZone *)timeZone
{
return self->timeZone;
}
- (void) setTimeZone: (NSTimeZone *) newTimeZone
{
if (timeZone)
[timeZone release];
timeZone = newTimeZone;
if (timeZone)
[timeZone retain];
}
- (BOOL)showOnlyTimeForToday {
return self->dfFlags.showOnlyTimeForToday ? YES : NO;
}
- (BOOL)showLabelsForNearDays {
return self->dfFlags.showLabelsForNearDays ? YES : NO;
}
/* formatting dates */
- (NSString *)stringForTime:(NSCalendarDate *)_d prefix:(char *)_p {
/* Note: prefix is not allowed to be long! */
char buf[32];
if (_p == NULL) _p = "";
#if GS_64BIT_OLD
sprintf(buf, "%s%02i:%02i", _p, [_d hourOfDay], [_d minuteOfHour]);
#else
sprintf(buf, "%s%02li:%02li", _p, [_d hourOfDay], [_d minuteOfHour]);
#endif
return [StrClass stringWithCString:buf];
}
- (NSString *)stringForCalendarDate:(NSCalendarDate *)_date {
char buf[32];
if (self->now == nil) {
self->now = [[NSCalendarDate alloc] init];
[self->now setTimeZone:[self timeZone]];
}
[_date setTimeZone:[self timeZone]];
if ([self showOnlyTimeForToday] && [_date isDateOnSameDay:self->now])
return [self stringForTime:_date prefix:NULL];
if ([self showLabelsForNearDays]) {
NSString *label;
if ([_date isDateOnSameDay:self->now])
label = [self labelForKey:@"today"];
else if ([_date isDateOnSameDay:[self->now yesterday]])
label = [self labelForKey:@"yesterday"];
else
label = nil;
if (label != nil) {
return [label stringByAppendingString:
[self stringForTime:_date prefix:", "]];
}
}
#if GS_64BIT_OLD
sprintf(buf, "%02d.%02d.%04d %02d:%02d",
[_date dayOfMonth], [_date monthOfYear], [_date yearOfCommonEra],
[_date hourOfDay], [_date minuteOfHour]);
#else
sprintf(buf, "%02ld.%02ld.%04ld %02ld:%02ld",
[_date dayOfMonth], [_date monthOfYear], [_date yearOfCommonEra],
[_date hourOfDay], [_date minuteOfHour]);
#endif
return [StrClass stringWithCString:buf];
}
/* formatter entry function */
- (NSString *)stringForObjectValue:(id)_date {
if (![_date isNotNull])
return nil;
if ([_date isKindOfClass:StrClass]) /* already formatted */
return _date;
if ([_date isKindOfClass:CalDateClass])
return [self stringForCalendarDate:_date];
[self debugWithFormat:
@"NOTE: unexpected object for date formatter: %@<%@>",
_date, NSStringFromClass([_date class])];
return [_date description];
}
@end /* UIxMailDateFormatter */
|