ImageAndTextCell.m   [plain text]


/*
	 File:		 ImageAndTextCell.m
 
	 Contains:	 Subclass of NSTextFieldCell which can display text and an image simultaneously.
 
	 Version:	 Technology: Mac OS X
				 Release:	 Mac OS X
 
	 Copyright:	 (c) 2002-2003 by Apple Computer, Inc., all rights reserved
 
	 Bugs?:		 For bug reports, consult the following page on
				 the World Wide Web:
 
					 http://developer.apple.com/bugreporter/
*/

/*
 * IMPORTANT:  This Apple software is supplied to you by Apple Computer, Inc. (“Apple”) in 
 * consideration of your agreement to the following terms, and your use, installation, 
 * modification or redistribution of this Apple software constitutes acceptance of these
 * terms.  If you do not agree with these terms, please do not use, install, modify or 
 * redistribute this Apple software.
 *
 * In consideration of your agreement to abide by the following terms, and subject to these 
 * terms, Apple grants you a personal, non exclusive license, under Apple’s copyrights in this 
 * original Apple software (the “Apple Software”), to use, reproduce, modify and redistribute 
 * the Apple Software, with or without modifications, in source and/or binary forms; provided 
 * that if you redistribute the Apple Software in its entirety and without modifications, you 
 * must retain this notice and the following text and disclaimers in all such redistributions 
 * of the Apple Software.  Neither the name, trademarks, service marks or logos of Apple 
 * Computer, Inc. may be used to endorse or promote products derived from the Apple Software 
 * without specific prior written permission from Apple. Except as expressly stated in this 
 * notice, no other rights or licenses, express or implied, are granted by Apple herein, 
 * including but not limited to any patent rights that may be infringed by your derivative 
 * works or by other works in which the Apple Software may be incorporated.
 * 
 * The Apple Software is provided by Apple on an "AS IS" basis.  APPLE MAKES NO WARRANTIES, 
 * EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED WARRANTIES OF NON-
 * INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, REGARDING THE APPLE 
 * SOFTWARE OR ITS USE AND OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS. 
 *
 * IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR CONSEQUENTIAL 
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS 
 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, 
 * REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVER CAUSED AND 
 * WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR 
 * OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */


//—————————————————————————————————————————————————————————————————————————————
//	Includes
//—————————————————————————————————————————————————————————————————————————————

#import "ImageAndTextCell.h"


//—————————————————————————————————————————————————————————————————————————————
//	Constants
//—————————————————————————————————————————————————————————————————————————————

#define kSlop		3


@implementation ImageAndTextCell


//—————————————————————————————————————————————————————————————————————————————
//	dealloc
//—————————————————————————————————————————————————————————————————————————————

- ( void ) dealloc
{
	
	[ image release ];
	image = nil;
	[ super dealloc ];
	
}


//—————————————————————————————————————————————————————————————————————————————
//	copyWithZone:
//—————————————————————————————————————————————————————————————————————————————

- copyWithZone: ( NSZone * ) zone
{
	
	ImageAndTextCell *	cell = ( ImageAndTextCell * ) [ super copyWithZone: zone ];
	
	cell->image = [ image retain ];
	
	return cell;
	
}


//—————————————————————————————————————————————————————————————————————————————
//	setImage:
//—————————————————————————————————————————————————————————————————————————————

- ( void ) setImage: ( NSImage * ) anImage
{
	
	if ( anImage != image )
	{
		
		[ image release ];
		image = [ anImage retain ];
		
	}
	
}


//—————————————————————————————————————————————————————————————————————————————
//	image:
//—————————————————————————————————————————————————————————————————————————————

- ( NSImage * ) image
{
	return [ [ image retain ] autorelease ];
}


//—————————————————————————————————————————————————————————————————————————————
//	imageFrameForCellFrame:
//—————————————————————————————————————————————————————————————————————————————

/*- ( NSRect ) imageFrameForCellFrame: ( NSRect ) cellFrame
{
	
	NSRect	rect		= NSZeroRect;
	int		textHeight	= floor ( [ [ self font ] ascender] - [ [ self font ] descender ] );
	
	if ( image != nil )
	{
		
		rect.size			= cellFrame.size;
		rect.size.height	-= textHeight;
		rect.size.width		-= kSlop;
		rect.origin			= cellFrame.origin;
		rect.origin.x 		+= kSlop;
		rect.origin.y 		+= textHeight;
		
	}
	
	return rect;
	
}
*/

//—————————————————————————————————————————————————————————————————————————————
//	editWithFrame:
//—————————————————————————————————————————————————————————————————————————————

- ( void ) editWithFrame: ( NSRect ) aRect
				  inView: ( NSView * ) controlView
				  editor: ( NSText * ) textObj
				delegate: ( id ) anObject
				   event: ( NSEvent * ) theEvent
{
	
	NSRect	textFrame	= NSZeroRect;
	NSRect	imageFrame	= NSZeroRect;
	int		textHeight	= floor ( [ [ self font ] ascender] - [ [ self font ] descender ] );
	
	NSDivideRect ( aRect, &textFrame, &imageFrame, textHeight, NSMinYEdge );
	
	[ super editWithFrame: textFrame
				   inView: controlView
				   editor: textObj
				 delegate: anObject
				 	event: theEvent ];
	
}


//—————————————————————————————————————————————————————————————————————————————
//	selectWithFrame:
//—————————————————————————————————————————————————————————————————————————————

- ( void ) selectWithFrame: ( NSRect ) aRect
					inView: ( NSView * ) controlView
					editor: ( NSText * ) textObj
				  delegate: ( id ) anObject
				  	 start: ( int ) selStart
				  	length: ( int ) selLength
{
	
	NSRect	textFrame;
	NSRect	imageFrame;
	int		textHeight	= floor ( [ [ self font ] ascender] - [ [ self font ] descender ] );
	
	NSDivideRect ( aRect, &textFrame, &imageFrame, textHeight, NSMinYEdge );
	
	[ super selectWithFrame: textFrame
					 inView: controlView
					 editor: textObj
				   delegate: anObject
					  start: selStart
					 length: selLength ];
	
}


//—————————————————————————————————————————————————————————————————————————————
//	drawWithFrame:
//—————————————————————————————————————————————————————————————————————————————

- ( void ) drawWithFrame: ( NSRect ) cellFrame
				  inView: ( NSView * ) controlView
{

	NSRect	textFrame;
	
	if ( image != nil )
	{
		
		NSRect	imageFrame;
		int		textHeight	= floor ( [ [ self font ] ascender] - [ [ self font ] descender ] );
		BOOL	isFlipped = [ controlView isFlipped ];
		
		NSDivideRect ( cellFrame, &textFrame, &imageFrame, textHeight, NSMinYEdge );
		
		if ( isFlipped )
		{
			
			textFrame.origin.y = cellFrame.size.height - textFrame.origin.y - 2 * textHeight;
			imageFrame.origin.y = cellFrame.size.height - imageFrame.origin.y - textHeight;
			
		}
		
		if ( [ self drawsBackground ] )
		{
			
			[ [ self backgroundColor ] set ];
			NSRectFill ( imageFrame );
			
		}
		
		[ image compositeToPoint: imageFrame.origin operation: NSCompositeSourceOver ];
		
	}
	
	[ super drawWithFrame: textFrame inView: controlView ];
	
}


//—————————————————————————————————————————————————————————————————————————————
//	cellSize
//—————————————————————————————————————————————————————————————————————————————

- ( NSSize ) cellSize
{
	
	NSSize	cellSize = [ super cellSize ];
	cellSize.width += ( image ? [ image size ].width : 0 ) + kSlop;
	
	return cellSize;
	
}


@end