//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose: 
// This class is a message box that has two buttons, ok and cancel instead of
// just the ok button of a message box. We use a message box class for the ok button
// and implement another button here.
//
// $NoKeywords: $
//=============================================================================//

#include <vgui/KeyCode.h>
#include <vgui/ISurface.h>

#include <vgui_controls/QueryBox.h>
#include <vgui_controls/TextImage.h>

// memdbgon must be the last include file in a .cpp file!!!
#include <tier0/memdbgon.h>

#ifndef max
#define max(a,b)            (((a) > (b)) ? (a) : (b))
#endif

using namespace vgui;

//-----------------------------------------------------------------------------
// Purpose: Constructor
//-----------------------------------------------------------------------------
QueryBox::QueryBox(const char *title, const char *queryText, vgui::Panel *parent) : MessageBox(title, queryText,parent)
{
	SetDeleteSelfOnClose(true);
	m_pCancelButton = new Button(this, "CancelButton", "#QueryBox_Cancel");
	m_pCancelButton->SetCommand("Cancel"); 
	m_pOkButton->SetCommand("OK");
	m_pCancelCommand = NULL;
	m_pOkCommand = NULL;

	m_pOkButton->SetTabPosition(1);
	m_pCancelButton->SetTabPosition(2);
}

//-----------------------------------------------------------------------------
// Purpose: Constructor
//-----------------------------------------------------------------------------
QueryBox::QueryBox(const wchar_t *wszTitle, const wchar_t *wszQueryText,vgui::Panel *parent) : MessageBox(wszTitle, wszQueryText,parent)
{
	SetDeleteSelfOnClose(true);
	m_pCancelButton = new Button(this, "CancelButton", "#QueryBox_Cancel");
	m_pCancelButton->SetCommand("Cancel"); 
	m_pOkButton->SetCommand("OK");
	m_pCancelCommand = NULL;
	m_pOkCommand = NULL;

	m_pOkButton->SetTabPosition(1);
	m_pCancelButton->SetTabPosition(2);
}

//-----------------------------------------------------------------------------
// Purpose: Destructor
//-----------------------------------------------------------------------------
QueryBox::~QueryBox()
{
	delete m_pCancelButton;

	if ( m_pOkCommand )
	{
		m_pOkCommand->deleteThis();
	}
	if ( m_pCancelCommand )
	{
		m_pCancelCommand->deleteThis();
	}
}

//-----------------------------------------------------------------------------
// Purpose: Layout the window for drawing 
//-----------------------------------------------------------------------------
void QueryBox::PerformLayout()
{
	BaseClass::PerformLayout();

	int boxWidth, boxTall;
	GetSize(boxWidth, boxTall);

	int x, y, wide, tall;
	GetClientArea(x, y, wide, tall);
	wide += x;
	tall += y;

	int oldWide, oldTall;
	m_pCancelButton->GetSize(oldWide, oldTall);
	
	// calc proportionality scale
	float scale = 1;
	if (IsProportional())
	{
		int screenW, screenH;
		surface()->GetScreenSize(screenW, screenH);

		int proW, proH;
		surface()->GetProportionalBase(proW, proH);

		scale = ((float)(screenH) / (float)(proH));
	}

	int btnWide, btnTall;
	m_pCancelButton->GetContentSize(btnWide, btnTall);
	btnWide = max(oldWide, btnWide + 10 * scale);
	btnTall = max(oldTall, btnTall + 10 * scale);
	m_pCancelButton->SetSize(btnWide, btnTall);

//nt boxWidth, boxTall;
	GetSize(boxWidth, boxTall);
//	wide = max(wide, btnWide * 2 + 100);
//	SetSize(wide, tall);

	m_pOkButton->SetPos((wide/2)-(m_pOkButton->GetWide())-1 + x, tall - m_pOkButton->GetTall() - 15 * scale);
	m_pCancelButton->SetPos((wide/2) + x+16*scale, tall - m_pCancelButton->GetTall() - 15 * scale);

}

//-----------------------------------------------------------------------------
// Purpose: Handles command text from the buttons
//			Deletes self when closed
//-----------------------------------------------------------------------------
void QueryBox::OnCommand(const char *command)
{
	if (!stricmp(command, "OK"))
	{
		OnCommand("Close");

		if ( m_pOkCommand )
		{
			PostActionSignal(m_pOkCommand->MakeCopy());
		}
	}
	else if (!stricmp(command, "Cancel"))
	{
		OnCommand("Close");	

		if (m_pCancelCommand)
		{
			PostActionSignal(m_pCancelCommand->MakeCopy());
		}
	}
	
	BaseClass::OnCommand(command);
	
}

//-----------------------------------------------------------------------------
// Purpose: Set the keyvalues to send when ok button is hit
//-----------------------------------------------------------------------------
void QueryBox::SetOKCommand(KeyValues *keyValues)
{
	if ( m_pOkCommand )
	{
		m_pOkCommand->deleteThis();
	}

	m_pOkCommand = keyValues;
}

//-----------------------------------------------------------------------------
// Purpose: Set a value of the ok command
//-----------------------------------------------------------------------------
void QueryBox::SetOKCommandValue(const char *keyName, int value)
{
	if ( !m_pOkCommand )
	{
		m_pOkCommand = new KeyValues("Command");
	}

	m_pOkCommand->SetInt(keyName, value);
}

//-----------------------------------------------------------------------------
// Purpose: Set the keyvalues to send when the cancel button is hit
//-----------------------------------------------------------------------------
void QueryBox::SetCancelCommand(KeyValues *keyValues)
{
	if ( m_pCancelCommand )
	{
		m_pCancelCommand->deleteThis();
	}

	m_pCancelCommand = keyValues;
}

//-----------------------------------------------------------------------------
// Purpose: Sets the cancel button text
//-----------------------------------------------------------------------------
void QueryBox::SetCancelButtonText(const char* buttonText)
{
	m_pCancelButton->SetText(buttonText);
	InvalidateLayout();
}

//-----------------------------------------------------------------------------
// Purpose: Sets the cancel button text
//-----------------------------------------------------------------------------
void QueryBox::SetCancelButtonText(const wchar_t* wszButtonText)
{
	m_pCancelButton->SetText(wszButtonText);
	InvalidateLayout();
}

void QueryBox::OnKeyCodeTyped( KeyCode code )
{
	if ( code == KEY_ESCAPE )
	{
		OnCommand("Cancel");
	}
	else
	{
		Frame::OnKeyCodeTyped(code);
	}
}

//-----------------------------------------------------------------------------
// Purpose: 
//-----------------------------------------------------------------------------
void QueryBox::OnKeyCodePressed( KeyCode code )
{
	if ( code == KEY_XBUTTON_B )
	{
		OnCommand("Cancel");
	}
	else
	{
		Frame::OnKeyCodePressed(code);
	}
}