This is MColCell.m in view mode; [Download] [Up]
#import "MColCell.h" typedef struct _Column { unsigned short offset; BOOL copy; const char *value; } Column; #define Column_desc "SC*" @implementation MColCell - init { if (![super init]) return nil; [self initMColCell]; return self; } - initTextCell:(const char *)string { Column col; if (![super initTextCell:string]) return nil; [self initMColCell]; col.offset = 0; col.copy = YES; if (string) col.value = NXCopyStringBuffer(string); else col.value = NULL; [stringValues addElement:&col]; return self; } - initIconCell:(const char *)string { if (![super initIconCell:string]) return nil; [self initMColCell]; return self; } - initMColCell { stringValues = [[Storage alloc] initCount:0 elementSize:sizeof(Column) description:Column_desc]; return self; } - free { int count = [stringValues count]; int ind; Column *col; for (ind=0; ind<count; ind++) { col = [stringValues elementAt:ind]; if (col->copy) free((char *)col->value); } [stringValues free]; return [super free]; } - setStringValue:(const char *)string at:(int)col copy:(BOOL)copy { int count = [stringValues count]; Column *column; if (col>=count || col<0) return nil; column = [stringValues elementAt:col]; if (column->copy) free((char *)column->value); if (copy && string!=NULL) column->value = NXCopyStringBuffer(string); else column->value = string; column->copy = copy; col = count; return self; } - (const char *)stringValueAt:(int)col { int count = [stringValues count]; Column *column; if (col>=count || col<0) return NULL; column = [stringValues elementAt:col]; return column->value; } - insertColAt:(int)col offset:(int)offset { int count = [stringValues count]; Column column; if (col > count) col = count; else if (col < 0) col = 0; column.offset = offset; column.copy = NO; column.value = NULL; [stringValues insertElement:&column at:col]; return self; } - addColWithOffset:(int)offset { return [self insertColAt:[stringValues count] offset:offset]; } - removeColAt:(int)col { int count = [stringValues count]; Column *column; if (col>=count || col<0) return nil; column = [stringValues elementAt:col]; if (column->copy) free((char *)column->value); [stringValues removeElementAt:col]; return self; } - (int)colCount { return [stringValues count]; } - drawInside:(const NXRect *)cellFrame inView:controlView { NXCoord baseX,baseY; Column *column; int count = [stringValues count]; int ind; baseX = NX_X(cellFrame) + 4; baseY = NX_Y(cellFrame) + 12; PSsetgray((cFlags1.state || cFlags1.highlighted) ? NX_WHITE : NX_LTGRAY); NXRectFill(cellFrame); PSsetgray(NX_BLACK); [[support screenFont] set]; for (ind=0; ind<count; ind++) { column = [stringValues elementAt:ind]; if (column->value != NULL) { PSmoveto(baseX+column->offset,baseY); PSshow(column->value); } } return self; } - copyFromZone:(NXZone *)zone { MColCell *copy; int count; int ind; Column *column; copy = [super copyFromZone:zone]; copy->stringValues = [stringValues copyFromZone:zone]; count = [copy->stringValues count]; for (ind=0; ind<count; ind++) { column = [copy->stringValues elementAt:ind]; if (column->copy && column->value) column->value = NXCopyStringBuffer(column->value); } return copy; } - read:(NXTypedStream *)stream { [super read:stream]; stringValues = NXReadObject(stream); return self; } - write:(NXTypedStream *)stream { [super write:stream]; NXWriteObject(stream,stringValues); return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.