/* * Grouch.app Copyright (C) 2006 Andy Sveikauskas * ------------------------------------------------------------------------ * This program is free software under the GNU General Public License * -- * Simplified interface to application preferences. */ #import #import #import #import #import #import #import static NSString *savedUserDict = @"Saved User Information"; static NSString *colorDict = @"Buddy List Tags"; static NSString *awayMsgDict = @"Away Messages"; static NSString *textKey = @"Default Text Tags"; #if defined(__APPLE__) && !defined(GNUSTEP) #include #import #import #import /* Ugly hack to get Mac OS X version. Since this is NeXT versioning, 6.0 is 10.0. */ static NSString *getCocoaVersion() { NSBundle *b = [NSBundle bundleForClass:[NSBundle class]]; NSString *path = [b pathForResource:@"version" ofType:@"plist"]; if( path ) { NSDictionary *d = [NSPropertyListSerialization propertyListFromData:[NSData dataWithContentsOfFile:path] mutabilityOption:NSPropertyListImmutable format:NULL errorDescription:NULL]; NSString *r = [d objectForKey:@"CFBundleShortVersionString"];; if( r ) return r; } return @"6.4"; } #endif @implementation Defaults + (NSUserDefaults*)defaults { return [NSUserDefaults standardUserDefaults]; } + (void)registerDefaults { NSString *msgTitle, *msgBody; NSDictionary *awayMsg, *colors, *defaults; NSString *menuType; msgTitle = [GrouchString getString:@"away-msg-title"]; msgBody = [GrouchString getString:@"away-msg"]; awayMsg = [NSDictionary dictionaryWithObject:msgBody forKey:msgTitle]; // We don't have to terminate these HTML tags because // GrouchHtml will do that for us. colors = [NSDictionary dictionaryWithObjectsAndKeys: @"", @"offline", @"", @"idle", @"", @"away+idle", nil]; #ifdef GNUSTEP menuType = @"Gnu"; #else { int major = 6, minor = 4; sscanf( [getCocoaVersion() cString], "%i.%i", &major, &minor ); if( major > 6 || minor > 3 ) menuType = @"Apple"; else menuType = @"Apple-103"; } #endif defaults = [NSDictionary dictionaryWithObjectsAndKeys: awayMsg,awayMsgDict, colors,colorDict, [NSNumber numberWithInt:5*60], @"Auto-response Time-out", menuType, @"Menu Type", @"", textKey, nil]; [[self defaults] registerDefaults:defaults]; } + get:(NSString*)key { return [[self defaults] objectForKey:key]; } + get:(NSString*)key fromDict:(NSString*)dict { NSDictionary *d = [[self defaults] objectForKey:dict]; if( d ) return [d objectForKey:key]; else return d; } + (void)set:obj forKey:(NSString*)key { [[self defaults] setObject:obj forKey:key]; } + (void)set:obj forKey:(NSString*)key inDict:(NSString*)dict { NSDictionary *d = [[self defaults] objectForKey:dict]; if( d ) { NSMutableDictionary *d2 = [NSMutableDictionary dictionaryWithDictionary:d]; [d2 setObject:obj forKey:key]; [self set:d2 forKey:dict]; } else { d = [NSDictionary dictionaryWithObject:obj forKey:key]; [self set:d forKey:dict]; } } + (void)removeKey:(NSString*)key { [[self defaults] removeObjectForKey:key]; } + (void)removeKey:(NSString*)key inDict:(NSString*)dict { NSDictionary *d = [[self defaults] objectForKey:dict]; if( d ) { NSMutableDictionary *d2 = [NSMutableDictionary dictionaryWithDictionary:d]; [d2 removeObjectForKey:key]; [self set:d2 forKey:dict]; } } + (NSDictionary*)getSavedUsers { NSDictionary *r = [self get:savedUserDict]; if( r ) return r; else return [NSDictionary dictionary]; } + getSavedUserInfo:(NSString*)key forUser:(NSString*)user { NSDictionary *d; user = [user screenNameKey]; d = [self get:user fromDict:savedUserDict]; if( d ) { // Compatibility with original format... id r = [d objectForKey:key]; if( !r && [key isEqual:@"Login"] ) return user; else return r; } else return d; } + (void)setSavedUserInfo:info forKey:(NSString*)key andUser:(NSString*)user { NSDictionary *d; user = [user screenNameKey]; d = [self get:user fromDict:savedUserDict]; if( user ) { NSMutableDictionary *d2 = [NSMutableDictionary dictionaryWithDictionary:d]; [d2 setObject:info forKey:key]; [self set:d2 forKey:user inDict:savedUserDict]; } else { d = [NSDictionary dictionaryWithObject:info forKey:key]; [self set:d forKey:user inDict:savedUserDict]; } } + (NSDictionary*)getSavedUser:(NSString*)user { NSDictionary *d; user = [user screenNameKey]; d = [self get:user fromDict:savedUserDict]; if( d ) { if( [d objectForKey:@"Login"] ) { return d; } else // Compatibility with original format... { NSMutableDictionary *m = [NSMutableDictionary dictionaryWithDictionary:d]; [m setObject:user forKey:@"Login"]; return m; } } else return nil; } + (void)removeSavedUser:(NSString*)user { [self removeKey:[user screenNameKey] inDict:savedUserDict]; } + (NSString*)getAwayMessage:(NSString*)title { return [self get:title fromDict:awayMsgDict]; } + (void)setAwayMessage:(NSString*)title withTitle:(NSString*)key { [self set:title forKey:key inDict:awayMsgDict]; } + (void)removeAwayMessage:(NSString*)title { [self removeKey:title inDict:awayMsgDict]; } + (NSDictionary*)getAwayMessages { return [self get:awayMsgDict]; } + (NSString*)defaultTextTags { return [self get:textKey]; } + (NSDictionary*)defaultAttributes { NSString *tags = [NSString stringWithFormat:@"%@ ", [self get:textKey]]; NSAttributedString *ret = [tags parseHtml]; NSRange dummy; return [ret attributesAtIndex:0 effectiveRange:&dummy]; } + (void)setDefaultText:(NSAttributedString*)attr { NSString *str = [attr generateHtml]; NSMutableString *tags = [NSMutableString string]; int i; enum { START_TAG, GOOD_TAG, BAD_TAG, NO_TAG } state = NO_TAG; for(i=0; i<[str length]; ++i) { unichar c = [str characterAtIndex:i]; switch(state) { case NO_TAG: if( c == '<' ) state = START_TAG; break; case BAD_TAG: if( c == '>' ) state = NO_TAG; break; case GOOD_TAG: [tags appendString:[NSString stringWithCharacters:&c length:1]]; if( c == '>' ) state = NO_TAG; break; case START_TAG: if( c == '>' ) break; if( c == '/' ) state = BAD_TAG; else { state = GOOD_TAG; [tags appendString:[NSString stringWithFormat: @"<%c", c]]; } } } [self set:tags forKey:textKey]; } @end @implementation NSTextView (Grouch) - (void)setDefaultFont { /* * XXX. * This seems to expose a bug in GNUstep. * See: https://savannah.gnu.org/bugs/index.php?func=detailitem&item_id=17096 * Since there is not yet a way to change the default font attributes (due to * lack of preference pane), this is commented out. */ #if 0 [self setTypingAttributes:[Defaults defaultAttributes]]; #endif } @end