This is Preferences.m in view mode; [Download] [Up]
/* indent:4 tabsize:8 font:fixed-width */
#import "Preferences.h"
#import <Solitaire/SmallCard.h>
#import <Solitaire/Card.h>
#define TIFF_IMAGE 1
#define EPS_IMAGE 2
#define OTHER_IMAGE 3
@implementation Preferences
static int checkImageType(NSString *filename)
{
NSString* extension = [filename pathExtension];
if (([extension compare:@"tiff" options:NSCaseInsensitiveSearch] == NSOrderedSame) || ([extension compare:@"tif" options:NSCaseInsensitiveSearch] == NSOrderedSame)) {
return TIFF_IMAGE;
}
if ([extension compare:@"eps" options:NSCaseInsensitiveSearch] == NSOrderedSame) {
return EPS_IMAGE;
}
else {
return OTHER_IMAGE;
}
}
static NSString* convertColorToString(NSColor * aColor)
{
float r,g,b;
[[aColor colorUsingColorSpaceName:NSCalibratedRGBColorSpace] getRed:&r
green:&g blue:&b alpha:NULL];
return [NSString stringWithFormat:@"%6.4f %6.4f %6.4f", r, g, b];
}
static NSColor * convertStringToColor(NSString *aString)
{
float r, g, b;
r = g = b = 0;
if (aString != nil) {
NSScanner* scanner = [NSScanner scannerWithString:aString];
[scanner scanFloat:&r];
[scanner scanFloat:&g];
[scanner scanFloat:&b];
}
return [NSColor colorWithCalibratedRed:r green:g blue:b alpha:1.0];
}
- init
{
BOOL statusPanelUp=NO;
NSUserDefaults* userDefaults = [NSUserDefaults standardUserDefaults];
NSDictionary* defaultsDictionary;
NSArray* values;
NSArray* keys;
values = [NSArray arrayWithObjects:@"0.0 0.2 0.1333", @"0", @"0", @"1", @"", nil];
keys = [NSArray arrayWithObjects:@"backgroundColor", @"cardSize", @"cardBack", @"preDrawCards", @"imageFileName", nil];
defaultsDictionary = [NSDictionary dictionaryWithObjects:values forKeys:keys];
[userDefaults registerDefaults:defaultsDictionary];
backgroundColor = convertStringToColor([userDefaults objectForKey:@"backgroundColor"]);
[backgroundColor retain];
cardSize = [userDefaults integerForKey:@"cardSize"];
cardBack = [userDefaults integerForKey:@"cardBack"];
preDrawCards = [userDefaults integerForKey:@"preDrawCards"];
[self showPreferences:self];
if (![[userDefaults stringForKey:@"imageFileName"] isEqualToString:@""]) {
statusPanelUp = YES;
[messageField setStringValue:@"Converting Custom Back Image..."];
[statusPanel makeKeyAndOrderFront:nil];
PSWait();
imageFileName = [[userDefaults stringForKey:@"imageFileName"] retain];
[self setNewImage:self];
}
if(preDrawCards){
statusPanelUp = YES;
[messageField setStringValue:@"Pre-Drawing Cards..."];
[statusPanel makeKeyAndOrderFront:nil];
PSWait();
if(cardSize == CS_SMALL)
[[SmallCard class] drawCardImages];
else
[[Card class] drawCardImages];
}
if(statusPanelUp) [statusPanel close];
return self;
}
- (void) defaults:sender
{
[backgroundColorWell setColor:[NSColor colorWithCalibratedRed:0.0
green:51.0/255.0 blue:34.0/255.0 alpha:1.0]];
[cardSizeMatrix selectCellWithTag:CS_SMALL];
[cardBackMatrix selectCellWithTag:CS_DEFAULT];
[self saveColor:self];
[self saveCardSize:self];
[self saveCardBack:self];
}
- (void) saveColor:sender
{
NSString *buffer;
backgroundColor = [backgroundColorWell color];
buffer = convertColorToString(backgroundColor);
[[NSUserDefaults standardUserDefaults] setObject:buffer
forKey:@"backgroundColor"];
}
- (void) saveCardSize:sender
{
NSString *buffer;
cardSize = [cardSizeMatrix selectedTag];
buffer = [NSString stringWithFormat:@"%d", cardSize];
[[NSUserDefaults standardUserDefaults] setObject:buffer
forKey:@"cardSize"];
if(preDrawCards){
if(cardSize == CS_SMALL)
[[SmallCard class] drawCardImages];
else
[[Card class] drawCardImages];
}
}
- (void) saveCardBack:sender
{
NSString *buffer;
cardBack = [cardBackMatrix selectedTag];
buffer = [NSString stringWithFormat:@"%d", cardBack];
[[NSUserDefaults standardUserDefaults] setObject:buffer
forKey:@"cardBack"];
}
- (void) savePreDrawState:sender
{
NSString *buffer;
preDrawCards = [preDrawSwitch state];
buffer = [NSString stringWithFormat:@"%d", preDrawCards];
[[NSUserDefaults standardUserDefaults] setObject:buffer
forKey:@"preDrawCards"];
if(preDrawCards){
if(cardSize == CS_SMALL)
[[SmallCard class] drawCardImages];
else
[[Card class] drawCardImages];
}
else{
[[Card class] freeCardImages];
[[SmallCard class] freeCardImages];
}
}
- (void) setNewImage:sender
{
NSImageRep* originalRep=nil;
NSButtonCell* buttonCell;
NSRect imageRect;
NSRect largeRect = {{0,0},{91.0, 153.0}};
NSRect smallRect = {{0,0},{67.0, 114.0}};
NSData* imageData;
int imageType = checkImageType(imageFileName);
if (imageType == TIFF_IMAGE) {
imageData = [NSData dataWithContentsOfFile:imageFileName];
originalRep = [[NSBitmapImageRep alloc] initWithData:imageData];
(imageRect.size) = [originalRep size];
if (!imageData) {
NSRunAlertPanel(@"Custom Image Error",
@"Could not find the image file, %@, for the custom card back.",
@"OK", nil, nil, imageFileName);
return;
}
}
else if(imageType == EPS_IMAGE) {
imageData = [NSData dataWithContentsOfFile:imageFileName];
originalRep = [[NSEPSImageRep allocWithZone:[self zone]]
initWithData:imageData];
imageRect = [(NSEPSImageRep*)originalRep boundingBox];
[originalRep setOpaque:YES];
if (!originalRep) {
NSRunAlertPanel(@"Custom Image Error", @"Could not find the "
@"image file, %@, for the custom card back.",
@"OK", nil, nil, imageFileName);
return;
}
}
else if(imageType == OTHER_IMAGE){
NSPasteboard* pasteboard;
NSData* data;
pasteboard = [NSPasteboard pasteboardByFilteringFile:imageFileName];
data = [pasteboard dataForType:NSTIFFPboardType];
originalRep = [[NSBitmapImageRep allocWithZone:[self zone]]
initWithData:data];
(imageRect.size) = [originalRep size];
if(!originalRep){
NSRunAlertPanel(@"Custom Image Error", @"Error in converting or could not find the image file, %@, for the custom card back.", @"OK", nil, nil, imageFileName);
return;
}
}
else {
NSRunAlertPanel(@"Custom Image Error", @"Image type not supported in Solitaire.", @"OK", nil, nil);
return;
}
[[NSUserDefaults standardUserDefaults] setObject:imageFileName
forKey:@"imageFileName"];
imageRect.origin.x = 0.0; imageRect.origin.y = 0.0;
if(cardBackImage) [cardBackImage release];
if(sCardBackImage) [sCardBackImage release];
cardBackImage = [[NSImage allocWithZone:[self zone]]
initWithSize:(largeRect.size)];
[cardBackImage setScalesWhenResized:YES];
[cardBackImage setCachedSeparately:YES];
[cardBackImage addRepresentation:[[[NSCachedImageRep alloc]
initWithSize:[cardBackImage size] depth:0
separate:[cardBackImage isCachedSeparately] alpha:YES] autorelease]];
[cardBackImage lockFocusOnRepresentation:
[[cardBackImage representations] lastObject]];
[originalRep drawInRect:largeRect];
[cardBackImage unlockFocus];
sCardBackImage = [[NSImage allocWithZone:[self zone]]
initWithSize:(smallRect.size)];
[sCardBackImage setScalesWhenResized:YES];
[sCardBackImage setCachedSeparately:YES];
[sCardBackImage addRepresentation:[[[NSCachedImageRep alloc]
initWithSize:[sCardBackImage size] depth:0
separate:[sCardBackImage isCachedSeparately] alpha:YES]
autorelease]];
[sCardBackImage lockFocusOnRepresentation:
[[sCardBackImage representations] lastObject]];
[originalRep drawInRect:smallRect];
[sCardBackImage unlockFocus];
buttonCell = [cardBackMatrix cellWithTag:3];
[buttonCell setImagePosition:NSImageOnly];
[buttonCell setImage:sCardBackImage];
[buttonCell setEnabled:YES];
[originalRep release];
}
- (void) showPreferences:sender
{
if (!preferencesPanel)
{
int depth;
NSArray *types = [NSArray arrayWithObject:NSFilenamesPboardType];
/*
NSString *path = [[NSBundle bundleForClass:[self class]]
pathForResource:@"Preferences.nib" ofType:@"nib"];
[NSBundle loadNibFile:path externalNameTable:[NSDictionary
dictionaryWithObjectsAndKeys:self, @"NSOwner", nil]
withZone:[self zone]];
*/
[NSBundle loadNibNamed:@"Preferences.nib" owner:self];
[preferencesPanel setFrameAutosaveName:@"PrefPanel"];
[preferencesPanel registerForDraggedTypes:types];
[backgroundColorWell setColor:backgroundColor];
[cardSizeMatrix selectCellWithTag:cardSize];
[cardBackMatrix selectCellWithTag:cardBack];
[preDrawSwitch setState:preDrawCards];
if ((depth = [preferencesPanel depthLimit]) == 0)
depth = [NSWindow defaultDepthLimit];
if (depth ==
NSBestDepth(NSCalibratedWhiteColorSpace, 2, 2, YES, NULL))
[backgroundColorWell setEnabled:NO];
else
[backgroundColorWell setEnabled:YES];
if(sCardBackImage){
NSButtonCell* buttonCell = [cardBackMatrix cellWithTag:3];
[buttonCell setImagePosition:NSImageOnly];
[buttonCell setImage:sCardBackImage];
[buttonCell setEnabled:YES];
}
}
if(sender != self) [preferencesPanel makeKeyAndOrderFront:nil];
}
- (CardSize) cardSize
{
return cardSize;
}
- (CardBack) cardBack
{
return cardBack;
}
- (NSColor *) backgroundColor
{
return backgroundColor;
}
- (NSImage*) imageForSize:(CardSize)aSize
{
if(aSize == CS_SMALL)
return sCardBackImage;
return cardBackImage;
}
- (unsigned int) draggingEntered:(id <NSDraggingInfo>)sender
{
foundFile = NO;
return [self draggingUpdated:sender];
}
- (unsigned int) draggingUpdated:(id <NSDraggingInfo>)sender
{
NSPasteboard *pboard;
NSArray *imageFileTypes=[NSImage imageFileTypes];
pboard = [sender draggingPasteboard];
if ([[pboard types] containsObject:NSFilenamesPboardType]) {
NSArray* propertyList;
NSString* listItem;
NSString* itemExtension;
NSEnumerator* listEnumerator;
propertyList = [pboard propertyListForType:NSFilenamesPboardType];
listEnumerator = [propertyList objectEnumerator];
while ((listItem = [listEnumerator nextObject])) {
itemExtension = [listItem pathExtension];
if ([imageFileTypes containsObject:itemExtension]) {
imageFileName = [listItem retain];
foundFile = YES;
break;
}
}
}
if(!foundFile)
return NSDragOperationNone;
else
return NSDragOperationCopy;
}
- (BOOL) prepareForDragOperation:(id <NSDraggingInfo>)sender
{
if(foundFile) return YES;
return NO;
}
- (BOOL) performDragOperation:(id <NSDraggingInfo>)sender
{
NSPasteboard *pboard;
NSArray *imageFileTypes=[NSImage imageFileTypes];
pboard = [sender draggingPasteboard];
if ([[pboard types] containsObject:NSFilenamesPboardType]){
NSArray* propertyList;
NSString* listItem;
NSString* itemExtension;
NSEnumerator* listEnumerator;
propertyList = [pboard propertyListForType:NSFilenamesPboardType];
listEnumerator = [propertyList objectEnumerator];
while ((listItem = [listEnumerator nextObject])) {
itemExtension = [listItem pathExtension];
if ([imageFileTypes containsObject:itemExtension]) {
imageFileName = [listItem retain];
break;
}
}
}
[NSApp activateIgnoringOtherApps:YES];
return YES;
}
- (void) concludeDragOperation:(id <NSDraggingInfo>)sender
{
[self performSelector:@selector(setNewImage:) withObject:self
afterDelay:0.0];
foundFile = NO;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.