/*************************************************************************
 * Copyright (c) 2011 AT&T Intellectual Property 
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html
 *
 * Contributors: Details at http://www.graphviz.org/
 *************************************************************************/

#import "GVExportViewController.h"
#import "GVZGraph.h"

static NSMutableArray *_formatRenders = nil;

@implementation GVExportViewController

@synthesize URL = _url;
@synthesize render = _render;

+ (void)initialize
{
	if (!_formatRenders) {
		_formatRenders = [[NSMutableArray alloc] init];
		
		NSString *lastFormat = nil;
		NSMutableArray *lastRenders = nil;
		for (NSString *device in [GVZGraph pluginsWithAPI:API_device]) {
			NSArray *deviceComponents = [device componentsSeparatedByString:@":"];
			NSUInteger componentCount = [deviceComponents count];
			
			if (componentCount > 0) {
				NSString *format = [deviceComponents objectAtIndex:0];
				if (![lastFormat isEqualToString:format]) {
					lastFormat = format;
					lastRenders = [NSMutableArray array];
					[_formatRenders addObject:[NSDictionary dictionaryWithObjectsAndKeys:lastFormat, @"format", lastRenders, @"renders", nil]];
				}
			}
			
			if (componentCount > 1)
				[lastRenders addObject:[deviceComponents objectAtIndex:1]];
		}
	}
}

- (id)init
{
	if (self = [super initWithNibName:@"Export" bundle:nil]) {
		_panel = nil;
		_url = nil;
		
		_formatRender = nil;
		_render = nil;
		for (NSDictionary *formatRender in _formatRenders)
			if ([[formatRender objectForKey:@"format"] isEqualToString:@"pdf"]) {
				_formatRender = [formatRender retain];
				if ([[formatRender objectForKey:@"renders"] containsObject:@"quartz"])
					_render = @"quartz";
				break;
			}
	}
	return self;
}

- (NSArray *)formatRenders
{
	return _formatRenders;
}

- (NSString *)device
{
	NSString *format = [_formatRender objectForKey:@"format"];
	return _render ? [NSString stringWithFormat:@"%@:%@", format, _render] : format;
}

- (NSDictionary *)formatRender
{
	return _formatRender;
}

- (void)setFormatRender:(NSDictionary *)formatRender
{
	if (_formatRender != formatRender) {
		[_formatRender release];
		_formatRender = [formatRender retain];
		
		/* force save panel to use this file type */
		[_panel setAllowedFileTypes:[NSArray arrayWithObject:[_formatRender objectForKey:@"format"]]];
		
		/* remove existing render if it's not compatible with format */
		if (![[_formatRender objectForKey:@"renders"] containsObject:_render])
			[self setRender:nil];
	}
}

- (void)beginSheetModalForWindow:(NSWindow *)window modalDelegate:(id)modalDelegate didEndSelector:(SEL)selector
{
	/* remember to invoke end selector on the modal delegate */
	NSInvocation *endInvocation = [NSInvocation invocationWithMethodSignature:[modalDelegate methodSignatureForSelector:selector]];
	[endInvocation setTarget:modalDelegate];
	[endInvocation setSelector:selector];
	[endInvocation setArgument:&self atIndex:2];
	[endInvocation retain];

	_panel = [NSSavePanel savePanel];
	[_panel setAccessoryView:[self view]];
	[_panel setAllowedFileTypes:[NSArray arrayWithObject:[_formatRender objectForKey:@"format"]]];
	[_panel setDirectoryURL:[_url URLByDeletingLastPathComponent]];
	[_panel setNameFieldStringValue:[_url lastPathComponent]];
	[_panel beginSheetModalForWindow:window completionHandler:^(NSInteger result) {
		if (result == NSOKButton) {
			NSURL *url = [_panel URL];
			if (_url != url) {
				[_url release];
				_url = [url retain];
			}

			/* invoke the end selector on the modal delegate */
			[endInvocation invoke];
		}

		[endInvocation release];
		[_panel setAccessoryView:nil];
		_panel = nil;
	}];
}

- (void)dealloc
{
	[_panel release];
	[_url release];
	[_formatRender release];
	[_render release];
	[super dealloc];
}

@end
