This is SmileyPrefs.m in view mode; [Download] [Up]
/* -*-ObjC-*- ******************************************************************************* * * File: SmileyPrefs.m * RCS: /usr/local/sources/CVS/EnhanceMail/SmileyPrefs.m,v 1.1 1997/09/14 22:42:12 tom Exp * Description: * Author: Tom Hageman * Created: Fri Sep 5 18:48:41 1997 * Modified: * Language: Objective-C * Package: N/A * Status: Experimental * * (C) Copyright 1997, but otherwise this file is perfect freeware. * ******************************************************************************* */ #import "SmileyPrefs.h" #import <dbkit/dbkit.h> #import "SimpleString.h" #import "XImageURL.h" #import <regex.h> // NOT "regexp.h" since DisplayFilter uses system regex routines. @interface EnhanceSmileyTableViewController (TableViewDataSource) - (void)_setupTableView; - (void)_reloadTableView; @end @implementation EnhanceSmileyTableViewController - awakeFromNib { [self _setupTableView]; [self setAction:@selector(noteChange:)]; // Kludge: cannot set action in IB for custom object. return self; } - target { return target; } - setTarget:anObject { target = anObject; return self; } - (SEL)action { return action; } - setAction:(SEL)aSelector { action = aSelector; return self; } /* contentsList contains alternating regex / smileyName string pairs. i.e. contentsList[2*n] = regex[n], contenstList[2*n+1] = smileyName[n]. */ - (const char *)stringValue { if (contentsString == nil) { unsigned i, count = [contentsList count]; contentsString = [[SimpleString alloc] init]; for (i = 0; i < count; i++) { SimpleString *ss = [contentsList objectAt:i]; // XXX Clean this up. /* Ignore if either regex or name is an empty string. -- in effect, remove this entry. */ if ([ss length] && [[contentsList objectAt:(i^1)] length]) { [contentsString appendSimpleString:ss]; [contentsString appendChar:'\n']; } } } return [contentsString string]; } - setStringValue:(const char *)aValue { if (aValue && (!contentsString || strcmp([contentsString string], aValue) != 0)) { [contentsString free]; contentsString = [[SimpleString allocFromZone:[self zone]] init]; [contentsString appendString:aValue]; [contentsList freeObjects]; [self _reloadTableView]; } return self; } @end // EnhanceSmileyTableViewController @implementation EnhanceSmileyTableViewController (TableViewDataSource) #define COL_REGEX 1 #define COL_NAME 2 #define COL_IMAGE 3 - (void)_setupTableView { [tableView setDataSource:self]; [[tableView columnAt:0] setIdentifier:(id)COL_REGEX]; [[tableView columnAt:1] setIdentifier:(id)COL_NAME]; [[tableView columnAt:2] setIdentifier:(id)COL_IMAGE]; [[tableView columnAt:2] setFormatter:[[DBImageFormatter alloc] init]]; } - (void)_reloadTableView { int oldSelectedRow = [tableView selectedRow]; if (!contentsList) contentsList = [[List allocFromZone:[self zone]] init]; if ([contentsList count] == 0) { const char *c, *d, *e; SimpleString *ss; for (c = [contentsString string]; *c; c = d) { for (d = c; *d && *d != '\n'; d++) ; if (!*d) break; e = d; for (d = e + 1; *d && *d != '\n'; d++) ; if (e > c && d > e+1) { [ss = [[SimpleString allocFromZone:[self zone]] init] appendString:c length:(e-c)]; [contentsList addObject:ss]; [ss = [[SimpleString allocFromZone:[self zone]] init] appendString:(e+1) length:(d-(e+1))]; [contentsList addObject:ss]; if (*d) d++; } } } [tableView reloadData:self]; if (oldSelectedRow >= 0 && oldSelectedRow < [tableView rowCount]) { [tableView selectRow:oldSelectedRow byExtension:NO]; [tableView scrollRowToVisible:oldSelectedRow]; } else { [tableView deselectAll:self]; } } - (unsigned)rowCount { return [contentsList count] / 2 + 1; } - getValueFor:identifier at:(unsigned)aPosition into:aValue { unsigned i = aPosition * 2; const char *s, *ext; NXImage *image = nil; switch ((int)identifier) { case COL_REGEX: s = (i < [contentsList count]) ? [[contentsList objectAt:i] string] : ""; [aValue setStringValue:s]; break; case COL_NAME: s = (i+1 < [contentsList count]) ? [[contentsList objectAt:i+1] string] : ""; // Strip .tiff extension. if ((ext = strrchr(s, '.')) && strcmp(ext, ".tiff") == 0) { char *t = strncpy(alloca(ext-s+1), s, (ext-s)); t[ext-s] = '\0'; s = t; } [aValue setStringValue:s]; break; case COL_IMAGE: if (i+1 < [contentsList count]) { s = [[contentsList objectAt:i+1] string]; image = [[NXImage allocFromZone:[self zone]] initNameInPath:s]; } [aValue setObjectValue:image]; [image free]; break; } return self; } - setValueFor:identifier at:(unsigned)aPosition from:aValue { unsigned i = aPosition * 2; const char *s, *ext, *re_sult; SimpleString *ss; // Add empty row if last empty line is filled. while (i >= [contentsList count]) { [contentsList addObject:[[SimpleString allocFromZone:[self zone]] init]]; [contentsList addObject:[[SimpleString allocFromZone:[self zone]] init]]; } switch ((int)identifier) { case COL_REGEX: s = [aValue stringValue]; if ((re_sult = re_comp(s)) != NULL) { NXRunLocalizedAlertPanel("Alerts", "Regular Expression Error", re_sult, NULL, NULL, NULL); // XXX Localization return nil; } [ss = [[SimpleString allocFromZone:[self zone]] init] appendString:s]; [[contentsList replaceObjectAt:i with:ss] free]; break; case COL_NAME: s = [aValue stringValue]; [ss = [[SimpleString allocFromZone:[self zone]] init] appendString:s]; if (s[0] && (ext = strrchr(s, '.')) == NULL) [ss appendString:".tiff"]; [[contentsList replaceObjectAt:(i+1) with:ss] free]; break; case COL_IMAGE: /* Shouldn't happen -- ignore. */ return nil; } if (contentsString) [contentsString free], contentsString = nil; // Remove empty row. // XXX The following does not work yet for some reason... if ([[contentsList objectAt:i] length] == 0 && [[contentsList objectAt:i+1] length] == 0) { [[contentsList removeObjectAt:i+1] free]; [[contentsList removeObjectAt:i] free]; } [self _reloadTableView]; // XXX brute-force approach. if ([self action] && [self target]) { [NXApp sendAction:[self action] to:[self target] from:self]; } return self; } @end // EnhanceSmileyTableViewController (TableViewDataSource)
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.