//
//  SplitViewController.m
//  Cog
//
//  Created by Vincent Spader on 6/20/08.
//  Copyright 2008 __MyCompanyName__. All rights reserved.
//

#import "SideViewController.h"

@implementation SideViewController

- (NSString *)showSideViewDefaultsKey
{
	return [NSString stringWithFormat:@"%@ShowSideView", [self nibName]];
}

- (NSString *)sideViewVerticalDefaultsKey
{
	return [NSString stringWithFormat:@"%@SideViewVertical", [self nibName]];
}

- (NSString *)sideViewDividerPositionDefaultsKey
{
	return [NSString stringWithFormat:@"%@SideViewDividerPosition", [self nibName]];
}

- (void)registerDefaults
{
	NSMutableDictionary *userDefaultsValuesDict = [NSMutableDictionary dictionary];
	
	[userDefaultsValuesDict setObject:[NSNumber numberWithBool:YES] forKey:[self sideViewVerticalDefaultsKey]];
	[userDefaultsValuesDict setObject:[NSNumber numberWithBool:NO] forKey:[self showSideViewDefaultsKey]];
	[userDefaultsValuesDict setObject:[NSNumber numberWithFloat:100.0] forKey:[self sideViewDividerPositionDefaultsKey]];
	
	[[NSUserDefaults standardUserDefaults] registerDefaults:userDefaultsValuesDict];
}

- (id)initWithNibName:(NSString *)nib bundle:(NSBundle *)bundle
{
	self = [super initWithNibName:nib bundle:bundle];
	if (self)
	{
		[self registerDefaults];
	}
	
	return self;
}


- (void)awakeFromNib
{
	if ([[NSUserDefaults standardUserDefaults] boolForKey:[self showSideViewDefaultsKey]])
	{
		[self showSideView];
	}
	
	if (![[NSUserDefaults standardUserDefaults] boolForKey:[self sideViewVerticalDefaultsKey]])
	{
		[self toggleVertical:self];
	}
}

- (IBAction)toggleSideView:(id)sender
{
	//Show/hide current
	if ([self sideViewIsHidden])
	{
		[self showSideView];
	}
	else
	{
		[self hideSideView];
	}
	
	[splitView adjustSubviews];
}

- (IBAction)toggleVertical:(id)sender
{
	[splitView setVertical:![splitView isVertical]];
	
	if (![self sideViewIsHidden])
	{
		[self showSideView];
	}
	
	[splitView adjustSubviews];
	
	[[NSUserDefaults standardUserDefaults] setBool:[splitView isVertical] forKey:[self sideViewVerticalDefaultsKey]];
}

- (void)showSideView
{
	if ([splitView isVertical]) {
		[splitView setSubviews:[NSArray arrayWithObjects:[self view], mainView, nil]];
	}
	else {
		[splitView setSubviews:[NSArray arrayWithObjects:mainView, [self view], nil]];
	}
	
	[self setDividerPosition: [[NSUserDefaults standardUserDefaults] floatForKey:[self sideViewDividerPositionDefaultsKey]]];
	
	[[[self view] window] makeFirstResponder:firstResponder];
	
	[[NSUserDefaults standardUserDefaults] setBool:YES forKey:[self showSideViewDefaultsKey]];
}

- (void)hideSideView
{
	[splitView setSubviews:[NSArray arrayWithObject:mainView]];
	[[NSUserDefaults standardUserDefaults] setBool:NO forKey:[self showSideViewDefaultsKey]];
	
	[[mainView window] makeFirstResponder:mainView];
}

- (BOOL)sideViewIsHidden
{
	return ([[splitView subviews] count] == 1);
}

- (BOOL)splitView:(NSSplitView *)aSplitView canCollapseSubview:(NSView *)subview
{
	return (subview != mainView);
}


- (BOOL)splitView:(NSSplitView *)aSplitView shouldCollapseSubview:(NSView *)subview forDoubleClickOnDividerAtIndex:(NSInteger)dividerIndex
{
	return (subview != mainView);
}

- (void)splitViewDidResizeSubviews:(NSNotification *)aNotification
{
	//Update default
	if (![self sideViewIsHidden])
	{
		[[NSUserDefaults standardUserDefaults] setFloat:[self dividerPosition] forKey:[self sideViewDividerPositionDefaultsKey]];
		NSLog(@"DIVIDER POSITION: %f", [self dividerPosition]);
	}
}

- (void)splitView:(NSSplitView *)sender resizeSubviewsWithOldSize: (NSSize)oldSize
{
	if ([self sideViewIsHidden])
	{
		[splitView adjustSubviews];
	}
	else
	{
		CGFloat dividerThickness = [splitView dividerThickness];
		
		NSRect sideRect = [[self view] frame];
		NSRect mainRect = [mainView frame];
		
		NSRect newFrame = [splitView frame];
		
		if ([splitView isVertical])
		{
			sideRect.size.width = [[NSUserDefaults standardUserDefaults] floatForKey:[self sideViewDividerPositionDefaultsKey]];
			sideRect.size.height = newFrame.size.height;
			sideRect.origin = NSMakePoint(0, 0);
			
			mainRect.size.width = newFrame.size.width - sideRect.size.width - dividerThickness;
			mainRect.size.height = newFrame.size.height;
			mainRect.origin.x = sideRect.size.width + dividerThickness;
		}
		else
		{
			sideRect.size.height = [[NSUserDefaults standardUserDefaults] floatForKey:[self sideViewDividerPositionDefaultsKey]];
			sideRect.size.width = newFrame.size.width;
			
			mainRect.origin = NSMakePoint(0, 0);
			mainRect.size.width = newFrame.size.width;
			mainRect.size.height = newFrame.size.height - sideRect.size.height - dividerThickness;
			
			sideRect.origin.y = mainRect.size.height + dividerThickness;
		}
		
		
		[[self view] setFrame:sideRect];
		[mainView setFrame:mainRect];
	}
}

- (float)dividerPosition
{
	if ([splitView isVertical])
	{
		return [[self view] frame].size.width;
	}
	
	return [[self view] frame].size.height;
}

- (void)setDividerPosition:(float)position
{
	float actualPosition = position;
	if (![splitView isVertical])
	{
		actualPosition = ([splitView frame].size.height - position);
	}
	
	[splitView adjustSubviews];
	[splitView setPosition:actualPosition ofDividerAtIndex:0];
	
	[[NSUserDefaults standardUserDefaults] setFloat:position forKey:[self sideViewDividerPositionDefaultsKey]];
}


@end