3 * Christopher Bowns, 2008
5 * Formerly: Memory Monitor, by Bernhard Baehr
7 * Copyright © 2001-2003 Bernhard Baehr
9 * Preferences.m - Preferences Controller Class
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 2 of the License, or
14 * (at your option) any later version.
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
21 * You should have received a copy of the GNU General Public License
22 * along with this program; if not, write to the Free Software
23 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
27 #import "Preferences.h"
30 @implementation Preferences
33 + (NSMutableDictionary *)defaultPreferences
35 return ([[NSMutableDictionary alloc] initWithObjectsAndKeys:
36 [[NSColor yellowColor] colorWithAlphaComponent:0.8], WIRED_COLOR_KEY,
37 [[NSColor magentaColor] colorWithAlphaComponent:0.8], ACTIVE_COLOR_KEY,
38 [[NSColor cyanColor] colorWithAlphaComponent:0.8], INACTIVE_COLOR_KEY,
39 [[NSColor blueColor] colorWithAlphaComponent:0.8], FREE_COLOR_KEY,
41 [NSColor whiteColor], PAGEIN_COLOR_KEY,
42 [NSColor blackColor], PAGEOUT_COLOR_KEY,
43 [NSNumber numberWithInt:250], PAGING_SCALE_MAX_KEY,
44 [NSNumber numberWithBool:YES], PAGEIN_ATOP_PAGEOUT_KEY,
45 [NSNumber numberWithBool:YES], SHOW_PAGING_RATE_KEY,
47 [[NSColor yellowColor] colorWithAlphaComponent:0.8], USER_COLOR_KEY,
48 [[NSColor magentaColor] colorWithAlphaComponent:0.8], SYS_COLOR_KEY,
49 [[NSColor cyanColor] colorWithAlphaComponent:0.8], NICE_COLOR_KEY,
50 [[NSColor blueColor] colorWithAlphaComponent:0.8], IDLE_COLOR_KEY,
53 [NSNumber numberWithInt:10], UPDATE_FREQUENCY_KEY, /* unit is 1/10 second */
54 [NSNumber numberWithBool:NO], SHOW_GRAPH_WINDOW_KEY,
55 [NSNumber numberWithBool:NO], GRAPH_WINDOW_ON_TOP_KEY,
56 [NSNumber numberWithInt:128], GRAPH_WINDOW_SIZE_KEY,
57 [NSNumber numberWithFloat:1.0], DOCK_ICON_SIZE_KEY,
64 #define SCANCOLOR(key) \
65 if ((obj = [defaults objectForKey:key])) { \
67 sscanf ([obj cString], "%f %f %f %f", &r, &g, &b, &a); \
68 obj = [NSColor colorWithCalibratedRed:r green:g blue:b alpha:a]; \
69 [currentSettings setObject:obj forKey:key]; \
71 #define GETNUMBER(key) \
72 if ((obj = [defaults objectForKey:key])) \
73 [currentSettings setObject:obj forKey:key];
76 float r, g, b, a, transparency;
78 NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
81 currentSettings = [Preferences defaultPreferences];
82 SCANCOLOR (WIRED_COLOR_KEY);
83 SCANCOLOR (ACTIVE_COLOR_KEY);
84 SCANCOLOR (INACTIVE_COLOR_KEY);
85 SCANCOLOR (FREE_COLOR_KEY);
86 SCANCOLOR (PAGEIN_COLOR_KEY);
87 SCANCOLOR (PAGEOUT_COLOR_KEY);
88 GETNUMBER (PAGING_SCALE_MAX_KEY);
89 GETNUMBER (PAGEIN_ATOP_PAGEOUT_KEY);
90 GETNUMBER (SHOW_PAGING_RATE_KEY);
92 GETNUMBER (OLD_TRANSPARENCY_KEY);
93 transparency = obj ? [obj floatValue] : 0.8; /* global transparency setting of version 1.1 */
94 SCANCOLOR (USER_COLOR_KEY);
95 SCANCOLOR (SYS_COLOR_KEY);
96 SCANCOLOR (NICE_COLOR_KEY);
97 SCANCOLOR (IDLE_COLOR_KEY);
98 transparency = 1.0; /* paging was drawn without transparency in version 1.1 */
99 GETNUMBER (UPDATE_FREQUENCY_KEY);
100 GETNUMBER (SHOW_GRAPH_WINDOW_KEY);
101 GETNUMBER (GRAPH_WINDOW_ON_TOP_KEY);
102 GETNUMBER (GRAPH_WINDOW_SIZE_KEY);
103 GETNUMBER (DOCK_ICON_SIZE_KEY);
104 [[NSColorPanel sharedColorPanel] setShowsAlpha:YES];
109 - (void)showUpdateFrequency:(int)freq
111 [updateFrequency setStringValue:[NSString
112 localizedStringWithFormat:NSLocalizedString(@"every\n%.1f sec.", @""), freq / 10.0]];
116 - (void)adjustGraphWindowControls
120 BOOL enabled = [[currentSettings objectForKey:SHOW_GRAPH_WINDOW_KEY] boolValue];
121 NSColor *color = enabled ? [NSColor controlTextColor] : [NSColor controlHighlightColor];
122 NSEnumerator *enumerator = [[graphWindowOptionsView subviews] objectEnumerator];
124 while ((obj = [enumerator nextObject])) {
125 if ([obj isMemberOfClass:[NSTextField class]])
126 [obj setTextColor:color];
128 [obj setEnabled:enabled];
133 - (IBAction)showPreferences:(id)sender
138 if ([NSBundle loadNibNamed:@"Preferences" owner:self])
141 NSLog (@"Failed to load Preferences.nib");
146 [wiredColor setColor:[currentSettings objectForKey:WIRED_COLOR_KEY]];
147 [activeColor setColor:[currentSettings objectForKey:ACTIVE_COLOR_KEY]];
148 [inactiveColor setColor:[currentSettings objectForKey:INACTIVE_COLOR_KEY]];
149 [freeColor setColor:[currentSettings objectForKey:FREE_COLOR_KEY]];
150 [pageinColor setColor:[currentSettings objectForKey:PAGEIN_COLOR_KEY]];
151 [pageoutColor setColor:[currentSettings objectForKey:PAGEOUT_COLOR_KEY]];
152 [pagingScale selectItemAtIndex:[pagingScale
153 indexOfItemWithTag:[[currentSettings objectForKey:PAGING_SCALE_MAX_KEY] intValue]]];
154 [pageinAtopPageout selectCellWithTag:[[currentSettings objectForKey:PAGEIN_ATOP_PAGEOUT_KEY] intValue]];
155 [showPagingRate setState:[[currentSettings objectForKey:SHOW_PAGING_RATE_KEY] boolValue]];
158 [userColor setColor:[currentSettings objectForKey:USER_COLOR_KEY]];
159 [sysColor setColor:[currentSettings objectForKey:SYS_COLOR_KEY]];
160 [niceColor setColor:[currentSettings objectForKey:NICE_COLOR_KEY]];
161 [idleColor setColor:[currentSettings objectForKey:IDLE_COLOR_KEY]];
163 freq = [[currentSettings objectForKey:UPDATE_FREQUENCY_KEY] floatValue];
164 [self showUpdateFrequency:(int)freq];
165 [updateFrequencySlider setFloatValue:1000.0 * log(freq)];
166 [showGraphWindow setState:[[currentSettings objectForKey:SHOW_GRAPH_WINDOW_KEY] boolValue]];
167 [graphWindowOnTop setState:[[currentSettings objectForKey:GRAPH_WINDOW_ON_TOP_KEY] boolValue]];
168 [graphWindowSize setFloatValue:[[currentSettings objectForKey:GRAPH_WINDOW_SIZE_KEY] floatValue]];
169 [dockIconSizeSlider setFloatValue:[[currentSettings objectForKey:DOCK_ICON_SIZE_KEY] floatValue]];
170 [self adjustGraphWindowControls];
171 [panel makeKeyAndOrderFront:nil];
175 - (IBAction)revertToDefaults:(id)sender
177 [currentSettings release];
178 currentSettings = [Preferences defaultPreferences];
179 [self showPreferences:sender];
180 [[NSNotificationCenter defaultCenter] postNotificationName:PREFERENCES_CHANGED object:nil];
184 - (void)savePreferences
190 NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
191 NSEnumerator *enumerator = [currentSettings keyEnumerator];
193 while ((key = [enumerator nextObject])) {
194 obj = [currentSettings objectForKey:key];
195 if ([obj isKindOfClass:[NSColor class]]) {
196 [[obj colorUsingColorSpaceName:@"NSCalibratedRGBColorSpace"]
197 getRed:&r green:&g blue:&b alpha:&a];
199 obj = [NSString stringWithFormat:@"%f %f %f %f", r, g, b, a];
201 [defaults setObject:obj forKey:key];
206 - (id)objectForKey:(id)key
208 return ([currentSettings objectForKey:key]);
212 - (IBAction)preferencesChanged:(id)sender
216 [currentSettings setObject:[wiredColor color] forKey:WIRED_COLOR_KEY];
217 [currentSettings setObject:[activeColor color] forKey:ACTIVE_COLOR_KEY];
218 [currentSettings setObject:[inactiveColor color] forKey:INACTIVE_COLOR_KEY];
219 [currentSettings setObject:[freeColor color] forKey:FREE_COLOR_KEY];
220 [currentSettings setObject:[pageinColor color] forKey:PAGEIN_COLOR_KEY];
221 [currentSettings setObject:[pageoutColor color] forKey:PAGEOUT_COLOR_KEY];
222 [currentSettings setObject:[NSNumber numberWithInt:[[pagingScale selectedItem] tag]] forKey:PAGING_SCALE_MAX_KEY];
223 [currentSettings setObject:[NSNumber numberWithInt:[[pageinAtopPageout selectedCell] tag]] forKey:PAGEIN_ATOP_PAGEOUT_KEY];
224 [currentSettings setObject:[NSNumber numberWithInt:[showPagingRate state]] forKey:SHOW_PAGING_RATE_KEY];
229 [currentSettings setObject:[userColor color] forKey:USER_COLOR_KEY];
230 [currentSettings setObject:[sysColor color] forKey:SYS_COLOR_KEY];
231 [currentSettings setObject:[niceColor color] forKey:NICE_COLOR_KEY];
232 [currentSettings setObject:[idleColor color] forKey:IDLE_COLOR_KEY];
234 freq = exp([updateFrequencySlider doubleValue] / 1000.0); /* 1..600 == 0.1 sec. to 1 min. */
235 [self showUpdateFrequency:freq];
236 [currentSettings setObject:[NSNumber numberWithInt:freq] forKey:UPDATE_FREQUENCY_KEY];
237 [currentSettings setObject:[NSNumber numberWithInt:[showGraphWindow state]] forKey:SHOW_GRAPH_WINDOW_KEY];
238 [currentSettings setObject:[NSNumber numberWithInt:[graphWindowOnTop state]] forKey:GRAPH_WINDOW_ON_TOP_KEY];
239 [currentSettings setObject:[NSNumber numberWithInt:[graphWindowSize intValue]] forKey:GRAPH_WINDOW_SIZE_KEY];
240 [currentSettings setObject:[NSNumber numberWithFloat:[dockIconSizeSlider floatValue]] forKey:DOCK_ICON_SIZE_KEY];
241 [self adjustGraphWindowControls];
242 [[NSNotificationCenter defaultCenter] postNotificationName:PREFERENCES_CHANGED object:nil];
248 return (panel ? [panel windowNumber] : 0);