/* ** PTYTabViewItem.m ** ** Copyright (c) 2002, 2003 ** ** Author: Ujwal S. Setlur ** ** Project: iTerm ** ** Description: NSTabViewItem subclass. Implements attributes for label. ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #import #import #define DEBUG_ALLOC 0 #define DEBUG_METHOD_TRACE 0 @implementation PTYTabViewItem - (id) initWithIdentifier: (id) anIdentifier { #if DEBUG_ALLOC NSLog(@"%s: 0x%x", __PRETTY_FUNCTION__, self); #endif dragTarget = NO; return([super initWithIdentifier: anIdentifier]); } - (void) dealloc { #if DEBUG_ALLOC NSLog(@"%s: 0x%x", __PRETTY_FUNCTION__, self); #endif [warningImage release]; [labelAttributes release]; labelAttributes = nil; [super dealloc]; } // Override this to be able to customize the label attributes - (void)drawLabel:(BOOL)shouldTruncateLabel inRect:(NSRect)tabRect { NSString *imagePath; NSBundle *thisBundle = [NSBundle bundleForClass: [self class]]; #if DEBUG_METHOD_TRACE NSLog(@"PTYTabViewItem: -drawLabel(bell=%@)",bell?@"YES":@"NO"); #endif if(labelAttributes != nil) { NSMutableParagraphStyle *pstyle = [[[NSMutableParagraphStyle alloc] init] autorelease]; [pstyle setLineBreakMode:NSLineBreakByTruncatingMiddle]; NSMutableAttributedString * attributedLabel = [[[NSMutableAttributedString alloc] initWithString: [NSString stringWithFormat: @"%d: %@", [[self tabView] indexOfTabViewItem: self] + 1, [self label]] attributes: labelAttributes] autorelease]; // If we are a current drag target, add foreground and background colors if(dragTarget) { [attributedLabel addAttribute: NSForegroundColorAttributeName value: [NSColor greenColor] range: NSMakeRange(0, [attributedLabel length])]; [attributedLabel addAttribute: NSBackgroundColorAttributeName value: [NSColor blackColor] range: NSMakeRange(0, [attributedLabel length])]; } [attributedLabel addAttribute:NSParagraphStyleAttributeName value:pstyle range:NSMakeRange(0, [attributedLabel length])]; if (bell) { int tabViewType = [[self tabView] tabViewType]; if(tabViewType == NSTopTabsBezelBorder || tabViewType == NSBottomTabsBezelBorder) { if(warningImage == nil) { imagePath = [thisBundle pathForResource:@"important" ofType:@"png"]; warningImage = [[NSImage alloc] initByReferencingFile: imagePath]; } [warningImage compositeToPoint:NSMakePoint(tabRect.origin.x,tabRect.origin.y+16) operation:NSCompositeSourceOver]; tabRect.origin.x+=18; tabRect.size.width-=18; } else if(tabViewType == NSRightTabsBezelBorder) { if(warningImage == nil) { imagePath = [thisBundle pathForResource:@"important_r" ofType:@"png"]; warningImage = [[NSImage alloc] initByReferencingFile: imagePath]; } [warningImage compositeToPoint:NSMakePoint(tabRect.origin.x + 12,tabRect.origin.y + 15) operation:NSCompositeSourceOver]; tabRect.origin.x+=14; tabRect.size.width-=14; } else if(tabViewType == NSLeftTabsBezelBorder) { if(warningImage == nil) { imagePath = [thisBundle pathForResource:@"important_l" ofType:@"png"]; warningImage = [[NSImage alloc] initByReferencingFile: imagePath]; } [warningImage compositeToPoint:NSMakePoint(tabRect.origin.x - 3,tabRect.origin.y) operation:NSCompositeSourceOver]; tabRect.origin.x+=15; tabRect.size.width-=15; } [attributedLabel drawInRect: tabRect]; } else [attributedLabel drawInRect: tabRect]; } else { // No attributed label, so just call the parent method. [super drawLabel: shouldTruncateLabel inRect: tabRect]; } } - (NSSize) sizeOfLabel:(BOOL)shouldTruncateLabel { NSSize aSize; NSMutableAttributedString *attributedLabel; #if DEBUG_METHOD_TRACE NSLog(@"PTYTabViewItem: -sizeOfLabel"); #endif if(labelAttributes != nil) { attributedLabel = [[[NSMutableAttributedString alloc] initWithString: [NSString stringWithFormat: @"%d: %@", [[self tabView] indexOfTabViewItem: self] + 1, [self label]] attributes: labelAttributes] autorelease]; // If we are a current drag target, add foreground and background colors if(dragTarget) { [attributedLabel addAttribute: NSForegroundColorAttributeName value: [NSColor greenColor] range: NSMakeRange(0, [attributedLabel length])]; [attributedLabel addAttribute: NSBackgroundColorAttributeName value: [NSColor blackColor] range: NSMakeRange(0, [attributedLabel length])]; } aSize = [attributedLabel size]; if (bell) aSize.width+=18; } else aSize = [super sizeOfLabel: shouldTruncateLabel]; if (aSize.width > [((PTYTabView*)[self tabView]) maxLabelSize]) aSize.width = [((PTYTabView*)[self tabView]) maxLabelSize]; return (aSize); } // set/get custom label - (NSDictionary *) labelAttributes { return (labelAttributes); } - (void) setLabelAttributes: (NSDictionary *) theLabelAttributes { #if DEBUG_METHOD_TRACE NSLog(@"PTYTabViewItem: -setLabelAttributes"); #endif // Do this only if there is a change if([labelAttributes isEqualToDictionary: theLabelAttributes]) return; [labelAttributes release]; labelAttributes = [theLabelAttributes retain]; bell=NO; // redraw the label [self setLabel: [[[self label] copy] autorelease]]; } // Called when when another tab is being dragged over this one - (void) becomeDragTarget { dragTarget = YES; // redraw the label [self setLabel: [[[self label] copy] autorelease]]; } // Called when another tab is moved away from this one - (void) resignDragTarget { dragTarget = NO; // redraw the label [self setLabel: [[[self label] copy] autorelease]]; } - (void) setBell:(BOOL)b { // do this only if there is a change if(bell == b) return; bell=b; // redraw the label [self setLabel: [[[self label] copy] autorelease]]; } @end