This is SolitaireMore.m in view mode; [Download] [Up]
/* indent:4 tabsize:8 font:fixed-width */ #import "Solitaire.h" #import "ModuleList.h" #import "localstrings.h" #define GAMEDIRECTORY @"/LocalLibrary/Solitaire" @implementation Solitaire(More) /*---------------------------------------------------------------------------- | | - getGameType | |----------------------------------------------------------------------------- | | Go find dynamically loadable Solitaire games in ~/Library/Solitaire, | Solitaire.app, and /LocalLibrary/Solitaire and any directory in | the ther user's defaults (SolitaireBundlePaths). Load their descriptions | into the game-selection browser. | \----------------------------------------------------------------------------*/ - (void) getGameType { NSMatrix* theMatrix; NSMutableString* homeSolitairePath; NSString* unseparatedBundlePaths; NSArray* bundlePaths = nil; NSEnumerator* bundlePathsEnumerator = nil; NSString* aBundlePath; // Construct path to user's home lib. homeSolitairePath = [NSHomeDirectory() mutableCopy]; [homeSolitairePath appendString:@"/Library/Solitaire"]; // Get any paths from the user's defaults. unseparatedBundlePaths = [[NSUserDefaults standardUserDefaults] stringForKey:@"SolitaireBundlePaths"]; if (unseparatedBundlePaths != nil && ![unseparatedBundlePaths isEqualToString:@""]) { bundlePaths = [unseparatedBundlePaths componentsSeparatedByString:@";"]; } if (!moduleList) { moduleList = [[ModuleList allocWithZone:[self zone]] init]; } // Do the obvious places first (on Mach anyway). [self loadGamesFrom:homeSolitairePath]; [self loadGamesFrom:[self appDirectory]]; [self loadGamesFrom:GAMEDIRECTORY]; // Now do any paths found in the defaults. bundlePathsEnumerator = [bundlePaths objectEnumerator]; while ((aBundlePath = [bundlePathsEnumerator nextObject]) != nil) { if (![aBundlePath isEqualToString:@""]) { [self loadGamesFrom:aBundlePath]; } } if ([moduleList count] == 0) { NSRunAlertPanel([[NSProcessInfo processInfo] processName], LOCALIZED_NOGAMES, LOCALIZED_TERMINATE, nil, nil); [NSApp terminate:self]; } [moduleList sort]; browserValid = NO; [gameSelectionBrowser loadColumnZero]; theMatrix = [gameSelectionBrowser matrixInColumn:0]; [theMatrix selectCellAtRow:realGameIndex column:0]; [theMatrix scrollCellToVisibleAtRow:realGameIndex column:0]; } /*---------------------------------------------------------------------------- | | - setGameType:(NSString *)filename dir:(NSString *)dirname | |----------------------------------------------------------------------------- | | Load the description of the specified .solitaire bundle into the | browser. | \----------------------------------------------------------------------------*/ - (void) setGameType:(NSString *)filename dir:(NSString *)dirname { NSMatrix* theMatrix; if (!moduleList) { moduleList = [[ModuleList allocWithZone:[self zone]] init]; } browserValid = NO; [self addGameToList:filename dir:dirname]; [moduleList sort]; [gameSelectionBrowser loadColumnZero]; theMatrix = [gameSelectionBrowser matrixInColumn:0]; [theMatrix selectCellAtRow:realGameIndex column:0]; [theMatrix scrollCellToVisibleAtRow:realGameIndex column:0]; } /*---------------------------------------------------------------------------- | | - loadGamesFrom:(NSString *)dirname | |----------------------------------------------------------------------------- | | Find all .solitaire modules in the specified directory. | If we find a module in several places, we keep only the first one found. | \----------------------------------------------------------------------------*/ - (void) loadGamesFrom:(NSString *)dirname { NSFileManager *fm = [NSFileManager defaultManager]; NSArray *files = [fm directoryContentsAtPath:dirname]; int i, count = [files count]; for (i = 0; i < count; i++) { NSString *file = [files objectAtIndex:i]; if ([[file pathExtension] isEqualToString:@"solitaire"]) { [self addGameToList:file dir:dirname]; } } } /*---------------------------------------------------------------------------- | | - addGameToList:(NSString *)filename dir:(NSString *)dirname | |----------------------------------------------------------------------------- | | Add the specified game to the list of games. | \----------------------------------------------------------------------------*/ - (void) addGameToList:(NSString *)filename dir:(NSString *)dirname { ModuleInfo *m; int i, numstrings; NSString* gameName = nil; BOOL valid = YES; numstrings = [moduleList count]; // Game.solitaire -> Game gameName = [[filename stringByDeletingPathExtension] lastPathComponent]; // check for duplicate modules; keep only the first one found for (i=0; (i < numstrings) && (valid == YES); i++) { if ([gameName isEqualToString:[moduleList nameAtIndex:i]]) { // already have a module with this name valid = NO; } } if (valid) { NSString* path; // add a new entry for this module path = [dirname stringByAppendingPathComponent:filename]; m = [[ModuleInfo allocWithZone:[self zone]] initWithController:NULL name:gameName path:path]; if (m) [moduleList addObject:m]; } } /*---------------------------------------------------------------------------- | | - (NSString *)appDirectory | | returns: (NSString *) full path of main bundle | |----------------------------------------------------------------------------- | | Returns the application's main bundle directory. | \----------------------------------------------------------------------------*/ - (NSString *)appDirectory { return [[NSBundle mainBundle] bundlePath]; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.