X-Git-Url: http://git.ithinksw.org/MenuTunes.git/blobdiff_plain/0b83e13fdd374e0ac55397663cedb94bf8df197f..55639e195a5ec0ae91eba86cd0377df626e2040a:/PreferencesController.m?ds=inline diff --git a/PreferencesController.m b/PreferencesController.m index 39c0c9f..67cdd56 100755 --- a/PreferencesController.m +++ b/PreferencesController.m @@ -9,6 +9,10 @@ #import #import #import +#import +#import + +#import #import #import @@ -17,6 +21,7 @@ #import #import +#import #import #import #import @@ -36,6 +41,11 @@ - (void)setupCustomizationTables; - (void)setupMenuItems; - (void)setupUI; +- (void)setStatusWindowEntryEffect:(Class)effectClass; +- (void)setStatusWindowExitEffect:(Class)effectClass; +- (void)setCustomColor:(NSColor *)color updateWell:(BOOL)update; +- (void)repopulateEffectPopupsForVerticalPosition:(ITVerticalWindowPosition)vPos horizontalPosition:(ITHorizontalWindowPosition)hPos; +- (BOOL)effect:(Class)effectClass supportsVerticalPosition:(ITVerticalWindowPosition)vPos withHorizontalPosition:(ITHorizontalWindowPosition)hPos; - (IBAction)changeMenus:(id)sender; - (void)setLaunchesAtLogin:(BOOL)flag; @end @@ -70,6 +80,9 @@ static PreferencesController *prefs = nil; if ( (self = [super init]) ) { ITDebugLog(@"Preferences initialized."); df = [[NSUserDefaults standardUserDefaults] retain]; + + effectClasses = [[ITWindowEffect effectClasses] retain]; + hotKeysArray = [[NSArray alloc] initWithObjects:@"PlayPause", @"NextTrack", @"PrevTrack", @@ -135,9 +148,11 @@ static PreferencesController *prefs = nil; [passwordPanelOKButton setTitle:@"Connect"]; [passwordPanelTitle setStringValue:@"Password Required"]; [passwordPanelMessage setStringValue:[NSString stringWithFormat:@"Please enter a password for access to the MenuTunes player named %@ at %@.", [[[NetworkController sharedController] networkObject] serverName], [[NetworkController sharedController] remoteHost]]]; - [passwordPanel center]; [passwordPanel setLevel:NSStatusWindowLevel]; - [passwordPanel makeKeyAndOrderFront:nil]; + [NSApp activateIgnoringOtherApps:YES]; + [passwordPanel center]; + [passwordPanel orderFrontRegardless]; + [passwordPanel makeKeyWindow]; if ([NSApp runModalForWindow:passwordPanel]) { return YES; } else { @@ -151,9 +166,11 @@ static PreferencesController *prefs = nil; [passwordPanelOKButton setTitle:@"Retry"]; [passwordPanelTitle setStringValue:@"Invalid Password"]; [passwordPanelMessage setStringValue:[NSString stringWithFormat:@"The password entered for access to the MenuTunes player named %@ at %@ is invalid. Please provide a new password.", [[[NetworkController sharedController] networkObject] serverName], [[NetworkController sharedController] remoteHost]]]; - [passwordPanel center]; [passwordPanel setLevel:NSStatusWindowLevel]; - [passwordPanel makeKeyAndOrderFront:nil]; + [NSApp activateIgnoringOtherApps:YES]; + [passwordPanel center]; + [passwordPanel orderFrontRegardless]; + [passwordPanel makeKeyWindow]; if ([NSApp runModalForWindow:passwordPanel]) { return YES; } else { @@ -181,9 +198,12 @@ static PreferencesController *prefs = nil; NS_ENDHANDLER } - [window center]; + [self resetRemotePlayerTextFields]; + [launchAtLoginCheckbox becomeFirstResponder]; [NSApp activateIgnoringOtherApps:YES]; - [window performSelector:@selector(makeKeyAndOrderFront:) withObject:self afterDelay:0.0]; + [window center]; + [window orderFrontRegardless]; + [window makeKeyWindow]; } - (IBAction)showTestWindow:(id)sender @@ -214,6 +234,19 @@ static PreferencesController *prefs = nil; [df setBool:SENDER_STATE forKey:@"showTrackNumber"]; } else if ( [sender tag] == 1090) { [df setBool:SENDER_STATE forKey:@"showTrackRating"]; + } else if ( [sender tag] == 1100) { + [df setBool:SENDER_STATE forKey:@"showAlbumArtwork"]; + } else if ( [sender tag] == 1110) { + [df setBool:SENDER_STATE forKey:@"runScripts"]; + if (SENDER_STATE) { + [runScriptsCheckbox setState:NSOnState]; + [showScriptsButton setEnabled:YES]; + } else { + [showScriptsButton setEnabled:NO]; + } + } else if ( [sender tag] == 1120) { + mkdir([[NSHomeDirectory() stringByAppendingPathComponent:@"Library/Application Support/MenuTunes/Scripts"] cString], 0744); + [[NSWorkspace sharedWorkspace] openFile:[NSHomeDirectory() stringByAppendingPathComponent:@"Library/Application Support/MenuTunes/Scripts"]]; } [df synchronize]; } @@ -226,35 +259,36 @@ static PreferencesController *prefs = nil; [df setBool:state forKey:@"enableSharing"]; //Disable/enable the use of shared player options [useSharedMenuTunesCheckbox setEnabled:!state]; - [usePasswordCheckbox setEnabled:state]; [passwordTextField setEnabled:state]; [nameTextField setEnabled:state]; [selectSharedPlayerButton setEnabled:NO]; [controller setServerStatus:state]; //Set server status } else if ( [sender tag] == 5015 ) { [df setObject:[sender stringValue] forKey:@"sharedPlayerName"]; - } else if ( [sender tag] == 5020 ) { - [df setBool:SENDER_STATE forKey:@"enableSharingPassword"]; + [[NetworkController sharedController] resetServerName]; } else if ( [sender tag] == 5030 ) { //Set the server password const char *instring = [[sender stringValue] UTF8String]; - const char *password = "password"; + const char *password = "p4s5w0rdMT1.2"; unsigned char *result; NSData *hashedPass, *passwordStringHash; + if ([[sender stringValue] length] == 0) { + [df setObject:[NSData data] forKey:@"sharedPlayerPassword"]; + return; + } result = SHA1(instring, strlen(instring), NULL); hashedPass = [NSData dataWithBytes:result length:strlen(result)]; result = SHA1(password, strlen(password), NULL); passwordStringHash = [NSData dataWithBytes:result length:strlen(result)]; if (![hashedPass isEqualToData:passwordStringHash]) { [df setObject:hashedPass forKey:@"sharedPlayerPassword"]; - [sender setStringValue:@"password"]; + [sender setStringValue:@"p4s5w0rdMT1.2"]; } } else if ( [sender tag] == 5040 ) { BOOL state = SENDER_STATE; [df setBool:state forKey:@"useSharedPlayer"]; //Disable/enable the use of sharing options [shareMenuTunesCheckbox setEnabled:!state]; - [usePasswordCheckbox setEnabled:NO]; [passwordTextField setEnabled:NO]; [nameTextField setEnabled:NO]; [selectSharedPlayerButton setEnabled:state]; @@ -368,59 +402,63 @@ static PreferencesController *prefs = nil; { StatusWindow *sw = [StatusWindow sharedWindow]; ITDebugLog(@"Changing status window setting of tag %i", [sender tag]); + if ( [sender tag] == 2010) { + + BOOL entryEffectValid = YES; + BOOL exitEffectValid = YES; + [df setInteger:[sender selectedRow] forKey:@"statusWindowVerticalPosition"]; [df setInteger:[sender selectedColumn] forKey:@"statusWindowHorizontalPosition"]; - [sw setHorizontalPosition:[sender selectedColumn]]; [sw setVerticalPosition:[sender selectedRow]]; - // update the window's position here + [sw setHorizontalPosition:[sender selectedColumn]]; + + // Enable/disable the items in the popups. + [self repopulateEffectPopupsForVerticalPosition:[sw verticalPosition] + horizontalPosition:[sw horizontalPosition]]; + + // Make sure the effects support the new position. + entryEffectValid = ( [self effect:[[sw entryEffect] class] + supportsVerticalPosition:[sw verticalPosition] + withHorizontalPosition:[sw horizontalPosition]] ); + exitEffectValid = ( [self effect:[[sw exitEffect] class] + supportsVerticalPosition:[sw verticalPosition] + withHorizontalPosition:[sw horizontalPosition]] ); + + if ( ! entryEffectValid ) { + [appearanceEffectPopup selectItemAtIndex:[[appearanceEffectPopup menu] indexOfItemWithRepresentedObject:NSClassFromString(@"ITCutWindowEffect")]]; + [self setStatusWindowEntryEffect:NSClassFromString(@"ITCutWindowEffect")]; + } else { + [appearanceEffectPopup selectItemAtIndex:[[appearanceEffectPopup menu] indexOfItemWithRepresentedObject:[[sw entryEffect] class]]]; + } + + if ( ! exitEffectValid ) { + [vanishEffectPopup selectItemAtIndex:[[vanishEffectPopup menu] indexOfItemWithRepresentedObject:NSClassFromString(@"ITDissolveWindowEffect")]]; + [self setStatusWindowExitEffect:NSClassFromString(@"ITDissolveWindowEffect")]; + } else { + [vanishEffectPopup selectItemAtIndex:[[vanishEffectPopup menu] indexOfItemWithRepresentedObject:[[sw exitEffect] class]]]; + } + + [(MainController *)controller showCurrentTrackInfo]; + } else if ( [sender tag] == 2020) { - // update screen selection + + // Update screen selection. + } else if ( [sender tag] == 2030) { - int effectTag = [[sender selectedItem] tag]; - float time = ([df floatForKey:@"statusWindowAppearanceSpeed"] ? [df floatForKey:@"statusWindowAppearanceSpeed"] : 0.8); - [df setInteger:effectTag forKey:@"statusWindowAppearanceEffect"]; - - if ( effectTag == 2100 ) { - [sw setEntryEffect:[[[ITCutWindowEffect alloc] initWithWindow:sw] autorelease]]; - } else if ( effectTag == 2101 ) { - [sw setEntryEffect:[[[ITDissolveWindowEffect alloc] initWithWindow:sw] autorelease]]; - } else if ( effectTag == 2102 ) { - [sw setEntryEffect:[[[ITSlideVerticallyWindowEffect alloc] initWithWindow:sw] autorelease]]; - } else if ( effectTag == 2103 ) { - [sw setEntryEffect:[[[ITSlideHorizontallyWindowEffect alloc] initWithWindow:sw] autorelease]]; - } else if ( effectTag == 2104 ) { - [sw setEntryEffect:[[[ITPivotWindowEffect alloc] initWithWindow:sw] autorelease]]; - } - - [[sw entryEffect] setEffectTime:time]; + + [self setStatusWindowEntryEffect:[[sender selectedItem] representedObject]]; } else if ( [sender tag] == 2040) { - int effectTag = [[sender selectedItem] tag]; - float time = ([df floatForKey:@"statusWindowVanishSpeed"] ? [df floatForKey:@"statusWindowVanishSpeed"] : 0.8); - - [df setInteger:[[sender selectedItem] tag] forKey:@"statusWindowVanishEffect"]; + + [self setStatusWindowExitEffect:[[sender selectedItem] representedObject]]; - if ( effectTag == 2100 ) { - [sw setExitEffect:[[[ITCutWindowEffect alloc] initWithWindow:sw] autorelease]]; - } else if ( effectTag == 2101 ) { - [sw setExitEffect:[[[ITDissolveWindowEffect alloc] initWithWindow:sw] autorelease]]; - } else if ( effectTag == 2102 ) { - [sw setExitEffect:[[[ITSlideVerticallyWindowEffect alloc] initWithWindow:sw] autorelease]]; - } else if ( effectTag == 2103 ) { - [sw setExitEffect:[[[ITSlideHorizontallyWindowEffect alloc] initWithWindow:sw] autorelease]]; - } else if ( effectTag == 2104 ) { - [sw setExitEffect:[[[ITPivotWindowEffect alloc] initWithWindow:sw] autorelease]]; - } - - [[sw exitEffect] setEffectTime:time]; - } else if ( [sender tag] == 2050) { - float newTime = (-([sender floatValue])); + float newTime = ( -([sender floatValue]) ); [df setFloat:newTime forKey:@"statusWindowAppearanceSpeed"]; [[sw entryEffect] setEffectTime:newTime]; } else if ( [sender tag] == 2060) { - float newTime = (-([sender floatValue])); + float newTime = ( -([sender floatValue]) ); [df setFloat:newTime forKey:@"statusWindowVanishSpeed"]; [[sw exitEffect] setEffectTime:newTime]; } else if ( [sender tag] == 2070) { @@ -434,20 +472,43 @@ static PreferencesController *prefs = nil; if ( setting == 0 ) { [(ITTSWBackgroundView *)[sw contentView] setBackgroundMode:ITTSWBackgroundApple]; - [backgroundColorWell setEnabled:NO]; + [backgroundColorWell setEnabled:NO]; + [backgroundColorPopup setEnabled:NO]; } else if ( setting == 1 ) { [(ITTSWBackgroundView *)[sw contentView] setBackgroundMode:ITTSWBackgroundReadable]; - [backgroundColorWell setEnabled:NO]; + [backgroundColorWell setEnabled:NO]; + [backgroundColorPopup setEnabled:NO]; } else if ( setting == 2 ) { [(ITTSWBackgroundView *)[sw contentView] setBackgroundMode:ITTSWBackgroundColored]; - [backgroundColorWell setEnabled:YES]; + [backgroundColorWell setEnabled:YES]; + [backgroundColorPopup setEnabled:YES]; } [df setInteger:setting forKey:@"statusWindowBackgroundMode"]; } else if ( [sender tag] == 2091) { - [(ITTSWBackgroundView *)[sw contentView] setBackgroundColor:[sender color]]; - [df setObject:[NSArchiver archivedDataWithRootObject:[sender color]] forKey:@"statusWindowBackgroundColor"]; + [self setCustomColor:[sender color] updateWell:NO]; + } else if ( [sender tag] == 2092) { + + int selectedItem = [sender indexOfSelectedItem]; + + if ( selectedItem == 1 ) { // An NSPopUpButton in PullDown mode uses item 0 as its title. Its first selectable item is 1. + [self setCustomColor:[NSColor colorWithCalibratedRed:0.92549 green:0.686275 blue:0.0 alpha:1.0] updateWell:YES]; + } else if ( selectedItem == 2 ) { + [self setCustomColor:[NSColor colorWithCalibratedRed:0.380392 green:0.670588 blue:0.0 alpha:1.0] updateWell:YES]; + } else if ( selectedItem == 3 ) { + [self setCustomColor:[NSColor colorWithCalibratedRed:0.443137 green:0.231373 blue:0.619608 alpha:1.0] updateWell:YES]; + } else if ( selectedItem == 4 ) { + [self setCustomColor:[NSColor colorWithCalibratedRed:0.831373 green:0.12549 blue:0.509804 alpha:1.0] updateWell:YES]; + } else if ( selectedItem == 5 ) { + [self setCustomColor:[NSColor colorWithCalibratedRed:0.00784314 green:0.611765 blue:0.662745 alpha:1.0] updateWell:YES]; + } else { + [self setCustomColor:[NSColor colorWithCalibratedWhite:0.15 alpha:0.70] updateWell:YES]; + } + + } else if ( [sender tag] == 2095) { + [df setInteger:[sender indexOfSelectedItem] forKey:@"statusWindowSizing"]; + [(MainController *)controller showCurrentTrackInfo]; } [df synchronize]; @@ -475,19 +536,26 @@ static PreferencesController *prefs = nil; @"quit", nil] forKey:@"menu"]; + [df setInteger:1200 forKey:@"appVersion"]; [df setInteger:5 forKey:@"SongsInAdvance"]; - // [df setBool:YES forKey:@"showName"]; // Song info will always show song title. +// [df setBool:YES forKey:@"showName"]; // Song info will always show song title. [df setBool:YES forKey:@"showArtist"]; [df setBool:NO forKey:@"showAlbum"]; [df setBool:NO forKey:@"showTime"]; - [df setInteger:2100 forKey:@"statusWindowAppearanceEffect"]; - [df setInteger:2101 forKey:@"statusWindowVanishEffect"]; + [df setObject:@"ITCutWindowEffect" forKey:@"statusWindowAppearanceEffect"]; + [df setObject:@"ITDissolveWindowEffect" forKey:@"statusWindowVanishEffect"]; [df setFloat:0.8 forKey:@"statusWindowAppearanceSpeed"]; [df setFloat:0.8 forKey:@"statusWindowVanishSpeed"]; [df setFloat:4.0 forKey:@"statusWindowVanishDelay"]; + [df setInteger:(int)ITWindowPositionBottom forKey:@"statusWindowVerticalPosition"]; + [df setInteger:(int)ITWindowPositionLeft forKey:@"statusWindowHorizontalPosition"]; + [[StatusWindow sharedWindow] setVerticalPosition:(int)ITWindowPositionBottom]; + [[StatusWindow sharedWindow] setHorizontalPosition:(int)ITWindowPositionLeft]; [df setBool:YES forKey:@"showSongInfoOnChange"]; - + + [df setObject:[NSArchiver archivedDataWithRootObject:[NSColor blueColor]] forKey:@"statusWindowBackgroundColor"]; + [df synchronize]; loginWindow = [[df persistentDomainForName:@"loginwindow"] mutableCopy]; @@ -693,9 +761,11 @@ static PreferencesController *prefs = nil; - (void)setupUI { NSMutableDictionary *loginwindow; - NSMutableArray *loginarray; - NSEnumerator *loginEnum, *keyArrayEnum; - NSString *serverName; + NSMutableArray *loginarray; + NSEnumerator *loginEnum; + NSEnumerator *keyArrayEnum; + NSString *serverName; + NSData *colorData; int selectedBGStyle; id anItem; @@ -724,6 +794,14 @@ static PreferencesController *prefs = nil; [trackTimeCheckbox setState:[df boolForKey:@"showTime"] ? NSOnState : NSOffState]; [trackNumberCheckbox setState:[df boolForKey:@"showTrackNumber"] ? NSOnState : NSOffState]; [ratingCheckbox setState:[df boolForKey:@"showTrackRating"] ? NSOnState : NSOffState]; + [albumArtworkCheckbox setState:[df boolForKey:@"showAlbumArtwork"] ? NSOnState : NSOffState]; + + if ([df boolForKey:@"runScripts"]) { + [runScriptsCheckbox setState:NSOnState]; + [showScriptsButton setEnabled:YES]; + } else { + [showScriptsButton setEnabled:NO]; + } // Set the launch at login checkbox state ITDebugLog(@"Setting launch at login state."); @@ -743,27 +821,57 @@ static PreferencesController *prefs = nil; [launchPlayerAtLaunchCheckbox setState:[df boolForKey:@"LaunchPlayerWithMT"] ? NSOnState : NSOffState]; // Setup the positioning controls + [positionMatrix selectCellAtRow:[df integerForKey:@"statusWindowVerticalPosition"] + column:[df integerForKey:@"statusWindowHorizontalPosition"]]; // Setup effects controls - [appearanceEffectPopup selectItem:[appearanceEffectPopup itemAtIndex:[appearanceEffectPopup indexOfItemWithTag:[df integerForKey:@"statusWindowAppearanceEffect"]]]]; - [vanishEffectPopup selectItem:[vanishEffectPopup itemAtIndex:[vanishEffectPopup indexOfItemWithTag:[df integerForKey:@"statusWindowVanishEffect"]]]]; - [appearanceSpeedSlider setFloatValue:-([df floatForKey:@"statusWindowAppearanceSpeed"])]; - [vanishSpeedSlider setFloatValue:-([df floatForKey:@"statusWindowVanishSpeed"])]; + // Populate the effects popups + [appearanceEffectPopup setAutoenablesItems:NO]; + [vanishEffectPopup setAutoenablesItems:NO]; + [self repopulateEffectPopupsForVerticalPosition:[df integerForKey:@"statusWindowVerticalPosition"] + horizontalPosition:[df integerForKey:@"statusWindowHorizontalPosition"]]; + + // Attempt to find the pref'd effect in the list. + // If it's not there, use cut/dissolve. + if ( [effectClasses containsObject:NSClassFromString([df stringForKey:@"statusWindowAppearanceEffect"])] ) { + [appearanceEffectPopup selectItemAtIndex:[effectClasses indexOfObject:NSClassFromString([df stringForKey:@"statusWindowAppearanceEffect"])]]; + } else { + [appearanceEffectPopup selectItemAtIndex:[effectClasses indexOfObject:NSClassFromString(@"ITCutWindowEffect")]]; + } + + if ( [effectClasses containsObject:NSClassFromString([df stringForKey:@"statusWindowVanishEffect"])] ) { + [vanishEffectPopup selectItemAtIndex:[effectClasses indexOfObject:NSClassFromString([df stringForKey:@"statusWindowVanishEffect"])]]; + } else { + [vanishEffectPopup selectItemAtIndex:[effectClasses indexOfObject:NSClassFromString(@"ITCutWindowEffect")]]; + } + + [appearanceSpeedSlider setFloatValue:( -([df floatForKey:@"statusWindowAppearanceSpeed"]) )]; + [vanishSpeedSlider setFloatValue:( -([df floatForKey:@"statusWindowVanishSpeed"]) )]; [vanishDelaySlider setFloatValue:[df floatForKey:@"statusWindowVanishDelay"]]; // Setup General Controls - selectedBGStyle = [df integerForKey:@"statusWindowBackgroundMode"]; [backgroundStylePopup selectItem:[backgroundStylePopup itemAtIndex:[backgroundStylePopup indexOfItemWithTag:selectedBGStyle]]]; if ( selectedBGStyle == ITTSWBackgroundColored ) { - [backgroundColorWell setEnabled:YES]; + [backgroundColorWell setEnabled:YES]; + [backgroundColorPopup setEnabled:YES]; } else { - [backgroundColorWell setEnabled:NO]; + [backgroundColorWell setEnabled:NO]; + [backgroundColorPopup setEnabled:NO]; } - [backgroundColorWell setColor:(NSColor *)[NSUnarchiver unarchiveObjectWithData:[df dataForKey:@"statusWindowBackgroundColor"]]]; + colorData = [df dataForKey:@"statusWindowBackgroundColor"]; + + if ( colorData ) { + [backgroundColorWell setColor:(NSColor *)[NSUnarchiver unarchiveObjectWithData:colorData]]; + } else { + [backgroundColorWell setColor:[NSColor blueColor]]; + } + [showOnChangeCheckbox setState:([df boolForKey:@"showSongInfoOnChange"] ? NSOnState : NSOffState)]; + + [windowSizingPopup selectItem:[windowSizingPopup itemAtIndex:[windowSizingPopup indexOfItemWithTag:[df integerForKey:@"statusWindowSizing"]]]]; // Setup the sharing controls if ([df boolForKey:@"enableSharing"]) { @@ -771,7 +879,6 @@ static PreferencesController *prefs = nil; [useSharedMenuTunesCheckbox setEnabled:NO]; [selectSharedPlayerButton setEnabled:NO]; [passwordTextField setEnabled:YES]; - [usePasswordCheckbox setEnabled:YES]; [nameTextField setEnabled:YES]; } else if ([df boolForKey:@"useSharedPlayer"]) { [useSharedMenuTunesCheckbox setState:NSOnState]; @@ -788,9 +895,10 @@ static PreferencesController *prefs = nil; [nameTextField setStringValue:serverName]; [selectPlayerBox setContentView:zeroConfView]; - [usePasswordCheckbox setState:([df boolForKey:@"enableSharingPassword"] ? NSOnState : NSOffState)]; - if ([df dataForKey:@"sharedPlayerPassword"]) { - [passwordTextField setStringValue:@"password"]; + if ([[df dataForKey:@"sharedPlayerPassword"] length] > 0) { + [passwordTextField setStringValue:@"p4s5w0rdMT1.2"]; + } else { + [passwordTextField setStringValue:@""]; } if ([df stringForKey:@"sharedPlayerHost"]) { [hostTextField setStringValue:[df stringForKey:@"sharedPlayerHost"]]; @@ -805,11 +913,107 @@ static PreferencesController *prefs = nil; } } +- (void)setStatusWindowEntryEffect:(Class)effectClass +{ + StatusWindow *sw = [StatusWindow sharedWindow]; + + float time = ([df floatForKey:@"statusWindowAppearanceSpeed"] ? [df floatForKey:@"statusWindowAppearanceSpeed"] : 0.8); + [df setObject:NSStringFromClass(effectClass) forKey:@"statusWindowAppearanceEffect"]; + + [sw setEntryEffect:[[[effectClass alloc] initWithWindow:sw] autorelease]]; + [[sw entryEffect] setEffectTime:time]; +} + +- (void)setStatusWindowExitEffect:(Class)effectClass +{ + StatusWindow *sw = [StatusWindow sharedWindow]; + + float time = ([df floatForKey:@"statusWindowVanishSpeed"] ? [df floatForKey:@"statusWindowVanishSpeed"] : 0.8); + [df setObject:NSStringFromClass(effectClass) forKey:@"statusWindowVanishEffect"]; + + [sw setExitEffect:[[[effectClass alloc] initWithWindow:sw] autorelease]]; + [[sw exitEffect] setEffectTime:time]; +} + +- (void)setCustomColor:(NSColor *)color updateWell:(BOOL)update +{ + [(ITTSWBackgroundView *)[[StatusWindow sharedWindow] contentView] setBackgroundColor:color]; + [df setObject:[NSArchiver archivedDataWithRootObject:color] forKey:@"statusWindowBackgroundColor"]; + + if ( update ) { + [backgroundColorWell setColor:color]; + } +} + +- (void)repopulateEffectPopupsForVerticalPosition:(ITVerticalWindowPosition)vPos horizontalPosition:(ITHorizontalWindowPosition)hPos +{ + NSEnumerator *effectEnum = [effectClasses objectEnumerator]; + id anItem; + + [appearanceEffectPopup removeAllItems]; + [vanishEffectPopup removeAllItems]; + + while ( (anItem = [effectEnum nextObject]) ) { + [appearanceEffectPopup addItemWithTitle:[anItem effectName]]; + [vanishEffectPopup addItemWithTitle:[anItem effectName]]; + + [[appearanceEffectPopup lastItem] setRepresentedObject:anItem]; + [[vanishEffectPopup lastItem] setRepresentedObject:anItem]; + + if ( [self effect:anItem supportsVerticalPosition:vPos withHorizontalPosition:hPos] ) { + [[appearanceEffectPopup lastItem] setEnabled:YES]; + [[vanishEffectPopup lastItem] setEnabled:YES]; + } else { + [[appearanceEffectPopup lastItem] setEnabled:NO]; + [[vanishEffectPopup lastItem] setEnabled:NO]; + } + } + +} + +- (BOOL)effect:(Class)effectClass supportsVerticalPosition:(ITVerticalWindowPosition)vPos withHorizontalPosition:(ITHorizontalWindowPosition)hPos +{ + BOOL valid = NO; + + if ( vPos == ITWindowPositionTop ) { + if ( hPos == ITWindowPositionLeft ) { + valid = ( [[[[effectClass supportedPositions] objectForKey:@"Top"] objectForKey:@"Left"] boolValue] ) ; + } else if ( hPos == ITWindowPositionCenter ) { + valid = ( [[[[effectClass supportedPositions] objectForKey:@"Top"] objectForKey:@"Center"] boolValue] ); + } else if ( hPos == ITWindowPositionRight ) { + valid = ( [[[[effectClass supportedPositions] objectForKey:@"Top"] objectForKey:@"Right"] boolValue] ); + } + } else if ( vPos == ITWindowPositionMiddle ) { + if ( hPos == ITWindowPositionLeft ) { + valid = ( [[[[effectClass supportedPositions] objectForKey:@"Middle"] objectForKey:@"Left"] boolValue] ); + } else if ( hPos == ITWindowPositionCenter ) { + valid = ( [[[[effectClass supportedPositions] objectForKey:@"Middle"] objectForKey:@"Center"] boolValue] ); + } else if ( hPos == ITWindowPositionRight ) { + valid = ( [[[[effectClass supportedPositions] objectForKey:@"Middle"] objectForKey:@"Right"] boolValue] ); + } + } else if ( vPos == ITWindowPositionBottom ) { + if ( hPos == ITWindowPositionLeft ) { + valid = ( [[[[effectClass supportedPositions] objectForKey:@"Bottom"] objectForKey:@"Left"] boolValue] ); + } else if ( hPos == ITWindowPositionCenter ) { + valid = ( [[[[effectClass supportedPositions] objectForKey:@"Bottom"] objectForKey:@"Center"] boolValue] ); + } else if ( hPos == ITWindowPositionRight ) { + valid = ( [[[[effectClass supportedPositions] objectForKey:@"Bottom"] objectForKey:@"Right"] boolValue] ); + } + } + + return valid; +} + - (IBAction)changeMenus:(id)sender { ITDebugLog(@"Synchronizing menus"); [df setObject:myItems forKey:@"menu"]; [df synchronize]; + + //If we're connected over a network, refresh the menu immediately + if ([[NetworkController sharedController] isConnectedToServer]) { + [controller timerUpdate]; + } } - (void)setLaunchesAtLogin:(BOOL)flag @@ -1036,6 +1240,7 @@ static PreferencesController *prefs = nil; { [hotKeysArray release]; [hotKeysDictionary release]; + [effectClasses release]; [menuTableView setDataSource:nil]; [allTableView setDataSource:nil]; [controller release];