This is Server.m in view mode; [Download] [Up]
/* Generated by Interface Builder */ #import "Server.h" #import "Protos.h" #import "Proto.h" #import "Main.h" #import <appkit/Panel.h> #import <appkit/SavePanel.h> #import <appkit/Application.h> #import <appkit/Listener.h> #import <appkit/Speaker.h> #import <appkit/Pasteboard.h> #import <appkit/Button.h> #import <appkit/PopUpList.h> #import <appkit/Matrix.h> #import <objc/List.h> #import <stdio.h> #import <strings.h> #import <sys/types.h> #import <sys/stat.h> #import <sys/param.h> #import <mach.h> @implementation Server + new { self = [super new]; [NXApp loadNibSection:"Server.nib" owner:self]; savepanel = [SavePanel new]; // Add the view with the type pop-up-list and opening choice to save panel. [auxview removeFromSuperview]; [savepanel setAccessoryView:auxview]; return self; } // Add a type to the list. - addtype:(char *)name { [typelist addItem:name]; return self; } // Set up the type list from the list of proto's. - inittypes:list { int i; int count = [list count]; for (i=0; i<count; i++) [self addtype:[[list objectAt:i] typename]]; return self; } /* If path is a directory, then dir is a copy of path. Otherwise, dir contains the directory part of path. */ void get_directory(char *dir, char *path) { struct stat buf; strcpy(dir, path); stat(dir, &buf); if ((buf.st_mode & S_IFDIR) == 0) *rindex(dir, '/') = '\0'; } // When service is activated, the current directory is in the pasteboard. - get_dir_from_pb:(char *)dir:(id)pb { int length; char *data; const char *const *types; int hasType, i; // Don't really need to check for the type, as it must always be // present if a service was invoked. types = [pb types]; hasType=0; for (i=0; !hasType && types[i] ; i++) if (!strcmp(types[i], NXFilenamePboardType)) hasType=1; if (hasType) { [pb readType:NXFilenamePboardType data:&data length:&length]; get_directory(dir, data); return self; } else return nil; } /* Set the type of the file to be created. Sets the save panel's type and sets the type pop-up-list and open default. */ - setfiletype:(char *)typename { char *ext; char *editor, editorstr[100]; id proto; proto = [protos protoforname:typename]; [listbase setTitle:typename]; ext = [proto extension]; [savepanel setRequiredFileType:ext]; editor = [proto editor]; if (strcmp(editor, "") == 0) { [openineditor setTitle:""]; [openineditor setEnabled:NO]; } else { sprintf(editorstr, "Open in %s", editor); [openineditor setTitle:editorstr]; [openineditor setEnabled:YES]; } [defaultopen selectCellWithTag:[proto defaultopen]]; return self; } // Called when the user selects a type in the pop-up-list. - settype:sender { char *typename = (char *)[[sender selectedCell] title]; return [self setfiletype:typename]; } // Handle service requests. The string udata is the typename.. - createNew:(id)pb userData:(const char *)udata error:(char **)ermsg { char *typename; id proto; char directory[MAXPATHLEN]; int tag; typename = (char *)udata; proto = [protos protoforname:typename]; [self setfiletype:typename]; if ([self get_dir_from_pb:directory:pb]) { // Run the save panel. if ([savepanel runModalForDirectory:directory file:""]) { char fullname[MAXPATHLEN]; // Get the typename from the pop-up-list. typename = (char *)[listbase title]; proto = [protos protoforname:typename]; // Copy the file/directory [main copyfile:(char *)[savepanel filename]:[main fullprotoname:fullname:[proto pathname]]]; // Open appropriately. tag = [[defaultopen selectedCell] tag]; if (tag == OPEN_WS) [main openinws:(char *)[savepanel filename]]; else if (tag == OPEN_EDITOR) [main openineditor:(char *)[savepanel filename]:[proto editor]]; } } return self; } // Intercept the initialization of the listbase button to get the pop-up-list. - setListbase:anObject; { listbase = anObject; typelist = [listbase target]; [typelist setTarget:self]; [typelist setAction:@selector(settype:)]; return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.