This is Protos.m in view mode; [Download] [Up]
/* Generated by Interface Builder */ #import "Protos.h" #import "Proto.h" #import "Main.h" #import <appkit/Matrix.h> #import <appkit/Cell.h> #import <appkit/TextField.h> #import <objc/List.h> #import <appkit/Application.h> #import <appkit/OpenPanel.h> #import <sys/param.h> @implementation Protos + new { self = [super new]; list = [List new]; return self; } // -------------------------------------------------------- // Abstraction of the interface. - (char *)typename { return (char *)[typename stringValue]; } - settypename:(char *)atypename { [typename setStringValue:atypename]; return self; } - (char *)pathname { return (char *)[pathname stringValue]; } - setpathname:(char *)apathname { [pathname setStringValue:apathname]; return self; } - (char *)editor { return (char *)[editor stringValue]; } - seteditor:(char *)aneditor { [editor setStringValue:aneditor]; return self; } - (int)defaultopen { return [[defaultopen selectedCell] tag]; } - setdefaultopen:(int)open { [defaultopen selectCellWithTag:open]; return self; } // Fill in the interface for proto. // If proto is nil, then fill in blanks. - showtypedetails:proto { if (proto) { [self settypename:[proto typename]]; [self setpathname:[proto pathname]]; [self seteditor:[proto editor]]; if (strcmp([self editor], "")==0) [openineditor setEnabled:NO]; else [openineditor setEnabled:YES]; [self setdefaultopen:[proto defaultopen]]; [openinws setEnabled:YES]; } else { [self settypename:""]; [self setpathname:""]; [self seteditor:""]; [self setdefaultopen:OPEN_EDITOR]; [openineditor setEnabled:NO]; [openinws setEnabled:NO]; } return self; } // Load interface and initialize. - loadnib { int i; [NXApp loadNibSection:"Protos.nib" owner:self]; // Delete the dummy entries used to set up matrix in InterfaceBuilder for (i=0; i<3; i++) [typematrix removeRowAt:0 andFree:YES]; // Fill in entries for prototypes. for (i=0; i<[list count]; i++) { [typematrix addRow]; [typematrix setTitle:[[list objectAt:i] typename] at:i:0]; } [typematrix sizeToCells]; [typematrix selectCellAt:0:0]; [typematrix display]; [self showtype:self]; return self; } // Create a proto from the entries in the interface. - formproto { id proto = [Proto new :[self typename]:[self pathname]:[self editor]:[self defaultopen]]; return proto; } // -------------------------------------------------------- // -------------------------------------------------------- // Respond to the interface. // Display the interface. - showwindow:sender { static nibloaded = 0; if (nibloaded==0) { [self loadnib]; nibloaded++; } [window makeKeyAndOrderFront:self]; return self; } - openineditor:sender { char fullname[MAXPATHLEN]; [main openineditor:[main fullprotoname:fullname:[self selectedpathname]]:[self selectededitor]]; return self; } - openinworkspace:sender { char fullname[MAXPATHLEN]; [main openinws:[main fullprotoname:fullname:[self selectedpathname]]]; return self; } - remove:sender { [self removefromlist:[self selectedname]]; return self; } - modify:sender { id proto = [self formproto]; int newcell = [self findposinlist:[proto typename]]; int pos = [self addtolist:proto]; if (newcell<0) { [typematrix setTitle:[proto typename] at:pos:0]; [typematrix sizeToCells]; [typematrix display]; } [typematrix selectCellAt:pos:0]; [remove setEnabled:YES]; [self showtype:self]; return self; } // Called when user clicks on entry in type list. - showtype:sender { char *name = [self selectedname]; id proto = [self protoatpos:[self findposinlist:name]]; [self showtypedetails:proto]; return self; } // -------------------------------------------------------- // The list of proto's. The list is ordered alphabetically. // The list. - protoslist { return list; } // Return the proto whose typename is name. - protoforname:(char *)name { int pos; pos = [self findposinlist:name]; return [self protoatpos:[self findposinlist:name]]; } /* Return the position in the list of the proto with typename name. If no proto has that name, return the position at which a new entry with that name should go. */ - (int)findposinlist:(char *)name { int len = [list count]; int i = 0; int compare = -1; while (i<len && compare < 0) { compare = strcmp([[list objectAt:i] typename], name); if (compare<0) i++; } if (compare==0) return i; else return -i; } // The proto at position pos. - protoatpos:(int)pos { return [list objectAt:pos]; } /* If a proto with the name typename as proto is already in the list, replace that entry (destroying the old entry), otherwise add a new entry. Return the position of the added/modified entry. The interface is not updated: have to avoid the interface in this routine since the list is loaded and accessed on startup, and the interface is not loaded until it is required. */ - (int)addtolist:proto { id old; int pos = [self findposinlist:[proto typename]]; if (pos<=0) { // New entry. pos = -pos; [list insertObject:proto at:pos]; [typematrix insertRowAt:pos]; } else { // Modify entry. old = [list replaceObjectAt:pos with:proto]; [old free]; } return pos; } // Remove the proto with typename name and update the interface. - (int)removefromlist:(char *)name { int pos = [self findposinlist:name]; if (pos>=0) { [list removeObjectAt:pos]; [typematrix removeRowAt:pos andFree:YES]; [typematrix sizeToCells]; // Select the entry that was previous to the deleted entry in the list. if (pos==[typematrix cellCount]) pos--; [typematrix selectCellAt:pos:0]; [typematrix display]; } if ([typematrix cellCount]==0) [remove setEnabled:NO]; [self showtype:self]; return pos; } // Load the list. - readprotos:(FILE *)fp { id proto; int pos; if (list) [list free]; list = [List new]; do { proto = [Proto read:fp]; if (proto) { pos = [self addtolist:proto]; } } while (proto); return self; } // Store the list. - writeprotos:(FILE *)fp { int i; int count = [list count]; for (i=0; i<count; i++) [[list objectAt:i] write:fp]; return self; } // -------------------------------------------------------- // Properties of the proto whose name is currently selected in the type list. // The proto itself. - selected { char *name = (char *)[[typematrix selectedCell] title]; if (strcmp(name, "") == 0) return nil; else return [self protoatpos:[self findposinlist:name]]; } - (char *)selectedname { return (char *)[[typematrix selectedCell] title]; } - (char *)selectededitor { return [[self selected] editor]; } - (char *)selectedpathname; { return [[self selected] pathname]; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.