//
//  SPQueryConsole.m
//  sequel-pro
//
//  Created by Stuart Connolly (stuconnolly.com) on Jan 30, 2009
//
//  This program is free software; you can redistribute it and/or modify
//  it under the terms of the GNU General Public License as published by
//  the Free Software Foundation; either version 2 of the License, or
//  (at your option) any later version.
//
//  This program is distributed in the hope that it will be useful,
//  but WITHOUT ANY WARRANTY; without even the implied warranty of
//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//  GNU General Public License for more details.
//
//  You should have received a copy of the GNU General Public License
//  along with this program; if not, write to the Free Software
//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
//
//  More info at <http://code.google.com/p/sequel-pro/>

#import "SPQueryConsole.h"

#define DEFAULT_CONSOLE_LOG_FILENAME @"untitled"
#define DEFAULT_CONSOLE_LOG_FILE_EXTENSION @"log"

#define CONSOLE_WINDOW_AUTO_SAVE_NAME @"QueryConsole"

@interface SPQueryConsole (PrivateAPI)

- (void)_appendMessageToConsole:(NSString *)message withColor:(NSColor *)color;

@end

@implementation SPQueryConsole

// -------------------------------------------------------------------------------
// awakeFromNib
//
// Set the window's auto save name.
// -------------------------------------------------------------------------------
- (void)awakeFromNib
{
	[self setWindowFrameAutosaveName:CONSOLE_WINDOW_AUTO_SAVE_NAME];
}

// -------------------------------------------------------------------------------
// clearConsole:
//
// Clears the console by setting its displayed text to an empty string.
// -------------------------------------------------------------------------------
- (IBAction)clearConsole:(id)sender
{
	[consoleTextView setString:@""];
}

// -------------------------------------------------------------------------------
// saveConsoleAs:
//
// Presents the user with a save panel to the save the current console to a log file.
// -------------------------------------------------------------------------------
- (IBAction)saveConsoleAs:(id)sender
{
	NSSavePanel *panel = [NSSavePanel savePanel];
	
	[panel setRequiredFileType:DEFAULT_CONSOLE_LOG_FILE_EXTENSION];
	
	[panel setExtensionHidden:NO];
	[panel setAllowsOtherFileTypes:YES];
	[panel setCanSelectHiddenExtension:YES];
	
	[panel beginSheetForDirectory:nil file:DEFAULT_CONSOLE_LOG_FILENAME modalForWindow:[self window] modalDelegate:self didEndSelector:@selector(savePanelDidEnd:returnCode:contextInfo:) contextInfo:NULL];
}

// -------------------------------------------------------------------------------
// showMessageInConsole:
//
// Shows the supplied message in the console.
// -------------------------------------------------------------------------------
- (void)showMessageInConsole:(NSString *)message
{
	[self _appendMessageToConsole:message withColor:[NSColor blackColor]];
}

// -------------------------------------------------------------------------------
// showErrorInConsole:
//
// Shows the supplied error in the console.
// -------------------------------------------------------------------------------
- (void)showErrorInConsole:(NSString *)error
{
	[self _appendMessageToConsole:error	withColor:[NSColor redColor]];
}

// -------------------------------------------------------------------------------
// consoleTextView
//
// Return a reference to the console's text view.
// -------------------------------------------------------------------------------
- (NSTextView *)consoleTextView
{
	return consoleTextView;
}

// -------------------------------------------------------------------------------
// savePanelDidEnd:returnCode:contextInfo:
//
// Called when the NSSavePanel sheet ends.
// -------------------------------------------------------------------------------
- (void)savePanelDidEnd:(NSSavePanel *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo
{
	if (returnCode == NSOKButton) {
		[[[consoleTextView textStorage] string] writeToFile:[sheet filename] atomically:YES encoding:NSUTF8StringEncoding error:NULL];
	}
}

@end

@implementation SPQueryConsole (PrivateAPI)

// -------------------------------------------------------------------------------
// _appendMessageToConsole:withColor:
//
// Appeds the supplied string to the query console, coloring the text using the 
// supplied color.
// -------------------------------------------------------------------------------
- (void)_appendMessageToConsole:(NSString *)message withColor:(NSColor *)color
{
	int begin, end;
	
	// Set the selected range of the text view to be the very last character
	[consoleTextView setSelectedRange:NSMakeRange([[consoleTextView string] length], 0)];
	begin = [[consoleTextView string] length];
	
	// Apped the message to the current text storage using the text view's current typing attributes
	[[consoleTextView textStorage] appendAttributedString:[[NSAttributedString alloc] initWithString:message attributes:[consoleTextView typingAttributes]]];
	end = [[consoleTextView string] length];
	
	// Color the text we just added
	[consoleTextView setTextColor:color range:NSMakeRange(begin, (end - begin))];

	// Scroll to the text we just added
	[consoleTextView scrollRangeToVisible:[consoleTextView selectedRange]];
}

@end