From: helge Date: Sat, 2 Oct 2004 14:32:29 +0000 (+0000) Subject: added maillist formatters X-Git-Url: https://err.no/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6a4e3e7c4b9d1b0a1866a2cddf68c2d08d0bc760;p=scalable-opengroupware.org added maillist formatters git-svn-id: http://svn.opengroupware.org/SOGo/trunk@339 d1b88da0-ebda-0310-925b-ed51d893ca5b --- diff --git a/SOGo/UI/Mailer/ChangeLog b/SOGo/UI/Mailer/ChangeLog index ddd1f9c5..5162ee99 100644 --- a/SOGo/UI/Mailer/ChangeLog +++ b/SOGo/UI/Mailer/ChangeLog @@ -1,5 +1,7 @@ 2004-10-02 Helge Hess + * added formatters for mail list (v0.9.8) + * v0.9.7 * show messages in an IMAP4 folder diff --git a/SOGo/UI/Mailer/GNUmakefile b/SOGo/UI/Mailer/GNUmakefile index 33066efe..5de68bca 100644 --- a/SOGo/UI/Mailer/GNUmakefile +++ b/SOGo/UI/Mailer/GNUmakefile @@ -13,6 +13,8 @@ MailerUI_OBJC_FILES += \ \ UIxMailMainFrame.m \ UIxMailTree.m \ + UIxMailFormatter.m \ + WOContext+UIxMailer.m \ \ UIxMailAccountsView.m \ UIxMailAccountView.m \ diff --git a/SOGo/UI/Mailer/UIxMailFormatter.h b/SOGo/UI/Mailer/UIxMailFormatter.h new file mode 100644 index 00000000..c7501327 --- /dev/null +++ b/SOGo/UI/Mailer/UIxMailFormatter.h @@ -0,0 +1,76 @@ +/* + 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. +*/ + +#ifndef __Mailer_UIxMailFormatter_H__ +#define __Mailer_UIxMailFormatter_H__ + +#import + +@class NSString, NSCalendarDate, NSTimeZone; + +@interface UIxMailFormatter : NSFormatter +{ +} + +/* labels */ + +- (NSString *)labelForKey:(NSString *)_key; + +@end + +@interface UIxMailDateFormatter : UIxMailFormatter +{ + NSCalendarDate *now; + NSTimeZone *timeZone; + struct { + int showOnlyTimeForToday:1; + int showLabelsForNearDays:1; /* 'yesterday' instead of '2004-09-31' */ + int reserved:30; + } dfFlags; +} + +/* configuration */ + +- (NSTimeZone *)timeZone; +- (BOOL)showOnlyTimeForToday; +- (BOOL)showLabelsForNearDays; + +@end + +@interface UIxSubjectFormatter : UIxMailFormatter +{ + unsigned maxLength; +} + +/* configuration */ + +- (unsigned int)maxLength; + +/* labels */ + +- (NSString *)missingSubjectLabel; + +@end + +@interface UIxEnvelopeAddressFormatter : UIxMailFormatter +@end + +#endif /* __Mailer_UIxMailFormatter_H__ */ diff --git a/SOGo/UI/Mailer/UIxMailFormatter.m b/SOGo/UI/Mailer/UIxMailFormatter.m new file mode 100644 index 00000000..79e77e2d --- /dev/null +++ b/SOGo/UI/Mailer/UIxMailFormatter.m @@ -0,0 +1,310 @@ +/* + 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. +*/ + +#include "UIxMailFormatter.h" +#include "common.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; +} + +- (BOOL)showOnlyTimeForToday { + return self->dfFlags.showOnlyTimeForToday ? YES : NO; +} +- (BOOL)showLabelsForNearDays { + return self->dfFlags.showLabelsForNearDays ? YES : NO; +} + +/* formatting dates */ + +- (NSString *)stringForTime:(NSCalendarDate *)_d prefix:(unsigned char *)_p { + /* Note: prefix is not allowed to be long! */ + unsigned char buf[32]; + + if (_p == NULL) _p = ""; + sprintf(buf, "%s%02i:%02i", _p, [_d hourOfDay], [_d minuteOfHour]); + return [StrClass stringWithCString:buf]; +} + +- (NSString *)stringForCalendarDate:(NSCalendarDate *)_date { + unsigned 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:", "]]; + } + } + + /* 26.08.2004 13:24 */ + sprintf(buf, "%02d.%02d.%04d %02d:%02d", + [_date dayOfMonth], [_date monthOfYear], [_date yearOfCommonEra], + [_date hourOfDay], [_date minuteOfHour]); + 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 */ + +@implementation UIxSubjectFormatter + +- (id)init { + if ((self = [super init])) { + self->maxLength = 64; + } + return self; +} + +/* configuration */ + +- (unsigned int)maxLength { + return self->maxLength; +} + +/* labels */ + +- (NSString *)missingSubjectLabel { + return [self labelForKey:@"no_subject"]; +} + +/* specific formatters */ + +- (NSString *)stringForStringValue:(NSString *)_subject { + NSString *s; + + if ([_subject hasPrefix:@"=?"]) { /* quoted printable */ +#warning TODO: work on QP decoding + /* =?iso-8859-1?q?Yannick=20DAmboise?= */ + if ((s = [_subject stringByDecodingQuotedPrintable])) + _subject = s; + } + + if ([_subject length] == 0) + return [self missingSubjectLabel]; + + if ([_subject length] <= [self maxLength]) + return _subject; + + s = [_subject substringToIndex:([self maxLength] - 3)]; + return [s stringByAppendingString:@"..."]; +} + +- (NSString *)stringForDataValue:(NSData *)_subject { + NSString *s, *r; + + if ([_subject length] == 0) + return [self missingSubjectLabel]; + + [self debugWithFormat:@"WARNING: NSData subject! (using UTF-8 to decode!)"]; + + // TODO: exception handler? + s = [[NSString alloc] initWithData:_subject encoding:NSUTF8StringEncoding]; + if (s == nil) { + [self logWithFormat:@"ERROR: could do not decode NSData subject!"]; + return [self labelForKey:@"Error_CouldNotDecodeSubject"]; + } + + r = [[self stringForStringValue:s] copy]; + [s release]; + return [r autorelease]; +} + +/* formatter entry function */ + +- (NSString *)stringForObjectValue:(id)_subject { + if (![_subject isNotNull]) + return [self missingSubjectLabel]; + + if ([_subject isKindOfClass:StrClass]) + return [self stringForStringValue:_subject]; + if ([_subject isKindOfClass:[NSData class]]) + return [self stringForDataValue:_subject]; + + return [self stringForStringValue:[_subject stringValue]]; +} + +@end /* UIxSubjectFormatter */ + +#include + +@implementation UIxEnvelopeAddressFormatter + +static Class EnvAddrClass = Nil; + ++ (void)initialize { + if (EnvAddrClass == Nil) EnvAddrClass = [NGImap4EnvelopeAddress class]; +} + +/* configuration */ + +- (unsigned)maxLength { + return 128; // TODO +} + +- (NSString *)separator { + return @", "; +} + +/* formatting envelope addresses */ + +- (NSString *)stringForEnvelopeAddress:(NGImap4EnvelopeAddress *)_address { + NSString *s; + + s = [_address personalName]; + if ([s isNotNull]) return s; + + s = [_address baseEMail]; + if ([s isNotNull]) return s; + + [self debugWithFormat:@"WARNING: unexpected envelope address: %@", _address]; + return [_address stringValue]; +} + +- (NSString *)stringForArray:(NSArray *)_addresses { + NSMutableString *ms; + unsigned i, count; + + if ((count = [_addresses count]) == 0) + return nil; + + if (count == 1) + return [self stringForObjectValue:[_addresses objectAtIndex:0]]; + + ms = [NSMutableString stringWithCapacity:16 * count]; + for (i = 0; i < count && [ms length] < [self maxLength]; i++) { + NSString *s; + + s = [self stringForObjectValue:[_addresses objectAtIndex:i]]; + if (s == nil) + continue; + + if ([ms length] > 0) [ms appendString:[self separator]]; + [ms appendString:s]; + } + return ms; +} + +/* formatter entry function */ + +- (NSString *)stringForObjectValue:(id)_address { + if (![_address isNotNull]) + return nil; + + if ([_address isKindOfClass:StrClass]) /* preformatted? */ + return _address; + + if ([_address isKindOfClass:EnvAddrClass]) + return [self stringForEnvelopeAddress:_address]; + + if ([_address isKindOfClass:[NSArray class]]) + return [self stringForArray:_address]; + + [self debugWithFormat: + @"NOTE: unexpected object for envelope formatter: %@<%@>", + _address, NSStringFromClass([_address class])]; + return [_address stringValue]; +} + +@end /* UIxEnvelopeAddressFormatter */ diff --git a/SOGo/UI/Mailer/UIxMailListView.m b/SOGo/UI/Mailer/UIxMailListView.m index ab945b94..11da482f 100644 --- a/SOGo/UI/Mailer/UIxMailListView.m +++ b/SOGo/UI/Mailer/UIxMailListView.m @@ -25,6 +25,7 @@ @interface UIxMailListView : UIxComponent { + id message; } @end @@ -35,18 +36,34 @@ @implementation UIxMailListView -- (NSString *)messageSubject { - id tmp; - - tmp = [self valueForKeyPath:@"message.envelope.subject"]; - if ([tmp isKindOfClass:[NSString class]]) - return tmp; +- (void)dealloc { + [self->message release]; + [super dealloc]; +} + +/* notifications */ + +- (void)sleep { + [self->message release]; self->message = nil; + [super sleep]; +} + +/* accessors */ + +- (void)setMessage:(id)_msg { + ASSIGN(self->message, _msg); +} +- (id)message { + return self->message; +} + +/* derived accessors */ + +- (BOOL)isMessageRead { + NSArray *flags; - if ([tmp isKindOfClass:[NSData class]]) { // TODO: change that somehow ... - tmp = [[NSString alloc] initWithData:tmp encoding:NSUTF8StringEncoding]; - return [tmp autorelease]; - } - return [tmp stringValue]; + flags = [[self message] valueForKey:@"flags"]; + return [flags containsObject:@"seen"]; } - (NSArray *)messages { @@ -82,6 +99,8 @@ return [msgs valueForKey:@"fetch"]; } +/* actions */ + - (id)defaultAction { [self logWithFormat:@"default action ..."]; return self; diff --git a/SOGo/UI/Mailer/UIxMailListView.wox b/SOGo/UI/Mailer/UIxMailListView.wox index c324b80a..ab2195fe 100644 --- a/SOGo/UI/Mailer/UIxMailListView.wox +++ b/SOGo/UI/Mailer/UIxMailListView.wox @@ -23,13 +23,45 @@
- + screenshot + +
+ + + + + + + + - - - - + + + + @@ -37,12 +69,4 @@ Folder List - -
-
- Content - screenshot -
-
- diff --git a/SOGo/UI/Mailer/Version b/SOGo/UI/Mailer/Version index cab297dc..28292b54 100644 --- a/SOGo/UI/Mailer/Version +++ b/SOGo/UI/Mailer/Version @@ -1,3 +1,3 @@ # $Id$ -SUBMINOR_VERSION:=7 +SUBMINOR_VERSION:=8 diff --git a/SOGo/UI/Mailer/WOContext+UIxMailer.h b/SOGo/UI/Mailer/WOContext+UIxMailer.h new file mode 100644 index 00000000..7d9d603b --- /dev/null +++ b/SOGo/UI/Mailer/WOContext+UIxMailer.h @@ -0,0 +1,43 @@ +/* + 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. +*/ + +#ifndef __Mailer_WOContext_UIxMailer_H__ +#define __Mailer_WOContext_UIxMailer_H__ + +#include + +/* + WOContext(UIxMailer) + + Provide shared objects used by the UIx components. +*/ + +@class NSFormatter; + +@interface WOContext(UIxMailer) + +- (NSFormatter *)mailSubjectFormatter; +- (NSFormatter *)mailDateFormatter; +- (NSFormatter *)mailEnvelopeAddressFormatter; + +@end + +#endif /* __Mailer_WOContext_UIxMailer_H__ */ diff --git a/SOGo/UI/Mailer/WOContext+UIxMailer.m b/SOGo/UI/Mailer/WOContext+UIxMailer.m new file mode 100644 index 00000000..3603b756 --- /dev/null +++ b/SOGo/UI/Mailer/WOContext+UIxMailer.m @@ -0,0 +1,43 @@ +/* + 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. +*/ + +#include "WOContext+UIxMailer.h" +#include "UIxMailFormatter.h" +#include "common.h" + +@implementation WOContext(UIxMailer) + +// TODO: make configurable +// TODO: cache! + +- (NSFormatter *)mailSubjectFormatter { + return [[[UIxSubjectFormatter alloc] init] autorelease]; +} + +- (NSFormatter *)mailDateFormatter { + return [[[UIxMailDateFormatter alloc] init] autorelease]; +} + +- (NSFormatter *)mailEnvelopeAddressFormatter { + return [[[UIxEnvelopeAddressFormatter alloc] init] autorelease]; +} + +@end /* WOContext(UIxMailer) */ diff --git a/SOGo/UI/Mailer/mailer.css b/SOGo/UI/Mailer/mailer.css index caaa246e..90646d7c 100644 --- a/SOGo/UI/Mailer/mailer.css +++ b/SOGo/UI/Mailer/mailer.css @@ -137,6 +137,12 @@ td.tb_icon a { /* mail tableview */ .tableview { - font-size: 10pt; + font-size: 9pt; font-family: Arial, Helvetica, Verdana, Geneva, Tahoma, sans-serif; } + +span.readmailsubject { +} +span.unreadmailsubject { + font-weight: bold; +}
DateSubjectFromToFlags
+ + + + + + + + + + + + + + + + +