This is TableSource.m in view mode; [Download] [Up]
/*
* Filename: TableSource.m
* Created : Wed Nov 27 15:15:58 1996
* Author : Vince DeMarco <vdemarco@bou.shl.com>
* LastEditDate Was "Fri Jan 17 10:38:44 1997"
*/
#import "TableSource.h"
#import <objc/objc-class.h>
#import <Foundation/NSException.h>
#import <Foundation/NSInvocation.h>
#import <Foundation/NSMethodSignature.h>
#import <AppKit/NSTableView.h>
#import <AppKit/NSTableColumn.h>
#import "Sorting.h"
@implementation NSArray(NSArray_TableSource)
- (SEL)selectorForGetIdentifier:(NSString *)identifier
{
SEL ident;
ident = NSSelectorFromString(identifier);
if (ident){
return ident;
}
return 0;
}
- (SEL)selectorForSetIdentifier:(NSString *)identifier
{
SEL set_ident;
NSString *string;
string = [NSString stringWithFormat:@"set%@%@:",[[identifier substringToIndex:1] capitalizedString],
[identifier substringFromIndex:1]];
set_ident = NSSelectorFromString(string);
if (set_ident){
return set_ident;
}
return 0;
}
- (int)numberOfRowsInTableView:(NSTableView *)tableView
{
return [self count];
}
- (id)tableView:(NSTableView *)tableView
objectValueForTableColumn:(NSTableColumn *)tableColumn
row:(int)row
{
SEL theSelector;
NSMethodSignature *signature;
NSInvocation *anInvocation;
NSParameterAssert(row >= 0 && row < [self count]);
theSelector = [self selectorForGetIdentifier:[tableColumn identifier]];
if (![[self objectAtIndex:row] respondsToSelector:theSelector]){
[NSException raise:NSGenericException
format:@"Table Source <tableView:objectValueForTableColumn:row:> object does not implement selector %@",
[tableColumn identifier]];
return self;
}
signature = [[self objectAtIndex:row] methodSignatureForSelector:theSelector];
NSParameterAssert([signature numberOfArguments] == 2);
anInvocation = [NSInvocation invocationWithMethodSignature:signature];
[anInvocation setSelector:theSelector];
[anInvocation setTarget:[self objectAtIndex:row]];
switch ([signature methodReturnType][0]){
case _C_ID:
{
id result;
[anInvocation invoke];
[anInvocation getReturnValue:&result];
return result;
}
case _C_CLASS:
{
Class result;
[anInvocation invoke];
[anInvocation getReturnValue:&result];
return result;
}
case _C_CHR:
{
char result;
[anInvocation invoke];
[anInvocation getReturnValue:&result];
return [NSNumber numberWithChar:result];
}
case _C_UCHR:
{
unsigned char result;
[anInvocation invoke];
[anInvocation getReturnValue:&result];
return [NSNumber numberWithUnsignedChar:result];
}
case _C_SHT:
{
short result;
[anInvocation invoke];
[anInvocation getReturnValue:&result];
return [NSNumber numberWithShort:result];
}
case _C_USHT:
{
unsigned short result;
[anInvocation invoke];
[anInvocation getReturnValue:&result];
return [NSNumber numberWithUnsignedShort:result];
}
case _C_INT:
{
int result;
[anInvocation invoke];
[anInvocation getReturnValue:&result];
return [NSNumber numberWithInt:result];
}
case _C_UINT:
{
unsigned int result;
[anInvocation invoke];
[anInvocation getReturnValue:&result];
return [NSNumber numberWithUnsignedInt:result];
}
case _C_LNG:
{
long int result;
[anInvocation invoke];
[anInvocation getReturnValue:&result];
return [NSNumber numberWithLong:result];
}
case _C_ULNG:
{
unsigned long int result;
[anInvocation invoke];
[anInvocation getReturnValue:&result];
return [NSNumber numberWithUnsignedLong:result];
}
case _C_FLT:
{
float result;
[anInvocation invoke];
[anInvocation getReturnValue:&result];
return [NSNumber numberWithFloat:result];
}
case _C_DBL:
{
double result;
[anInvocation invoke];
[anInvocation getReturnValue:&result];
return [NSNumber numberWithDouble:result];
}
case _C_CHARPTR:
{
char *result;
[anInvocation invoke];
[anInvocation getReturnValue:&result];
return [NSString stringWithCString:result];
}
default:
return nil;
}
}
- (void)tableView:(NSTableView *)tableView
setObjectValue:(id)object
forTableColumn:(NSTableColumn *)tableColumn
row:(int)row
{
SEL theSelector;
NSMethodSignature *signature;
NSInvocation *anInvocation;
NSParameterAssert(row >= 0 && row < [self count]);
theSelector = [self selectorForSetIdentifier:[tableColumn identifier]];
if (![[self objectAtIndex:row] respondsToSelector:theSelector]){
[NSException raise:NSGenericException
format:@"Table Source <tableView:setObjectValue:row:> object does not implement selector %@",
[tableColumn identifier]];
return;
}
signature = [[self objectAtIndex:row] methodSignatureForSelector:theSelector];
NSParameterAssert([signature numberOfArguments] == 3);
anInvocation = [NSInvocation invocationWithMethodSignature:signature];
[anInvocation setSelector:theSelector];
[anInvocation setTarget:[self objectAtIndex:row]];
switch ([signature getArgumentTypeAtIndex:2][0]){
case _C_ID:
case _C_CLASS:
{
[anInvocation setArgument:&object atIndex:2];
[anInvocation invoke];
break;
}
case _C_CHR:
{
char value;
value = [object charValue];
[anInvocation setArgument:&value atIndex:2];
[anInvocation invoke];
break;
}
case _C_UCHR:
{
unsigned char value;
value = [object unsignedCharValue];
[anInvocation setArgument:&value atIndex:2];
[anInvocation invoke];
break;
}
case _C_SHT:
{
short value;
value = [object shortValue];
[anInvocation setArgument:&value atIndex:2];
[anInvocation invoke];
break;
}
case _C_USHT:
{
unsigned short value;
value = [object unsignedShortValue];
[anInvocation setArgument:&value atIndex:2];
[anInvocation invoke];
break;
}
case _C_INT:
{
int value;
value = [object intValue];
[anInvocation setArgument:&value atIndex:2];
[anInvocation invoke];
break;
}
case _C_UINT:
{
unsigned int value;
value = [object unsignedIntValue];
[anInvocation setArgument:&value atIndex:2];
[anInvocation invoke];
break;
}
case _C_LNG:
{
long int value;
value = [object longValue];
[anInvocation setArgument:&value atIndex:2];
[anInvocation invoke];
break;
}
case _C_ULNG:
{
unsigned long int value;
value = [object unsignedLongValue];
[anInvocation setArgument:&value atIndex:2];
[anInvocation invoke];
break;
}
case _C_FLT:
{
float value;
value = [object floatValue];
[anInvocation setArgument:&value atIndex:2];
[anInvocation invoke];
break;
}
case _C_DBL:
{
double value;
value = [object doubleValue];
[anInvocation setArgument:&value atIndex:2];
[anInvocation invoke];
break;
}
case _C_CHARPTR:
{
const char *value;
value = [object cString];
[anInvocation setArgument:(void *)value atIndex:2];
[anInvocation invoke];
break;
}
default:
break;
}
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.