/* emacs buffer mode hint -*- objc -*- */ #import "PreferencesController.h" #import "HourFormatter.h" #import "ConfigManager.h" #import "AlarmManager.h" #import "AlarmBackend.h" #import "defines.h" @implementation PreferencesController - (id)init { self = [super init]; if (self) { if (![NSBundle loadNibNamed:@"Preferences" owner:self]) return nil; _sm = [StoreManager globalManager]; HourFormatter *formatter = [[[HourFormatter alloc] init] autorelease]; [[dayStartText cell] setFormatter:formatter]; [[dayEndText cell] setFormatter:formatter]; [[minStepText cell] setFormatter:formatter]; [[refreshIntervalText cell] setFormatter:formatter]; RETAIN(globalPreferences); RETAIN(storePreferences); RETAIN(storeFactory); RETAIN(uiPreferences); RETAIN(alarmPreferences); [self selectItem:itemPopUp]; [panel setFrameAutosaveName:@"preferencesPanel"]; /* FIXME : could we call setupDefaultStore directly ? */ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(storeStateChanged:) name:SAStatusChangedForStore object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(storeStateChanged:) name:SAEnabledStatusChangedForStore object:nil]; } return self; } - (void)dealloc { RELEASE(globalPreferences); RELEASE(storePreferences); RELEASE(storeFactory); RELEASE(uiPreferences); RELEASE(alarmPreferences); [super dealloc]; } - (void)setupDefaultStore { NSString *defaultStore = [[ConfigManager globalConfig] objectForKey:ST_DEFAULT]; NSEnumerator *list = [_sm storeEnumerator]; id aStore; [defaultStorePopUp removeAllItems]; while ((aStore = [list nextObject])) { if ([aStore writable] && [aStore enabled]) [defaultStorePopUp addItemWithTitle:[aStore description]]; } if ([defaultStorePopUp numberOfItems] > 0) { if ([defaultStorePopUp itemWithTitle:defaultStore]) [defaultStorePopUp selectItemWithTitle:defaultStore]; else { [defaultStorePopUp selectItemAtIndex:0]; [self selectDefaultStore:self]; } } } - (void)setupStores { NSEnumerator *list; id aStore; [self setupDefaultStore]; list = [_sm storeEnumerator]; [storePopUp removeAllItems]; while ((aStore = [list nextObject])) [storePopUp addItemWithTitle:[aStore description]]; [storePopUp selectItemAtIndex:0]; [self selectStore:self]; } - (void)storeStateChanged:(NSNotification *)notification { [self setupDefaultStore]; [self selectStore:nil]; } - (void)showPreferences { ConfigManager *config = [ConfigManager globalConfig]; NSEnumerator *backends; int start = [config integerForKey:FIRST_HOUR]; int end = [config integerForKey:LAST_HOUR]; int step = [config integerForKey:MIN_STEP]; Class backend; NSString *name; [dayStart setIntValue:start*3600]; [dayEnd setIntValue:end*3600]; [dayStartText setIntValue:start*3600]; [dayEndText setIntValue:end*3600]; [minStep setIntValue:step * 60]; [minStepText setIntValue:step * 60]; [showTooltip setState:[config integerForKey:TOOLTIP]]; [showDateAppIcon setState:[config integerForKey:APPICON_DATE]]; [showTimeAppIcon setState:[config integerForKey:APPICON_TIME]]; [alarmEnabled setState:[[AlarmManager globalManager] alarmsEnabled]]; [alarmBackendPopUp removeAllItems]; backends = [[AlarmManager backends] objectEnumerator]; while ((backend = [backends nextObject])) [alarmBackendPopUp addItemWithTitle:[[backend class] backendName]]; name = [[AlarmManager globalManager] defaultBackendName]; if ([alarmBackendPopUp itemWithTitle:name]) [alarmBackendPopUp selectItemWithTitle:name]; [self setupStores]; [storeClass removeAllItems]; backends = [[StoreManager backends] objectEnumerator]; while ((backend = [backends nextObject])) if ([backend isUserInstanciable]) [storeClass addItemWithTitle:[backend storeTypeName]]; [storeClass selectItemAtIndex:0]; [createButton setEnabled:NO]; [panel makeKeyAndOrderFront:self]; } - (void)periodicSetupForStore:(id)store { if ([store conformsToProtocol:@protocol(PeriodicRefresh)]) { [storeRefresh setEnabled:YES]; [storeRefresh setState:[store periodicRefresh]]; [refreshInterval setEnabled:[store periodicRefresh]]; [refreshIntervalText setEnabled:[store periodicRefresh]]; [refreshIntervalText setIntValue:[store refreshInterval]]; [refreshInterval setIntValue:[store refreshInterval]]; } else { [storeRefresh setEnabled:NO]; [storeRefresh setState:NO]; [refreshInterval setEnabled:NO]; [refreshIntervalText setEnabled:NO]; [refreshIntervalText setIntValue:0]; [refreshInterval setIntValue:0]; } } - (void)selectStore:(id)sender { id store = [_sm storeForName:[storePopUp titleOfSelectedItem]]; [storeColor setColor:[store eventColor]]; [storeTextColor setColor:[store textColor]]; [storeDisplay setState:[store displayed]]; [storeWritable setState:[store writable]]; [storeEnabled setState:[store enabled]]; if ([[defaultStorePopUp titleOfSelectedItem] isEqual:[store description]]) [removeButton setEnabled:NO]; else [removeButton setEnabled:YES]; [self periodicSetupForStore:store]; } - (void)changeColor:(id)sender { NSColor *rgb = [[storeColor color] colorUsingColorSpaceName:NSCalibratedRGBColorSpace]; id store = [_sm storeForName:[storePopUp titleOfSelectedItem]]; [store setEventColor:rgb]; } - (void)changeTextColor:(id)sender { NSColor *rgb = [[storeTextColor color] colorUsingColorSpaceName:NSCalibratedRGBColorSpace]; id store = [_sm storeForName:[storePopUp titleOfSelectedItem]]; [store setTextColor:rgb]; } - (void)changeStart:(id)sender { int value = [dayStart intValue] / 3600; if (value != [[ConfigManager globalConfig] integerForKey:FIRST_HOUR]) { [dayStartText setIntValue:value * 3600]; [[ConfigManager globalConfig] setInteger:value forKey:FIRST_HOUR]; } } - (void)changeEnd:(id)sender { int value = [dayEnd intValue] / 3600; if (value != [[ConfigManager globalConfig] integerForKey:LAST_HOUR]) { [dayEndText setIntValue:value * 3600]; [[ConfigManager globalConfig] setInteger:value forKey:LAST_HOUR]; } } - (void)changeStep:(id)sender { int value = [minStep intValue] / 60; if (value != [[ConfigManager globalConfig] integerForKey:MIN_STEP]) { [minStepText setIntValue:value * 60]; [[ConfigManager globalConfig] setInteger:value forKey:MIN_STEP]; } } - (void)changeInterval:(id)sender { int value = [refreshInterval intValue]; id store = (id )[_sm storeForName:[storePopUp titleOfSelectedItem]]; [store setRefreshInterval:value]; [refreshIntervalText setIntValue:value]; [refreshInterval setIntValue:value]; } - (void)selectDefaultStore:(id)sender { [_sm setDefaultStore:[defaultStorePopUp titleOfSelectedItem]]; [self selectStore:nil]; } - (void)toggleDisplay:(id)sender { id store = [_sm storeForName:[storePopUp titleOfSelectedItem]]; [store setDisplayed:[storeDisplay state]]; } - (void)toggleWritable:(id)sender { id store = [_sm storeForName:[storePopUp titleOfSelectedItem]]; [store setWritable:[storeWritable state]]; } - (void)toggleRefresh:(id)sender { id store = (id )[_sm storeForName:[storePopUp titleOfSelectedItem]]; [store setPeriodicRefresh:[storeRefresh state]]; [self periodicSetupForStore:store]; } - (void)toggleEnabled:(id)sender { id store = [_sm storeForName:[storePopUp titleOfSelectedItem]]; [store setEnabled:[storeEnabled state]]; } - (void)toggleTooltip:(id)sender { [[ConfigManager globalConfig] setInteger:[showTooltip state] forKey:TOOLTIP]; } - (void)toggleShowDate:(id)sender { [[ConfigManager globalConfig] setInteger:[showDateAppIcon state] forKey:APPICON_DATE]; } - (void)toggleShowTime:(id)sender { [[ConfigManager globalConfig] setInteger:[showTimeAppIcon state] forKey:APPICON_TIME]; } - (void)toggleAlarms:(id)sender { [[AlarmManager globalManager] setAlarmsEnabled:[alarmEnabled state]]; } - (void)selectAlarmBackend:(id)sender { [[AlarmManager globalManager] setDefaultBackend:[alarmBackendPopUp titleOfSelectedItem]]; } /* We only allow the removal of non-default stores */ - (void)removeStore:(id)sender { id store = [_sm storeForName:[storePopUp titleOfSelectedItem]]; ConfigManager *config = [ConfigManager globalConfig]; NSMutableArray *storeArray = [NSMutableArray arrayWithArray:[config objectForKey:STORES]]; [storeArray removeObject:[store description]]; [config setObject:storeArray forKey:STORES]; [config removeObjectForKey:[store description]]; [_sm removeStoreNamed:[store description]]; /* FIXME : This could be done by registering STORES key */ [self setupStores]; } - (void)createStore:(id)sender { ConfigManager *config = [ConfigManager globalConfig]; NSMutableArray *storeArray = [NSMutableArray arrayWithArray:[config objectForKey:STORES]]; Class backend; backend = [StoreManager backendForName:[storeClass titleOfSelectedItem]]; if (backend && [backend registerWithName:[storeName stringValue]]) { [_sm addStoreNamed:[storeName stringValue]]; [storeArray addObject:[storeName stringValue]]; [config setObject:storeArray forKey:STORES]; [self setupStores]; } [storeName setStringValue:@""]; [createButton setEnabled:NO]; } - (void)setContent:(id)content { id old = [slot contentView]; if (old == content) return; [slot setContentView: content]; [itemPopUp setNextKeyView:[slot contentView]]; } - (void)selectItem:(id)sender { switch ([sender indexOfSelectedItem]) { case 0: [self setContent:globalPreferences]; break; case 1: [self setContent:storePreferences]; break; case 2: [self setContent:storeFactory]; break; case 3: [self setContent:uiPreferences]; break; case 4: [self setContent:alarmPreferences]; break; } } - (void)controlTextDidChange:(NSNotification *)notification { if ([notification object] == storeName) { if ([_sm storeForName:[storeName stringValue]] || ![[storeName stringValue] length]) [createButton setEnabled:NO]; else [createButton setEnabled:YES]; } } @end