]> err.no Git - scalable-opengroupware.org/blobdiff - UI/MailerUI/UIxMailListView.m
git-svn-id: http://svn.opengroupware.org/SOGo/inverse/trunk@1123 d1b88da0-ebda-0310...
[scalable-opengroupware.org] / UI / MailerUI / UIxMailListView.m
index de669d916bcd160f4a584503efd01268aa588888..41ba101bbc588655e58c9831014509a1c6a08e8b 100644 (file)
   object.
 */
 
-#define messagesPerPage 50
-
-#include "common.h"
-#include <SoObjects/Mailer/SOGoMailFolder.h>
-#include <SoObjects/Mailer/SOGoMailObject.h>
-#include <NGObjWeb/SoObject+SoDAV.h>
+#import <Foundation/NSCalendarDate.h>
+#import <Foundation/NSDictionary.h>
+#import <Foundation/NSValue.h>
+#import <NGObjWeb/WOResponse.h>
+#import <NGObjWeb/WORequest.h>
+#import <NGObjWeb/SoObject+SoDAV.h>
+#import <NGObjWeb/NSException+HTTP.h>
+#import <NGExtensions/NSNull+misc.h>
+#import <NGExtensions/NSString+misc.h>
+
+#import <EOControl/EOQualifier.h>
+
+#import <SoObjects/Mailer/SOGoMailFolder.h>
+#import <SoObjects/Mailer/SOGoMailObject.h>
+#import <SoObjects/SOGo/SOGoDateFormatter.h>
+#import <SoObjects/SOGo/SOGoUser.h>
 
 #import "UIxMailListView.h"
 
+#define messagesPerPage 50
 static int attachmentFlagSize = 8096;
 
 @implementation UIxMailListView
 
-- (void) dealloc 
+- (id) init
 {
-  [self->qualifier  release];
-  [self->sortedUIDs release];
-  [self->messages   release];
-  [self->message    release];
-  [super dealloc];
-}
+  SOGoUser *user;
 
-/* notifications */
+  if ((self = [super init]))
+    {
+      qualifier = nil;
+      user = [context activeUser];
+      ASSIGN (dateFormatter, [user dateFormatterInContext: context]);
+      ASSIGN (userTimeZone, [user timeZone]);
+    }
+
+  return self;
+}
 
-- (void) sleep 
+- (void) dealloc 
 {
-  [self->qualifier  release]; self->qualifier  = nil;
-  [self->sortedUIDs release]; self->sortedUIDs = nil;
-  [self->messages   release]; self->messages   = nil;
-  [self->message    release]; self->message    = nil;
-  [super sleep];
+  [qualifier release];
+  [sortedUIDs release];
+  [messages release];
+  [message release];
+  [dateFormatter release];
+  [userTimeZone release];
+  [super dealloc];
 }
 
 /* accessors */
 
-- (void)setMessage:(id)_msg
+- (void) setMessage: (id) _msg
 {
-  ASSIGN(self->message, _msg);
+  ASSIGN(message, _msg);
 }
 
 - (id) message 
 {
-  return self->message;
+  return message;
 }
 
-- (void) setQualifier: (EOQualifier *) _msg 
+- (NSString *) messageDate
 {
-  ASSIGN(self->qualifier, _msg);
-}
+  NSCalendarDate *messageDate;
 
-- (EOQualifier *) qualifier 
-{
-  return self->qualifier;
+  messageDate = [[message valueForKey: @"envelope"] date];
+  [messageDate setTimeZone: userTimeZone];
+
+  return [dateFormatter formattedDateAndTime: messageDate];
 }
 
 - (BOOL) showToAddress 
@@ -128,7 +145,7 @@ static int attachmentFlagSize = 8096;
   return [[[self message] valueForKey:@"uid"] stringValue];
 }
 
-- (NSString *) messageCellStyleClass 
+- (NSString *) messageRowStyleClass 
 {
   return [self isMessageDeleted]
     ? @"mailer_listcell_deleted"
@@ -137,11 +154,9 @@ static int attachmentFlagSize = 8096;
 
 - (NSString *) messageSubjectCellStyleClass 
 {
-  return [NSString stringWithFormat: @"%@ %@",
-                  [self messageCellStyleClass],
-                  ([self isMessageRead]
-                   ? @"mailer_readmailsubject"
-                   : @"mailer_unreadmailsubject")];
+  return ([self isMessageRead]
+         ? @"mailer_readmailsubject"
+         : @"mailer_unreadmailsubject");
 }
 
 - (BOOL) hasMessageAttachment 
@@ -160,7 +175,7 @@ static int attachmentFlagSize = 8096;
   /* Note: see SOGoMailManager.m for allowed IMAP4 keys */
   static NSArray *keys = nil;
   if (keys == nil) {
-    keys = [[NSArray alloc] initWithObjects:
+    keys = [[NSArray alloc] initWithObjects: @"UID",
                              @"FLAGS", @"ENVELOPE", @"RFC822.SIZE", nil];
   }
   return keys;
@@ -168,39 +183,29 @@ static int attachmentFlagSize = 8096;
 
 - (NSString *) defaultSortKey 
 {
-  return @"DATE";
+  return @"ARRIVAL";
 }
 
 - (NSString *) imap4SortKey 
 {
   NSString *sort;
   
-  sort = [[[self context] request] formValueForKey:@"sort"];
+  sort = [[context request] formValueForKey: @"sort"];
 
-  if ([sort length] == 0)
+  if (![sort length])
     sort = [self defaultSortKey];
 
   return [sort uppercaseString];
 }
 
-- (BOOL) isSortedDescending
-{
-  NSString *desc;
-
-  desc = [[[self context] request] formValueForKey:@"desc"];
-
-  return ((desc)
-          ? [desc boolValue]
-          : YES);
-}
-
 - (NSString *) imap4SortOrdering 
 {
-  NSString *sort;
+  NSString *sort, *ascending;
 
   sort = [self imap4SortKey];
 
-  if ([self isSortedDescending])
+  ascending = [[context request] formValueForKey: @"asc"];
+  if (![ascending boolValue])
     sort = [@"REVERSE " stringByAppendingString: sort];
 
   return sort;
@@ -208,27 +213,27 @@ static int attachmentFlagSize = 8096;
 
 - (NSRange) fetchRange 
 {
-  if (self->firstMessageNumber == 0)
+  if (firstMessageNumber == 0)
     return NSMakeRange(0, messagesPerPage);
-  return NSMakeRange(self->firstMessageNumber - 1, messagesPerPage);
+  return NSMakeRange(firstMessageNumber - 1, messagesPerPage);
 }
 
 - (NSArray *) sortedUIDs 
 {
   if (!sortedUIDs)
     {
-      sortedUIDs 
-        = [[self clientObject] fetchUIDsMatchingQualifier: [self qualifier]
-                               sortOrdering: [self imap4SortOrdering]];
+      sortedUIDs
+        = [[self clientObject] fetchUIDsMatchingQualifier: qualifier
+                              sortOrdering: [self imap4SortOrdering]];
       [sortedUIDs retain];
     }
 
-  return self->sortedUIDs;
+  return sortedUIDs;
 }
 
 - (unsigned int) totalMessageCount 
 {
-  return [self->sortedUIDs count];
+  return [sortedUIDs count];
 }
 
 - (BOOL) showsAllMessages 
@@ -312,18 +317,19 @@ static int attachmentFlagSize = 8096;
   NSRange  r;
   unsigned len;
   
-  if (self->messages != nil)
-    return self->messages;
-  
+  if (messages != nil)
+    return messages;
+
   r    = [self fetchBlock];
   uids = [self sortedUIDs];
   if ((len = [uids count]) > r.length)
     /* only need to restrict if we have a lot */
     uids = [uids subarrayWithRange:r];
   
-  msgs = [[self clientObject] fetchUIDs:uids parts:[self fetchKeys]];
-  self->messages = [[msgs valueForKey:@"fetch"] retain];
-  return self->messages;
+  msgs = [[self clientObject] fetchUIDs: uids parts: [self fetchKeys]];
+  messages = [[msgs valueForKey: @"fetch"] retain];
+
+  return messages;
 }
 
 /* URL processing */
@@ -406,25 +412,26 @@ static int attachmentFlagSize = 8096;
 {
   NSString *uid;
   
-  if ((uid = [[[self context] request] formValueForKey:@"uid"]) == nil)
+  if ((uid = [[context request] formValueForKey: @"uid"]) == nil)
     return nil;
 
-  return [[self clientObject] lookupName:uid inContext:[self context]
-                             acquire:NO];
+  return [[self clientObject] lookupName: uid
+                             inContext: context
+                             acquire: NO];
 }
 
 /* actions */
 
 - (BOOL) isJavaScriptRequest 
 {
-  return [[[[self context] request] formValueForKey:@"jsonly"] boolValue];
+  return [[[context request] formValueForKey:@"jsonly"] boolValue];
 }
 
 - (id) javaScriptOK 
 {
   WOResponse *r;
 
-  r = [[self context] response];
+  r = [context response];
   [r setStatus:200 /* OK */];
   return r;
 }
@@ -447,17 +454,57 @@ static int attachmentFlagSize = 8096;
   return firstMessage;
 }
 
+- (void) _setQualifierForCriteria: (NSString *) criteria
+                        andValue: (NSString *) value
+{
+  [qualifier release];
+
+  if ([criteria isEqualToString: @"subject"])
+    qualifier = [EOQualifier qualifierWithQualifierFormat:
+                              @"(subject doesContain: %@)",
+                            value];
+  else if ([criteria isEqualToString: @"sender"])
+    qualifier = [EOQualifier qualifierWithQualifierFormat:
+                            @"(from doesContain: %@)",
+                            value];
+  else if ([criteria isEqualToString: @"subject_or_sender"])
+    qualifier = [EOQualifier qualifierWithQualifierFormat:
+                              @"(subject doesContain: %@) OR "
+                            @"(from doesContain: %@)",
+                            value, value];
+  else if ([criteria isEqualToString: @"to_or_cc"])
+    qualifier = [EOQualifier qualifierWithQualifierFormat:
+                              @"(to doesContain: %@) OR "
+                            @"(cc doesContain: %@)",
+                            value, value];
+  else if ([criteria isEqualToString: @"entire_message"])
+    qualifier = [EOQualifier qualifierWithQualifierFormat:
+                            @"(message doesContain: %@)",
+                            value];
+  else
+    qualifier = nil;
+
+  [qualifier retain];
+}
+
 - (id) defaultAction 
 {
   WORequest *request;
-  NSString *specificMessage;
+  NSString *specificMessage, *searchCriteria, *searchValue;
 
-  request = [[self context] request];
+  request = [context request];
 
   [[self clientObject] flushMailCaches];
 
   specificMessage = [request formValueForKey: @"pageforuid"];
-  self->firstMessageNumber
+  searchCriteria = [request formValueForKey: @"search"];
+  searchValue = [request formValueForKey: @"value"];
+  if ([searchCriteria length] > 0
+      && [searchValue length] > 0)
+    [self _setQualifierForCriteria: searchCriteria
+         andValue: searchValue];
+
+  firstMessageNumber
     = ((specificMessage)
        ? [self firstMessageOfPageFor: [specificMessage intValue]]
        : [[request formValueForKey:@"idx"] intValue]);
@@ -524,19 +571,24 @@ static int attachmentFlagSize = 8096;
 {
   // TODO: we might want to flush the caches?
   NSException *error;
-  id client;
-  
-  if ((client = [self clientObject]) == nil) {
-    return [NSException exceptionWithHTTPStatus:404 /* Not Found */
-                       reason:@"did not find mail folder"];
-  }
-  
-  if ((error = [[self clientObject] expunge]) != nil)
-    return error;
+  id clientObject;
+
+  clientObject = [self clientObject];
+  if (clientObject)
+    {
+      error = [clientObject expunge];
+      if (!error)
+       {
+         if ([clientObject respondsToSelector: @selector(flushMailCaches)])
+           [clientObject flushMailCaches];
+         return [self redirectToLocation:@"view"];
+       }
+    }
+  else
+    error = [NSException exceptionWithHTTPStatus:404 /* Not Found */
+                        reason: @"did not find mail folder"];
   
-  if ([client respondsToSelector:@selector(flushMailCaches)])
-    [client flushMailCaches];
-  return [self redirectToLocation:@"view"];
+  return error;
 }
 
 @end