[5] | 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 |
---|