#import "Controller.h" #import "ITTransientStatusWindow.h" #import "ITTextField.h" #define SW_PAD 24.0 #define SW_SPACE 24.0 #define SW_MINW 211.0 #define SW_BORDER 32.0 #define SW_IMAGE @"Library" @interface Controller (ITStatusItemSupport) - (void)createStatusItem; - (void)removeStatusItem; @end @implementation Controller - (void)awakeFromNib { [self createStatusItem]; [testTextField setCastsShadow:YES]; statusWindow = [ITTransientStatusWindow sharedWindow]; // [tabView setAllowsDragging:YES]; } /*************************************************************************/ #pragma mark - #pragma mark ITStatusItem SUPPORT /*************************************************************************/ - (void)createStatusItem { statusItem = [[ITStatusItem alloc] initWithStatusBar:[NSStatusBar systemStatusBar] withLength:NSVariableStatusItemLength]; if ( [showImageCheckBox state] == NSOnState ) { [statusItem setImage:[NSImage imageNamed:@"ITStatusItem"]]; } if ( [useInvertedCheckBox state] == NSOnState ) { [statusItem setAlternateImage:[NSImage imageNamed:@"ITStatusItemInv"]]; } if ( [showTitleCheckBox state] == NSOnState ) { [statusItem setTitle:@"ITStatusItem"]; } [statusItem setMenu:statusItemMenu]; } - (void)removeStatusItem { [[statusItem statusBar] removeStatusItem:statusItem]; [statusItem autorelease]; statusItem = nil; } - (IBAction)toggleStatusItem:(id)sender { if ( [sender state] == NSOnState ) { [self createStatusItem]; [showImageCheckBox setEnabled:YES]; [showTitleCheckBox setEnabled:YES]; [useInvertedCheckBox setEnabled:YES]; } else { [self removeStatusItem]; [showImageCheckBox setEnabled:NO]; [useInvertedCheckBox setEnabled:NO]; [showTitleCheckBox setEnabled:NO]; } } - (IBAction)toggleImage:(id)sender { if ( [sender state] == NSOnState ) { [statusItem setImage:[NSImage imageNamed:@"ITStatusItem"]]; [statusItem setAlternateImage:[NSImage imageNamed:@"ITStatusItemInv"]]; [useInvertedCheckBox setEnabled:YES]; [useInvertedCheckBox setState:NSOnState]; } else { [statusItem setImage:nil]; [statusItem setAlternateImage:nil]; [useInvertedCheckBox setEnabled:NO]; [useInvertedCheckBox setState:NSOffState]; } } - (IBAction)toggleInvertedImage:(id)sender { if ( [sender state] == NSOnState ) { [statusItem setAlternateImage:[NSImage imageNamed:@"ITStatusItemInv"]]; } else { [statusItem setAlternateImage:nil]; } } - (IBAction)toggleTitle:(id)sender { if ( [sender state] == NSOnState ) { [statusItem setTitle:@"ITStatusItem"]; } else { [statusItem setTitle:nil]; } } /*************************************************************************/ #pragma mark - #pragma mark ITTextView SUPPORT /*************************************************************************/ - (IBAction)toggleCastsShadow:(id)sender { [testTextField setCastsShadow:([sender state] == NSOnState)]; } /*************************************************************************/ #pragma mark - #pragma mark ITTransientStatusWindow SUPPORT /*************************************************************************/ - (IBAction)buildStatusWindow:(id)sender { NSImageView *imageView = nil; ITTextField *textField = nil; NSImage *image = [NSImage imageNamed:SW_IMAGE]; NSRect imageRect; NSRect textRect; float imageWidth = 0.0; float imageHeight = 0.0; float textWidth = 0.0; float textHeight = 0.0; float contentHeight = 0.0; float windowWidth = 0.0; float windowHeight = 0.0; NSString *text = [swSampleTextView string]; 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; // 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 textHeight += [oneLine sizeWithAttributes:attr].height; // If this line wider than the last one, set it as the text width. textWidth = ( ( textWidth > oneLineWidth ) ? textWidth : oneLineWidth ); } // Add 4.0 to the final textHeight to accomodate the shadow. textHeight += 4.0; // Set the content height to the greater of the text and image heights. contentHeight = ( ( imageHeight > textHeight ) ? imageHeight : textHeight ); // Setup the Window, and remove all its contentview's subviews. windowWidth = ( SW_PAD + imageWidth + SW_SPACE + textWidth + SW_PAD ); windowHeight = ( SW_PAD + contentHeight + SW_PAD ); [statusWindow setFrame:NSMakeRect(SW_BORDER, SW_BORDER, windowWidth, windowHeight) display:YES]; [[[statusWindow 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]; [[statusWindow contentView] addSubview:imageView]; // Setup, position, fill, and add the text view to the content view. textRect = NSMakeRect( (SW_PAD + imageWidth + SW_SPACE), (SW_PAD + ((contentHeight - textHeight) / 2)), textWidth, textHeight); textField = [[[ITTextField alloc] initWithFrame:textRect] autorelease]; [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]; [[statusWindow contentView] addSubview:textField]; [[statusWindow contentView] setNeedsDisplay:YES]; } /* - (IBAction)foo:(id)sender { maxLineHeight = ( ( maxLineHeight > [cdImage size].height ) ? maxLineHeight : [cdImage size].height ); totalWidth = ( ITTSWPADDING + [cdImage size].width + ITTSWSPACING + maxLineWidth + ITTSWPADDING ); totalHeight = ( ITTSWPADDING + maxLineHeight + ITTSWPADDING ); totalWidth = ( ( totalWidth > ITTSWMINW ) ? totalWidth : ITTSWMINW ); [statusWindow setFrame:NSMakeRect(72.0, 72.0, totalWidth, totalHeight) display:YES]; textField = [[[ITTextField alloc] initWithFrame: NSMakeRect((24.0 + [cdImage size].width + 32.0), 24.0, maxLineWidth, maxLineHeight)] autorelease]; [[statusWindow contentView] addSubview:textField]; [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]; [[statusWindow contentView] lockFocus]; [cdImage compositeToPoint:NSMakePoint(ITTSWPADDING, ( ITTSWPADDING + ((maxLineHeight - [cdImage size].height) / ITTSWPADDING)) ) operation:NSCompositeSourceOver]; [[statusWindow contentView] unlockFocus]; } */ - (IBAction)showStatusWindow:(id)sender { // [[statusWindow contentView] setNeedsDisplay:YES]; [statusWindow setFrame:NSMakeRect( (0.0 - NSWidth([statusWindow frame])), SW_BORDER, NSWidth([statusWindow frame]), NSHeight([statusWindow frame]) ) display:YES]; [statusWindow orderFront:self]; [statusWindow setFrame:NSMakeRect( SW_BORDER, SW_BORDER, NSWidth([statusWindow frame]), NSHeight([statusWindow frame]) ) display:YES animate:YES]; } - (IBAction)hideStatusWindow:(id)sender { [statusWindow orderOut:self]; } /*************************************************************************/ #pragma mark - #pragma mark NSWindow DELEGATE METHODS /*************************************************************************/ - (void)windowWillMiniaturize:(NSNotification *)note { [[note object] setMiniwindowImage:[NSImage imageNamed:@"ITStatusItem"]]; } @end