BWToolkit / BWAnchoredButtonCell.m

Diff from to

BWAnchoredButtonCell.m

 
 static NSColor *fillStop1, *fillStop2, *fillStop3, *fillStop4;
 static NSColor *topBorderColor, *bottomBorderColor, *sideBorderColor, *sideInsetColor, *pressedColor;
-static NSColor *textColor, *textShadowColor, *imageColor, *imageShadowColor;
+static NSColor *enabledTextColor, *disabledTextColor, *enabledImageColor, *disabledImageColor;
 static NSColor *borderedSideBorderColor, *borderedTopBorderColor;
 static NSGradient *fillGradient;
-static float scaleFactor = 1.0f;
+static NSShadow *contentShadow;
+
+@interface NSCell (BWABCPrivate)
+- (NSDictionary *)_textAttributes;
+@end
 
 @interface BWAnchoredButtonCell (BWABCPrivate)
-- (void)drawTitleInFrame:(NSRect)cellFrame;
-- (void)drawImageInFrame:(NSRect)cellFrame;
+- (NSColor *)textColor;
+- (NSColor *)imageColor;
+- (NSRect)highlightRectForBounds:(NSRect)cellFrame;
 @end
 
 @implementation BWAnchoredButtonCell
 	
 	pressedColor		= [[NSColor colorWithCalibratedWhite:(0.0f / 255.0f) alpha:0.35] retain];
 	
-	textColor			= [[NSColor colorWithCalibratedWhite:(10.0f / 255.0f) alpha:1] retain];
-	textShadowColor		= [[NSColor colorWithCalibratedWhite:(255.0f / 255.0f) alpha:0.75] retain];
+	enabledTextColor	= [[NSColor colorWithCalibratedWhite:(10.0f / 255.0f) alpha:1] retain];
+	disabledTextColor	= [[enabledTextColor colorWithAlphaComponent:0.6] retain];
 	
-	imageColor			= [[NSColor colorWithCalibratedWhite:(72.0f / 255.0f) alpha:1] retain];
-	imageShadowColor	= [[NSColor colorWithCalibratedWhite:(240.0f / 255.0f) alpha:1] retain];
+	enabledImageColor	= [[NSColor colorWithCalibratedWhite:(72.0f / 255.0f) alpha:1] retain];
+	disabledImageColor	= [[enabledImageColor colorWithAlphaComponent:0.6] retain];
 	
 	borderedSideBorderColor	= [[NSColor colorWithCalibratedWhite:(0.0f / 255.0f) alpha:0.25] retain];
 	borderedTopBorderColor	= [[NSColor colorWithCalibratedWhite:(190.0f / 255.0f) alpha:1] retain];
 
+	contentShadow = [[NSShadow alloc] init];
+	[contentShadow setShadowOffset:NSMakeSize(0,-1)];
+	[contentShadow setShadowColor:[NSColor colorWithCalibratedWhite:(255.0f / 255.0f) alpha:0.75]];
 }
 
-- (void)awakeFromNib
+- (NSControlSize)controlSize
 {
-	scaleFactor = [[NSScreen mainScreen] userSpaceScaleFactor];
+	return NSSmallControlSize;
 }
 
+- (void)setControlSize:(NSControlSize)size
+{
+	
+}
+
+#pragma mark Draw Bezel
+
 - (void)drawWithFrame:(NSRect)cellFrame inView:(NSView *)controlView
-{		
+{
+	[super drawWithFrame:cellFrame inView:controlView];
+
+	if ([self isHighlighted])
+	{
+		[pressedColor set];
+		NSRectFillUsingOperation([self highlightRectForBounds:cellFrame], NSCompositeSourceOver);
+	}
+}
+
+- (NSRect)highlightRectForBounds:(NSRect)bounds
+{
+	return bounds;
+}
+
+- (void)drawBezelWithFrame:(NSRect)cellFrame inView:(NSView *)controlView
+{
 	BOOL inBorderedBar = YES;
 	
 	if ([[[self controlView] superview] respondsToSelector:@selector(isAtBottom)])
 		if ([(BWAnchoredButton *)[self controlView] isAtRightEdgeOfBar])
 			[bottomBorderColor bwDrawPixelThickLineAtPosition:0 withInset:1 inRect:cellFrame inView:[self controlView] horizontal:NO flip:YES];
 	}
-	
-	if ([self image] == nil)
-		[self drawTitleInFrame:cellFrame];
-	else
-		[self drawImageInFrame:cellFrame];
-		
-	if ([self isHighlighted])
-	{
-		[pressedColor set];
-		NSRectFillUsingOperation(cellFrame, NSCompositeSourceOver);
-	}
 }
 
-- (void)drawTitleInFrame:(NSRect)cellFrame
+#pragma mark Draw Title
+
+- (NSColor *)textColor
 {
-	if (![[self title] isEqualToString:@""])
-	{
-		NSColor *localTextColor = textColor;
-		
-		if (![self isEnabled])
-		{
-			localTextColor = [textColor colorWithAlphaComponent:0.6];
-		}
-		
-		NSMutableDictionary *attributes = [[[NSMutableDictionary alloc] init] autorelease];
-		[attributes addEntriesFromDictionary:[[self attributedTitle] attributesAtIndex:0 effectiveRange:NULL]];
-		[attributes setObject:localTextColor forKey:NSForegroundColorAttributeName];
-		[attributes setObject:[NSFont systemFontOfSize:11] forKey:NSFontAttributeName];
-		
-		NSShadow *shadow = [[[NSShadow alloc] init] autorelease];
-		[shadow setShadowOffset:NSMakeSize(0,-1)];
-		[shadow setShadowColor:textShadowColor];
-		[attributes setObject:shadow forKey:NSShadowAttributeName];
-		
-		NSMutableAttributedString *string = [[[NSMutableAttributedString alloc] initWithString:[self title] attributes:attributes] autorelease];
-		[self setAttributedTitle:string];
-
-		// Draw title
-		NSRect boundingRect = [[self attributedTitle] boundingRectWithSize:cellFrame.size options:0];
-		
-		NSPoint cellCenter;
-		cellCenter.x = cellFrame.size.width / 2;
-		cellCenter.y = cellFrame.size.height / 2;
-		
-		NSPoint drawPoint = cellCenter;
-		drawPoint.x -= boundingRect.size.width / 2;
-		drawPoint.y -= boundingRect.size.height / 2;
-		
-		drawPoint.x = roundf(drawPoint.x);
-		drawPoint.y = roundf(drawPoint.y);
-		
-		if (drawPoint.x < 4)
-			drawPoint.x = 4;
-		
-		[[self attributedTitle] drawAtPoint:drawPoint];
-	}
+	return [self isEnabled] ? enabledTextColor : disabledTextColor;
 }
 
-- (void)drawImageInFrame:(NSRect)cellFrame
+- (NSDictionary *)_textAttributes
 {
-	NSImage *image = [self image];
+	NSMutableDictionary *attributes = [[[NSMutableDictionary alloc] init] autorelease];
+	[attributes addEntriesFromDictionary:[super _textAttributes]];
+	[attributes setObject:[self textColor] forKey:NSForegroundColorAttributeName];
+	[attributes setObject:[NSFont systemFontOfSize:11] forKey:NSFontAttributeName];
+	[attributes setObject:contentShadow forKey:NSShadowAttributeName];
 	
-	if (image != nil)
-	{
-		[image setScalesWhenResized:NO];
-		NSRect sourceRect = NSZeroRect;
-		
-		if ([[image name] isEqualToString:@"NSActionTemplate"])
-			[image setSize:NSMakeSize(10,10)];
-
-		sourceRect.size = [image size];
-		
-		NSPoint backgroundCenter;
-		backgroundCenter.x = cellFrame.size.width / 2;
-		backgroundCenter.y = cellFrame.size.height / 2;
-		
-		NSPoint drawPoint = backgroundCenter;
-		drawPoint.x -= sourceRect.size.width / 2;
-		drawPoint.y -= sourceRect.size.height / 2 ;
-		
-		drawPoint.x = roundf(drawPoint.x);
-		drawPoint.y = roundf(drawPoint.y);
-		
-		NSAffineTransform* xform = [NSAffineTransform transform];
-		[xform translateXBy:0.0 yBy:cellFrame.size.height];
-		[xform scaleXBy:1.0 yBy:-1.0];
-		[xform concat];
-		
-		if ([image isTemplate])
-		{
-			NSImage *glyphImage = [image bwTintedImageWithColor:imageColor];
-			NSImage *shadowImage = [image bwTintedImageWithColor:imageShadowColor];
-			NSPoint shadowPoint = drawPoint;
-			shadowPoint.y--;
-			
-			[shadowImage drawAtPoint:shadowPoint fromRect:sourceRect operation:NSCompositeSourceOver fraction:1];		
-			
-			if ([self isEnabled])
-				[glyphImage drawAtPoint:drawPoint fromRect:sourceRect operation:NSCompositeSourceOver fraction:1];
-			else
-				[glyphImage	drawAtPoint:drawPoint fromRect:sourceRect operation:NSCompositeSourceOver fraction:0.5];
-		}
-		else
-		{
-			if ([self isEnabled])
-				[image drawAtPoint:drawPoint fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1];
-			else
-				[image drawAtPoint:drawPoint fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:0.5];
-		}
-	}
+	return attributes;
 }
 
-- (NSControlSize)controlSize
+- (NSRect)titleRectForBounds:(NSRect)bounds
 {
-	return NSSmallControlSize;
+	return NSOffsetRect([super titleRectForBounds:bounds], 0, 1);
 }
 
-- (void)setControlSize:(NSControlSize)size
+#pragma mark Draw Image
+
+- (NSColor *)imageColor
 {
+	return [self isEnabled] ? enabledImageColor : disabledImageColor;
+}
+
+- (void)drawImage:(NSImage *)image withFrame:(NSRect)frame inView:(NSView *)controlView
+{	
+	if ([[image name] isEqualToString:@"NSActionTemplate"])
+		[image setSize:NSMakeSize(10,10)];
 	
+	NSImage *newImage = image;
+	
+	// Only tint if the image is a template and shouldn't be rendered as a blue active state
+	if ([image isTemplate] && !([self showsStateBy] == NSContentsCellMask && [self intValue] == 1))
+	{
+		newImage = [image bwTintedImageWithColor:[self imageColor]];
+		[newImage setTemplate:NO];
+
+		[contentShadow set];
+	}
+
+	[super drawImage:newImage withFrame:NSOffsetRect(frame, 0, 1) inView:controlView];
 }
 
 @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.