This is Object_Document.m in view mode; [Download] [Up]
#import "Object_Document.h" #import "Object_AllocNDebug.h" #import <appkit/appkit.h> /* Category variables */ static const char *gLastOpenPath; static const char *gLastSavePath; static const char *gLastFilename; @implementation Object(Document) - (const char *) openFileTypes:(const char *const *) fileTypes directory:(const char *) path file:(const char *) filename forDirectory:(BOOL) flag { OpenPanel *openPanel; BOOL isOk; [self debug: MAX_DEBUG method: _cmd, "path = %s\n", path]; if( path == NULL ) path = [self lastOpenPath]; errno = 0; openPanel = [OpenPanel new]; [openPanel chooseDirectories: flag]; isOk = [openPanel runModalForDirectory: path file: filename types: fileTypes]; if( isOk == NO ) return NULL; // user Canceled gLastFilename = filename = [openPanel filename]; gLastOpenPath = [openPanel directory]; return gLastFilename; } - (const char *) saveFileType:(const char *) type directory:(const char *) path file:(const char *) filename { SavePanel *savePanel; BOOL isOk; char tmpName[MAXPATHLEN], *tmpPtr; if( path == NULL ) path = [self lastSavePath]; errno = 0; savePanel = [SavePanel new]; [savePanel setRequiredFileType: type]; /* If this is a full pathname break it into the path and file */ if( filename != NULL && rindex(filename, '/') != NULL ) { strcpy(tmpName, filename); tmpPtr = rindex(filename, '/'); if( tmpPtr == filename ) { /* Root directory path */ path = "/"; filename = ++ tmpPtr; } else { *tmpPtr = '\0'; path = tmpName; filename = ++ tmpPtr; } } isOk = [savePanel runModalForDirectory: path file: filename]; if( isOk == NO ) return NULL; // user Canceled gLastFilename = filename = [savePanel filename]; gLastSavePath = [savePanel directory]; return gLastFilename; } /* Return a typed stream to be used to read in a document with file extensions "fileTypes". It displays an OpenPanel using the method streamForDoc:directory:file:prompt: */ - (NXTypedStream *) readStreamForDoc:(const char *const *) fileTypes file:(const char *) filename { NXTypedStream *stream; stream = [self readStreamForDoc: fileTypes directory: NULL file: filename prompt: YES]; return stream; } /* Return a typed stream to be used to read in a document with file extensions "fileTypes". It displays an OpenPanel if prompt is YES, else it opens the file given by directory/filename */ - (NXTypedStream *) readStreamForDoc:(const char *const *) fileTypes directory:(const char *) path file:(const char *) filename prompt:(BOOL) prompt { NXTypedStream *stream; if( path == NULL ) path = [self lastOpenPath]; [self debug: MAX_DEBUG method: _cmd, "path = %s\n", path]; errno = 0; if( prompt == YES ) { filename = [self openFileTypes: fileTypes directory: path file: filename forDirectory: NO]; if( filename == 0 ) return 0; // user Canceled gLastFilename = filename; } else if( filename == NULL ) { NXRunAlertPanel(NULL,"You must specify a filename to %s:streamForDoc", NULL, NULL, NULL, [[self class] name]); return NULL; } [self debug: MAX_DEBUG method: _cmd, "opening = %s\n", filename]; stream = NXOpenTypedStreamForFile(filename, NX_READONLY); return stream; } /* Return a typed stream that can be used to save a document with a file extension of "type". It displays a SavePanel using the method streamForSave:directory:file: */ - (NXTypedStream *) writeStreamForDoc:(const char *) type { NXTypedStream *stream; stream = [self writeStreamForDoc: type directory: NULL file: NULL prompt: YES]; return stream; } /* Return a typed stream that can be used to save a document with a file extension of "type", by prompting the user with a SavePanel that is intialized to the path specified by "path" & prompt "filename". */ - (NXTypedStream *) writeStreamForDoc:(const char *) type directory:(const char *) path file:(const char *) filename prompt:(BOOL) prompt { NXTypedStream *stream; char tmpName[MAXPATHLEN]; if( path == NULL ) path = [self lastSavePath]; errno = 0; if( prompt == YES ) { filename = [self saveFileType: type directory: path file: filename]; } else if( filename == NULL ) { sprintf(tmpName, "%s/Untitled", path); filename = tmpName; } stream = NXOpenTypedStreamForFile(filename, NX_WRITEONLY); return stream; } - (const char *) lastOpenPath { const char *directory = gLastOpenPath; if( gLastOpenPath == NULL ) directory = NXHomeDirectory(); return directory; } - (const char *) lastSavePath { const char *directory = gLastSavePath; if( directory == NULL ) directory = NXHomeDirectory(); return directory; } - (const char *) lastFilename { return gLastFilename; } @end /* RCS Information: $Author: me $; $Date: 93/02/23 02:01:22 $; $Source: /usr1/me/NeXTSrc/MyClasses/RCS/Object_Document.m,v $; $Revision: 1.1 $; $Log: Object_Document.m,v $ Revision 1.1 93/02/23 02:01:22 me Begin RCS logging. ; */
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.