1 | //
|
---|
2 | // DockCamPrefs.m
|
---|
3 | // DockCam
|
---|
4 | //
|
---|
5 | // Created by Nicholas Riley on Thu Jun 27 2002.
|
---|
6 | // Copyright (c) 2002 Nicholas Riley. All rights reserved.
|
---|
7 | //
|
---|
8 |
|
---|
9 | #import "DockCamPrefs.h"
|
---|
10 |
|
---|
11 | NSString * const DCImageLocation = @"DCImageLocation";
|
---|
12 | NSString * const DCImageSize = @"DCImageSize";
|
---|
13 | NSString * const DCImageRefreshEnabled = @"DCImageRefreshEnabled";
|
---|
14 | NSString * const DCImageRefreshInterval = @"DCImageRefreshInterval";
|
---|
15 | NSString * const DCShowImageInBackground = @"DCShowImageInBackground";
|
---|
16 | NSString * const DCShowStatus = @"DCShowStatus";
|
---|
17 |
|
---|
18 | NSString * const DCPrefChangedNotification = @"DCPrefChangedNotification";
|
---|
19 |
|
---|
20 | const NSTimeInterval DCDefaultImageRefreshInterval = 30;
|
---|
21 |
|
---|
22 | enum {
|
---|
23 | DCImageRetrieveOnOpen = 2000, DCImageRetrieveOnTimer = 2001
|
---|
24 | };
|
---|
25 |
|
---|
26 | enum {
|
---|
27 | DCImageRefreshIntervalSeconds = 1, DCImageRefreshIntervalMinutes = 60, DCImageRefreshIntervalHours = 3600
|
---|
28 | };
|
---|
29 |
|
---|
30 | NSUserDefaults *defaults;
|
---|
31 |
|
---|
32 | @implementation DockCamPrefs
|
---|
33 |
|
---|
34 | + (void)initialize;
|
---|
35 | {
|
---|
36 | NSDictionary *appDefaults =
|
---|
37 | [NSDictionary dictionaryWithObjectsAndKeys:
|
---|
38 | @"", DCImageLocation,
|
---|
39 | [NSNumber numberWithInt: DCDefaultImageRefreshInterval], DCImageRefreshInterval,
|
---|
40 | [NSNumber numberWithBool: NO], DCShowImageInBackground,
|
---|
41 | [NSNumber numberWithBool: YES], DCShowStatus,
|
---|
42 | nil];
|
---|
43 | defaults = [NSUserDefaults standardUserDefaults];
|
---|
44 | [defaults registerDefaults: appDefaults];
|
---|
45 | }
|
---|
46 |
|
---|
47 | + (void)_prefChanged:(NSString *)pref;
|
---|
48 | {
|
---|
49 | [[NSNotificationCenter defaultCenter] postNotificationName: DCPrefChangedNotification object: pref];
|
---|
50 | }
|
---|
51 |
|
---|
52 | #pragma mark preference getters
|
---|
53 |
|
---|
54 | + (BOOL)boolForPref:(NSString *)pref;
|
---|
55 | {
|
---|
56 | return [defaults boolForKey: pref];
|
---|
57 | }
|
---|
58 |
|
---|
59 | + (int)intForPref:(NSString *)pref;
|
---|
60 | {
|
---|
61 | return [defaults integerForKey: pref];
|
---|
62 | }
|
---|
63 |
|
---|
64 | + (NSString *)stringForPref:(NSString *)pref;
|
---|
65 | {
|
---|
66 | return [defaults stringForKey: pref];
|
---|
67 | }
|
---|
68 |
|
---|
69 | + (NSSize)sizeForPref:(NSString *)pref;
|
---|
70 | {
|
---|
71 | return NSSizeFromString([defaults stringForKey: pref]);
|
---|
72 | }
|
---|
73 |
|
---|
74 | #pragma mark preference setters
|
---|
75 |
|
---|
76 | + (void)setBool:(BOOL)value forPref:(NSString *)pref;
|
---|
77 | {
|
---|
78 | BOOL oldValue = [self boolForPref: pref];
|
---|
79 | if (oldValue != value) {
|
---|
80 | [defaults setBool: value forKey: pref];
|
---|
81 | [self _prefChanged: pref];
|
---|
82 | }
|
---|
83 | }
|
---|
84 |
|
---|
85 | + (void)setInt:(int)value forPref:(NSString *)pref;
|
---|
86 | {
|
---|
87 | int oldValue = [self intForPref: pref];
|
---|
88 | if (oldValue != value) {
|
---|
89 | [defaults setInteger: value forKey: pref];
|
---|
90 | [self _prefChanged: pref];
|
---|
91 | }
|
---|
92 | }
|
---|
93 |
|
---|
94 | + (void)setString:(NSString *)value forPref:(NSString *)pref;
|
---|
95 | {
|
---|
96 | NSString *oldValue = [self stringForPref: pref];
|
---|
97 | if (![oldValue isEqualToString: value]) {
|
---|
98 | [defaults setObject: value forKey: pref];
|
---|
99 | [self _prefChanged: pref];
|
---|
100 | }
|
---|
101 | }
|
---|
102 |
|
---|
103 | + (void)setSize:(NSSize)value forPref:(NSString *)pref;
|
---|
104 | {
|
---|
105 | NSSize oldValue = [self sizeForPref: pref];
|
---|
106 | if (!NSEqualSizes(oldValue, value)) {
|
---|
107 | [defaults setObject: NSStringFromSize(value) forKey: pref];
|
---|
108 | [self _prefChanged: pref];
|
---|
109 | }
|
---|
110 | }
|
---|
111 |
|
---|
112 | #pragma mark complex interface-preference mapping
|
---|
113 |
|
---|
114 | - (BOOL)retrieveOnTimer;
|
---|
115 | {
|
---|
116 | return [[retrieveImageAutomatically selectedCell] tag] == DCImageRetrieveOnTimer;
|
---|
117 | }
|
---|
118 |
|
---|
119 | - (NSTimeInterval)interval;
|
---|
120 | {
|
---|
121 | return [imageRefreshInterval intValue] * [[imageRefreshIntervalUnits selectedItem] tag];
|
---|
122 | }
|
---|
123 |
|
---|
124 | - (void)setInterval:(NSTimeInterval)interval;
|
---|
125 | {
|
---|
126 | // we assume that the tags are in ascending order in the array
|
---|
127 | NSEnumerator *e = [[imageRefreshIntervalUnits itemArray] reverseObjectEnumerator];
|
---|
128 | NSMenuItem *i;
|
---|
129 | int multiplierTag;
|
---|
130 |
|
---|
131 | while ( (i = [e nextObject]) != nil) {
|
---|
132 | multiplierTag = [i tag];
|
---|
133 | if (((int)interval % multiplierTag) == 0) {
|
---|
134 | [imageRefreshInterval setIntValue: interval / multiplierTag];
|
---|
135 | [imageRefreshIntervalUnits selectItem: i];
|
---|
136 | return;
|
---|
137 | }
|
---|
138 | }
|
---|
139 | [imageRefreshIntervalUnits selectItemAtIndex: 0];
|
---|
140 | [imageRefreshInterval setIntValue: DCDefaultImageRefreshInterval];
|
---|
141 | }
|
---|
142 |
|
---|
143 | #pragma mark preference I/O
|
---|
144 |
|
---|
145 | - (void)readFromPrefs;
|
---|
146 | {
|
---|
147 | [imageLocation setStringValue: [DockCamPrefs stringForPref: DCImageLocation]];
|
---|
148 | [retrieveImageAutomatically selectCellWithTag:
|
---|
149 | [DockCamPrefs boolForPref: DCImageRefreshEnabled] ? DCImageRetrieveOnTimer : DCImageRetrieveOnOpen];
|
---|
150 | [self setInterval: [DockCamPrefs intForPref: DCImageRefreshInterval]];
|
---|
151 | [showImageInBackground setState:
|
---|
152 | [DockCamPrefs boolForPref: DCShowImageInBackground] ? NSOnState : NSOffState];
|
---|
153 | }
|
---|
154 |
|
---|
155 | - (IBAction)writeToPrefs:(id)sender;
|
---|
156 | {
|
---|
157 | [DockCamPrefs setString: [imageLocation stringValue] forPref: DCImageLocation];
|
---|
158 | [DockCamPrefs setBool: [self retrieveOnTimer] forPref: DCImageRefreshEnabled];
|
---|
159 | [DockCamPrefs setInt: [self interval] forPref: DCImageRefreshInterval];
|
---|
160 | [DockCamPrefs setBool: [showImageInBackground state] == NSOnState forPref: DCShowImageInBackground];
|
---|
161 | [defaults synchronize];
|
---|
162 | }
|
---|
163 |
|
---|
164 | #pragma mark interface maintenance
|
---|
165 |
|
---|
166 | - (IBAction)showWindow:(id)sender;
|
---|
167 | {
|
---|
168 | // XXX workaround for weird bug where combo box and text field alternately become first responder
|
---|
169 | [super showWindow: sender];
|
---|
170 | [[[self window] initialFirstResponder] becomeFirstResponder];
|
---|
171 | }
|
---|
172 |
|
---|
173 | - (void)update;
|
---|
174 | {
|
---|
175 | BOOL enabled = [self retrieveOnTimer];
|
---|
176 | [imageRefreshInterval setEnabled: enabled];
|
---|
177 | [imageRefreshIntervalUnits setEnabled: enabled];
|
---|
178 | }
|
---|
179 |
|
---|
180 | - (IBAction)retrieveImageAutomatically:(id)sender;
|
---|
181 | {
|
---|
182 | [self update];
|
---|
183 | if ([self retrieveOnTimer]) [imageRefreshInterval becomeFirstResponder];
|
---|
184 | else [sender becomeFirstResponder];
|
---|
185 | }
|
---|
186 |
|
---|
187 | #pragma mark initialize-release
|
---|
188 |
|
---|
189 | - (id)init {
|
---|
190 | self = [super initWithWindowNibName:@"Preferences"];
|
---|
191 | [self window]; // connect outlets
|
---|
192 | [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(windowWillClose:)
|
---|
193 | name: NSWindowWillCloseNotification object: [self window]];
|
---|
194 | [self readFromPrefs];
|
---|
195 | [self update];
|
---|
196 | return self;
|
---|
197 | }
|
---|
198 |
|
---|
199 | @end
|
---|
200 |
|
---|
201 | @implementation DockCamPrefs (NSWindowNotifications)
|
---|
202 |
|
---|
203 | - (void)windowWillClose:(NSNotification *)notification;
|
---|
204 | {
|
---|
205 | [self writeToPrefs: self];
|
---|
206 | }
|
---|
207 |
|
---|
208 | @end |
---|