This is MailReader.m in view mode; [Download] [Up]
/* -*-C-*- ******************************************************************************* * * File: MailReader.m * RCS: /usr/local/sources/CVS/EnhanceMail/MailReader.m,v 1.21 1998/06/30 20:18:49 tom Exp * Description: * Author: Carl Edman * Created: Fri Oct 13 11:48:05 1995 * Modified: Sat Apr 13 19:09:44 1996 (Carl Edman) cedman@capitalist.princeton.edu * Language: C * Package: N/A * Status: Experimental (Do Not Distribute) * * (C) Copyright 1995, but otherwise this file is perfect freeware. * ******************************************************************************* */ #import "EnhanceMail.h" #import "MailReader.h" #import "MailBox.h" #import "XFace.h" #import "XImageURL.h" #import "XImageAliases.h" #import "Preferences.h" #import "TransferPanel.h" #define MENU_MESSAGE_FLAG NXLocalizedStringFromTableInBundle("Localizable", EnhanceBundle, "Message/Flag", NULL, Slashed menu path to flag command) #define MENU_MESSAGE_STRIP NXLocalizedStringFromTableInBundle("Localizable", EnhanceBundle, "Message/Strip", NULL, Slashed menu path to strip command) #define MENU_MAILBOX_INDEX NXLocalizedStringFromTableInBundle("Localizable", EnhanceBundle, "Mailbox/Index", NULL, Slashed menu path to create index command) #define MENU_MAILBOX_UNINDEX NXLocalizedStringFromTableInBundle("Localizable", EnhanceBundle, "Mailbox/Delete index", NULL, Slashed menu path to remove index command) #define STATUS_INDEXED NXLocalizedStringFromTableInBundle("Localizable", EnhanceBundle, "indexed", NULL, in MailReader status field) /* This is to avoid genstrings from breaking. */ #define LOCALIZE(TABLE,BUNDLE,KEY,VALUE) NXLoadLocalized\ StringFromTableInBundle(TABLE,BUNDLE,KEY,VALUE) static id index_menucell=nil; static id indextag_image=nil; @implementation EnhanceMailReader + finishLoading:(struct mach_header *)header { char path[MAXPATHLEN+1]; EnhanceBundleInit(); [self poseAs:[self superclass]]; [[NXApp mainMenu] addSlashItem:MENU_MESSAGE_FLAG action:@selector(toggleFlagged:) keyEquivalent:0]; #if 0 [[NXApp mainMenu] addSlashItem:MENU_MESSAGE_STRIP action:@selector(strip:) keyEquivalent:0]; #endif index_menucell=[[NXApp mainMenu] addSlashItem:MENU_MAILBOX_INDEX action:@selector(toggleIndexing:) keyEquivalent:0]; if ([EnhanceBundle getPath:path forResource:"indexTag" ofType:"tiff"]) indextag_image=[[NXImage alloc] initFromFile:path]; return self; } - loadMessage:(int)fp16 newMsg:(BOOL)fp20 withAllHeaders:(BOOL)fp24 { const char *header; id ret; Window *w = [self window]; [w disableFlushWindow]; ret = [super loadMessage:fp16 newMsg:fp20 withAllHeaders:fp24]; if (EnhanceShowXImageURL) { const char *url = [mailMessage headerValueForKey:"X-Image-URL"]; char *address = NULL; int len; if ((header = [mailMessage headerValueForKey:"From"]) || (header = [mailMessage headerValueForKey:"Reply-To"])) { if (EnhanceGetAddress(header, &header, &len)) { address = alloca(len+1); strncpy(address, header, len); address[len] = '\0'; } } [command setXImageURL:url address:address]; } if (EnhanceShowXFace && (header=[mailMessage headerValueForKey:"X-Face"])) { [command setXFace:header]; } [w reenableFlushWindow]; [w flushWindowIfNeeded]; return ret; } - (void)loadMessage:(MailMessage *)message into:fp20 { /* This fixes the annoying habit of Mail.app to display ASCII messages sent by NeXT Mail.app in a proportional font, even if "Use Fixed Pitch Font For Plain Text" is selected (subject to an EM preference, of course; some people may actually like the old behaviour). */ if (EnhanceUseFixedPitchFontForPlainMessages) { if ([[Defaults new] autoSelectFont] && ![message isRichBody]) { [self loadMessage:message into:fp20 headerFont:msgFont bodyFont:fixedFont allHeaders:[self displayAllHeaders]]; return; } } [super loadMessage:message into:fp20]; } - (void)updateTransferPanel:(int)oldMessageCount { //printf("oldMessageCount:%d\n", oldMessageCount); //printf("newMessageCount:%d\n", newMessageCount); if (newMessageCount != oldMessageCount) { //printf("updating Transferpanel for %s\n",[mailbox dirname]); [[TransferPanel new] updateMessageCount:newMessageCount old:oldMessageCount forMailBoxNamed:[mailbox dirname] isNew:NO]; } } - free { /* XXX For now, don't autocompact indexed mailboxes. */ if (EnhanceAutoCompact && mailbox && ![mailbox hasStore]) { struct u_mailboxstatus stat; [mailbox getMailboxStatus:&stat]; if (stat.delmsgno>0) [self compact:self]; } return [super free]; } - compact:sender { if (mailbox && [mailbox hasStore]) { id ret; [self toggleIndexing:sender]; ret=[super compact:sender]; [self toggleIndexing:sender]; return ret; } return [super compact:sender]; } - strip:sender { #if 0 id list=[matrix getSelectedCells:nil]; id cell; int i; for(i=0;i<[list count];i++) { cell=[list objectAt:i]; if (cell==nil) continue; /* XXX Strip every message of all NeXT/MIME/uuencoded attachments XXX */ } list=[list free]; #endif return self; } - (void)_newMailMsg { if (!EnhanceSilentNewMail && strcmp([mailbox dirname], [[Defaults new] activeMailbox]) != 0) { [NXApp newMailMsg]; } } - incorporateMail:sender { int oldMessageCount = newMessageCount; id ret = [super incorporateMail:sender]; if (newMessageCount > oldMessageCount) { [[TransferPanel new] setNewMailFlagForMailBoxNamed:[mailbox dirname]]; [self _newMailMsg]; } return ret; } - newMail:sender { if ([[TransferPanel new] checkNewMailForReader:self]) { /* Don't invoke super if successful, because it tends to beep. */ return self; } return [super newMail:sender]; } - (void)setFlagged:(BOOL)flag { id cell=[matrix selectedCell]; if (cell==nil) return; #if 0 [cell setFlagged:YES]; if (mailbox==nil) return; [mailbox setState:'+' forMsg:[cell msgId] flush:NO]; [self display]; #endif if ([cell isFlagged] == !flag) { [self toggleFlagged:self]; } return; } - toggleFlagged:sender { id ret = [super toggleFlagged:sender]; id cell = [matrix selectedCell]; if (cell) { [[TransferPanel new] updateFlaggedCountBy:([cell isFlagged] ? +1 : -1) forMailBoxNamed:[mailbox dirname]]; } return ret; } - toggleIndexing:sender { if (mailbox==nil) return nil; if ([mailbox hasStore]) [mailbox deleteStore]; else [mailbox createStore]; [self display]; [self windowDidBecomeMain:self]; [self updateStatus]; return self; } - windowDidBecomeMain:sender { const char *c; if ((mailbox==nil)||(index_menucell==nil)) return self; c=[mailbox hasStore] ? MENU_MAILBOX_UNINDEX : MENU_MAILBOX_INDEX; if (c=rindex(c,'/')) [index_menucell setTitle:(c+1)]; return self; } static const char *formatSize(char *buf, unsigned long size) { /* Take size format from Mail.app's UI.strings. */ const unsigned long MB_CUTOFF = (750*1024); const unsigned long KB_CUTOFF = (750); const char *format = LOCALIZE("UI", nil, ((size > MB_CUTOFF) ? "%.1fMB" : (size > KB_CUTOFF) ? "%dKB" : "%d bytes"), NULL); if (size > MB_CUTOFF) { sprintf(buf, format, (float)size / (1024*1024)); } else { sprintf(buf, format, (size > KB_CUTOFF) ? (size + 1024/2-1)/1024 : size); } return buf; } - (void)updateStatus { int indexSize = 0; int oldMessageCount = newMessageCount; Window *w = [statusField window]; [w disableFlushWindow]; [super updateStatus]; [self updateTransferPanel:oldMessageCount]; if (statusField && mailbox && ((indexSize = [mailbox storeSize]) >= 0 || newMessageCount > 0)) { char buf[MAXPATHLEN+1], sizeBuf[20]; BOOL showSizes = [[self matrix] showSizes]; strcpy(buf, [statusField stringValue]); if (newMessageCount > 0) { /* Take `unread' from Mail.app's UI.strings. */ const char *unread = LOCALIZE("UI", nil, (newMessageCount==1) ? "new_message" : "new_messages", "unread"); sprintf(buf+strlen(buf), " \320 %d %s", newMessageCount, unread); if (showSizes) { struct u_mailboxstatus st; [mailbox getMailboxStatus:&st]; sprintf(buf+strlen(buf), " (%s)", formatSize(sizeBuf, st.unreadmsgsize)); } } if (indexSize >= 0 && showSizes) { /* Not much sense to add "indexed" without size, since we already display an index icon if mailbox is indexed. */ sprintf(buf+strlen(buf), " \320 %s (%s)", STATUS_INDEXED, formatSize(sizeBuf, indexSize)); } [statusField setStringValue:buf]; } [w reenableFlushWindow]; [w flushWindowIfNeeded]; } - drawSelf:(const NXRect *)rects :(int)rectCount { id ret=[super drawSelf:rects:rectCount]; if ((mailbox==nil)||(indextag_image==nil)) return nil; if ([mailbox hasStore]) { NXPoint p; NXSize s; [indextag_image getSize:&s]; p.x=0; p.y=s.height; [indextag_image composite:NX_SOVER toPoint:&p]; } return ret; } #if 0 // Experimental cruft. // flagged messages loose their flag when transferred - showTransferMsg:(int)fp16 to:(const char *)fp20; { //printf("showTransferMsg:%d,%s\n",fp16,fp20); return [super showTransferMsg:fp16 to:fp20]; } - transfer:fp16; { //printf("transfer:%p class=%s\n",fp16,[[fp16 class] name]); return [super transfer:fp16]; } - showTransfer:fp16; { //printf("showTransfer:%p\n",fp16); return [super showTransfer:fp16]; } #endif @end // EnhanceMailReader @implementation CommandView(EnhanceMailReaderFace) - setXFace:(const char *)xface { NXSize size; if (face) return self; size.width=size.height=64; face=[[NXImage alloc] initXFace:xface size:&size]; [self display]; return self; } - setXImageURL:(const char *)ximageurl address:(const char *)address { if (!face) { EnhanceXImageAliases *aliases = [EnhanceXImageAliases aliases]; const char *imageFile; if (ximageurl) { if ((imageFile = [aliases fileForURL:ximageurl])) { face = [[NXImage alloc] initFromFile:imageFile]; } else { face = [[NXImage alloc] initURL:ximageurl]; if (!face) face = [NXImage findImageNamed:"user"]; [aliases recordURL:ximageurl forAddress:address]; } } else if (address) { if ((imageFile = [aliases fileForAddress:address])) { face = [[NXImage alloc] initFromFile:imageFile]; } } if (face) [self display]; } return self; } @end // CommandView (EnhanceMailReader)
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.