Positioning Fixes. The window might still do some weirdness if you change its positi...
[ITKit.git] / ITTransientStatusWindow.m
index f749278..4f03f53 100755 (executable)
@@ -1,9 +1,9 @@
 #import "ITTransientStatusWindow.h"
 #import "ITWindowEffect.h"
 #import "ITTransientStatusWindow.h"
 #import "ITWindowEffect.h"
-#import <CoreGraphics/CoreGraphics.h>
+#import <ApplicationServices/ApplicationServices.h>
 #import "ITCoreGraphicsHacks.h"
 #import "ITTextField.h"
 #import "ITCoreGraphicsHacks.h"
 #import "ITTextField.h"
-#import "ITGrayRoundedView.h"
+#import "ITTSWBackgroundView.h"
 
 #define EFFECT_FPS 30.0
 
 
 #define EFFECT_FPS 30.0
 
@@ -18,7 +18,8 @@
                  exitMode:(ITTransientStatusWindowExitMode)exitMode
            backgroundType:(ITTransientStatusWindowBackgroundType)backgroundType;
 - (void)rebuildWindow;
                  exitMode:(ITTransientStatusWindowExitMode)exitMode
            backgroundType:(ITTransientStatusWindowBackgroundType)backgroundType;
 - (void)rebuildWindow;
-// - (void)performEffect;
+- (void)startVanishTimer;
+- (void)stopVanishTimer;
 @end
 
 
 @end
 
 
@@ -73,18 +74,18 @@ static ITTransientStatusWindow *staticWindow = nil;
                                      backing:NSBackingStoreBuffered
                                        defer:NO] ) ) {
                                     
                                      backing:NSBackingStoreBuffered
                                        defer:NO] ) ) {
                                     
-        _visibilityState     = ITTransientStatusWindowHiddenState;
+        _visibilityState     = ITWindowHiddenState;
         _exitMode            = exitMode;
         _exitDelay           = DEFAULT_EXIT_DELAY;
         _backgroundType      = backgroundType;
         _verticalPosition    = ITWindowPositionBottom;
         _horizontalPosition  = ITWindowPositionLeft;
         _screenPadding       = 32.0;
         _exitMode            = exitMode;
         _exitDelay           = DEFAULT_EXIT_DELAY;
         _backgroundType      = backgroundType;
         _verticalPosition    = ITWindowPositionBottom;
         _horizontalPosition  = ITWindowPositionLeft;
         _screenPadding       = 32.0;
-        _screenNumber        = 0;
+        //_screenNumber        = 0;
         _entryEffect         = nil;
         _exitEffect          = nil;
         _reallyIgnoresEvents = YES;
         _entryEffect         = nil;
         _exitEffect          = nil;
         _reallyIgnoresEvents = YES;
-        _delayTimer          = nil;
+        _exitTimer           = nil;
 
 //      if ( _backgroundType == ITTransientStatusWindowRounded ) {
 //          _contentSubView = contentView;
 
 //      if ( _backgroundType == ITTransientStatusWindowRounded ) {
 //          _contentSubView = contentView;
@@ -127,49 +128,6 @@ static ITTransientStatusWindow *staticWindow = nil;
 
 /*
 
 
 /*
 
-- (void)orderFront:(id)sender
-{
-    if ( _entryEffect == nil ) {
-        [super orderFront:sender];
-        _visibilityState = ITTransientStatusWindowVisibleState;
-    } else {
-        [self performEffect];
-    }
-    if ( _exitMode == ITTransientStatusWindowExitAfterDelay ) {
-        // set the timer, and orderOut: when it lapses.
-    }
-}
-
-- (void)makeKeyAndOrderFront:(id)sender
-{
-    if ( _exitMode == ITTransientStatusWindowExitAfterDelay ) {
-        // set the timer, and orderOut: when it lapses.
-    }
-
-    if ( _entryEffect == nil ) {
-        [super makeKeyAndOrderFront:sender];
-        _visibilityState = ITTransientStatusWindowVisibleState;
-    } else {
-        [self performEffect];
-        [self makeKeyWindow];
-    }
-}
-
-- (void)orderOut:(id)sender
-{
-    if ( _entryEffect == nil ) {
-        [super orderOut:sender];
-        _visibilityState = ITTransientStatusWindowHiddenState;
-    } else {
-        [self performEffect];
-    }
-}
-
-- (NSTimeInterval)animationResizeTime:(NSRect)newFrame
-{
-    return _resizeTime;
-}
-
 - (id)contentView
 {
     if ( _backgroundType == ITTransientStatusWindowRounded ) {
 - (id)contentView
 {
     if ( _backgroundType == ITTransientStatusWindowRounded ) {
@@ -194,37 +152,53 @@ static ITTransientStatusWindow *staticWindow = nil;
 
 */
 
 
 */
 
-- (void)appear
+- (IBAction)appear:(id)sender
 {
 {
-    if ( _entryEffect == nil ) {
-        [self orderFront:self];
-        _visibilityState = ITTransientStatusWindowVisibleState;
-    } else {
-        _visibilityState = ITTransientStatusWindowAppearingState;
+    if ( _visibilityState == ITWindowHiddenState ) {
+         // Window is hidden.  Appear as normal, and start the timer.
         [_entryEffect performAppear];
         [_entryEffect performAppear];
-        _visibilityState = ITTransientStatusWindowVisibleState;
-    }
-    if ( _exitMode == ITTransientStatusWindowExitAfterDelay ) {
-        // set the timer, and vanish when it lapses.
+    } else if ( _visibilityState == ITWindowVisibleState ) {
+         // Window is completely visible.  Simply reset the timer.
+        [self startVanishTimer];
+    } else if ( _visibilityState == ITWindowAppearingState ) {
+         // Window is on its way in.  Do nothing.
+    } else if ( _visibilityState == ITWindowVanishingState ) {
+        // Window is on its way out.  Cancel the vanish.
+        [_exitEffect cancelVanish];
     }
 }
 
     }
 }
 
-- (void)vanish
+- (IBAction)vanish:(id)sender
 {
 {
-    if ( _entryEffect == nil ) {
-        [self orderOut:self];
-        _visibilityState = ITTransientStatusWindowHiddenState;
-    } else {
+    if ( _visibilityState == ITWindowVisibleState ) {
+        // Window is totally visible.  Perform exit effect.
         [_exitEffect performVanish];
         [_exitEffect performVanish];
-        _visibilityState = ITTransientStatusWindowHiddenState;
+    } else if ( _visibilityState == ITWindowHiddenState ) {
+        // Window is hidden.  Do nothing.
+    } else if ( _visibilityState == ITWindowAppearingState ) {
+        // Window is on its way in.  Cancel appear.
+        [_entryEffect cancelAppear];
+    } else if ( _visibilityState == ITWindowVanishingState ) {
+        // Window is on its way out.  Do nothing.
     }
 }
 
     }
 }
 
-- (ITTransientStatusWindowVisibilityState)visibilityState
+- (ITWindowVisibilityState)visibilityState
 {
     return _visibilityState;
 }
 
 {
     return _visibilityState;
 }
 
+- (void)setVisibilityState:(ITWindowVisibilityState)newState
+{
+    _visibilityState = newState;
+    
+    if ( _visibilityState == ITWindowVisibleState ) {
+        [self startVanishTimer];
+    } else if ( (_visibilityState == ITWindowVanishingState) || (_visibilityState == ITWindowHiddenState) ) {
+        [self stopVanishTimer];
+    }
+}
+
 - (ITTransientStatusWindowExitMode)exitMode
 {
     return _exitMode;
 - (ITTransientStatusWindowExitMode)exitMode
 {
     return _exitMode;
@@ -233,6 +207,14 @@ static ITTransientStatusWindow *staticWindow = nil;
 - (void)setExitMode:(ITTransientStatusWindowExitMode)newMode
 {
     _exitMode = newMode;
 - (void)setExitMode:(ITTransientStatusWindowExitMode)newMode
 {
     _exitMode = newMode;
+    
+    if ( _visibilityState == ITWindowVisibleState ) {
+        if ( _exitMode == ITTransientStatusWindowExitOnCommand ) {
+            [self stopVanishTimer];
+        } else if ( _exitMode == ITTransientStatusWindowExitAfterDelay ) {
+            [self startVanishTimer];
+        }
+    }
 }
 
 - (float)exitDelay
 }
 
 - (float)exitDelay
@@ -278,6 +260,16 @@ static ITTransientStatusWindow *staticWindow = nil;
     _horizontalPosition = newPosition;
 }
 
     _horizontalPosition = newPosition;
 }
 
+- (float)effectProgress
+{
+    return _effectProgress;
+}
+
+- (void)setEffectProgress:(float)newProgress
+{
+    _effectProgress = newProgress;
+}
+
 - (float)screenPadding
 {
     return _screenPadding;
 - (float)screenPadding
 {
     return _screenPadding;
@@ -288,7 +280,7 @@ static ITTransientStatusWindow *staticWindow = nil;
     _screenPadding = newPadding;
 }
 
     _screenPadding = newPadding;
 }
 
-- (int)screenNumber
+/*- (int)screenNumber
 {
     return _screenNumber;
 }
 {
     return _screenNumber;
 }
@@ -296,7 +288,7 @@ static ITTransientStatusWindow *staticWindow = nil;
 - (void)setScreenNumber:(int)newNumber
 {
     _screenNumber = newNumber;
 - (void)setScreenNumber:(int)newNumber
 {
     _screenNumber = newNumber;
-}
+}*/
 
 - (ITWindowEffect *)entryEffect
 {
 
 - (ITWindowEffect *)entryEffect
 {
@@ -305,7 +297,7 @@ static ITTransientStatusWindow *staticWindow = nil;
 
 - (void)setEntryEffect:(ITWindowEffect *)newEffect
 {
 
 - (void)setEntryEffect:(ITWindowEffect *)newEffect
 {
-    [_entryEffect autorelease];
+    [_entryEffect releaseWhenIdle];
     _entryEffect = [newEffect retain];
 }
 
     _entryEffect = [newEffect retain];
 }
 
@@ -316,7 +308,7 @@ static ITTransientStatusWindow *staticWindow = nil;
 
 - (void)setExitEffect:(ITWindowEffect *)newEffect
 {
 
 - (void)setExitEffect:(ITWindowEffect *)newEffect
 {
-    [_exitEffect autorelease];
+    [_exitEffect releaseWhenIdle];
     _exitEffect = [newEffect retain];
 }
 
     _exitEffect = [newEffect retain];
 }
 
@@ -329,7 +321,7 @@ static ITTransientStatusWindow *staticWindow = nil;
 - (void)rebuildWindow;
 {
     if ( _backgroundType == ITTransientStatusWindowRounded ) {
 - (void)rebuildWindow;
 {
     if ( _backgroundType == ITTransientStatusWindowRounded ) {
-        ITGrayRoundedView *roundedView = [[[ITGrayRoundedView alloc] initWithFrame:[self frame]] autorelease];
+        ITTSWBackgroundView *roundedView = [[[ITTSWBackgroundView alloc] initWithFrame:[self frame]] autorelease];
 
         [self setBackgroundColor:[NSColor clearColor]];
         [self setHasShadow:NO];
 
         [self setBackgroundColor:[NSColor clearColor]];
         [self setHasShadow:NO];
@@ -344,30 +336,30 @@ static ITTransientStatusWindow *staticWindow = nil;
     }
 }
 
     }
 }
 
-/*
-
-- (void)performEffect
+- (void)startVanishTimer
 {
 {
-    if ( _visibilityState == ITTransientStatusWindowHiddenState ) {
-        _visibilityState = ITTransientStatusWindowEnteringState;
-    } else if ( _visibilityState == ITTransientStatusWindowVisibleState ) {
-        _visibilityState = ITTransientStatusWindowExitingState;
-    } else {
-        return;
-    }
-        
-    if ( _entryEffect == ITTransientStatusWindowEffectDissolve ) {
-        [self dissolveEffect];
-    } else if ( _entryEffect == ITTransientStatusWindowEffectSlideVertically ) {
-        [self slideVerticalEffect];
-    } else if ( _entryEffect == ITTransientStatusWindowEffectSlideHorizontally ) {
-        [self slideHorizontalEffect];
-    } else if ( _entryEffect == ITTransientStatusWindowEffectPivot ) {
-        [self pivotEffect];
+    if ( _exitMode == ITTransientStatusWindowExitAfterDelay) {
+        [self stopVanishTimer];
+        _exitTimer = [NSTimer scheduledTimerWithTimeInterval:_exitDelay
+                                                      target:self
+                                                    selector:@selector(doDelayedExit)
+                                                    userInfo:nil
+                                                     repeats:NO];
     }
 }
 
     }
 }
 
-*/
+- (void)doDelayedExit
+{
+    [self vanish:self];
+    _exitTimer = nil;
+}
 
 
+- (void)stopVanishTimer
+{
+    if ( _exitTimer ) {
+        [_exitTimer invalidate];
+        _exitTimer = nil;
+    }
+}
 
 @end
 
 @end