1// 2// osx.m 3// Hivelytracker: OSX dialog and file reqester support 4// 5// Created by Christopher O'Neill on 15/10/2012. 6// 7 8#import <Cocoa/Cocoa.h> 9#import "NSFileManager+DirectoryLocations.h" 10 11typedef uint32_t uint32; 12typedef int32_t int32; 13typedef char TEXT; 14 15extern BOOL enableKeys; 16 17int32 gui_req( uint32 img, const TEXT *title, const TEXT *reqtxt, const TEXT *buttons ) 18{ 19 int i; 20 NSAlert *alert = [[[NSAlert alloc] init] autorelease]; 21 [alert setMessageText:[NSString stringWithCString:title encoding:NSASCIIStringEncoding]]; 22 [alert setInformativeText:[NSString stringWithCString:reqtxt encoding:NSASCIIStringEncoding]]; 23 NSMutableString *btnStr = [NSMutableString stringWithCString:buttons encoding:NSASCIIStringEncoding]; 24 [btnStr replaceOccurrencesOfString:@"_" withString:@"" options:0 25 range:NSMakeRange(0, [btnStr length])]; 26 NSArray *btnArr = [btnStr componentsSeparatedByString:@"|"]; 27 for (btnStr in [[btnArr reverseObjectEnumerator] allObjects]) 28 { 29 [alert addButtonWithTitle:btnStr]; 30 } 31 32 enableKeys = TRUE; 33 i = [alert runModal] - 1000; 34 enableKeys = FALSE; 35 return i; 36} 37 38#define FR_HVLSAVE 0 39#define FR_AHXSAVE 1 40#define FR_INSSAVE 2 41#define FR_MODLOAD 3 42#define FR_INSLOAD 4 43 44char *filerequester( const char *title, const char *path, const char *fname, int type ) 45{ 46 NSArray *fileTypes; 47 NSSavePanel *savePanel; 48 NSOpenPanel *panel; 49 switch (type) { 50 case FR_HVLSAVE: 51 fileTypes = [NSArray arrayWithObjects:@"hvl", @"HVL", nil]; 52 break; 53 case FR_AHXSAVE: 54 fileTypes = [NSArray arrayWithObjects:@"ahx", @"AHX", nil]; 55 break; 56 case FR_INSSAVE: 57 case FR_INSLOAD: 58 fileTypes = [NSArray arrayWithObjects:@"ins", @"INS", nil]; 59 break; 60 case FR_MODLOAD: 61 fileTypes = [NSArray arrayWithObjects:@"hvl", @"HVL", @"ahx", @"AHX", nil]; 62 break; 63 default: 64 return NULL; 65 } 66 67 if ((type == FR_INSLOAD) || (type == FR_MODLOAD)) { 68 panel = [NSOpenPanel openPanel]; 69 } else { 70 savePanel = [NSSavePanel savePanel]; 71 panel = (NSOpenPanel *)savePanel; 72 } 73 74 [panel setAllowedFileTypes:fileTypes]; 75 [panel setAllowsOtherFileTypes:YES]; 76 [panel setTitle:[NSString stringWithCString:title encoding:NSASCIIStringEncoding]]; 77 [panel setDirectoryURL:[NSURL fileURLWithPath:[NSString stringWithCString:path encoding:NSASCIIStringEncoding] isDirectory:YES]]; 78 [panel setNameFieldStringValue:[NSString stringWithCString:fname encoding:NSASCIIStringEncoding]]; 79 80 enableKeys = TRUE; 81 int i = [panel runModal]; 82 enableKeys = FALSE; 83 if (i == 1) { 84 const char *cstr = [[[panel URL] path] UTF8String]; 85 char *rval = (char *)malloc(strlen(cstr) + 1); 86 strcpy(rval, cstr); 87 return rval; 88 }; 89 90 return NULL; 91} 92 93BOOL directoryrequester( const char *title, char *path ) 94{ 95 NSOpenPanel *panel = [NSOpenPanel openPanel]; 96 [panel setCanChooseFiles:NO]; 97 [panel setCanChooseDirectories:YES]; 98 [panel setTitle: [NSString stringWithCString:title encoding:NSASCIIStringEncoding]]; 99 [panel setDirectoryURL:[NSURL fileURLWithPath:[NSString stringWithCString:path encoding:NSASCIIStringEncoding] isDirectory:YES]]; 100 enableKeys = FALSE; 101 int i = [panel runModal]; 102 enableKeys = FALSE; 103 if (i == 1) { 104 const char *cstr = [[[panel URL] path] UTF8String]; 105 strncpy(path, cstr, 512); 106 return TRUE; 107 }; 108 109 return FALSE; 110} 111 112char *osxGetPrefsPath() 113{ 114 static char *path; 115 116 if(!path) { 117 NSString *strPath = [[NSFileManager defaultManager] applicationSupportDirectory]; 118 strPath = [strPath stringByAppendingPathComponent:@"ht.prefs"]; 119 path = malloc([strPath length] + 1); 120 strcpy(path, [strPath UTF8String]); 121 } 122 return path; 123} 124 125char *osxGetResourcesPath(char *path, const char *pathAppend) 126{ 127 NSBundle *bundle = [NSBundle mainBundle]; 128 NSString *strPath = [bundle resourcePath]; 129 strPath = [strPath stringByAppendingPathComponent:[NSString stringWithUTF8String:pathAppend]]; 130 if(!path) 131 path = malloc([strPath length] + 1); 132 strcpy(path, [strPath UTF8String]); 133 return path; 134} 135