This is MiscSavePanel.m in view mode; [Download] [Up]
// MiscSavePanel.m -- A save panel that allows appending. // // Written by Peter Langston Copyright (c) 1994 by Peter S. Langston. // Version 1.1. All rights reserved. // Thanks to David Griffiths <dave@prim.demon.co.uk> for the // pointer to the _validateNames:checkBrowser: method. // // This notice may not be removed from this source code. #import <misckit/MiscSavePanel.h> #import "libc.h" @interface SavePanel(Misc_private) - (BOOL)_validateNames:(char *)name checkBrowser:(BOOL)check; @end @implementation MiscSavePanel + alloc // return nil for error { return nil; } + allocFromZone:(NXZone *)zone // return nil for error { return nil; } + newContent:(const NXRect *)contentRect style:(int)aStyle backing:(int)bufferingType buttonMask:(int)mask defer:(BOOL)flag { static id me; if (!me) me = [super newContent:contentRect style:aStyle backing:bufferingType buttonMask:mask defer:flag]; return me; } - (BOOL)_validateNames:(char *)name checkBrowser:(BOOL)check { char buf[10000]; if (!appendOK) { appMode = NO; return [super _validateNames:name checkBrowser:check]; } sprintf(buf, "%s/%s", directory, name); appMode = NO; { struct stat fileInfo; // If it doesn't exist, or it is a directory, we should let // SavePanel's method handle it, since that is the behavior // we want. The 'Home' button, for example, wouldn't work // otherwise. // code from Carl Lindberg if ((stat(buf, &fileInfo) == -1) || ((fileInfo.st_mode & S_IFDIR) == S_IFDIR)) { return [super _validateNames:name checkBrowser:check]; } } if (access(buf, F_OK) == 0) { int i = NXRunAlertPanel("Save/Append", "The file %s in %s exists.", "Append", "Replace", "Cancel", name, directory); if (i == NX_ALERTOTHER) return NO; if (i == NX_ALERTDEFAULT) appMode = YES; } // We're hoping that NeXT hasn't made "filename" be static or something // so that freeing it is OK. Hopefully this won't cause crashes elsewhere. if (filename) free(filename); // Fix memory leak -- Carl Lindberg filename = NXCopyStringBuffer(buf); return YES; } - allowAppend:(BOOL)ok // ok=YES allows the append choice { if (appendOK = ok) [self setTitle:"Save/Append"]; else [self setTitle:"Save"]; return self; } - (BOOL)appending // YES => append chosen, else replace { return appMode; } - free // we ignore this... { return self; } - init // return nil for error { return nil; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.