ITKit for Menutunes
authorMatthew Judy <mjudy@ithinksw.com>
Mon, 27 Jan 2003 09:09:30 +0000 (09:09 +0000)
committerMatthew Judy <mjudy@ithinksw.com>
Mon, 27 Jan 2003 09:09:30 +0000 (09:09 +0000)
Commit Phase 2: New Classes

This checkin adds the new classes to the repository.

13 files changed:
ITCategory-NSView.h [new file with mode: 0755]
ITCategory-NSView.m [new file with mode: 0755]
ITCoreGraphicsHacks.h [new file with mode: 0755]
ITTSWBackgroundView.h [new file with mode: 0755]
ITTSWBackgroundView.m [new file with mode: 0755]
ITTableCornerView.h [new file with mode: 0755]
ITTableCornerView.m [new file with mode: 0755]
ITTableView.h [new file with mode: 0755]
ITTableView.m [new file with mode: 0755]
ITTextField.h [new file with mode: 0755]
ITTextField.m [new file with mode: 0755]
ITTransientStatusWindow.h [new file with mode: 0755]
ITTransientStatusWindow.m [new file with mode: 0755]

diff --git a/ITCategory-NSView.h b/ITCategory-NSView.h
new file mode 100755 (executable)
index 0000000..79d26d6
--- /dev/null
@@ -0,0 +1,8 @@
+#import <AppKit/AppKit.h>
+
+
+@interface NSView (ITCategory)
+
+- (void)removeAllSubviews;
+
+@end
diff --git a/ITCategory-NSView.m b/ITCategory-NSView.m
new file mode 100755 (executable)
index 0000000..b2c8c0c
--- /dev/null
@@ -0,0 +1,10 @@
+#import "ITCategory-NSView.h"
+
+
+@implementation NSView (ITCategory)
+
+- (void)removeAllSubviews {
+    [[self subviews] makeObjectsPerformSelector:@selector(removeFromSuperview)];
+}
+
+@end
diff --git a/ITCoreGraphicsHacks.h b/ITCoreGraphicsHacks.h
new file mode 100755 (executable)
index 0000000..c9041c9
--- /dev/null
@@ -0,0 +1,35 @@
+
+/*************************************************************************/
+#pragma mark -
+#pragma mark CoreGraphics HACKS
+/*************************************************************************/
+
+typedef void * CGSGenericObj;
+typedef CGSGenericObj CGSValueObj;
+typedef void * CGSConnectionID;
+typedef void * CGSWindowID;
+typedef struct CGStyle *CGStyleRef;
+typedef struct CGShadowStyle {
+    unsigned int version;
+    float elevation;
+    float azimuth;
+    float ambient;
+    float height;
+    float radius;
+    float saturation;
+} CGShadowStyle;
+typedef unsigned char CGSBoolean;
+enum {
+    kCGSFalse = 0,
+    kCGSTrue  = 1
+};
+
+extern void        CGStyleRelease(CGStyleRef style);
+extern void        CGSReleaseObj(void *obj);
+extern void        CGContextSetStyle(CGContextRef c, CGStyleRef style);
+extern void        CGStyleRelease(CGStyleRef style);
+extern CGStyleRef  CGStyleCreateShadow(const CGShadowStyle *shadow);
+extern CGSValueObj CGSCreateCString(const char *string);
+extern CGSValueObj CGSCreateBoolean(CGSBoolean boolean);
+extern CGError     CGSSetWindowProperty(const CGSConnectionID cid,
+                                        CGSWindowID wid, const CGSValueObj key, const CGSValueObj value);
diff --git a/ITTSWBackgroundView.h b/ITTSWBackgroundView.h
new file mode 100755 (executable)
index 0000000..53172e0
--- /dev/null
@@ -0,0 +1,16 @@
+//
+//  ITGrayRoundedView.h
+//  ITKit
+//
+//  Created by Matt L. Judy on Wed Jan 22 2003.
+//  Copyright (c) 2003 NibFile.com. All rights reserved.
+//
+
+#import <Cocoa/Cocoa.h>
+
+
+@interface ITGrayRoundedView : NSView {
+
+}
+
+@end
diff --git a/ITTSWBackgroundView.m b/ITTSWBackgroundView.m
new file mode 100755 (executable)
index 0000000..c978c55
--- /dev/null
@@ -0,0 +1,46 @@
+//
+//  ITGrayRoundedView.m
+//  ITKit
+//
+//  Created by Matt L. Judy on Wed Jan 22 2003.
+//  Copyright (c) 2003 NibFile.com. All rights reserved.
+//
+
+#import "ITGrayRoundedView.h"
+
+
+@implementation ITGrayRoundedView
+
+- (void)drawRect:(NSRect)theRect
+{
+    NSBezierPath *path = [NSBezierPath bezierPath];
+    float vh = NSHeight(theRect);
+    float vw = NSWidth(theRect);
+    [path moveToPoint:NSMakePoint( 0.0, (vh - 24.0) )];          //  first point
+    [path curveToPoint:NSMakePoint( 24.0, vh )
+         controlPoint1:NSMakePoint( 0.0, (vh - 11.0) )
+         controlPoint2:NSMakePoint( 11.0, vh )];                 //  top-left curve
+    [path lineToPoint:NSMakePoint( (vw - 24.0), vh )];    //  top line
+    [path curveToPoint:NSMakePoint( vw, (vh - 24.0) )
+         controlPoint1:NSMakePoint( (vw - 11.0), vh )
+         controlPoint2:NSMakePoint( vw, (vh - 11.0) )];   //  top-right curve
+    [path lineToPoint:NSMakePoint( vw, 24.0 )];           //  right line
+    [path curveToPoint:NSMakePoint( (vw - 24.0), 0.0 )
+         controlPoint1:NSMakePoint( vw, 11.0 )
+         controlPoint2:NSMakePoint( (vw - 11.0), 0.0 )];  //  bottom-right curve
+    [path lineToPoint:NSMakePoint( 24.0, 0.0 )];          //  bottom line
+    [path curveToPoint:NSMakePoint( 0.0, 24.0 )
+         controlPoint1:NSMakePoint( 11.0, 0.0 )
+         controlPoint2:NSMakePoint( 0.0, 11.0 )];         //  bottom-left curve
+    [path closePath];                                                                    //  left line
+
+    [[NSColor colorWithCalibratedWhite:0.0 alpha:0.15] set];
+    [path fill];
+}
+
+- (BOOL)isOpaque
+{
+    return NO;
+}
+
+@end
diff --git a/ITTableCornerView.h b/ITTableCornerView.h
new file mode 100755 (executable)
index 0000000..a8b582c
--- /dev/null
@@ -0,0 +1,36 @@
+/*
+ *     ITKit
+ *  ITTableCornerView
+ *    NSPopUpButton subclass for corner views in a table view.
+ *
+ *  Original Author : Joseph Spiros <joseph.spiros@ithinksw.com>
+ *   Responsibility : Matt Judy <mjudy@ithinksw.com>
+ *   Responsibility : Joseph Spiros <joseph.spiros@ithinksw.com>
+ *
+ *  Copyright (c) 2002 - 2003 iThink Software.
+ *  All Rights Reserved
+ *
+ */
+
+/*
+ *     This subclass does 4 things to approximate NSMenuExtra's functionality:
+ *
+ *  1. Makes the status item smarter about highlighting.
+ *  2. Allows you to set an alternate (inverted) image.
+ *  3. Eliminates the pre-Jaguar shadow behind a normal status item.
+ *  4. If you use an image AND title, the text will be made slightly smaller
+ *     to resemble the visual interface of an NSMenuExtra.
+ *
+ *  Note:  In order to have the shadow not overlap the bottom of the
+ *  menubar, Apple moves the image up one pixel.  Since that shadow is
+ *  no longer drawn, please adjust your images DOWN one pixel to compensate.
+ *
+ */
+
+#import <AppKit/AppKit.h>
+
+@interface ITTableCornerView : NSPopUpButton {
+    NSTableHeaderCell *headerCell;
+}
+@end
+
diff --git a/ITTableCornerView.m b/ITTableCornerView.m
new file mode 100755 (executable)
index 0000000..256c808
--- /dev/null
@@ -0,0 +1,39 @@
+//
+//  ITTableCornerView.m
+//  
+//
+//  Created by Joseph Spiros on Wed Jan 22 2003.
+//  Copyright (c) 2003 __MyCompanyName__. All rights reserved.
+//
+
+#import "ITTableCornerView.h"
+
+@implementation ITTableCornerView
+
+- (id)initWithFrame:(NSRect)frame {
+    self = [super initWithFrame:frame];
+    if (self) {
+        headerCell = [[NSTableHeaderCell alloc] init];
+    }
+    return self;
+}
+
+- (void)drawRect:(NSRect)rect {
+    rect.origin.y = 0;
+    rect.size.height = 17;
+    rect.size.width += 1;
+    
+    [headerCell setState: ([[self cell] isHighlighted]) ? NSOnState : NSOffState];
+    [headerCell drawWithFrame:rect inView:nil];
+    
+    if ([self image]) {
+        [[self image] drawAtPoint:rect.origin fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1.0];
+    }
+}
+
+- (void)dealloc {
+    [headerCell release];
+    [super dealloc];
+}
+
+@end
\ No newline at end of file
diff --git a/ITTableView.h b/ITTableView.h
new file mode 100755 (executable)
index 0000000..5661c74
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ *     ITKit
+ *     ITTableView
+ *
+ *     An NSTableView subclass with easy to use accessors for adding a menu (with optional image)
+ *     to the corner view of the TableView.
+ *
+ *     Original Author : Joseph Spiros <joseph.spiros@ithinksw.com>
+ *     Responsibility  : Joseph Spiros <joseph.spiros@ithinksw.com>
+ *
+ *     Copyright (c) 2002 iThink Software.
+ *     All Rights Reserved
+ *
+ */
+
+#import <AppKit/AppKit.h>
+#import "ITTableCornerView.h"
+
+@interface ITTableView : NSTableView {
+    ITTableCornerView *corner;
+}
+
+- (void)setCornerImage:(NSImage*)image;
+- (NSImage*)cornerImage;
+- (void)setCornerMenu:(NSMenu*)menu;
+- (NSMenu*)cornerMenu;
+
+@end
diff --git a/ITTableView.m b/ITTableView.m
new file mode 100755 (executable)
index 0000000..613a441
--- /dev/null
@@ -0,0 +1,48 @@
+//  ITTableView.m
+
+#import "ITTableView.h"
+
+
+@implementation ITTableView
+
+- (id)initWithFrame:(NSRect)frame {
+    self = [super initWithFrame:frame];
+    if (self) {
+        corner = [[ITTableCornerView alloc] initWithFrame:[[self cornerView] frame]];
+        [corner setPullsDown:YES];
+        [self setCornerView:corner];
+    }
+    return self;
+}
+
+- (id)initWithCoder:(NSCoder*)coder {
+    self = [super initWithCoder:coder];
+    if (self) {
+        corner = [[ITTableCornerView alloc] initWithFrame:[[self cornerView] frame]];
+        [corner setPullsDown:YES];
+        [self setCornerView:corner];
+    }
+    return self;
+}
+
+- (void)encodeWithCoder:(NSCoder*)coder {
+    [super encodeWithCoder:coder];
+}
+
+- (void)setCornerImage:(NSImage*)image {
+    [corner setImage:image];
+}
+
+- (NSImage*)cornerImage {
+    return [corner image];
+}
+
+- (void)setCornerMenu:(NSMenu*)menu {
+    [corner setMenu:menu];
+}
+
+- (NSMenu*)cornerMenu {
+    return [corner menu];
+}
+
+@end
diff --git a/ITTextField.h b/ITTextField.h
new file mode 100755 (executable)
index 0000000..ea3e8f3
--- /dev/null
@@ -0,0 +1,54 @@
+/*
+ *     ITKit
+ *  ITTextField
+ *    Allows shadows to be drawn under text.
+ *
+ *  Original Author : Matt Judy <mjudy@ithinksw.com>
+ *   Responsibility : Matt Judy <mjudy@ithinksw.com>
+ *   Responsibility : Joseph Spiros <joseph.spiros@ithinksw.com>
+ *
+ *  Copyright (c) 2002 - 2003 iThink Software.
+ *  All Rights Reserved
+ *
+ */
+
+#import <Cocoa/Cocoa.h>
+
+
+@interface ITTextField : NSTextField {
+
+    BOOL  castsShadow;
+    
+    float shadowElevation;
+    float shadowAzimuth;
+    float shadowAmbient;
+    float shadowHeight;
+    float shadowRadius;
+    float shadowSaturation;
+
+}
+
+- (BOOL)castsShadow;
+- (void)setCastsShadow:(BOOL)newSetting;
+
+- (float)shadowElevation;              /* Light source elevation in degrees.  Defaults to 45.0 */
+- (void)setShadowElevation:(float)newElevation;
+
+- (float)shadowAzimuth;                        /* Light source azimuth in degrees.  Defaults to 90.0 */
+- (void)setShadowAzimuth:(float)newAzimuth;
+
+- (float)shadowAmbient;                        /* Amount of ambient light.  Defaults to 0.15 */
+- (void)setShadowAmbient:(float)newAmbient;
+
+- (float)shadowHeight;                 /* Height above the canvas.  Defaults to 1.0 */
+- (void)setShadowHeight:(float)newHeight;
+
+- (float)shadowRadius;                 /* Blur radius.  Defaults to 4.0 */
+- (void)setShadowRadius:(float)newRadius;
+
+- (float)shadowSaturation;             /* Maximum saturation.  Defaults to 1.0 */
+- (void)setShadowSaturation:(float)newSaturation;
+
+
+@end
diff --git a/ITTextField.m b/ITTextField.m
new file mode 100755 (executable)
index 0000000..3ab85b7
--- /dev/null
@@ -0,0 +1,171 @@
+#import "ITTextField.h"
+#import <CoreGraphics/CoreGraphics.h>
+#import "ITCoreGraphicsHacks.h"
+
+
+/*************************************************************************/
+#pragma mark -
+#pragma mark IMPLEMENTATION
+/*************************************************************************/
+
+@implementation ITTextField
+
+/*************************************************************************/
+#pragma mark -
+#pragma mark INITIALIZATION METHODS
+/*************************************************************************/
+
+- (id)initWithFrame:(NSRect)frameRect
+{
+    if ( ( self = [super initWithFrame:frameRect] ) ) {
+        castsShadow      = NO;
+        shadowElevation  = 45.0;
+        shadowAzimuth    = 90.0;
+        shadowAmbient    = 0.15;
+        shadowHeight     = 1.00;
+        shadowRadius     = 4.00;
+        shadowSaturation = 1.0;
+    }
+
+    return self;
+}
+
+- (id)initWithCoder:(NSCoder *)coder
+{
+    if ( ( self = [super initWithCoder:coder] ) ) {
+        castsShadow      = NO;
+        shadowElevation  = 45.0;
+        shadowAzimuth    = 90.0;
+        shadowAmbient    = 0.15;
+        shadowHeight     = 1.00;
+        shadowRadius     = 4.00;
+        shadowSaturation = 1.0;
+    }
+    
+    return self;
+}
+
+
+/*************************************************************************/
+#pragma mark -
+#pragma mark DRAWING METHODS
+/*************************************************************************/
+
+- (void)drawRect:(NSRect)rect
+{
+    CGSGenericObj        style = nil;
+    CGShadowStyle        shadow;
+
+    if ( castsShadow ) { 
+        // Create the shadow style to use for drawing the string
+        shadow.version    = 0;
+        shadow.elevation  = shadowElevation;
+        shadow.azimuth    = shadowAzimuth;
+        shadow.ambient    = shadowAmbient;
+        shadow.height     = shadowHeight;
+        shadow.radius     = shadowRadius;
+        shadow.saturation = shadowSaturation;
+        style = CGStyleCreateShadow(&shadow);
+        
+        // Set the context for drawing the string
+        [NSGraphicsContext saveGraphicsState];
+        CGContextSetStyle([[NSGraphicsContext currentContext] graphicsPort], style);
+    }
+    
+    // Draw the string
+    [super drawRect:rect];
+    
+
+    if ( castsShadow ) { 
+        // Restore the old context
+        [NSGraphicsContext restoreGraphicsState];
+        CGStyleRelease(style);
+    }
+}
+
+
+
+/*************************************************************************/
+#pragma mark -
+#pragma mark ACCESSOR METHODS
+/*************************************************************************/
+
+- (BOOL)castsShadow;
+{
+    return castsShadow;
+}
+
+- (void)setCastsShadow:(BOOL)newSetting;
+{
+    castsShadow = newSetting;
+    [self setNeedsDisplay:YES];
+}
+
+- (float)shadowElevation;
+{
+    return shadowElevation;
+}
+
+- (void)setShadowElevation:(float)newElevation;
+{
+    shadowElevation = newElevation;
+    [self setNeedsDisplay:YES];
+}
+
+- (float)shadowAzimuth;
+{
+    return shadowAzimuth;
+}
+
+- (void)setShadowAzimuth:(float)newAzimuth;
+{
+    shadowAzimuth = newAzimuth;
+    [self setNeedsDisplay:YES];
+}
+
+- (float)shadowAmbient;
+{
+    return shadowAmbient;
+}
+
+- (void)setShadowAmbient:(float)newAmbient;
+{
+    shadowAmbient = newAmbient;
+    [self setNeedsDisplay:YES];
+}
+
+- (float)shadowHeight;
+{
+    return shadowHeight;
+}
+
+- (void)setShadowHeight:(float)newHeight;
+{
+    shadowHeight = newHeight;
+    [self setNeedsDisplay:YES];
+}
+
+- (float)shadowRadius;
+{
+    return shadowRadius;
+}
+
+- (void)setShadowRadius:(float)newRadius;
+{
+    shadowRadius = newRadius;
+    [self setNeedsDisplay:YES];
+}
+
+- (float)shadowSaturation;
+{
+    return shadowSaturation;
+}
+
+- (void)setShadowSaturation:(float)newSaturation;
+{
+    shadowSaturation = newSaturation;
+    [self setNeedsDisplay:YES];
+}
+
+
+@end
diff --git a/ITTransientStatusWindow.h b/ITTransientStatusWindow.h
new file mode 100755 (executable)
index 0000000..af6d277
--- /dev/null
@@ -0,0 +1,105 @@
+/*
+ *     ITKit
+ *  ITTransientStatusWindow
+ *    NSWindow subclass for quick display of status information.
+ *    Similar to volume/brightness/eject bezel key windows.
+ *
+ *  Original Author : Kent Sutherland <joseph.spiros@ithinksw.com>
+ *  Original Author : Matt Judy <mjudy@ithinksw.com>
+ *   Responsibility : Matt Judy <mjudy@ithinksw.com>
+ *   Responsibility : Joseph Spiros <joseph.spiros@ithinksw.com>
+ *
+ *  Copyright (c) 2002 - 2003 iThink Software.
+ *  All Rights Reserved
+ *
+ */
+
+
+#import <Cocoa/Cocoa.h>
+
+
+#define DEFAULT_EXIT_DELAY 3.0
+
+
+typedef enum {
+    ITTransientStatusWindowHiddenState,
+    ITTransientStatusWindowEnteringState,
+    ITTransientStatusWindowVisibleState,
+    ITTransientStatusWindowExitingState
+} ITTransientStatusWindowVisibilityState;
+
+typedef enum {
+    ITTransientStatusWindowExitOnOrderOut,
+    ITTransientStatusWindowExitAfterDelay,
+} ITTransientStatusWindowExitMode;
+
+typedef enum {
+    ITTransientStatusWindowNoBackground,
+    ITTransientStatusWindowRounded,
+    ITTransientStatusWindowSquare,
+    ITTransientStatusWindowMetal,
+    ITTransientStatusWindowMetalUtility,
+    ITTransientStatusWindowAquaUtility
+} ITTransientStatusWindowBackgroundType;
+
+typedef enum {
+    ITTransientStatusWindowPositionTop,
+    ITTransientStatusWindowPositionMiddle,
+    ITTransientStatusWindowPositionBottom,
+    ITTransientStatusWindowPositionLeft,
+    ITTransientStatusWindowPositionCenter,
+    ITTransientStatusWindowPositionRight,
+    ITTransientStatusWindowOther
+} ITTransientStatusWindowPosition;
+
+typedef enum {                                     // Note: Entry effects described here.  Exit does the reverse.
+    ITTransientStatusWindowEffectNone,             // No effect, window just appears.
+    ITTransientStatusWindowEffectDissolve,         // Fades in.
+    ITTransientStatusWindowEffectSlideVertically,  // Slides vertically onto the screen from the nearest edge
+    ITTransientStatusWindowEffectSlideHorizontally // Slides horizontally onto the screen from the nearest edge
+} ITTransientStatusWindowEffect;
+
+
+@interface ITTransientStatusWindow : NSWindow {
+
+    ITTransientStatusWindowVisibilityState  _visibilityState;
+    ITTransientStatusWindowExitMode         _exitMode;
+    float                                   _exitDelay;
+    ITTransientStatusWindowBackgroundType   _backgroundType;
+    ITTransientStatusWindowEffect                      _entryEffect;
+    ITTransientStatusWindowEffect           _exitEffect;
+    ITTransientStatusWindowPosition                    _verticalPosition;
+    ITTransientStatusWindowPosition                    _horizontalPosition;
+    
+    NSTimer *_delayTimer;
+    NSTimer *_fadeTimer;
+
+//  NSView *_contentSubView;           
+}
+
++ (ITTransientStatusWindow *)sharedWindow;
+
+- (ITTransientStatusWindowVisibilityState)visibilityState;
+
+- (ITTransientStatusWindowExitMode)exitMode;
+- (void)setExitMode:(ITTransientStatusWindowExitMode)newMode;
+
+- (float)exitDelay;
+- (void)setExitDelay:(float)seconds;
+
+- (ITTransientStatusWindowBackgroundType)backgroundType;
+- (void)setBackgroundType:(ITTransientStatusWindowBackgroundType)newType;
+
+- (ITTransientStatusWindowPosition)verticalPosition;
+- (void)setVerticalPosition:(ITTransientStatusWindowPosition)newPosition;
+
+- (ITTransientStatusWindowPosition)horizontalPosition;
+- (void)setHorizontalPosition:(ITTransientStatusWindowPosition)newPosition;
+
+- (ITTransientStatusWindowEffect)entryEffect;
+- (void)setEntryEffect:(ITTransientStatusWindowEffect)newEffect;
+
+- (ITTransientStatusWindowEffect)exitEffect;
+- (void)setExitEffect:(ITTransientStatusWindowEffect)newEffect;
+
+@end
diff --git a/ITTransientStatusWindow.m b/ITTransientStatusWindow.m
new file mode 100755 (executable)
index 0000000..4182d57
--- /dev/null
@@ -0,0 +1,332 @@
+#import "ITTransientStatusWindow.h"
+#import <CoreGraphics/CoreGraphics.h>
+#import "ITCoreGraphicsHacks.h"
+#import "ITTextField.h"
+#import "ITGrayRoundedView.h"
+
+
+/*************************************************************************/
+#pragma mark -
+#pragma mark EVIL HACKERY
+/*************************************************************************/
+
+@interface NSApplication (HACKHACKHACKHACK)
+- (CGSConnectionID)contextID;
+@end
+
+
+/*************************************************************************/
+#pragma mark -
+#pragma mark PRIVATE METHOD DECLARATIONS
+/*************************************************************************/
+
+@interface ITTransientStatusWindow (Private)
+- (id)initWithContentView:(NSView *)contentView
+                 exitMode:(ITTransientStatusWindowExitMode)exitMode
+           backgroundType:(ITTransientStatusWindowBackgroundType)backgroundType;
+- (void)rebuildWindow;
+- (void)performEffect;
+- (void)dissolveEffect:(BOOL)entering;
+- (void)slideVerticalEffect:(BOOL)entering;
+- (void)slideHorizontalEffect:(BOOL)entering;
+@end
+
+
+/*************************************************************************/
+#pragma mark -
+#pragma mark IMPLEMENTATION
+/*************************************************************************/
+
+@implementation ITTransientStatusWindow
+
+
+/*************************************************************************/
+#pragma mark -
+#pragma mark SHARED STATIC OBJECTS
+/*************************************************************************/
+
+static ITTransientStatusWindow *staticWindow = nil;
+
+
+/*************************************************************************/
+#pragma mark -
+#pragma mark INITIALIZATION METHODS
+/*************************************************************************/
+
++ (ITTransientStatusWindow *)sharedWindow
+{
+    if ( ! (staticWindow) ) {
+        staticWindow = [[self alloc] initWithContentView:nil
+                                                exitMode:ITTransientStatusWindowExitAfterDelay
+                                          backgroundType:ITTransientStatusWindowRounded];
+    }
+    return staticWindow;
+}
+
+- (id)initWithContentView:(NSView *)contentView
+                 exitMode:(ITTransientStatusWindowExitMode)exitMode
+           backgroundType:(ITTransientStatusWindowBackgroundType)backgroundType
+{
+    NSRect contentRect;
+    
+    CGSValueObj         key;
+    CGSValueObj         ignore;
+
+    // If no Content View was provided, use a generic NSImageView with the app icon.
+    if ( ! (contentView) ) {
+        contentView = [[[NSView alloc] initWithFrame:
+            NSMakeRect(100.0, 100.0, 200.0, 200.0)] autorelease];
+    }
+    
+    // Set the content rect to the frame of the content view, now guaranteed to exist.
+    contentRect = [contentView frame];
+    
+    if ( ( self = [super initWithContentRect:contentRect
+                                   styleMask:NSBorderlessWindowMask
+                                     backing:NSBackingStoreBuffered
+                                       defer:NO] ) ) {
+                                    
+        _visibilityState    = ITTransientStatusWindowHiddenState;
+        _exitMode           = exitMode;
+        _exitDelay          = DEFAULT_EXIT_DELAY;
+        _backgroundType     = backgroundType;
+        _verticalPosition   = ITTransientStatusWindowPositionBottom;
+        _horizontalPosition = ITTransientStatusWindowPositionLeft;
+        _entryEffect        = ITTransientStatusWindowEffectNone;
+        _exitEffect         = ITTransientStatusWindowEffectDissolve;
+        
+        _delayTimer = nil;
+        _fadeTimer  = nil;
+
+//        if ( _backgroundType == ITTransientStatusWindowRounded ) {
+//            _contentSubView = contentView;
+//        } else {
+//            [self setContentView:contentView];
+//        }
+
+//      [self setIgnoresMouseEvents:YES];
+
+        key = CGSCreateCString("IgnoreForEvents");
+        ignore = CGSCreateBoolean(kCGSTrue);
+        
+        CGSSetWindowProperty([NSApp contextID], (CGSWindowID)[self windowNumber], key, ignore);
+
+        CGSReleaseObj(key);
+        CGSReleaseObj(ignore);
+        
+        [self setLevel:NSScreenSaverWindowLevel];
+        [self setContentView:contentView];
+        [self rebuildWindow];
+    }
+    return self;
+}
+
+
+/*************************************************************************/
+#pragma mark -
+#pragma mark INSTANCE METHODS
+/*************************************************************************/
+
+- (void)orderFront:(id)sender
+{
+    if ( _exitMode = ITTransientStatusWindowExitAfterDelay ) {
+        // set the timer, and orderOut: when it lapses.
+    }
+
+    if ( _entryEffect == ITTransientStatusWindowEffectNone ) {
+        [super orderFront:sender];
+    } else {
+        [self performEffect];
+    }
+}
+
+- (void)makeKeyAndOrderFront:(id)sender
+{
+    if ( _exitMode = ITTransientStatusWindowExitAfterDelay ) {
+        // set the timer, and orderOut: when it lapses.
+    }
+
+    if ( _entryEffect == ITTransientStatusWindowEffectNone ) {
+        [super makeKeyAndOrderFront:sender];
+    } else {
+        [self performEffect];
+        [self makeKeyWindow];
+    }
+}
+
+- (void)orderOut:(id)sender
+{
+    if ( _entryEffect == ITTransientStatusWindowEffectNone ) {
+        [super orderOut:sender];
+    } else {
+        [self performEffect];
+    }
+}
+
+/*
+
+- (id)contentView
+{
+    if ( _backgroundType == ITTransientStatusWindowRounded ) {
+        return _contentSubView;
+    } else {
+        return [super contentView];
+    }
+}
+
+- (void)setContentView:(NSView *)aView
+{
+    if ( _backgroundType == ITTransientStatusWindowRounded ) {
+       [_contentSubView removeFromSuperview];
+        _contentSubView = aView;
+        [_contentSubView setFrame:[[super contentView] frame]];
+        [[super contentView] addSubview:_contentSubView];
+        [_contentSubView setNextResponder:self];
+    } else {
+        [super setContentView:aView];
+    }
+}
+
+*/
+
+- (ITTransientStatusWindowVisibilityState)visibilityState
+{
+    return _visibilityState;
+}
+
+- (ITTransientStatusWindowExitMode)ExitMode
+{
+    return _exitMode;
+}
+
+- (void)setExitMode:(ITTransientStatusWindowExitMode)newMode
+{
+    _exitMode = newMode;
+}
+
+- (float)exitDelay
+{
+    return _exitDelay;
+}
+
+- (void)setExitDelay:(float)seconds
+{
+    _exitDelay = seconds;
+}
+
+- (ITTransientStatusWindowBackgroundType)backgroundType
+{
+//  return _backgroundType;
+    return ITTransientStatusWindowRounded;
+}
+
+- (void)setBackgroundType:(ITTransientStatusWindowBackgroundType)newType
+{
+//  setBackgroundType: is currently ignored.  Defaults to ITTransientStatusWindowRounded.
+//  _backgroundType = newType;
+    _backgroundType = ITTransientStatusWindowRounded;
+}
+
+- (ITTransientStatusWindowPosition)verticalPosition;
+{
+    return _verticalPosition;
+}
+
+- (void)setVerticalPosition:(ITTransientStatusWindowPosition)newPosition;
+{
+    _verticalPosition = newPosition;
+}
+
+- (ITTransientStatusWindowPosition)horizontalPosition;
+{
+    return _horizontalPosition;
+}
+
+- (void)setHorizontalPosition:(ITTransientStatusWindowPosition)newPosition;
+{
+    _horizontalPosition = newPosition;
+}
+
+- (ITTransientStatusWindowEffect)entryEffect
+{
+    return _entryEffect;
+}
+
+- (void)setEntryEffect:(ITTransientStatusWindowEffect)newEffect;
+{
+    _entryEffect = newEffect;
+}
+
+- (ITTransientStatusWindowEffect)exitEffect;
+{
+    return _exitEffect;
+}
+
+- (void)setExitEffect:(ITTransientStatusWindowEffect)newEffect;
+{
+    _exitEffect = newEffect;
+}
+
+
+/*************************************************************************/
+#pragma mark -
+#pragma mark PRIVATE METHODS
+/*************************************************************************/
+
+- (void)rebuildWindow;
+{
+    if ( _backgroundType == ITTransientStatusWindowRounded ) {
+        ITGrayRoundedView *roundedView = [[[ITGrayRoundedView alloc] initWithFrame:[self frame]] autorelease];
+
+        [self setBackgroundColor:[NSColor clearColor]];
+        [self setHasShadow:NO];
+        [self setOpaque:NO];
+        
+        [self setContentView:roundedView];
+//      [super setContentView:roundedView];
+//      [_contentSubView setAutoresizingMask:(NSViewWidthSizable | NSViewHeightSizable)];
+//      [self setContentView:_contentSubView];
+    } else {
+        // YUO == CLWONBAOT
+    }
+}
+
+- (void)performEffect
+{
+    if ( _visibilityState == ITTransientStatusWindowHiddenState ) {
+        if ( _entryEffect == ITTransientStatusWindowEffectDissolve ) {
+            [self dissolveEffect:YES];
+        } else if ( _entryEffect == ITTransientStatusWindowEffectSlideVertically ) {
+            [self slideEffect:YES];
+        } else if ( _entryEffect == ITTransientStatusWindowEffectSlideHorizontally ) {
+            [self slideEffect:YES];
+        }
+    } else if ( _visibilityState == ITTransientStatusWindowVisibleState ) {
+        if ( _exitEffect == ITTransientStatusWindowEffectDissolve ) {
+            [self dissolveEffect:NO];
+        } else if ( _exitEffect == ITTransientStatusWindowEffectSlideVertically ) {
+            [self slideEffect:NO];
+        } else if ( _exitEffect == ITTransientStatusWindowEffectSlideHorizontally ) {
+            [self slideEffect:NO];
+        }
+    }
+}
+
+- (void)dissolveEffect:(BOOL)entering
+{
+    
+    [super orderFront:self];
+}
+
+- (void)slideVerticalEffect:(BOOL)entering
+{
+    [super orderFront:self];
+}
+
+- (void)slideHorizontalEffect:(BOOL)entering
+{
+    [super orderFront:self];
+}
+
+
+@end