This is Preferences.m in view mode; [Download] [Up]
/* indent:4 tabsize:8 font:fixed-width */ #import "Preferences.h" #define TIFF_IMAGE 1 #define EPS_IMAGE 2 #define OTHER_IMAGE 3 @implementation Preferences static int checkImageType(const char *filename) { if(strcmp(strrchr(filename, '.'), ".tiff") == 0){ return TIFF_IMAGE; } if(strcmp(strrchr(filename, '.'), ".tif") == 0){ return TIFF_IMAGE; } if(strcmp(strrchr(filename, '.'), ".TIFF") == 0){ return TIFF_IMAGE; } if(strcmp(strrchr(filename, '.'), ".TIF") == 0){ return TIFF_IMAGE; } if(strcmp(strrchr(filename, '.'), ".eps") == 0){ return EPS_IMAGE; } if(strcmp(strrchr(filename, '.'), ".EPS") == 0){ return EPS_IMAGE; } else{ return OTHER_IMAGE; } return NULL; } static void convertColorToString(NXColor aColor,char *aString) { float r,g,b; NXConvertColorToRGB(aColor, &r, &g, &b); sprintf(aString, "%6.4f %6.4f %6.4f", r, g, b ); return; } static NXColor convertStringToColor(const char *aString) { float r,g,b; if(aString) sscanf(aString, "%f %f %f", &r, &g, &b); return NXConvertRGBToColor(r,g,b); } static BOOL IncludesType(const NXAtom *types, NXAtom type) { if (types) while (*types) if (*types++ == type) return YES; return NO; } - init { BOOL statusPanelUp=NO; const NXDefaultsVector solitaireDefaults = { {"backgroundColor", "0.0 0.2 0.1333"}, {"cardSize", "0"}, {"cardBack", "0"}, {"preDrawCards", "1"}, {"imageFileName", NULL}, {NULL, NULL} }; NXRegisterDefaults([NXApp appName], solitaireDefaults); backgroundColor = convertStringToColor(NXGetDefaultValue([NXApp appName], "backgroundColor")); cardSize = atoi(NXGetDefaultValue([NXApp appName], "cardSize")); cardBack = atoi(NXGetDefaultValue([NXApp appName], "cardBack")); preDrawCards = atoi(NXGetDefaultValue([NXApp appName], "preDrawCards")); [self showPreferences:self]; if(NXGetDefaultValue([NXApp appName], "imageFileName")){ statusPanelUp = YES; [messageField setStringValue:"Converting Custom Back Image..."]; [statusPanel makeKeyAndOrderFront:nil]; NXPing(); imageFileName = NXCopyStringBuffer(NXGetDefaultValue([NXApp appName], "imageFileName")); [self setNewImage:self]; } if(preDrawCards){ statusPanelUp = YES; [messageField setStringValue:"Pre-Drawing Cards..."]; [statusPanel makeKeyAndOrderFront:nil]; NXPing(); if(cardSize == CS_SMALL) [[SmallCard class] drawCardImages]; else [[Card class] drawCardImages]; } if(statusPanelUp) [statusPanel orderOut:nil]; return self; } - defaults:sender { [backgroundColorWell setColor:NXConvertRGBToColor(0.0, 51.0/255.0, 34.0/255.0)]; [cardSizeMatrix selectCellWithTag:CS_SMALL]; [cardBackMatrix selectCellWithTag:CS_DEFAULT]; [self saveColor:self]; [self saveCardSize:self]; [self saveCardBack:self]; return self; } - saveColor:sender { char buffer[80]; backgroundColor = [backgroundColorWell color]; convertColorToString(backgroundColor, buffer); NXWriteDefault([NXApp appName], "backgroundColor", buffer); return self; } - saveCardSize:sender { char buffer[80]; cardSize = [cardSizeMatrix selectedTag]; sprintf(buffer, "%d", cardSize); NXWriteDefault([NXApp appName], "cardSize", buffer); if(preDrawCards){ if(cardSize == CS_SMALL) [[SmallCard class] drawCardImages]; else [[Card class] drawCardImages]; } return self; } - saveCardBack:sender { char buffer[80]; cardBack = [cardBackMatrix selectedTag]; sprintf(buffer, "%d", cardBack); NXWriteDefault([NXApp appName], "cardBack", buffer); return self; } - savePreDrawState:sender { char buffer[80]; preDrawCards = [preDrawSwitch state]; sprintf(buffer, "%d", preDrawCards); NXWriteDefault([NXApp appName], "preDrawCards", buffer); if(preDrawCards){ if(cardSize == CS_SMALL) [[SmallCard class] drawCardImages]; else [[Card class] drawCardImages]; } else{ [[Card class] freeCardImages]; [[SmallCard class] freeCardImages]; } return self; } - setNewImage:sender { id originalRep=nil; id buttonCell; NXRect imageRect; NXRect largeRect = {{0,0},{91.0, 153.0}}; NXRect smallRect = {{0,0},{67.0, 114.0}}; NXStream *stream; int imageType = checkImageType(imageFileName); if(imageType == TIFF_IMAGE){ if(stream = NXMapFile(imageFileName, NX_READONLY)){ originalRep = [[NXBitmapImageRep allocFromZone:[self zone]] initFromStream:stream]; [originalRep getSize:&(imageRect.size)]; } else{ NXRunAlertPanel("Custom Image Error", "Could not find the image file, %s, for the custom card back.", "OK", NULL, NULL, imageFileName); return self; } } else if(imageType == EPS_IMAGE){ if(stream = NXMapFile(imageFileName, NX_READONLY)){ originalRep = [[NXEPSImageRep allocFromZone:[self zone]] initFromStream:stream]; [originalRep getBoundingBox:&imageRect]; [originalRep setOpaque:YES]; } else{ NXRunAlertPanel("Custom Image Error", "Could not find the image file, %s, for the custom card back.", "OK", NULL, NULL, imageFileName); return self; } } else if(imageType == OTHER_IMAGE){ id pasteboard; char *data; int length; pasteboard = [Pasteboard newByFilteringFile:imageFileName]; [pasteboard readType:NXTIFFPboardType data:&data length:&length]; stream = NXOpenMemory(data, length, NX_READONLY); if(length){ originalRep = [[NXBitmapImageRep allocFromZone:[self zone]] initFromStream:stream]; [originalRep getSize:&(imageRect.size)]; } NXCloseMemory(stream, NX_SAVEBUFFER); [pasteboard deallocatePasteboardData:data length:length]; if(!originalRep){ NXRunAlertPanel("Custom Image Error", "Error in converting or could not find the image file, %s, for the custom card back.", "OK", NULL, NULL, imageFileName); return self; } } else{ NXRunAlertPanel("Custom Image Error", "Image type not supported in Solitaire.", "OK", NULL, NULL); return self; } NXWriteDefault([NXApp appName], "imageFileName", imageFileName); imageRect.origin.x = 0.0; imageRect.origin.y = 0.0; if(cardBackImage) [cardBackImage free]; if(sCardBackImage) [sCardBackImage free]; cardBackImage = [[NXImage allocFromZone:[self zone]] initSize:&(largeRect.size)]; [cardBackImage setScalable:YES]; [cardBackImage setUnique:YES]; [cardBackImage useCacheWithDepth:NX_DefaultDepth]; if([cardBackImage lockFocusOn:[cardBackImage lastRepresentation]]){ [originalRep drawIn:&largeRect]; [cardBackImage unlockFocus]; } sCardBackImage = [[NXImage allocFromZone:[self zone]] initSize:&(smallRect.size)]; [sCardBackImage setScalable:YES]; [sCardBackImage setUnique:YES]; [sCardBackImage useCacheWithDepth:NX_DefaultDepth]; if([sCardBackImage lockFocusOn:[sCardBackImage lastRepresentation]]){ [originalRep drawIn:&smallRect]; [sCardBackImage unlockFocus]; } buttonCell = [cardBackMatrix findCellWithTag:3]; [buttonCell setIconPosition:NX_ICONONLY]; [buttonCell setImage:sCardBackImage]; [buttonCell setEnabled:YES]; [originalRep free]; return self; } - showPreferences:sender { if (!preferencesPanel) { int depth; const char *const types[] = {NXFilenamePboardType}; [NXApp loadNibSection:"Preferences.nib" owner:self withNames:NO fromZone:[self zone]]; [preferencesPanel setFrameAutosaveName:"PrefPanel"]; [preferencesPanel registerForDraggedTypes:(const char *const*)&types count:1]; [backgroundColorWell setColor:backgroundColor]; [cardSizeMatrix selectCellWithTag:cardSize]; [cardBackMatrix selectCellWithTag:cardBack]; [preDrawSwitch setState:preDrawCards]; if ((depth = [preferencesPanel depthLimit]) == NX_DefaultDepth) depth = [Window defaultDepthLimit]; if (depth == NX_TwoBitGrayDepth) [backgroundColorWell setEnabled:NO]; else [backgroundColorWell setEnabled:YES]; if(sCardBackImage){ id buttonCell = [cardBackMatrix findCellWithTag:3]; [buttonCell setIconPosition:NX_ICONONLY]; [buttonCell setImage:sCardBackImage]; [buttonCell setEnabled:YES]; } } if(sender != self) [preferencesPanel makeKeyAndOrderFront:nil]; return self; } - (CardSize)returnCardSize { return cardSize; } - (CardBack)returnCardBack { return cardBack; } - (NXColor)returnBackgroundColor { return backgroundColor; } - returnImageForSize:(CardSize)aSize { if(aSize == CS_SMALL) return sCardBackImage; return cardBackImage; } - (NXDragOperation)draggingEntered:(id <NXDraggingInfo>)sender { foundFile = NO; return [self draggingUpdated:sender]; } - (NXDragOperation)draggingUpdated:(id <NXDraggingInfo>)sender { int length; Pasteboard *pboard; char *data, *file, *tab; const char *const *type; const char *const *imageFileTypes=[NXImage imageFileTypes]; pboard = [sender draggingPasteboard]; if(IncludesType([pboard types], NXFilenamePboardType)){ [pboard readType:NXFilenamePboardType data:&data length:&length]; file = data; while(file){ if(tab = strchr(file, '\t')) *tab = '\0'; if(strrchr(file, '.') != NULL){ type = imageFileTypes; while(type){ if(strcmp((strrchr(file, '.')+1), type)){ foundFile = YES; break; } type = type++; } } file = tab ? ++tab : NULL; } } if(!foundFile) return NX_DragOperationNone; else return NX_DragOperationCopy; } - (BOOL)prepareForDragOperation:(id <NXDraggingInfo>)sender { if(foundFile) return YES; return NO; } - (BOOL)performDragOperation:(id <NXDraggingInfo>)sender { int length; Pasteboard *pboard; char *data, *file, *tab; const char *const *type; const char *const *imageFileTypes=[NXImage imageFileTypes]; pboard = [sender draggingPasteboard]; if(IncludesType([pboard types], NXFilenamePboardType)){ [pboard readType:NXFilenamePboardType data:&data length:&length]; file = data; while(file){ if(tab = strchr(file, '\t')) *tab = '\0'; if(strrchr(file, '.') != NULL){ type = imageFileTypes; while(type){ if(strcmp((strrchr(file, '.')+1), type)){ if(imageFileName) NX_FREE(imageFileName); imageFileName = NXCopyStringBuffer(file); break; } type = type++; } } file = tab ? ++tab : NULL; } [pboard deallocatePasteboardData:data length:length]; } [NXApp activateSelf:YES]; return YES; } - concludeDragOperation:(id <NXDraggingInfo>)sender { [self perform:@selector(setNewImage:) with:self afterDelay:0 cancelPrevious:NO]; foundFile = NO; // reset for next dragging operation return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.