aboutsummaryrefslogtreecommitdiffstats
path: root/Source/BGHUDButtonCell.m
diff options
context:
space:
mode:
Diffstat (limited to 'Source/BGHUDButtonCell.m')
-rw-r--r--Source/BGHUDButtonCell.m1233
1 files changed, 1233 insertions, 0 deletions
diff --git a/Source/BGHUDButtonCell.m b/Source/BGHUDButtonCell.m
new file mode 100644
index 00000000..2a80be59
--- /dev/null
+++ b/Source/BGHUDButtonCell.m
@@ -0,0 +1,1233 @@
+//
+// BGHUDButtonCell.m
+// BGHUDAppKit
+//
+// Created by BinaryGod on 5/25/08.
+//
+// Copyright (c) 2008, Tim Davis (BinaryMethod.com, binary.god@gmail.com)
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without modification,
+// are permitted provided that the following conditions are met:
+//
+// Redistributions of source code must retain the above copyright notice, this
+// list of conditions and the following disclaimer.
+//
+// Redistributions in binary form must reproduce the above copyright notice,
+// this list of conditions and the following disclaimer in the documentation and/or
+// other materials provided with the distribution.
+//
+// Neither the name of the BinaryMethod.com nor the names of its contributors
+// may be used to endorse or promote products derived from this software without
+// specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND
+// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+// IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
+// OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+// POSSIBILITY OF SUCH DAMAGE.
+
+#import "BGHUDButtonCell.h"
+
+
+@implementation BGHUDButtonCell
+
+#pragma mark Draw Functions
+
+@synthesize themeKey;
+
+-(id)init {
+
+ self = [super init];
+
+ if(self) {
+
+ self.themeKey = @"gradientTheme";
+ buttonType = 0;
+ }
+
+ return self;
+}
+
+-(id)initWithCoder:(NSCoder *)aDecoder {
+
+ self = (BGHUDButtonCell *)[super initWithCoder: aDecoder];
+
+ if(self) {
+
+ if([aDecoder containsValueForKey: @"themeKey"]) {
+
+ self.themeKey = [aDecoder decodeObjectForKey: @"themeKey"];
+ } else {
+
+ self.themeKey = @"gradientTheme";
+ }
+
+ if([aDecoder containsValueForKey: @"BGButtonType"]) {
+
+ buttonType = [aDecoder decodeIntegerForKey: @"BGButtonType"];
+ } else {
+
+ buttonType = 0;
+ }
+ }
+
+ return self;
+}
+
+-(void)encodeWithCoder: (NSCoder *)coder {
+
+ [super encodeWithCoder: coder];
+
+ [coder encodeObject: self.themeKey forKey: @"themeKey"];
+ [coder encodeInt: (int)buttonType forKey: @"BGButtonType"];
+}
+
+-(id)copyWithZone:(NSZone *) zone {
+
+ BGHUDButtonCell *copy = [super copyWithZone: zone];
+
+ copy->themeKey = nil;
+ [copy setThemeKey: [self themeKey]];
+
+ return copy;
+}
+
+- (void)setButtonType:(NSButtonType)aType {
+
+ buttonType = aType;
+ [super setButtonType: aType];
+}
+
+-(void)drawWithFrame:(NSRect)cellFrame inView:(NSView *)controlView {
+
+ // Make sure our own height is right, and not using
+ // a NSMatrix parents height.
+ cellFrame.size.height = [self cellSize].height;
+
+ switch ([self bezelStyle]) {
+
+ case NSTexturedRoundedBezelStyle:
+
+ [self drawTexturedRoundedButtonInFrame: cellFrame];
+ break;
+
+ case NSRoundRectBezelStyle:
+
+ [self drawRoundRectButtonInFrame: cellFrame];
+ break;
+
+ case NSSmallSquareBezelStyle:
+
+ [self drawSmallSquareButtonInFrame: cellFrame];
+ break;
+
+ case NSRoundedBezelStyle:
+
+ [self drawRoundedButtonInFrame: cellFrame];
+ break;
+
+ case NSRecessedBezelStyle:
+ [self drawRecessedButtonInFrame: cellFrame];
+ break;
+ }
+
+ if(buttonType == NSSwitchButton || buttonType == NSRadioButton) {
+
+ if([self imagePosition] != NSNoImage) {
+
+ [self drawImage: [self image] withFrame: cellFrame inView: [self controlView]];
+ }
+ }
+}
+
+-(NSRect)drawTitle:(NSAttributedString *)title withFrame:(NSRect)frame inView:(NSView *)controlView {
+
+ NSRect textRect = frame;
+
+ // Adjust Text Rect based on control type and size
+ if(buttonType != NSSwitchButton && buttonType != NSRadioButton) {
+
+ textRect.origin.x += 5;
+ textRect.size.width -= 10;
+ textRect.size.height -= 2;
+ }
+
+ NSMutableAttributedString *newTitle = [title mutableCopy];
+
+ //If button is set to show alternate title then
+ //display alternate title
+ if([self showsStateBy] == 0 && [self highlightsBy] == 1) {
+
+ if([self isHighlighted]) {
+
+ if([self alternateTitle]) {
+
+ [newTitle setAttributedString: [self attributedAlternateTitle]];
+ }
+ }
+ }
+
+ //If button is set to show alternate title then
+ //display alternate title
+ if([self showsStateBy] == 1 && [self highlightsBy] == 3) {
+
+ if([self state] == 1) {
+
+ if([self alternateTitle]) {
+
+ [newTitle setAttributedString: [self attributedAlternateTitle]];
+ }
+ }
+ }
+
+ //Make sure we aren't trying to edit an
+ //empty string.
+ if([newTitle length] > 0) {
+
+ [newTitle beginEditing];
+
+ // Removed so Shadows could be used
+ // TODO: Find out why I had this in here in the first place, no cosmetic difference
+ /*[newTitle removeAttribute: NSShadowAttributeName
+ range: NSMakeRange(0, [newTitle length])];*/
+
+ //Set text color based on button enabled state.
+ if([self isEnabled]) {
+
+ [newTitle addAttribute: NSForegroundColorAttributeName
+ value: [NSColor whiteColor]
+ range: NSMakeRange(0, [newTitle length])];
+ } else {
+
+ [newTitle addAttribute: NSForegroundColorAttributeName
+ value: [NSColor colorWithDeviceRed: 1 green: 1 blue: 1 alpha: 0.2f]
+ range: NSMakeRange(0, [newTitle length])];
+ }
+
+ [newTitle endEditing];
+
+ //Make the super class do the drawing
+ [super drawTitle: newTitle withFrame: textRect inView: controlView];
+ }
+
+ [newTitle release];
+ return textRect;
+}
+
+-(void)drawImage:(NSImage *)image withFrame:(NSRect)frame inView:(NSView *)controlView {
+
+ if([image isTemplate]) {
+
+ [super drawImage: image withFrame: frame inView: controlView];
+ } else {
+
+ if(buttonType == NSSwitchButton) {
+
+ [self drawCheckInFrame: frame isRadio: NO];
+ } else if(buttonType == NSRadioButton) {
+
+ [self drawCheckInFrame: frame isRadio: YES];
+ } else {
+
+ //Setup per State and Highlight Settings
+ if([self showsStateBy] == 0 && [self highlightsBy] == 1) {
+
+ if([self isHighlighted]) {
+
+ if([self alternateImage]) {
+
+ image = [self alternateImage];
+ }
+ }
+ }
+
+ if([self showsStateBy] == 1 && [self highlightsBy] == 3) {
+
+ if([self state] == 1) {
+
+ if([self alternateImage]) {
+
+ image = [self alternateImage];
+ }
+ }
+ }
+
+ //Calculate Image Position
+ NSRect imageRect = frame;
+ imageRect.size.height = [image size].height;
+ imageRect.size.width = [image size].width;
+ imageRect.origin.y += (frame.size.height /2) - (imageRect.size.height /2);
+
+ //Setup Position
+ switch ([self imagePosition]) {
+
+ case NSImageLeft:
+
+ imageRect.origin.x += 5;
+ break;
+
+ case NSImageOnly:
+
+ imageRect.origin.x += (frame.size.width /2) - (imageRect.size.width /2);
+ break;
+
+ case NSImageRight:
+
+ imageRect.origin.x = ((frame.origin.x + frame.size.width) - imageRect.size.width) - 5;
+ break;
+
+ case NSImageBelow:
+
+ break;
+
+ case NSImageAbove:
+
+ break;
+
+ case NSImageOverlaps:
+
+ break;
+
+ default:
+
+ imageRect.origin.x += 5;
+ break;
+ }
+
+ [image setFlipped: YES];
+
+ //Draw the image based on enabled state
+ if([self isEnabled]) {
+
+ [image drawInRect: imageRect fromRect: NSZeroRect operation: NSCompositeSourceAtop fraction: 0.7f];
+ } else {
+ [image drawInRect: imageRect fromRect: NSZeroRect operation: NSCompositeSourceAtop fraction: 0.2f];
+ }
+
+ }
+ }
+}
+
+-(void)drawTexturedRoundedButtonInFrame:(NSRect)frame {
+
+ //Adjust Rect so strokes are true and
+ //shadows are visible
+ frame.origin.x += 1.5f;
+ frame.origin.y += 0.5f;
+ frame.size.width -= 3;
+ frame.size.height -= 4;
+
+ //Adjust Rect based on ControlSize so that
+ //my controls match as closely to apples
+ //as possible.
+ switch ([self controlSize]) {
+
+ case NSRegularControlSize:
+
+ frame.origin.y += 1;
+ break;
+
+ case NSSmallControlSize:
+
+ //frame.origin.y += 3;
+ //frame.size.height += 2;
+ break;
+
+ case NSMiniControlSize:
+
+ //frame.origin.y += 5;
+ //frame.size.height += 1;
+ break;
+ }
+
+ //Draw Outer-most ring
+ NSBezierPath *path = [[NSBezierPath alloc] init];
+ [path appendBezierPathWithRoundedRect: frame xRadius: 4.0f yRadius: 4.0f];
+
+ //Save Graphics State
+ [NSGraphicsContext saveGraphicsState];
+
+ if([self isEnabled]) {
+ NSShadow *shadow = [[NSShadow alloc] init];
+ [shadow setShadowColor: [NSColor blackColor]];
+ [shadow setShadowBlurRadius: 2];
+ [shadow setShadowOffset: NSMakeSize( 0, -1)];
+
+ [shadow set];
+ [shadow release];
+ }
+
+ //Draw Dark Border
+ [[NSColor colorWithDeviceRed: 0.141f green: 0.141f blue: 0.141f alpha: 0.5f] set];
+ [path setLineWidth: 1.0f];
+ [path stroke];
+
+ //Restore Graphics State
+ [NSGraphicsContext restoreGraphicsState];
+
+ if([self isEnabled]) {
+
+ //Draw Background
+ if(([self showsStateBy] == 12 && [self highlightsBy] == 14) ||
+ ([self showsStateBy] == 12 && [self highlightsBy] == 12)) {
+
+ if([self state] == 1) {
+ NSGradient *highlightGradient = [[[NSGradient alloc] initWithColorsAndLocations: [NSColor colorWithDeviceRed: 0.524f green: 0.531f blue: 0.547f alpha: 0.7f],
+ (CGFloat)0, [NSColor colorWithDeviceRed: 0.445f green: 0.453f blue: 0.469f alpha: 0.7f], (CGFloat).5,
+ [NSColor colorWithDeviceRed: 0.406f green: 0.414f blue: 0.433f alpha: 0.7f], (CGFloat).5,
+ [NSColor colorWithDeviceRed: 0.339f green: 0.347f blue: 0.367f alpha: 0.7f], (CGFloat)1.0f, nil] autorelease];
+
+ [highlightGradient drawInBezierPath: path angle: 90];
+ } else {
+ NSGradient *normalGradient = [[[NSGradient alloc] initWithColorsAndLocations: [NSColor colorWithDeviceRed: 0.324f green: 0.331f blue: 0.347f alpha: 0.7f],
+ (CGFloat)0, [NSColor colorWithDeviceRed: 0.245f green: 0.253f blue: 0.269f alpha: 0.7f], .5f,
+ [NSColor colorWithDeviceRed: 0.206f green: 0.214f blue: 0.233f alpha: 0.7f], .5f,
+ [NSColor colorWithDeviceRed: 0.139f green: 0.147f blue: 0.167f alpha: 0.7f], 1.0f, nil] autorelease];
+
+ [normalGradient drawInBezierPath: path angle: 90];
+ }
+ } else {
+
+ if([self isHighlighted]) {
+ NSGradient *pushedGradient = [[[NSGradient alloc] initWithColorsAndLocations: [NSColor colorWithDeviceRed: 0.524f green: 0.531f blue: 0.547f alpha: 0.7f],
+ (CGFloat)0, [NSColor colorWithDeviceRed: 0.445f green: 0.453f blue: 0.469f alpha: 0.7f], (CGFloat).5,
+ [NSColor colorWithDeviceRed: 0.406f green: 0.414f blue: 0.433f alpha: 0.7f], (CGFloat).5,
+ [NSColor colorWithDeviceRed: 0.339f green: 0.347f blue: 0.367f alpha: 0.7f], (CGFloat)1.0f, nil] autorelease];
+
+ [pushedGradient drawInBezierPath: path angle: 90];
+ } else {
+ NSGradient *normalGradient = [[[NSGradient alloc] initWithColorsAndLocations: [NSColor colorWithDeviceRed: 0.324f green: 0.331f blue: 0.347f alpha: 0.7f],
+ (CGFloat)0, [NSColor colorWithDeviceRed: 0.245f green: 0.253f blue: 0.269f alpha: 0.7f], .5f,
+ [NSColor colorWithDeviceRed: 0.206f green: 0.214f blue: 0.233f alpha: 0.7f], .5f,
+ [NSColor colorWithDeviceRed: 0.139f green: 0.147f blue: 0.167f alpha: 0.7f], 1.0f, nil] autorelease];
+
+ [normalGradient drawInBezierPath: path angle: 90];
+ }
+ }
+ } else {
+ NSGradient *disabledNormalGradient = [[[NSGradient alloc] initWithStartingColor: [NSColor colorWithDeviceRed: 0.251f green: 0.251f blue: 0.255f alpha: 0.2f]
+ endingColor: [NSColor colorWithDeviceRed: 0.118f green: 0.118f blue: 0.118f alpha: 0.2f]] autorelease];
+
+ [disabledNormalGradient drawInBezierPath: path angle: 90];
+ }
+
+ //Draw Border
+ if([self isEnabled]) {
+
+ [[NSColor colorWithDeviceRed: 0.749f green: 0.761f blue: 0.788f alpha: 0.7f] set];
+ } else {
+
+ [[NSColor colorWithDeviceRed: 0.749f green: 0.761f blue: 0.788f alpha: 0.7f] set];
+ }
+
+ [path setLineWidth: 1.0f];
+ [path stroke];
+
+ //path = nil;
+ [path release];
+
+ if([self imagePosition] != NSImageOnly) {
+
+ [self drawTitle: [self attributedTitle] withFrame: frame inView: [self controlView]];
+ }
+
+ if([self imagePosition] != NSNoImage) {
+
+ [self drawImage: [self image] withFrame: frame inView: [self controlView]];
+ }
+}
+
+-(void)drawRoundRectButtonInFrame:(NSRect)frame {
+
+ //Adjust Rect so strokes are true and
+ //shadows are visible
+ frame.origin.x += 1.5f;
+ frame.size.width -= 3;
+
+ //Adjust Rect based on ControlSize so that
+ //my controls match as closely to apples
+ //as possible.
+ switch ([self controlSize]) {
+
+ case NSRegularControlSize:
+
+ frame.size.height -= 3;
+ break;
+
+ case NSSmallControlSize:
+
+ frame.size.height -= 3;
+ break;
+
+ case NSMiniControlSize:
+
+ frame.origin.y += 1;
+ frame.size.height -= 5;
+ break;
+ }
+
+ //Create Path
+ NSBezierPath *path = [[NSBezierPath alloc] init];
+
+ [path appendBezierPathWithArcWithCenter: NSMakePoint(NSMinX(frame) + BGCenterY(frame), NSMidY(frame) + 0.5f)
+ radius: BGCenterY(frame)
+ startAngle: 90
+ endAngle: 270];
+
+ [path appendBezierPathWithArcWithCenter: NSMakePoint(NSMaxX(frame) - BGCenterY(frame), NSMidY(frame) + 0.5f)
+ radius: BGCenterY(frame)
+ startAngle: 270
+ endAngle: 90];
+
+ [path closePath];
+ [NSGraphicsContext saveGraphicsState];
+
+ //Draw dark border color
+ if([self isEnabled]) {
+ NSShadow *shadow = [[NSShadow alloc] init];
+ [shadow setShadowColor: [NSColor blackColor]];
+ [shadow setShadowBlurRadius: 2];
+ [shadow setShadowOffset: NSMakeSize( 0, -1)];
+
+ [shadow set];
+ [shadow release];
+ }
+ [[NSColor colorWithDeviceRed: 0.141f green: 0.141f blue: 0.141f alpha: 0.5f] set];
+ [path stroke];
+
+ [NSGraphicsContext restoreGraphicsState];
+
+ if([self isEnabled]) {
+
+ if(([self showsStateBy] == 12 && [self highlightsBy] == 14) ||
+ ([self showsStateBy] == 12 && [self highlightsBy] == 12)) {
+
+ if([self state] == 1) {
+ NSGradient *highlightGradient = [[[NSGradient alloc] initWithColorsAndLocations: [NSColor colorWithDeviceRed: 0.524f green: 0.531f blue: 0.547f alpha: 0.7f],
+ (CGFloat)0, [NSColor colorWithDeviceRed: 0.445f green: 0.453f blue: 0.469f alpha: 0.7f], (CGFloat).5,
+ [NSColor colorWithDeviceRed: 0.406f green: 0.414f blue: 0.433f alpha: 0.7f], (CGFloat).5,
+ [NSColor colorWithDeviceRed: 0.339f green: 0.347f blue: 0.367f alpha: 0.7f], (CGFloat)1.0f, nil] autorelease];
+
+ [highlightGradient drawInBezierPath: path angle: 90];
+ } else {
+ NSGradient *normalGradient = [[[NSGradient alloc] initWithColorsAndLocations: [NSColor colorWithDeviceRed: 0.324f green: 0.331f blue: 0.347f alpha: 0.7f],
+ (CGFloat)0, [NSColor colorWithDeviceRed: 0.245f green: 0.253f blue: 0.269f alpha: 0.7f], .5f,
+ [NSColor colorWithDeviceRed: 0.206f green: 0.214f blue: 0.233f alpha: 0.7f], .5f,
+ [NSColor colorWithDeviceRed: 0.139f green: 0.147f blue: 0.167f alpha: 0.7f], 1.0f, nil] autorelease];
+
+ [normalGradient drawInBezierPath: path angle: 90];
+ }
+ } else {
+
+ if([self isHighlighted]) {
+ NSGradient *pushedGradient = [[[NSGradient alloc] initWithColorsAndLocations: [NSColor colorWithDeviceRed: 0.524f green: 0.531f blue: 0.547f alpha: 0.7f],
+ (CGFloat)0, [NSColor colorWithDeviceRed: 0.445f green: 0.453f blue: 0.469f alpha: 0.7f], (CGFloat).5,
+ [NSColor colorWithDeviceRed: 0.406f green: 0.414f blue: 0.433f alpha: 0.7f], (CGFloat).5,
+ [NSColor colorWithDeviceRed: 0.339f green: 0.347f blue: 0.367f alpha: 0.7f], (CGFloat)1.0f, nil] autorelease];
+
+ [pushedGradient drawInBezierPath: path angle: 90];
+ } else {
+ NSGradient *normalGradient = [[[NSGradient alloc] initWithColorsAndLocations: [NSColor colorWithDeviceRed: 0.324f green: 0.331f blue: 0.347f alpha: 0.7f],
+ (CGFloat)0, [NSColor colorWithDeviceRed: 0.245f green: 0.253f blue: 0.269f alpha: 0.7f], .5f,
+ [NSColor colorWithDeviceRed: 0.206f green: 0.214f blue: 0.233f alpha: 0.7f], .5f,
+ [NSColor colorWithDeviceRed: 0.139f green: 0.147f blue: 0.167f alpha: 0.7f], 1.0f, nil] autorelease];
+
+ [normalGradient drawInBezierPath: path angle: 90];
+ }
+ }
+ } else {
+ NSGradient *disabledNormalGradient = [[[NSGradient alloc] initWithStartingColor: [NSColor colorWithDeviceRed: 0.251f green: 0.251f blue: 0.255f alpha: 0.2f]
+ endingColor: [NSColor colorWithDeviceRed: 0.118f green: 0.118f blue: 0.118f alpha: 0.2f]] autorelease];
+
+ [disabledNormalGradient drawInBezierPath: path angle: 90];
+ }
+
+ if([self isEnabled]) {
+
+ [[NSColor colorWithDeviceRed: 0.749f green: 0.761f blue: 0.788f alpha: 0.7f] set];
+ } else {
+
+ [[NSColor colorWithDeviceRed: 0.749f green: 0.761f blue: 0.788f alpha: 0.7f] set];
+ }
+ [path setLineWidth: 1.0f];
+ [path stroke];
+
+ [path release];
+
+ if([self imagePosition] != NSImageOnly) {
+
+ NSRect textFrame = frame;
+ textFrame.origin.y += 1;
+
+ [self drawTitle: [self attributedTitle] withFrame: textFrame inView: [self controlView]];
+ }
+
+ if([self imagePosition] != NSNoImage) {
+
+ [self drawImage: [self image] withFrame: frame inView: [self controlView]];
+ }
+}
+
+-(void)drawSmallSquareButtonInFrame:(NSRect)frame {
+
+ //Adjust Rect so strokes are true and
+ //shadows are visible
+ frame.origin.x += 1.5f;
+ frame.origin.y += 0.5f;
+ frame.size.width -= 3;
+ frame.size.height = [[self controlView] bounds].size.height - 3;
+
+ //Draw Outer-most ring
+ NSBezierPath *path = [[NSBezierPath alloc] init];
+ [path appendBezierPathWithRect: frame];
+
+ [NSGraphicsContext saveGraphicsState];
+
+ if([self isEnabled]) {
+ NSShadow *shadow = [[NSShadow alloc] init];
+ [shadow setShadowColor: [NSColor blackColor]];
+ [shadow setShadowBlurRadius: 2];
+ [shadow setShadowOffset: NSMakeSize( 0, -1)];
+
+ [shadow set];
+ [shadow release];
+ }
+
+ [[NSColor colorWithDeviceRed: 0.141f green: 0.141f blue: 0.141f alpha: 0.5f] set];
+ [path setLineWidth: 1.0f];
+ [path stroke];
+
+ [NSGraphicsContext restoreGraphicsState];
+
+ //Draw Background
+ if([self isEnabled]) {
+
+ if(([self showsStateBy] == 12 && [self highlightsBy] == 14) ||
+ ([self showsStateBy] == 12 && [self highlightsBy] == 12)) {
+
+ if([self state] == 1) {
+ NSGradient *highlightComplexGradient = [[[NSGradient alloc] initWithColorsAndLocations: [NSColor colorWithDeviceRed: 0.524f green: 0.531f blue: 0.547f alpha: 0.7f],
+ (CGFloat)0, [NSColor colorWithDeviceRed: 0.445f green: 0.453f blue: 0.469f alpha: 0.7f], (CGFloat).5,
+ [NSColor colorWithDeviceRed: 0.406f green: 0.414f blue: 0.433f alpha: 0.7f], (CGFloat).5,
+ [NSColor colorWithDeviceRed: 0.339f green: 0.347f blue: 0.367f alpha: 0.7f], (CGFloat)1.0f, nil] autorelease];
+
+
+ [highlightComplexGradient drawInBezierPath: path angle: 90];
+ } else {
+ NSGradient *normalComplexGradient = [[[NSGradient alloc] initWithColorsAndLocations: [NSColor colorWithDeviceRed: 0.324f green: 0.331f blue: 0.347f alpha: 0.7f],
+ (CGFloat)0, [NSColor colorWithDeviceRed: 0.245f green: 0.253f blue: 0.269f alpha: 0.7f], (CGFloat).5,
+ [NSColor colorWithDeviceRed: 0.206f green: 0.214f blue: 0.233f alpha: 0.7f], (CGFloat).5,
+ [NSColor colorWithDeviceRed: 0.139f green: 0.147f blue: 0.167f alpha: 0.7f], (CGFloat)1.0f, nil] autorelease];
+
+
+ [normalComplexGradient drawInBezierPath: path angle: 90];
+ }
+ } else {
+
+ if([self isHighlighted]) {
+ NSGradient *pushedComplexGradient = [[[NSGradient alloc] initWithColorsAndLocations: [NSColor colorWithDeviceRed: 0.524f green: 0.531f blue: 0.547f alpha: 0.7f],
+ (CGFloat)0, [NSColor colorWithDeviceRed: 0.445f green: 0.453f blue: 0.469f alpha: 0.7f], (CGFloat).5,
+ [NSColor colorWithDeviceRed: 0.406f green: 0.414f blue: 0.433f alpha: 0.7f], (CGFloat).5,
+ [NSColor colorWithDeviceRed: 0.339f green: 0.347f blue: 0.367f alpha: 0.7f], (CGFloat)1.0f, nil] autorelease];
+
+ [pushedComplexGradient drawInBezierPath: path angle: 90];
+ } else {
+ NSGradient *normalComplexGradient = [[[NSGradient alloc] initWithColorsAndLocations: [NSColor colorWithDeviceRed: 0.324f green: 0.331f blue: 0.347f alpha: 0.7f],
+ (CGFloat)0, [NSColor colorWithDeviceRed: 0.245f green: 0.253f blue: 0.269f alpha: 0.7f], (CGFloat).5,
+ [NSColor colorWithDeviceRed: 0.206f green: 0.214f blue: 0.233f alpha: 0.7f], (CGFloat).5,
+ [NSColor colorWithDeviceRed: 0.139f green: 0.147f blue: 0.167f alpha: 0.7f], (CGFloat)1.0f, nil] autorelease];
+
+ [normalComplexGradient drawInBezierPath: path angle: 90];
+ }
+ }
+ } else {
+ NSGradient *disabledNormalComplexGradient = [[[NSGradient alloc] initWithColorsAndLocations: [NSColor colorWithDeviceRed: 0.324f green: 0.331f blue: 0.347f alpha: 0.2f],
+ (CGFloat)0, [NSColor colorWithDeviceRed: 0.245f green: 0.253f blue: 0.269f alpha: 0.2f], (CGFloat).5,
+ [NSColor colorWithDeviceRed: 0.206f green: 0.214f blue: 0.233f alpha: 0.2f], (CGFloat).5,
+ [NSColor colorWithDeviceRed: 0.139f green: 0.147f blue: 0.167f alpha: 0.2f], (CGFloat)1.0f, nil] autorelease];
+
+
+ [disabledNormalComplexGradient drawInBezierPath: path angle: 90];
+ }
+
+ //Draw Border
+ if([self isEnabled]) {
+
+ [[NSColor colorWithDeviceRed: 0.749f green: 0.761f blue: 0.788f alpha: 0.7f] set];
+ } else {
+
+ [[NSColor colorWithDeviceRed: 0.749f green: 0.761f blue: 0.788f alpha: 0.7f] set];
+ }
+ [path setLineWidth: 1.0f];
+ [path stroke];
+
+ [path release];
+
+ if([self imagePosition] != NSImageOnly) {
+
+ [self drawTitle: [self attributedTitle] withFrame: frame inView: [self controlView]];
+ }
+
+ if([self imagePosition] != NSNoImage) {
+
+ [self drawImage: [self image] withFrame: frame inView: [self controlView]];
+ }
+}
+
+-(void)drawRoundedButtonInFrame:(NSRect)frame {
+
+ NSRect textFrame;
+
+ //Adjust Rect so strokes are true and
+ //shadows are visible
+ frame.origin.x += .5f;
+ frame.origin.y += .5f;
+ frame.size.height -= 1;
+ frame.size.width -= 1;
+
+ //Adjust Rect based on ControlSize so that
+ //my controls match as closely to apples
+ //as possible.
+ switch ([self controlSize]) {
+ default: // Silence uninitialized variable warnings for textFrame fields.
+ case NSRegularControlSize:
+
+ frame.origin.x += 4;
+ frame.origin.y += 4;
+ frame.size.width -= 8;
+ frame.size.height -= 12;
+
+ textFrame = frame;
+ break;
+
+ case NSSmallControlSize:
+
+ frame.origin.x += 4;
+ frame.origin.y += 4;
+ frame.size.width -= 8;
+ frame.size.height -= 11;
+
+ textFrame = frame;
+ textFrame.origin.y += 1;
+ break;
+
+ case NSMiniControlSize:
+
+ frame.origin.y -= 1;
+
+ textFrame = frame;
+ textFrame.origin.y += 1;
+ break;
+ }
+
+ //Create Path
+ NSBezierPath *path = [[NSBezierPath alloc] init];
+
+ [path appendBezierPathWithArcWithCenter: NSMakePoint(NSMinX(frame) + BGCenterY(frame), NSMidY(frame) + 0.5f)
+ radius: BGCenterY(frame)
+ startAngle: 90
+ endAngle: 270];
+
+ [path appendBezierPathWithArcWithCenter: NSMakePoint(NSMaxX(frame) - BGCenterY(frame), NSMidY(frame) + 0.5f)
+ radius: BGCenterY(frame)
+ startAngle: 270
+ endAngle: 90];
+
+ [path closePath];
+
+ if([self isEnabled]) {
+
+ if(([self showsStateBy] == 12 && [self highlightsBy] == 14) ||
+ ([self showsStateBy] == 12 && [self highlightsBy] == 12)) {
+
+ if([self state] == 1) {
+
+ [[NSColor colorWithDeviceRed: 0.941f green: 0.941f blue: 0.941f alpha: 0.7f] set];
+ [path fill];
+ } else {
+
+ [[NSColor colorWithDeviceRed: 0.141f green: 0.141f blue: 0.141f alpha: 0.7f] set];
+ [path fill];
+ }
+ } else {
+
+ if([self isHighlighted]) {
+
+ [[NSColor colorWithDeviceRed: 0.941f green: 0.941f blue: 0.941f alpha: 0.7f] set];
+ [path fill];
+ } else {
+
+ [[NSColor colorWithDeviceRed: 0.141f green: 0.141f blue: 0.141f alpha: 0.7f] set];
+ [path fill];
+ }
+ }
+ } else {
+
+ [[NSColor colorWithDeviceRed: 0.141f green: 0.141f blue: 0.141f alpha: 0.2f] set];
+ }
+
+ [path release];
+
+ if([self imagePosition] != NSImageOnly) {
+
+ [self drawTitle: [self attributedTitle] withFrame: textFrame inView: [self controlView]];
+ }
+
+ if([self imagePosition] != NSNoImage) {
+
+ [self drawImage: [self image] withFrame: frame inView: [self controlView]];
+ }
+}
+
+-(void)drawCheckInFrame:(NSRect)frame isRadio:(BOOL)radio{
+
+ //Adjust by .5 so lines draw true
+ frame.origin.x += .5f;
+ frame.origin.y += .5f;
+
+ if([[[self controlView] className] isEqualToString: @"NSMatrix"]) {
+
+ NSMatrix* matrix = (NSMatrix*)[self controlView];
+ frame.origin.y += (BGCenterY([matrix bounds]) / [matrix numberOfRows]) - BGCenterY(frame);
+ //frame.origin.x += 40;
+
+ } else if(![[[[self controlView] superclass] className] isEqualToString: @"BGHUDTableView"] &&
+ ![[[[self controlView] superclass] className] isEqualToString: @"BGHUDOutlineView"] &&
+ ![[[self controlView] className] isEqualToString: @"BGHUDTableView"] &&
+ ![[[self controlView] className] isEqualToString: @"BGHUDOutlineView"]) {
+
+ frame.origin.y += (BGCenterY([[self controlView] bounds]) - BGCenterY(frame));
+ }
+
+ // Create Check Rect
+ NSRect innerRect = frame;
+ NSRect textRect = frame;
+
+ //Make adjustments based on ControlSize
+ //Set checkbox size
+ if([self controlSize] == NSRegularControlSize) {
+
+ innerRect.size.height = 12;
+ innerRect.size.width = 13;
+ innerRect.origin.y += 2;
+
+ } else if([self controlSize] == NSSmallControlSize) {
+
+ innerRect.size.height = 10;
+ innerRect.size.width = 11;
+ innerRect.origin.y += 3;
+
+ } else {
+
+ innerRect.size.height = 8;
+ innerRect.size.width = 9;
+ innerRect.origin.y += 5;
+ }
+
+ if(radio) {
+
+ innerRect.size.height = innerRect.size.width;
+ }
+
+ // Determine Horizontal Placement
+ switch ([self imagePosition]) {
+
+ case NSImageLeft:
+
+ //Make adjustments to horizontal placement
+ //Create Text Rect so text is drawn properly
+ if([self controlSize] == NSRegularControlSize) {
+
+ innerRect.origin.x += 2;
+ textRect.size.width -= (NSMaxX(innerRect) + 5);
+ textRect.origin.x = (NSMaxX(innerRect) + 5);
+ textRect.origin.y -= 2;
+
+ } else if([self controlSize] == NSSmallControlSize) {
+
+ innerRect.origin.x += 3;
+ textRect.size.width -= (NSMaxX(innerRect) + 6);
+ textRect.origin.x = (NSMaxX(innerRect) + 6);
+ textRect.origin.y -= 1;
+
+ } else {
+
+ innerRect.origin.x += 4;
+ textRect.size.width -= (NSMaxX(innerRect) + 4);
+ textRect.origin.x = (NSMaxX(innerRect) + 4);
+ }
+
+ break;
+
+ case NSImageOnly:
+
+ //Adjust slightly so lines draw true, and center really is
+ //center
+ if([self controlSize] == NSRegularControlSize) {
+
+ innerRect.origin.x -= .5f;
+ } else if([self controlSize] == NSMiniControlSize) {
+
+ innerRect.origin.x += .5f;
+ }
+
+ innerRect.origin.x += BGCenterX(frame) - BGCenterX(innerRect);
+ break;
+
+ case NSImageRight:
+
+ if([self controlSize] == NSRegularControlSize) {
+
+ innerRect.origin.x = (NSWidth(frame) - NSWidth(innerRect) - 1.5f) ;
+ textRect.origin.x += 2;
+ textRect.size.width = (NSMinX(innerRect) - NSMinX(textRect) - 5);
+ textRect.origin.y -= 2;
+
+ } else if([self controlSize] == NSSmallControlSize) {
+
+ innerRect.origin.x = (NSWidth(frame) - NSWidth(innerRect) - 1.5f);
+ textRect.origin.x += 2;
+ textRect.size.width = (NSMinX(innerRect) - NSMinX(textRect) - 5);
+ textRect.origin.y -= 1;
+
+ } else {
+
+ innerRect.origin.x = (NSWidth(frame) - NSWidth(innerRect) - 1.5f);
+ textRect.origin.x += 2;
+ textRect.size.width = (NSMinX(innerRect) - NSMinX(textRect) - 5);
+ }
+
+ break;
+
+ case NSImageBelow:
+
+ break;
+
+ case NSImageAbove:
+
+ break;
+
+ case NSImageOverlaps:
+
+ break;
+ }
+
+ // Create Rounded Rect Path
+ NSBezierPath *path = [[NSBezierPath alloc] init];
+
+ if(radio) {
+
+ [path appendBezierPathWithOvalInRect: innerRect];
+ } else {
+
+ [path appendBezierPathWithRoundedRect: innerRect xRadius: 2 yRadius: 2];
+ }
+
+ [NSGraphicsContext saveGraphicsState];
+
+ //Draw Shadow
+ if([self isEnabled]) {
+ NSShadow *shadow = [[NSShadow alloc] init];
+ [shadow setShadowColor: [NSColor blackColor]];
+ [shadow setShadowBlurRadius: 2];
+ [shadow setShadowOffset: NSMakeSize( 0, -1)];
+
+ [shadow set];
+ [shadow release];
+ }
+ [[NSColor colorWithDeviceRed: 0.141f green: 0.141f blue: 0.141f alpha: 0.5f] set];
+ [path stroke];
+
+ [NSGraphicsContext restoreGraphicsState];
+
+ // Determine Fill Color and Alpha Values
+ if([self isEnabled]) {
+
+ if([self isHighlighted]) {
+ NSGradient *highlightGradient = [[[NSGradient alloc] initWithColorsAndLocations: [NSColor colorWithDeviceRed: 0.524f green: 0.531f blue: 0.547f alpha: 0.7f],
+ (CGFloat)0, [NSColor colorWithDeviceRed: 0.445f green: 0.453f blue: 0.469f alpha: 0.7f], (CGFloat).5,
+ [NSColor colorWithDeviceRed: 0.406f green: 0.414f blue: 0.433f alpha: 0.7f], (CGFloat).5,
+ [NSColor colorWithDeviceRed: 0.339f green: 0.347f blue: 0.367f alpha: 0.7f], (CGFloat)1.0f, nil] autorelease];
+
+ [highlightGradient drawInBezierPath: path angle: 90];
+ } else {
+ NSGradient *normalGradient = [[[NSGradient alloc] initWithColorsAndLocations: [NSColor colorWithDeviceRed: 0.324f green: 0.331f blue: 0.347f alpha: 0.7f],
+ (CGFloat)0, [NSColor colorWithDeviceRed: 0.245f green: 0.253f blue: 0.269f alpha: 0.7f], .5f,
+ [NSColor colorWithDeviceRed: 0.206f green: 0.214f blue: 0.233f alpha: 0.7f], .5f,
+ [NSColor colorWithDeviceRed: 0.139f green: 0.147f blue: 0.167f alpha: 0.7f], 1.0f, nil] autorelease];
+
+ [normalGradient drawInBezierPath: path angle: 90];
+ }
+ } else {
+ NSGradient *disabledNormalGradient = [[[NSGradient alloc] initWithStartingColor: [NSColor colorWithDeviceRed: 0.251f green: 0.251f blue: 0.255f alpha: 0.2f]
+ endingColor: [NSColor colorWithDeviceRed: 0.118f green: 0.118f blue: 0.118f alpha: 0.2f]] autorelease];
+
+ [disabledNormalGradient drawInBezierPath: path angle: 90];
+ }
+
+ // Draw Border
+ if([self isEnabled]) {
+
+ [[NSColor colorWithDeviceRed: 0.749f green: 0.761f blue: 0.788f alpha: 0.7f] set];
+ } else {
+
+ [[NSColor colorWithDeviceRed: 0.749f green: 0.761f blue: 0.788f alpha: 0.7f] set];
+ }
+ [path setLineWidth: 1.0f];
+ [path stroke];
+
+ [path release];
+
+ // Draw Glyphs for On/Off/Mixed States
+ switch ([self state]) {
+
+ case NSMixedState:
+
+ path = [[NSBezierPath alloc] init];
+ NSPoint pointsMixed[2];
+
+ pointsMixed[0] = NSMakePoint(NSMinX(innerRect) + 3, NSMidY(innerRect));
+ pointsMixed[1] = NSMakePoint(NSMaxX(innerRect) - 3, NSMidY(innerRect));
+
+ [path appendBezierPathWithPoints: pointsMixed count: 2];
+
+ if([self isEnabled]) {
+
+ [[NSColor colorWithDeviceRed: 0.749f green: 0.761f blue: 0.788f alpha: 0.7f] set];
+ } else {
+
+ [[NSColor colorWithDeviceRed: 0.749f green: 0.761f blue: 0.788f alpha: 0.7f] set];
+ }
+
+ [path setLineWidth: 2.0f];
+ [path stroke];
+
+ [path release];
+
+ break;
+
+ case NSOnState:
+
+ if(radio) {
+
+ if([self controlSize] == NSRegularControlSize) {
+
+ innerRect.origin.x += 4;
+ innerRect.origin.y += 4;
+ innerRect.size.width -= 8;
+ innerRect.size.height -= 8;
+
+ } else if([self controlSize] == NSSmallControlSize) {
+
+ innerRect.origin.x += 3.5f;
+ innerRect.origin.y += 3.5f;
+ innerRect.size.width -= 7;
+ innerRect.size.height -= 7;
+
+ } else {
+
+ innerRect.origin.x += 3;
+ innerRect.origin.y += 3;
+ innerRect.size.width -= 6;
+ innerRect.size.height -= 6;
+ }
+
+
+ path = [[NSBezierPath alloc] init];
+ [path appendBezierPathWithOvalInRect: innerRect];
+
+ if([self isEnabled]) {
+
+ [[NSColor colorWithDeviceRed: 0.749f green: 0.761f blue: 0.788f alpha: 0.7f] set];
+ } else {
+
+ [[NSColor colorWithDeviceRed: 0.749f green: 0.761f blue: 0.788f alpha: 0.7f] set];
+ }
+ [path fill];
+
+ [path release];
+ } else {
+
+ path = [[NSBezierPath alloc] init];
+ NSPoint pointsOn[4];
+
+ pointsOn[0] = NSMakePoint(NSMinX(innerRect) + 3, NSMidY(innerRect) - 2);
+ pointsOn[1] = NSMakePoint(NSMidX(innerRect), NSMidY(innerRect) + 2);
+ pointsOn[2] = NSMakePoint(NSMidX(innerRect), NSMidY(innerRect) + 2);
+ pointsOn[3] = NSMakePoint(NSMinX(innerRect) + NSWidth(innerRect) - 1, NSMinY(innerRect) - 2);
+
+ [path appendBezierPathWithPoints: pointsOn count: 4];
+
+ if([self isEnabled]) {
+
+ [[NSColor colorWithDeviceRed: 0.749f green: 0.761f blue: 0.788f alpha: 0.7f] set];
+ } else {
+
+ [[NSColor colorWithDeviceRed: 0.749f green: 0.761f blue: 0.788f alpha: 0.7f] set];
+ }
+
+ if([self controlSize] == NSMiniControlSize) {
+
+ [path setLineWidth: 1.5f];
+ } else {
+
+ [path setLineWidth: 2.0f];
+ }
+
+ [path stroke];
+
+ [path release];
+ }
+
+ break;
+ }
+
+ if([self imagePosition] != NSImageOnly) {
+
+ if([self attributedTitle]) {
+
+ [self drawTitle: [self attributedTitle] withFrame: textRect inView: [self controlView]];
+ }
+ }
+}
+
+-(void)drawRecessedButtonInFrame:(NSRect)frame {//This part is not implemented so good as the codes from Timothy Davis, but we do need that
+ NSRect textFrame;
+
+ //Adjust Rect so strokes are true and
+ //shadows are visible
+ frame.origin.x += .5f;
+ frame.origin.y += .5f;
+ frame.size.height -= 1;
+ frame.size.width -= 1;
+
+ //Adjust Rect based on ControlSize so that
+ //my controls match as closely to apples
+ //as possible.
+ switch ([self controlSize]) {
+ default: // Silence uninitialized variable warnings for textFrame fields.
+ case NSRegularControlSize:
+
+ frame.origin.x += 1;
+ frame.origin.y += 1;
+ frame.size.width -= 2;
+ frame.size.height -= 4;
+
+ textFrame = frame;
+ break;
+
+ case NSSmallControlSize:
+
+ frame.origin.x += 1;
+ frame.origin.y += 1;
+ frame.size.width -= 2;
+ frame.size.height -= 3;
+
+ textFrame = frame;
+ textFrame.origin.y += 1;
+ break;
+
+ case NSMiniControlSize:
+
+ frame.origin.y -= 1;
+
+ textFrame = frame;
+ textFrame.origin.y += 1;
+ break;
+ }
+ //Create Path
+ NSBezierPath *path = [[NSBezierPath alloc] init];
+
+ [path appendBezierPathWithArcWithCenter: NSMakePoint(NSMinX(frame) + BGCenterY(frame), NSMidY(frame) + 0.5f)
+ radius: BGCenterY(frame)
+ startAngle: 90
+ endAngle: 270];
+
+ [path appendBezierPathWithArcWithCenter: NSMakePoint(NSMaxX(frame) - BGCenterY(frame), NSMidY(frame) + 0.5f)
+ radius: BGCenterY(frame)
+ startAngle: 270
+ endAngle: 90];
+
+ [path closePath];
+
+ if([self isEnabled]) {
+ if([self state] == 1) {
+ [[NSColor colorWithDeviceRed: 0.941f green: 0.941f blue: 0.941f alpha: 0.7f] set];
+ [path fill];
+ isMouseIn = NO;
+ }
+ else {
+ if(isMouseIn){
+ [[NSColor colorWithDeviceRed: 0.941f green: 0.941f blue: 0.941f alpha: 0.7f] set];
+ [path fill];
+ }
+ else {
+ [[NSColor colorWithDeviceRed: 0.141f green: 0.141f blue: 0.141f alpha: 0.7f] set];
+ [path fill];
+ }
+ }
+ }
+ else {
+ [[NSColor colorWithDeviceRed: 0.141f green: 0.141f blue: 0.141f alpha: 0.2f] set];
+ }
+
+ [path release];
+
+ if([self imagePosition] != NSImageOnly) {
+ [self drawTitle: [self attributedTitle] withFrame: textFrame inView: [self controlView]];
+ }
+
+ if([self imagePosition] != NSNoImage) {
+ [self drawImage: [self image] withFrame: frame inView: [self controlView]];
+ }
+}
+
+- (void)mouseEntered:(NSEvent *)event{
+ if ([self bezelStyle] == NSRecessedBezelStyle) {
+ isMouseIn = YES;
+ [self setHighlighted:YES];
+ }
+}
+- (void)mouseExited:(NSEvent *)event{
+ if ([self bezelStyle] == NSRecessedBezelStyle) {
+ isMouseIn = NO;
+ [self setHighlighted:NO];
+ }
+}
+#pragma mark -
+#pragma mark Helper Methods
+
+-(void)dealloc {
+
+ [themeKey release];
+ [super dealloc];
+}
+
+-(void)setValue:(id) value forKey:(NSString *) key {
+
+ if([key isEqualToString: @"inspectedType"]) {
+
+ if([(NSNumber *)value intValue] == 2) {
+
+ buttonType = NSSwitchButton;
+ } else if([(NSNumber *)value intValue] == 3) {
+
+ buttonType = NSRadioButton;
+ } else {
+
+ buttonType = 0;
+ }
+ }
+
+ [super setValue: value forKey: key];
+}
+
+#pragma mark -
+
+@end