ftp.nice.ch/pub/next/developer/resources/classes/misckit/MiscKit.1.10.0.s.gnutar.gz#/MiscKit/Source/MiscKit/MiscSavePanel.m

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.