Fixed it so that if you double click on the MT icon or call it to open,
[MenuTunes.git] / MainController.m
index 44e766b..c2502c5 100755 (executable)
@@ -147,13 +147,13 @@ static MainController *sharedController;
                 withLength:NSSquareStatusItemLength];
     }
     
-    bling = [[MTBlingController alloc] init];
+    /*bling = [[MTBlingController alloc] init];
     [self blingTime];
     registerTimer = [[NSTimer scheduledTimerWithTimeInterval:10.0
                              target:self
                              selector:@selector(blingTime)
                              userInfo:nil
-                             repeats:YES] retain];
+                             repeats:YES] retain];*/
     
     NS_DURING
         if ([[self currentRemote] playerRunningState] == ITMTRemotePlayerRunning) {
@@ -173,11 +173,20 @@ static MainController *sharedController;
 
     [networkController startRemoteServerSearch];
     [NSApp deactivate];
+       [self performSelector:@selector(rawr) withObject:nil afterDelay:1.0];
+       
+       bling = [[MTBlingController alloc] init];
+    [self blingTime];
+    registerTimer = [[NSTimer scheduledTimerWithTimeInterval:10.0
+                             target:self
+                             selector:@selector(blingTime)
+                             userInfo:nil
+                             repeats:YES] retain];
 }
 
-- (void)applicationDidBecomeActive:(NSNotification *)note
+- (void)rawr
 {
-       [[MainController sharedController] showPreferences];
+       _open = YES;
 }
 
 - (ITMTRemote *)loadRemote
@@ -280,16 +289,18 @@ static MainController *sharedController;
         if ( ([now timeIntervalSinceDate:[self getBlingTime]] >= 604800) && (blinged != YES) ) {
             blinged = YES;
             [statusItem setEnabled:NO];
-            [self clearHotKeys];
+                       [[ITHotKeyCenter sharedCenter] setEnabled:NO];
             if ([refreshTimer isValid]) {
                 [refreshTimer invalidate];
+                               [refreshTimer release];
+                               refreshTimer = nil;
             }
             [statusWindowController showRegistrationQueryWindow];
         }
     } else {
         if (blinged) {
             [statusItem setEnabled:YES];
-            [self setupHotKeys];
+            [[ITHotKeyCenter sharedCenter] setEnabled:YES];
             if (![refreshTimer isValid]) {
                 [refreshTimer release];
                 refreshTimer = [[NSTimer scheduledTimerWithTimeInterval:([networkController isConnectedToServer] ? 10.0 : 0.5)
@@ -367,17 +378,15 @@ static MainController *sharedController;
 - (void)timerUpdate
 {
        NSString *identifier = [[self currentRemote] playerStateUniqueIdentifier];
-       if (identifier == nil) {
+       if (refreshTimer && identifier == nil) {
                if ([statusItem isEnabled]) {
                        [statusItem setToolTip:@"iTunes not responding."];
-                       [[ITHotKeyCenter sharedCenter] setEnabled:NO];
                }
                [statusItem setEnabled:NO];
                return;
        } else if (![statusItem isEnabled]) {
                [statusItem setEnabled:YES];
                [statusItem setToolTip:_toolTip];
-               [[ITHotKeyCenter sharedCenter] setEnabled:YES];
                return;
        }
        
@@ -420,7 +429,7 @@ static MainController *sharedController;
                                        } else if (title) {
                                                _toolTip = title;
                                        } else {
-                                               _toolTip = @"No Song Playing";
+                                               _toolTip = NSLocalizedString(@"noSongPlaying", @"No song is playing.");
                                        }
                                        [statusItem setToolTip:_toolTip];
                                } else {
@@ -443,17 +452,21 @@ static MainController *sharedController;
 {
     ITDebugLog(@"Menu clicked.");
        
-       if ( ([[self currentRemote] playerStateUniqueIdentifier] == nil) && playerRunningState == ITMTRemotePlayerRunning ) {
-               if ([statusItem isEnabled]) {
-                       [statusItem setToolTip:@"iTunes not responding."];
-                       [[ITHotKeyCenter sharedCenter] setEnabled:NO];
+       if (([[self currentRemote] playerStateUniqueIdentifier] == nil) && playerRunningState == ITMTRemotePlayerRunning) {
+               if (refreshTimer) {
+                       if ([statusItem isEnabled]) {
+                               [statusItem setToolTip:NSLocalizedString(@"iTunesNotResponding", @"iTunes is not responding.")];
+                       }
+                       [statusItem setEnabled:NO];
+               } else {
+                       NSMenu *menu = [[NSMenu alloc] init];
+                       [menu addItemWithTitle:NSLocalizedString(@"iTunesNotResponding", @"iTunes is not responding.") action:nil keyEquivalent:@""];
+                       [statusItem setMenu:[menu autorelease]];
                }
-               [statusItem setEnabled:NO];
                return;
        } else if (![statusItem isEnabled]) {
                [statusItem setEnabled:YES];
                [statusItem setToolTip:_toolTip];
-               [[ITHotKeyCenter sharedCenter] setEnabled:YES];
                return;
        }
        
@@ -473,6 +486,81 @@ static MainController *sharedController;
     NS_ENDHANDLER
 }
 
+- (void)trackChanged:(NSNotification *)note
+{
+       //If we're running the timer, shut it off since we don't need it!
+       if (refreshTimer && [refreshTimer isValid]) {
+               ITDebugLog(@"Invalidating refresh timer.");
+               [refreshTimer invalidate];
+               [refreshTimer release];
+               refreshTimer = nil;
+       }
+       
+       if (![self songChanged]) {
+               return;
+       }
+       NSString *identifier = [[self currentRemote] playerStateUniqueIdentifier];
+       if ( [df boolForKey:@"showSongInfoOnChange"] ) {
+               [self performSelector:@selector(showCurrentTrackInfo) withObject:nil afterDelay:0.0];
+       }
+       [_lastTrackInfo release];
+       _lastTrackInfo = [[note userInfo] retain];
+       
+       [self setLatestSongIdentifier:identifier];
+       ITDebugLog(@"The song changed. '%@'", _latestSongIdentifier);
+       if ([df boolForKey:@"runScripts"]) {
+               NSArray *scripts = [[NSFileManager defaultManager] directoryContentsAtPath:[NSHomeDirectory() stringByAppendingPathComponent:@"Library/Application Support/MenuTunes/Scripts"]];
+               NSEnumerator *scriptsEnum = [scripts objectEnumerator];
+               NSString *nextScript;
+               ITDebugLog(@"Running AppleScripts for song change.");
+               while ( (nextScript = [scriptsEnum nextObject]) ) {
+                       NSDictionary *error;
+                       NSAppleScript *currentScript = [[NSAppleScript alloc] initWithContentsOfURL:[NSURL fileURLWithPath:[[NSHomeDirectory() stringByAppendingPathComponent:@"Library/Application Support/MenuTunes/Scripts"] stringByAppendingPathComponent:nextScript]] error:&error];
+                       ITDebugLog(@"Running script: %@", nextScript);
+                       if (!currentScript || ![currentScript executeAndReturnError:nil]) {
+                               ITDebugLog(@"Error running script %@.", nextScript);
+                       }
+                       [currentScript release];
+               }
+       }
+       
+       [statusItem setEnabled:NO];
+       
+       NS_DURING
+               latestPlaylistClass = [[self currentRemote] currentPlaylistClass];
+               
+               if ([menuController rebuildSubmenus]) {
+                       /*if ( [df boolForKey:@"showSongInfoOnChange"] ) {
+                               [self performSelector:@selector(showCurrentTrackInfo) withObject:nil afterDelay:0.0];
+                       }*/
+                       [self setLatestSongIdentifier:identifier];
+                       //Create the tooltip for the status item
+                       if ( [df boolForKey:@"showToolTip"] ) {
+                               ITDebugLog(@"Creating status item tooltip.");
+                               NSString *artist = [_lastTrackInfo objectForKey:@"Artist"], *title = [_lastTrackInfo objectForKey:@"Name"];
+                               if (artist) {
+                                       _toolTip = [NSString stringWithFormat:@"%@ - %@", artist, title];
+                               } else if (title) {
+                                       _toolTip = title;
+                               } else {
+                                       _toolTip = NSLocalizedString(@"noSongPlaying", @"No song is playing.");;
+                               }
+                               [statusItem setToolTip:_toolTip];
+                       } else {
+                               [statusItem setToolTip:nil];
+                       }
+               }
+       NS_HANDLER
+               [self networkError:localException];
+       NS_ENDHANDLER
+       timerUpdating = NO;
+       [statusItem setEnabled:YES];
+       
+       if ([networkController isConnectedToServer]) {
+        [statusItem setMenu:([[self currentRemote] playerRunningState] == ITMTRemotePlayerRunning) ? [menuController menu] : [menuController menuForNoPlayer]];
+    }
+}
+
 //
 //
 // Menu Selectors
@@ -496,7 +584,9 @@ static MainController *sharedController;
         [self networkError:localException];
     NS_ENDHANDLER
     
-    [self timerUpdate];
+       if (refreshTimer) {
+               [self timerUpdate];
+       }
 }
 
 - (void)nextSong
@@ -507,7 +597,9 @@ static MainController *sharedController;
     NS_HANDLER
         [self networkError:localException];
     NS_ENDHANDLER
-    [self timerUpdate];
+    if (refreshTimer) {
+               [self timerUpdate];
+       }
 }
 
 - (void)prevSong
@@ -518,7 +610,9 @@ static MainController *sharedController;
     NS_HANDLER
         [self networkError:localException];
     NS_ENDHANDLER
-    [self timerUpdate];
+    if (refreshTimer) {
+               [self timerUpdate];
+       }
 }
 
 - (void)fastForward
@@ -529,7 +623,9 @@ static MainController *sharedController;
     NS_HANDLER
         [self networkError:localException];
     NS_ENDHANDLER
-    [self timerUpdate];
+    if (refreshTimer) {
+               [self timerUpdate];
+       }
 }
 
 - (void)rewind
@@ -540,7 +636,9 @@ static MainController *sharedController;
     NS_HANDLER
         [self networkError:localException];
     NS_ENDHANDLER
-    [self timerUpdate];
+    if (refreshTimer) {
+               [self timerUpdate];
+       }
 }
 
 - (void)selectPlaylistAtIndex:(int)index
@@ -552,7 +650,9 @@ static MainController *sharedController;
     NS_HANDLER
         [self networkError:localException];
     NS_ENDHANDLER
-    [self timerUpdate];
+    if (refreshTimer) {
+               [self timerUpdate];
+       }
 }
 
 - (void)selectSongAtIndex:(int)index
@@ -563,7 +663,9 @@ static MainController *sharedController;
     NS_HANDLER
         [self networkError:localException];
     NS_ENDHANDLER
-    [self timerUpdate];
+    if (refreshTimer) {
+               [self timerUpdate];
+       }
 }
 
 - (void)selectSongRating:(int)rating
@@ -574,7 +676,9 @@ static MainController *sharedController;
     NS_HANDLER
         [self networkError:localException];
     NS_ENDHANDLER
-    [self timerUpdate];
+    if (refreshTimer) {
+               [self timerUpdate];
+       }
 }
 
 - (void)selectEQPresetAtIndex:(int)index
@@ -589,7 +693,9 @@ static MainController *sharedController;
     NS_HANDLER
         [self networkError:localException];
     NS_ENDHANDLER
-    [self timerUpdate];
+    if (refreshTimer) {
+               [self timerUpdate];
+       }
 }
 
 - (void)makePlaylistWithTerm:(NSString *)term ofType:(int)type
@@ -1238,8 +1344,9 @@ static MainController *sharedController;
         [self setupHotKeys];
         //playerRunningState = ITMTRemotePlayerRunning;
         playerRunningState = [[self currentRemote] playerRunningState];
-               
-        [refreshTimer invalidate];
+               if (refreshTimer) {
+                       [refreshTimer invalidate];
+               }
         refreshTimer = [[NSTimer scheduledTimerWithTimeInterval:([networkController isConnectedToServer] ? 10.0 : 0.5)
                                 target:self
                                 selector:@selector(timerUpdate)
@@ -1273,7 +1380,9 @@ static MainController *sharedController;
     } else {
         [self applicationTerminated:nil];
     }
-    [self timerUpdate];
+    if (refreshTimer) {
+               [self timerUpdate];
+       };
     return YES;
 }
 
@@ -1384,6 +1493,9 @@ static MainController *sharedController;
                                 userInfo:nil
                                 repeats:YES] retain];
             //[NSThread detachNewThreadSelector:@selector(startTimerInNewThread) toTarget:self withObject:nil];
+                       if (![df boolForKey:@"UsePollingOnly"]) {
+                               [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(trackChanged:) name:@"ITMTTrackChanged" object:nil];
+                       }
             [self setupHotKeys];
         }
     NS_HANDLER
@@ -1401,10 +1513,12 @@ static MainController *sharedController;
             [refreshTimer invalidate];
             [refreshTimer release];
             refreshTimer = nil;
+                       [[NSNotificationCenter defaultCenter] removeObserver:self name:@"ITMTTrackChanged" object:nil];
                        [statusItem setEnabled:YES];
                        [statusItem setToolTip:@"iTunes not running."];
             [self clearHotKeys];
-            
+
+                       
             if ([df objectForKey:@"ShowPlayer"] != nil) {
                 ITHotKey *hotKey;
                 ITDebugLog(@"Setting up show player hot key.");
@@ -1429,11 +1543,18 @@ static MainController *sharedController;
 
 - (void)applicationWillTerminate:(NSNotification *)note
 {
+       [[[NSWorkspace sharedWorkspace] notificationCenter] removeObserver:self];
     [networkController stopRemoteServerSearch];
     [self clearHotKeys];
     [[NSStatusBar systemStatusBar] removeStatusItem:statusItem];
 }
 
+- (void)applicationDidBecomeActive:(NSNotification *)note
+{
+       if (_open && !blinged && ![NSApp mainWindow] && ([[StatusWindow sharedWindow] exitMode] == ITTransientStatusWindowExitAfterDelay)) {
+               [[MainController sharedController] showPreferences];
+       }
+}
 
 /*************************************************************************/
 #pragma mark -