//************************************************************************
//
//	OICNSTableHeaderCell.m
//
//	by Juergen Moellenhoff <jm@oic.de>		
//
//
//	This code is supplied "as is" the author makes no warranty as to its 
//	suitability for any purpose.  This code is free and may be distributed 
//	in accordance with the terms of the:
//		
//			GNU GENERAL PUBLIC LICENSE
//			Version 2, June 1991
//			copyright (C) 1989, 1991 Free Software Foundation, Inc.
// 			675 Mass Ave, Cambridge, MA 02139, USA
//
//************************************************************************

#import "OICNSTableHeaderCell.h"

#import	<AppKit/AppKit.h>

static NSString	*OICHigh =		@"OICHigh";
static NSString	*OICLow =		@"OICLow";
static NSString	*OICNoOrder =	@"OICNoOrder";

#define	OICNSTABLEHEADERCELL_CURRENT_VERSION	3

@implementation OICNSTableHeaderCell

//
// Private Methods
//
- _createImageCell
{
	NSButtonCell		*cell;

	cell = [[NSButtonCell alloc] initImageCell:[NSImage imageNamed:OICNoOrder]];
	[cell setBordered:YES];
	[cell setImagePosition:NSImageOnly];
	[cell setButtonType:NSMomentaryPushButton];

	return [cell autorelease];
}

- (void)_finishInitializing
{
	NSString	*pathForResource;
	NSBundle	*bundle;	
	NSImage		*image;

	bundle = [NSBundle bundleForClass:[self class]];

	if ([NSImage imageNamed:OICHigh] == nil)
	{
		pathForResource = [bundle pathForResource:OICHigh ofType:@"tiff"];
		image = [[NSImage alloc] initByReferencingFile:pathForResource];
		[image setName:OICHigh];
	}

	if ([NSImage imageNamed:OICLow] == nil)
	{
		pathForResource = [bundle pathForResource:OICLow ofType:@"tiff"];
		image = [[NSImage alloc] initByReferencingFile:pathForResource];
		[image setName:OICLow];
	}

	if ([NSImage imageNamed:OICNoOrder] == nil)
	{
		pathForResource = [bundle pathForResource:OICNoOrder ofType:@"tiff"];
		image = [[NSImage alloc] initByReferencingFile:pathForResource];
		[image setName:OICNoOrder];
	}
}

//
// Public methods
//

//
// This bumps the class version so that we can compatibly read
// old objects out of an archive.
//
+ (void)initialize
{
	if (self == [OICNSTableHeaderCell class])
		[OICNSTableHeaderCell setVersion:OICNSTABLEHEADERCELL_CURRENT_VERSION];
}

//
// Init
//
- initTextCell:(NSString *)aString
{
	[super initTextCell:aString];

	// Set the ButtonCell for the image
	[self setOrderingCell:[self _createImageCell]];
	
	// finish initializing :-)
	[self _finishInitializing];

	// Set the default sort order
	[self setOrdering:NSOrderedSame];
	
	return self;
}

//
// Destroy
//
- (void)dealloc
{
	if (_orderingCell != nil)
	{
		[_orderingCell release];
		_orderingCell = nil;
	}

	[super dealloc]; 
}

//
// NSCoding protocol
//
- (id)initWithCoder:(NSCoder *)aDecoder
{
	unsigned			version;
	NSComparisonResult	tempOrdering;

	[super initWithCoder:aDecoder];

	version = [aDecoder versionForClassName:@"OICNSTableHeaderCell"];	
	if (version < OICNSTABLEHEADERCELL_CURRENT_VERSION)
	{
		id dummy;
	
		if (version == 2)
		{	
			// read code for old version
			dummy = [aDecoder decodeObject];
			[aDecoder decodeValueOfObjCType:@encode(typeof(tempOrdering)) at:&tempOrdering];
		}
		else
		{	
			// read code for old version
			dummy = [aDecoder decodeObject];
			tempOrdering = NSOrderedSame;
		}
	}
	else
	{
		// read code for current version
		[aDecoder decodeValueOfObjCType:@encode(typeof(tempOrdering)) at:&tempOrdering];
	}

	// Set the ButtonCell for the image
	[self setOrderingCell:[self _createImageCell]];
	
	// finish initializing :-)
	[self _finishInitializing];

	// Set the sort order
	[self setOrdering:tempOrdering];

	return self;
}

//
// NSCoding protocol
//
- (void)encodeWithCoder:(NSCoder *)aCoder
{
	[super encodeWithCoder:aCoder];

	// It is not really necessary to encode this variable, 
	// but maybe I need it later for something... who knows...
	[aCoder encodeValueOfObjCType:@encode(typeof(_ordering)) at:&_ordering];
}

//
// NSCopying protocol
//
- copyWithZone:(NSZone *)z
{
	OICNSTableHeaderCell	*theCopy;
	
	theCopy = [super copyWithZone:z];

	// Important!! I must clear the
	// variable, before I can use it.
	theCopy->_orderingCell = nil;

	// Now I can set the value.
	[theCopy setOrderingCell:[self _createImageCell]];
	[theCopy setOrdering:[self ordering]];

	return theCopy;
}

//
// Display
//
- (void)drawInteriorWithFrame:(NSRect)cellFrame inView:(NSView *)controlView
{
	NSRect	aNewRect;
	
	aNewRect = cellFrame;
	aNewRect.size.width -= aNewRect.size.height;
	
	[super drawInteriorWithFrame:aNewRect inView:controlView];

	aNewRect.origin.x = aNewRect.origin.x + aNewRect.size.width + 1.0;
	aNewRect.size.width = aNewRect.size.height;
	
	// Draw the ordering image
	[[self orderingCell] drawWithFrame:aNewRect inView:controlView];
}

//
// Get/Set methods
//

- (void)setOrderingCell:theCell
{
	if (_orderingCell == theCell)
		return;

	[_orderingCell release];
	_orderingCell = nil;

	_orderingCell = [theCell retain];
}	

- orderingCell
{
	return _orderingCell;
}

- (void)setOrdering:(NSComparisonResult)newOrdering
{
	NSString	*imageName = nil;
	
	_ordering = newOrdering;
	switch(_ordering)
	{
	case NSOrderedAscending:
		imageName = OICHigh;
		break;

	case NSOrderedDescending:
		imageName = OICLow;
		break;

	case NSOrderedSame:
	default:
		imageName = OICNoOrder;
		break;
	}
	
	[[self orderingCell] setImage:[NSImage imageNamed:imageName]];
}

- (NSComparisonResult)ordering
{
	return _ordering;
}

@end
