BWToolkit copy / BWTransparentCheckboxCell.m

//
//  BWTransparentCheckboxCell.m
//  BWToolkit
//
//  Created by Brandon Walkin (www.brandonwalkin.com)
//  All code is provided under the New BSD license.
//

#import "BWTransparentCheckboxCell.h"
#import "BWTransparentTableView.h"
#import "NSApplication+BWAdditions.h"

static NSImage *checkboxOffN, *checkboxOffP, *checkboxOnN, *checkboxOnP;

@implementation BWTransparentCheckboxCell

+ (void)initialize;
{
	NSBundle *bundle = [NSBundle bundleForClass:[BWTransparentCheckboxCell class]];
	
	checkboxOffN = [[NSImage alloc] initWithContentsOfFile:[bundle pathForImageResource:@"TransparentCheckboxOffN.tiff"]];
	checkboxOffP = [[NSImage alloc] initWithContentsOfFile:[bundle pathForImageResource:@"TransparentCheckboxOffP.tiff"]];
	checkboxOnN = [[NSImage alloc] initWithContentsOfFile:[bundle pathForImageResource:@"TransparentCheckboxOnN.tiff"]];
	checkboxOnP = [[NSImage alloc] initWithContentsOfFile:[bundle pathForImageResource:@"TransparentCheckboxOnP.tiff"]];
	
	[checkboxOffN setFlipped:YES];
	[checkboxOffP setFlipped:YES];
	[checkboxOnN setFlipped:YES];
	[checkboxOnP setFlipped:YES];
}

- (NSRect)drawTitle:(NSAttributedString *)title withFrame:(NSRect)frame inView:(NSView *)controlView
{
	if ([[self controlView] isMemberOfClass:[BWTransparentTableView class]])
	{
		frame.origin.x += 4;
		return [super drawTitle:title withFrame:frame inView:controlView];
	}
	
	return [super drawTitle:title withFrame:frame inView:controlView];
}

- (void)drawImage:(NSImage*)image withFrame:(NSRect)frame inView:(NSView*)controlView
{
	if ([[self controlView] isMemberOfClass:[BWTransparentTableView class]])
		frame.origin.x += 4;
	
	CGFloat y = NSMaxY(frame) - (frame.size.height - checkboxOffN.size.height) / 2.0 - 15;
	CGFloat x = frame.origin.x + 1;
	NSPoint point = NSMakePoint(x, roundf(y));
	
	CGFloat alpha = 1.0;
	
	if (![self isEnabled])
		alpha = 0.6;
	
	if ([self isHighlighted] && [self intValue])
		[checkboxOnP drawAtPoint:point fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:alpha];
	else if (![self isHighlighted] && [self intValue])
		[checkboxOnN drawAtPoint:point fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:alpha];
	else if (![self isHighlighted] && ![self intValue])
		[checkboxOffN drawAtPoint:point fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:alpha];
	else if ([self isHighlighted] && ![self intValue])
		[checkboxOffP drawAtPoint:point fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:alpha];

	if (![[self title] isEqualToString:@""])
	{
		// Style the text differently if the cell is in a table view
		if ([[self controlView] isMemberOfClass:[BWTransparentTableView class]])
		{
			NSColor *textColor;
			
			// Make the text white if the row is selected
			if ([self backgroundStyle] != 1)
				textColor = [NSColor colorWithCalibratedWhite:(198.0f / 255.0f) alpha:1];
			else
				textColor = [NSColor whiteColor];
			
			NSMutableDictionary *attributes = [[[NSMutableDictionary alloc] init] autorelease];
			[attributes addEntriesFromDictionary:[[self attributedTitle] attributesAtIndex:0 effectiveRange:NULL]];
			[attributes setObject:textColor forKey:NSForegroundColorAttributeName];
			[attributes setObject:[NSFont systemFontOfSize:11] forKey:NSFontAttributeName];
			
			NSMutableAttributedString *string = [[[NSMutableAttributedString alloc] initWithString:[self title] attributes:attributes] autorelease];
			[self setAttributedTitle:string];			
		}
		else
		{
			NSColor *textColor;
			if ([self isEnabled])
				textColor = [NSColor whiteColor];
			else
				textColor = [NSColor colorWithCalibratedWhite:0.6 alpha:1];
			
			NSMutableDictionary *attributes = [[[NSMutableDictionary alloc] init] autorelease];
			[attributes addEntriesFromDictionary:[[self attributedTitle] attributesAtIndex:0 effectiveRange:NULL]];
			[attributes setObject:textColor forKey:NSForegroundColorAttributeName];
			
			if ([NSApplication bwIsOnLeopard])
				[attributes setObject:[NSFont boldSystemFontOfSize:11] forKey:NSFontAttributeName];
			else
				[attributes setObject:[NSFont systemFontOfSize:11] forKey:NSFontAttributeName];
			
			NSShadow *shadow = [[[NSShadow alloc] init] autorelease];
			[shadow setShadowOffset:NSMakeSize(0,-1)];
			[attributes setObject:shadow forKey:NSShadowAttributeName];
			
			NSMutableAttributedString *string = [[[NSMutableAttributedString alloc] initWithString:[self title] attributes:attributes] autorelease];
			[self setAttributedTitle:string];
		}
	}
}

- (NSControlSize)controlSize
{
	return NSSmallControlSize;
}

- (void)setControlSize:(NSControlSize)size
{
	
}

@end
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.