This is IBetterForm.m in view mode; [Download] [Up]
#import "IBetterForm.h" #import <appkit/FormCell.h> #import <appkit/Text.h> #import <appkit/Font.h> #import <stdio.h> #import "errdebug.h" // Form for article header. Terribly complicated since both field titles // and field values are editable. The appkit only supports editable // field values so this terrible kludge was neccessary. Basically both // field names and field values are implemented as Forms with the field // titles hidden. @implementation IBetterForm - initFrame:(const NXRect *)frameRect { NXRect titleFrame, valueFrame; NXSize titleCellSize, valueCellSize; DBG(1, fprintf(stderr, "[IBetterForm initFrame:]\n");) [self sizeTo:frameRect->size.width :frameRect->size.height]; [Form setCellClass:[FormCell class]]; titleWidth = frameRect->size.width / 4.0; titleFrame = valueFrame = *frameRect; titleFrame.size.width = titleWidth; titleForm = [[Form alloc] initFrame:&titleFrame]; [titleForm setAutosizeCells:YES]; titleCellSize.width = 300.0; titleCellSize.height = 21.0; [titleForm setCellSize:&titleCellSize]; [titleForm setFont:[Font newFont:"Helvetica-Bold" size:12]]; [titleForm setTitleAlignment:NX_LEFTALIGNED]; [titleForm setTextAlignment:NX_LEFTALIGNED]; [self addSubview:titleForm]; valueFrame.origin.x += titleWidth; valueFrame.size.width -= titleWidth; valueForm = [[Form alloc] initFrame:&valueFrame]; [valueForm setAutosizeCells:YES]; valueCellSize.width = 1000.0; valueCellSize.height = 21.0; [valueForm setCellSize:&valueCellSize]; [valueForm setFont:[Font newFont:"Helvetica" size:12]]; [titleForm setTitleAlignment:NX_LEFTALIGNED]; [valueForm setTextAlignment:NX_LEFTALIGNED]; [self addSubview:valueForm]; [self addSubview:titleForm]; return self; } - addEntry:(const char *)aTitle { const char *title; FormCell *valueCell; if (aTitle != NULL) { title = aTitle; } else { title = " "; } [[[[titleForm addEntry:"1234567890123456789 "] setTitleWidth:1.0] setStringValue:title] setEnabled:aTitle == NULL]; // setBezeled:aTitle == NULL]; valueCell = [[valueForm addEntry:"1234567890123456789 "] setTitleWidth:1.0]; [valueCell setScrollable:YES]; return valueCell; } - removeEntryAt:(int)index { [titleForm removeEntryAt:index]; [valueForm removeEntryAt:index]; } - (const char *)titleAt:(int)index { return [titleForm stringValueAt:index]; } - (const char *)stringValueAt:(int)index { return [valueForm stringValueAt:index]; } - cellAt:(int)row :(int)col { return [valueForm cellAt:row :col]; } - selectCell:aCell { return [valueForm selectCell:aCell]; } #define OFFSET -140 - sizeToFit { NXRect titleFrame, valueFrame; [titleForm sizeToFit]; [valueForm sizeToFit]; [titleForm getFrame:&titleFrame]; [valueForm getFrame:&valueFrame]; titleWidth = titleFrame.size.width; titleFrame.origin.x = frame.origin.x + OFFSET; [titleForm setFrame:&titleFrame]; valueFrame.origin.x = frame.origin.x + titleWidth + 2 * OFFSET; [valueForm setFrame:&valueFrame]; [self sizeTo:titleFrame.size.width + valueFrame.size.width + 2 * OFFSET :titleFrame.size.height]; [valueForm display]; [titleForm display]; return self; } // set target and action to trip needs saving flag - setTarget:target andAction:(SEL)action { [valueForm setTarget:target]; [valueForm setAction:action]; return(self); } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.