File: programming/cocoa/UKDockableView.zip/UKDockableWindow/NSBezierPathRoundRects.m


//
//  NSBezierPathRoundRects.m
//  UKDockableWindow
//
//  Created by Uli Kusterer on Wed Feb 04 2004.
//  Based on code by John C. Randolph.
//  Copyright (c) 2004 M. Uli Kusterer. All rights reserved.
//
 
#import "NSBezierPathRoundRects.h"
 
 
@implementation NSBezierPath (RoundRects)
 
+(void)		fillRoundRectInRect:(NSRect)rect radius:(float) radius
{
	NSBezierPath*   p = [self bezierPathWithRoundRectInRect: rect radius: radius];
	[p fill];
}
 
 
+(void)		strokeRoundRectInRect:(NSRect)rect radius:(float) radius
{
	NSBezierPath*   p = [self bezierPathWithRoundRectInRect: rect radius: radius];
	[p stroke];
}
 
 
 
// -----------------------------------------------------------------------------
//	bezierPathWithRoundRectInRect:radius:
//		This method adds the traditional Macintosh rounded-rectangle to
//		NSBezierPath's repertoire.
//
//	REVISIONS:
//		2004-02-04	witness	Created.
// -----------------------------------------------------------------------------
 
+(NSBezierPath*)	bezierPathWithRoundRectInRect:(NSRect)rect radius:(float) radius
{
	// Make sure radius doesn't exceed a maximum size to avoid artifacts:
	if( radius >= (rect.size.height /2) )
		radius = truncf(rect.size.height /2) -1;
	if( radius >= (rect.size.width /2) )
		radius = truncf(rect.size.width /2) -1;
	
	// Make sure silly values simply lead to un-rounded corners:
	if( radius <= 0 )
		return [self bezierPathWithRect: rect];
	
	// Now draw our rectangle:
	NSRect			innerRect = NSInsetRect( rect, radius, radius );	// Make rect with corners being centers of the corner circles.
	NSBezierPath	*path = [self bezierPath];
 
	[path moveToPoint: NSMakePoint(rect.origin.x,rect.origin.y +radius)];
 
	// Bottom left (origin):
	[path appendBezierPathWithArcWithCenter: UKBottomLeftOfRect(innerRect)
							radius: radius startAngle: 180.0 endAngle: 270.0 ];
	[path relativeLineToPoint: NSMakePoint(NSWidth(innerRect), 0.0) ];		// Bottom edge.
 
	// Bottom right:
	[path appendBezierPathWithArcWithCenter: UKBottomRightOfRect(innerRect)
							radius: radius startAngle: 270.0 endAngle: 360.0 ];
	[path relativeLineToPoint: NSMakePoint(0.0, NSHeight(innerRect)) ];		// Right edge.
 
	// Top right:
	[path appendBezierPathWithArcWithCenter: UKTopRightOfRect(innerRect)  
							radius: radius startAngle: 0.0  endAngle: 90.0 ];
	[path relativeLineToPoint: NSMakePoint( -NSWidth(innerRect), 0.0) ];	// Top edge.
 
	// Top left:
	[path appendBezierPathWithArcWithCenter: UKTopLeftOfRect(innerRect)
							radius: radius startAngle: 90.0  endAngle: 180.0 ];
 
	[path closePath];   // Implicitly causes left edge.
 
	return path;
}
 
 
NSPoint  UKCenterOfRect( NSRect rect )
{
	return NSMakePoint( NSMidX(rect), NSMidY(rect) );
}
 
NSPoint  UKTopCenterOfRect( NSRect rect )
{
	return NSMakePoint( NSMidX(rect), NSMaxY(rect) );
}
 
NSPoint  UKTopLeftOfRect( NSRect rect )
{
	return NSMakePoint( NSMinX(rect),NSMaxY(rect) );
}
 
NSPoint  UKTopRightOfRect( NSRect rect )
{
	return NSMakePoint( NSMaxX(rect), NSMaxY(rect) );
}
 
NSPoint  UKLeftCenterOfRect( NSRect rect )
{
	return NSMakePoint( NSMinX(rect), NSMidY(rect) );
}
 
NSPoint  UKBottomCenterOfRect( NSRect rect )
{
	return NSMakePoint( NSMidX(rect), NSMinY(rect) );
}
 
NSPoint  UKBottomLeftOfRect( NSRect rect )
{
	return rect.origin;
}
 
NSPoint  UKBottomRightOfRect( NSRect rect )
{
	return NSMakePoint( NSMaxX(rect), NSMinY(rect) );
}
 
NSPoint  UKRightCenterOfRect( NSRect rect )
{
	return NSMakePoint( NSMaxX(rect), NSMidY(rect) );
}
 
 
@end

This code uses the PclZip Zip File reading code, which is subject to the GNU LGPL. It also uses the GeSHi syntax highlighter, subject to the GPL. Ask if you want this for your own web site, it's free.