diff options
Diffstat (limited to 'Frameworks/BWToolkitFramework.framework/BWAnchoredButtonCell.m')
-rw-r--r-- | Frameworks/BWToolkitFramework.framework/BWAnchoredButtonCell.m | 226 |
1 files changed, 226 insertions, 0 deletions
diff --git a/Frameworks/BWToolkitFramework.framework/BWAnchoredButtonCell.m b/Frameworks/BWToolkitFramework.framework/BWAnchoredButtonCell.m new file mode 100644 index 00000000..b8bae016 --- /dev/null +++ b/Frameworks/BWToolkitFramework.framework/BWAnchoredButtonCell.m @@ -0,0 +1,226 @@ +// +// BWAnchoredButtonCell.m +// BWToolkit +// +// Created by Brandon Walkin (www.brandonwalkin.com) +// All code is provided under the New BSD license. +// + +#import "BWAnchoredButtonCell.h" +#import "BWAnchoredButtonBar.h" +#import "BWAnchoredButton.h" +#import "NSColor+BWAdditions.h" +#import "NSImage+BWAdditions.h" + +static NSColor *fillStop1, *fillStop2, *fillStop3, *fillStop4; +static NSColor *topBorderColor, *bottomBorderColor, *sideBorderColor, *sideInsetColor, *pressedColor; +static NSColor *textColor, *textShadowColor, *imageColor, *imageShadowColor; +static NSColor *borderedSideBorderColor, *borderedTopBorderColor; +static NSGradient *fillGradient; +static float scaleFactor = 1.0f; + +@interface BWAnchoredButtonCell (BWABCPrivate) +- (void)drawTitleInFrame:(NSRect)cellFrame; +- (void)drawImageInFrame:(NSRect)cellFrame; +@end + +@implementation BWAnchoredButtonCell + ++ (void)initialize; +{ + fillStop1 = [[NSColor colorWithCalibratedWhite:(253.0f / 255.0f) alpha:1] retain]; + fillStop2 = [[NSColor colorWithCalibratedWhite:(242.0f / 255.0f) alpha:1] retain]; + fillStop3 = [[NSColor colorWithCalibratedWhite:(230.0f / 255.0f) alpha:1] retain]; + fillStop4 = [[NSColor colorWithCalibratedWhite:(230.0f / 255.0f) alpha:1] retain]; + + fillGradient = [[NSGradient alloc] initWithColorsAndLocations: + fillStop1, (CGFloat)0.0, + fillStop2, (CGFloat)0.45454, + fillStop3, (CGFloat)0.45454, + fillStop4, (CGFloat)1.0, + nil]; + + topBorderColor = [[NSColor colorWithCalibratedWhite:(202.0f / 255.0f) alpha:1] retain]; + bottomBorderColor = [[NSColor colorWithCalibratedWhite:(170.0f / 255.0f) alpha:1] retain]; + sideBorderColor = [[NSColor colorWithCalibratedWhite:(0.0f / 255.0f) alpha:0.2] retain]; + sideInsetColor = [[NSColor colorWithCalibratedWhite:(255.0f / 255.0f) alpha:0.5] retain]; + + 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]; + + imageColor = [[NSColor colorWithCalibratedWhite:(72.0f / 255.0f) alpha:1] retain]; + imageShadowColor = [[NSColor colorWithCalibratedWhite:(240.0f / 255.0f) alpha:1] retain]; + + borderedSideBorderColor = [[NSColor colorWithCalibratedWhite:(0.0f / 255.0f) alpha:0.25] retain]; + borderedTopBorderColor = [[NSColor colorWithCalibratedWhite:(190.0f / 255.0f) alpha:1] retain]; + +} + +- (void)awakeFromNib +{ + scaleFactor = [[NSScreen mainScreen] userSpaceScaleFactor]; +} + +- (void)drawWithFrame:(NSRect)cellFrame inView:(NSView *)controlView +{ + BOOL inBorderedBar = YES; + + if ([[[self controlView] superview] respondsToSelector:@selector(isAtBottom)]) + { + if ([(BWAnchoredButtonBar *)[[self controlView] superview] isAtBottom]) + inBorderedBar = NO; + } + + [fillGradient drawInRect:cellFrame angle:90]; + + [bottomBorderColor drawPixelThickLineAtPosition:0 withInset:0 inRect:cellFrame inView:[self controlView] horizontal:YES flip:YES]; + [sideInsetColor drawPixelThickLineAtPosition:1 withInset:1 inRect:cellFrame inView:[self controlView] horizontal:NO flip:NO]; + [sideInsetColor drawPixelThickLineAtPosition:1 withInset:1 inRect:cellFrame inView:[self controlView] horizontal:NO flip:YES]; + + if (inBorderedBar) + { + [borderedTopBorderColor drawPixelThickLineAtPosition:0 withInset:0 inRect:cellFrame inView:[self controlView] horizontal:YES flip:NO]; + [borderedSideBorderColor drawPixelThickLineAtPosition:0 withInset:1 inRect:cellFrame inView:[self controlView] horizontal:NO flip:NO]; + [borderedSideBorderColor drawPixelThickLineAtPosition:0 withInset:1 inRect:cellFrame inView:[self controlView] horizontal:NO flip:YES]; + } + else + { + [topBorderColor drawPixelThickLineAtPosition:0 withInset:0 inRect:cellFrame inView:[self controlView] horizontal:YES flip:NO]; + [sideBorderColor drawPixelThickLineAtPosition:0 withInset:1 inRect:cellFrame inView:[self controlView] horizontal:NO flip:NO]; + [sideBorderColor drawPixelThickLineAtPosition:0 withInset:1 inRect:cellFrame inView:[self controlView] horizontal:NO flip:YES]; + } + + if (inBorderedBar && [[self controlView] respondsToSelector:@selector(isAtLeftEdgeOfBar)]) + { + if ([(BWAnchoredButton *)[self controlView] isAtLeftEdgeOfBar]) + [bottomBorderColor drawPixelThickLineAtPosition:0 withInset:1 inRect:cellFrame inView:[self controlView] horizontal:NO flip:NO]; + if ([(BWAnchoredButton *)[self controlView] isAtRightEdgeOfBar]) + [bottomBorderColor drawPixelThickLineAtPosition:0 withInset:1 inRect:cellFrame inView:[self controlView] horizontal:NO flip:YES]; + } + + if ([self image] == nil && [self alternateImage] == nil) + [self drawTitleInFrame:cellFrame]; + else + [self drawImageInFrame:cellFrame]; + + if ([self isHighlighted]) + { + [pressedColor set]; + NSRectFillUsingOperation(cellFrame, NSCompositeSourceOver); + } +} + +- (void)drawTitleInFrame:(NSRect)cellFrame +{ + 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]; + } +} + +- (void)drawImageInFrame:(NSRect)cellFrame +{ + NSImage *image; + + image = ([self state] == NSOffState ? [self image] : [self alternateImage]); + + 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 tintedImageWithColor:imageColor]; + NSImage *shadowImage = [image tintedImageWithColor: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]; + } + } +} + +- (NSControlSize)controlSize +{ + return [super controlSize]; +} + +- (void)setControlSize:(NSControlSize)size +{ + +} + +@end |