//
//  SUStatusController.m
//  Sparkle
//
//  Created by Andy Matuschak on 3/14/06.
//  Copyright 2006 Andy Matuschak. All rights reserved.
//

#import "SUUpdater.h"

#import "SUAppcast.h"
#import "SUAppcastItem.h"
#import "SUVersionComparisonProtocol.h"
#import "SUStatusController.h"
#import "SUHost.h"


@implementation SUStatusController

- (id)initWithHost:(SUHost *)aHost
{
	self = [super initWithHost:aHost windowNibName:@"SUStatus"];
	if (self)
	{
		host = [aHost retain];
		[self setShouldCascadeWindows:NO];
	}
	return self;
}

- (void)dealloc
{
	[host release];
	[title release];
	[statusText release];
	[buttonTitle release];
	[super dealloc];
}

- (NSString *)description { return [NSString stringWithFormat:@"%@ <%@, %@>", [self class], [host bundlePath], [host installationPath]]; }

- (void)awakeFromNib
{
    if ([host isBackgroundApplication]) {
        [[self window] setLevel:NSFloatingWindowLevel];
    }
    
	[[self window] center];
	[[self window] setFrameAutosaveName:@"SUStatusFrame"];
	[progressBar setUsesThreadedAnimation:YES];
}

- (NSString *)windowTitle
{
	return [NSString stringWithFormat:SULocalizedString(@"Updating %@", nil), [host name]];
}

- (NSImage *)applicationIcon
{
	return [host icon];
}

- (void)beginActionWithTitle:(NSString *)aTitle maxProgressValue:(double)aMaxProgressValue statusText:(NSString *)aStatusText
{
	[self willChangeValueForKey:@"title"];
	title = [aTitle copy];
	[self didChangeValueForKey:@"title"];
	
	[self setMaxProgressValue:aMaxProgressValue];
	[self setStatusText:aStatusText];
}

- (void)setButtonTitle:(NSString *)aButtonTitle target: (id)target action:(SEL)action isDefault:(BOOL)isDefault
{
	[self willChangeValueForKey:@"buttonTitle"];
	if (buttonTitle != aButtonTitle)
	{
		[buttonTitle release];
		buttonTitle = [aButtonTitle copy];
	}
	[self didChangeValueForKey:@"buttonTitle"];	
	
	[self window];
	[actionButton sizeToFit];
	// Except we're going to add 15 px for padding.
	[actionButton setFrameSize:NSMakeSize([actionButton frame].size.width + 15, [actionButton frame].size.height)];
	// Now we have to move it over so that it's always 15px from the side of the window.
	[actionButton setFrameOrigin:NSMakePoint([[self window] frame].size.width - 15 - [actionButton frame].size.width, [actionButton frame].origin.y)];	
	// Redisplay superview to clean up artifacts
	[[actionButton superview] display];
	
	[actionButton setTarget:target];
	[actionButton setAction:action];
	[actionButton setKeyEquivalent:isDefault ? @"\r" : @""];
	
	// 06/05/2008 Alex: Avoid a crash when cancelling during the extraction
	[self setButtonEnabled: (target != nil)];
}

- (BOOL)progressBarShouldAnimate
{
	return YES;
}

- (void)setButtonEnabled:(BOOL)enabled
{
	[actionButton setEnabled:enabled];
}

- (double)progressValue
{
	return progressValue;
}

- (void)setProgressValue:(double)value
{
	progressValue = value;
}

- (double)maxProgressValue
{
	return maxProgressValue;
}

- (void)setMaxProgressValue:(double)value
{
	if (value < 0.0) value = 0.0;
	maxProgressValue = value;
	[self setProgressValue:0.0];
	[progressBar setIndeterminate:(value == 0.0)];
	[progressBar startAnimation:self];
	[progressBar setUsesThreadedAnimation: YES];
}

- (void)setStatusText:(NSString *)aStatusText
{
	if (statusText != aStatusText)
	{
		[statusText release];
		statusText = [aStatusText copy];
	}
}

@end