]> err.no Git - scalable-opengroupware.org/commitdiff
added maillist formatters
authorhelge <helge@d1b88da0-ebda-0310-925b-ed51d893ca5b>
Sat, 2 Oct 2004 14:32:29 +0000 (14:32 +0000)
committerhelge <helge@d1b88da0-ebda-0310-925b-ed51d893ca5b>
Sat, 2 Oct 2004 14:32:29 +0000 (14:32 +0000)
git-svn-id: http://svn.opengroupware.org/SOGo/trunk@339 d1b88da0-ebda-0310-925b-ed51d893ca5b

SOGo/UI/Mailer/ChangeLog
SOGo/UI/Mailer/GNUmakefile
SOGo/UI/Mailer/UIxMailFormatter.h [new file with mode: 0644]
SOGo/UI/Mailer/UIxMailFormatter.m [new file with mode: 0644]
SOGo/UI/Mailer/UIxMailListView.m
SOGo/UI/Mailer/UIxMailListView.wox
SOGo/UI/Mailer/Version
SOGo/UI/Mailer/WOContext+UIxMailer.h [new file with mode: 0644]
SOGo/UI/Mailer/WOContext+UIxMailer.m [new file with mode: 0644]
SOGo/UI/Mailer/mailer.css

index ddd1f9c58d109809519809f6a136dcfeddbcc63d..5162ee9908e8a271b90e4c5c62afc057822cc387 100644 (file)
@@ -1,5 +1,7 @@
 2004-10-02  Helge Hess  <helge.hess@opengroupware.org>
 
+       * added formatters for mail list (v0.9.8)
+
        * v0.9.7
 
        * show messages in an IMAP4 folder
index 33066efe0cc28c5cbd4e7df5c737c573e6dcd805..5de68bca2a7fbd8347b5909b2874b1fbffec476e 100644 (file)
@@ -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 (file)
index 0000000..c750132
--- /dev/null
@@ -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 <Foundation/NSFormatter.h>
+
+@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 (file)
index 0000000..79e77e2
--- /dev/null
@@ -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 <NGImap4/NGImap4EnvelopeAddress.h>
+
+@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 */
index ab945b9479baad266c24db3a8ef9c8007fb06b2d..11da482f39ced117434ee9ced684855ec36205a5 100644 (file)
@@ -25,6 +25,7 @@
 
 @interface UIxMailListView : UIxComponent
 {
+  id message;
 }
 
 @end
 
 @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;
index c324b80afe5d5c7b1e33c054c3e3065580c0a589..ab2195fe99251a2aee47b72d23caadec0301096c 100644 (file)
 
   <div class="embedwhite_out">
     <div class="embedwhite_in">
-      <table border="0" width="100">
+      <a rsrc:href="tbird_073_mailwelcome.png">screenshot</a>
+
+      <table border="0" width="100%">
+        <tr class="tableview">
+          <td>Date</td>
+          <td>Subject</td>
+          <td>From</td>
+          <td>To</td>
+          <td>Flags</td>
+        </tr>
+
         <var:foreach list="messages" item="message">
           <tr class="tableview">
-            <td><var:string value="message.envelope.date"/></td>
-            <td><var:string value="messageSubject"/></td>
-            <td><var:string value="message.envelope.from.email"/></td>
-            <td><var:string value="message.envelope.to.email"/></td>
+            <td>
+              <var:string value="message.envelope.date" 
+                          formatter="context.mailDateFormatter"/>
+            </td>
+            <td>
+              <var:if condition="isMessageRead">
+                <span class="readmailsubject">
+                  <var:string value="message.envelope.subject"
+                              formatter="context.mailSubjectFormatter"/>
+                </span>
+              </var:if>
+              <var:if condition="isMessageRead" const:negate="YES">
+                <span class="unreadmailsubject">
+                  <var:string value="message.envelope.subject"
+                              formatter="context.mailSubjectFormatter"/>
+                </span>
+              </var:if>
+            </td>
+            <td>
+              <var:string value="message.envelope.from"
+                          formatter="context.mailEnvelopeAddressFormatter" />
+            </td>
+            <td>
+              <var:string value="message.envelope.to"
+                          formatter="context.mailEnvelopeAddressFormatter" />
+            </td>
             <td><var:string value="message.flags"/></td>
           </tr>
         </var:foreach>
       Folder List
     </div>
   </div>
-
-  <div class="embedwhite_out">
-    <div class="embedwhite_in">
-      Content
-      <a rsrc:href="tbird_073_mailwelcome.png">screenshot</a>
-    </div>
-  </div>
-
 </var:component>
index cab297dce179f93daddb8c8e20c17af86c0b5d3b..28292b549059af8a6800e33ac74ed5ab727067ed 100644 (file)
@@ -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 (file)
index 0000000..7d9d603
--- /dev/null
@@ -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 <NGObjWeb/WOContext.h>
+
+/*
+  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 (file)
index 0000000..3603b75
--- /dev/null
@@ -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) */
index caaa246e639d77c9aae76005c08bab1e0cbb5c69..90646d7c5ec99062121bf17a9d452c0aecb2cc9b 100644 (file)
@@ -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;
+}