+//
+// StatusWindow.m
+// MenuTunes
+//
+// Created by Matt L. Judy on Sat Feb 22 2003.
+// Copyright (c) 2003 NibFile.com. All rights reserved.
+//
+
#import "StatusWindow.h"
+
+@interface StatusWindow (Private)
+- (void)buildStatusWindow;
+@end
+
+
@implementation StatusWindow
-- (id)initWithContentRect:(NSRect)rect styleMask:(unsigned int)mask backing:(NSBackingStoreType)type defer:(BOOL)flag
+- (id)initWithContentView:(NSView *)contentView
+ exitMode:(ITTransientStatusWindowExitMode)exitMode
+ backgroundType:(ITTransientStatusWindowBackgroundType)backgroundType
{
- if ( (self = [super initWithContentRect:rect styleMask:NSBorderlessWindowMask backing:type defer:flag]) )
- {
- [self setHasShadow:NO];
- [self setOpaque:NO];
- [self setLevel:NSStatusWindowLevel];
- [self setIgnoresMouseEvents:YES];
- [self setBackgroundColor:[NSColor colorWithCalibratedRed:0.5 green:0.5 blue:0.5 alpha:0.6]];
+ if ( ( self = [super initWithContentView:contentView
+ exitMode:exitMode
+ backgroundType:backgroundType]) ) {
+ // Set default values.
+ windowMode = StatusWindowTextMode;
+ image = [NSImage imageNamed:@"NSApplicationIcon"];
+ text = @"No string set yet.";
+ volumeLevel = 0.0;
+
+ [self buildStatusWindow];
}
+
return self;
}
+- (void)buildStatusWindow
+{
+ NSRect imageRect;
+ NSRect dataRect;
+ float imageWidth = 0.0;
+ float imageHeight = 0.0;
+ float dataWidth = 0.0;
+ float dataHeight = 0.0;
+ float contentHeight = 0.0;
+ float windowWidth = 0.0;
+ float windowHeight = 0.0;
+ NSArray *lines = [text componentsSeparatedByString:@"\n"];
+ id oneLine = nil;
+ NSEnumerator *lineEnum = [lines objectEnumerator];
+ NSFont *font = [NSFont fontWithName:@"Lucida Grande Bold" size:18];
+ NSDictionary *attr = [NSDictionary dictionaryWithObject:font forKey:NSFontAttributeName];
+
+ // Get image width and height.
+ imageWidth = [image size].width;
+ imageHeight = [image size].height;
+
+ if ( windowMode == StatusWindowTextMode ) {
+ // Iterate over each line to get text width and height
+ while ( (oneLine = [lineEnum nextObject]) ) {
+ // Get the width of one line, adding 8.0 because Apple sucks donkey rectum.
+ float oneLineWidth = ( [oneLine sizeWithAttributes:attr].width + 8.0 );
+ // Add the height of this line to the total text height
+ dataHeight += [oneLine sizeWithAttributes:attr].height;
+ // If this line wider than the last one, set it as the text width.
+ dataWidth = ( ( dataWidth > oneLineWidth ) ? dataWidth : oneLineWidth );
+ }
+
+ // Add 4.0 to the final dataHeight to accomodate the shadow.
+ dataHeight += 4.0;
+ } else {
+ dataHeight = 24.0;
+ dataWidth = 200.0;
+ }
+
+ // Set the content height to the greater of the text and image heights.
+ contentHeight = ( ( imageHeight > dataHeight ) ? imageHeight : dataHeight );
+
+ // Setup the Window, and remove all its contentview's subviews.
+ windowWidth = ( SW_PAD + imageWidth + SW_SPACE + dataWidth + SW_PAD );
+ windowHeight = ( SW_PAD + contentHeight + SW_PAD );
+ [self setFrame:NSMakeRect(SW_BORDER, SW_BORDER, windowWidth, windowHeight) display:YES];
+ [[[self contentView] subviews] makeObjectsPerformSelector:@selector(removeFromSuperview)];
+
+ // Setup, position, fill, and add the image view to the content view.
+ imageRect = NSMakeRect( SW_PAD,
+ (SW_PAD + ((contentHeight - imageHeight) / 2)),
+ imageWidth,
+ imageHeight );
+ imageView = [[[NSImageView alloc] initWithFrame:imageRect] autorelease];
+ [imageView setImage:image];
+ [[self contentView] addSubview:imageView];
+
+ dataRect = NSMakeRect( (SW_PAD + imageWidth + SW_SPACE),
+ (SW_PAD + ((contentHeight - dataHeight) / 2)),
+ dataWidth,
+ dataHeight);
+
+ if ( windowMode == StatusWindowTextMode ) {
+
+ // Setup, position, fill, and add the text view to the content view.
+ textField = [[[ITTextField alloc] initWithFrame:dataRect] autorelease];
+ [textField setEditable:NO];
+ [textField setSelectable:NO];
+ [textField setBordered:NO];
+ [textField setDrawsBackground:NO];
+ [textField setFont:[NSFont fontWithName:@"Lucida Grande Bold" size:18]];
+ [textField setTextColor:[NSColor whiteColor]];
+ [textField setCastsShadow:YES];
+ [textField setStringValue:text];
+ [[self contentView] addSubview:textField];
+
+ } else if ( windowMode == StatusWindowVolumeMode ) {
+
+ NSEnumerator *cellEnum;
+ id aCell;
+ int lights = ( ceil(volumeLevel * 100) / 10 );
+ int lightCount = 0;
+
+ volMatrix = [[[NSMatrix alloc] initWithFrame:dataRect
+ mode:NSHighlightModeMatrix
+ cellClass:NSClassFromString(@"ITTextFieldCell")
+ numberOfRows:1
+ numberOfColumns:10] autorelease];
+
+ [volMatrix setCellSize:NSMakeSize(20, 24)];
+ [volMatrix setIntercellSpacing:NSMakeSize(0, 0)];
+
+ cellEnum = [[volMatrix cells] objectEnumerator];
+
+ while ( (aCell = [cellEnum nextObject]) ) {
+ [aCell setEditable:NO];
+ [aCell setSelectable:NO];
+ [aCell setBordered:NO];
+ [aCell setDrawsBackground:NO];
+ [aCell setFont:[NSFont fontWithName:@"Lucida Grande Bold" size:18]];
+ [aCell setStringValue:[NSString stringWithUTF8String:"▊"]];
+
+ lightCount ++;
+
+ // NSLog(@"%f, %i, %i", volumeLevel, lights, lightCount);
+
+ if ( lights >= lightCount ) {
+ [aCell setCastsShadow:YES];
+ [aCell setTextColor:[NSColor whiteColor]];
+ } else {
+ [aCell setCastsShadow:NO];
+ [aCell setTextColor:[NSColor darkGrayColor]];
+ }
+
+ }
+
+ [[self contentView] addSubview:volMatrix];
+ }
+
+ [[self contentView] setNeedsDisplay:YES];
+}
+
+- (void)setImage:(NSImage *)newImage
+{
+ [image autorelease];
+ image = [newImage copy];
+ [self buildStatusWindow];
+}
+
+- (void)setText:(NSString *)newText
+{
+ [text autorelease];
+ text = [newText copy];
+ windowMode = StatusWindowTextMode;
+ [self buildStatusWindow];
+}
+
+- (void)setVolume:(float)level
+{
+ volumeLevel = level;
+ windowMode = StatusWindowVolumeMode;
+ [self buildStatusWindow];
+}
+
@end