/*
**	Command & Conquer Generals Zero Hour(tm)
**	Copyright 2025 Electronic Arts Inc.
**
**	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 3 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, see <http://www.gnu.org/licenses/>.
*/

/******************************************************************************
 **	C O N F I D E N T I A L --- W E S T W O O D   S T U D I O S				***
 ******************************************************************************
 *																			  *
 *                  Project Name : Autorun									  *
 *																			  *
 *                     File Name : AUTORUN.CPP								  *
 *																			  *
 *                    Programmers: Maria del Mar McCready Legg				  * 
 *																			  *
 *                    Start Date : September 5, 1997						  *
 *																			  *
 *                   Last Update : October 2, 2000  [MML]					  *
 *																			  *
 *----------------------------------------------------------------------------*
 * Functions:																  *
 *		DrawButton::DrawButton												  *
 *		DrawButton::Is_Mouse_In_Region										  *
 *		DrawButton::Return_Bitmap											  *
 *		DrawButton::Return_Area												  *
 *		DrawButton::Set_Stretched_Width										  *
 *		DrawButton::Set_Stretched_Height									  *
 *----------------------------------------------------------------------------*/


#define  STRICT
#include <windows.h>
#include <windowsx.h>
#include "autorun.h"
#include "drawbutton.h"
#include "locale_api.h"
#include "wnd_file.h"



#include "leanAndMeanAutorun.h"

#ifndef LEAN_AND_MEAN
///////GAMEENGINE HEADERS////////////
#include "Common/UnicodeString.h" 
#include "Common/SubsystemInterface.h"
#include "GameClient/GameText.h"
#endif


//*****************************************************************************
//  DrawButton::DrawButton -- Constructor for custom "Button" type.
// 
// 	This custom button is drawn by the dialog, and uses the WM_MOUSEMOVE,
//	WM_LBUTTONUP, and WM_LBUTTONDOWN to trigger actions.
//
//  INPUT:  	int id -- button id handle
//				int x  -- x position
//				int y  -- y position
//				int w  -- width of button
//				int h  -- height of button
//				char *normal  -- name of normal button bitmap
//				char *pressed -- name of pressed button bitmap
//				char *focus   -- name of focus button bitmap
//
//	OUTPUT: 	none.
//
//  WARNINGS:	No keyboard/mouse/paint handling built in.  Do manually.
//
//  HISTORY:                                                                
//      07/15/1996  MML : Created.                                            
//=============================================================================

DrawButton::DrawButton ( int id, RECT button_rect, char *normal, char *focus, char *pressed, const char * string, TTFontClass *fontptr )
{
	Id = id;

	//--------------------------------------------------------------------------
	// Set default rectangle settings.
	//--------------------------------------------------------------------------
	rect.left	 	= button_rect.left;
	rect.top	 	= button_rect.top;
	rect.right	 	= button_rect.left + button_rect.right;
	rect.bottom	 	= button_rect.top  + button_rect.bottom;

	MyRect.X	 	= button_rect.left;
	MyRect.Y	 	= button_rect.top;
	MyRect.Width	= rect.right  - rect.left;
	MyRect.Height	= rect.bottom - rect.top;

	TextRect.X	 	= button_rect.left;
	TextRect.Y	 	= button_rect.top;
	TextRect.Width	= rect.right  - rect.left;
	TextRect.Height	= rect.bottom - rect.top;
	
	StretchedWidth 	= rect.right  - rect.left;
	StretchedHeight	= rect.bottom - rect.top;

	//--------------------------------------------------------------------------
	// Set the string variables.
	//--------------------------------------------------------------------------
	memset( String, '\0', MAX_PATH );
//	if ( string != NULL ) {
//		wcscpy( String, Locale_GetString( string_num, String ));


#ifdef LEAN_AND_MEAN
#else
	UnicodeString tempString = TheGameText->fetch(string);
	wcscpy(String, tempString.str());
#endif
//	}

	//--------------------------------------------------------------------------
	// Set the font pointer.
	//--------------------------------------------------------------------------
	MyFontPtr = NULL;

	if ( fontptr != NULL ) {
		MyFontPtr = fontptr;
	}

	//--------------------------------------------------------------------------
	// Set Button Backgrounds.
	//--------------------------------------------------------------------------
	_tcscpy( NormalBitmap, normal );
	_tcscpy( PressedBitmap, pressed );
	_tcscpy( FocusBitmap, focus );

	if( NormalBitmap[0] != '\0' ) {
		UseBitmaps = true;							// determines how to draw button.
	}

	//--------------------------------------------------------------------------
	// Start in normal mode.
	//--------------------------------------------------------------------------
	ButtonState	   	= NORMAL_STATE;

	Msg( __LINE__, TEXT(__FILE__), TEXT("	rect	= [%d,%d,%d,%d]"), rect.left, rect.top, rect.right, rect.bottom );
	Msg( __LINE__, TEXT(__FILE__), TEXT("	MyRect	= [%d,%d,%d,%d]"), MyRect.X, MyRect.Y, MyRect.Width, MyRect.Height );
}

DrawButton::DrawButton ( int id, RECT button_rect, char *normal, char *focus, char *pressed, const wchar_t *string, TTFontClass *fontptr )
{
	Id = id;

	//--------------------------------------------------------------------------
	// Set default rectangle settings.
	//--------------------------------------------------------------------------
	rect.left	 	= button_rect.left;
	rect.top	 	= button_rect.top;
	rect.right	 	= button_rect.left + button_rect.right;
	rect.bottom	 	= button_rect.top  + button_rect.bottom;

	MyRect.X	 	= button_rect.left;
	MyRect.Y	 	= button_rect.top;
	MyRect.Width	= rect.right  - rect.left;
	MyRect.Height	= rect.bottom - rect.top;

	TextRect.X	 	= button_rect.left;
	TextRect.Y	 	= button_rect.top;
	TextRect.Width	= rect.right  - rect.left;
	TextRect.Height	= rect.bottom - rect.top;

	StretchedWidth 	= rect.right  - rect.left;
	StretchedHeight	= rect.bottom - rect.top;

	//--------------------------------------------------------------------------
	// Set the string variables.
	//--------------------------------------------------------------------------
	memset( String, '\0', MAX_PATH );
	if ( string != NULL ) {
		wcscpy( String, string );
	}

	//--------------------------------------------------------------------------
	// Set the font pointer.
	//--------------------------------------------------------------------------
	MyFontPtr = NULL;

	if ( fontptr != NULL ) {
		MyFontPtr = fontptr;
	}

	//--------------------------------------------------------------------------
	// Set Button Backgrounds.
	//--------------------------------------------------------------------------
	_tcscpy( NormalBitmap, normal );
	_tcscpy( PressedBitmap, pressed );
	_tcscpy( FocusBitmap, focus );
	
	if( NormalBitmap[0] != '\0' ) {
		UseBitmaps = true;							// determines how to draw button.
	}

	//--------------------------------------------------------------------------
	// Start in normal mode.
	//--------------------------------------------------------------------------
	ButtonState	= NORMAL_STATE;

	Msg( __LINE__, TEXT(__FILE__), TEXT("	rect	= [%d,%d,%d,%d]"), rect.left, rect.top, rect.right, rect.bottom );
	Msg( __LINE__, TEXT(__FILE__), TEXT("	MyRect	= [%d,%d,%d,%d]"), MyRect.X, MyRect.Y, MyRect.Width, MyRect.Height );
}

//*****************************************************************************
// DrawButton::Draw_Text -- Check if mouse values are in button area.
// 
// INPUT: 		HDC hDC -- DC to paint to.
//
//	OUTPUT:    	none.
//
// WARNINGS:	
//
// HISTORY:                                                                
//   01/18/2002  MML : Created.                                            
//=============================================================================

void DrawButton::Draw_Text ( HDC hDC )
{
	RECT	outline_rect;
	Rect	rect;

	if( hDC == NULL ) {
		return;
	}

	Return_Area( &outline_rect );
	Return_Text_Area( &rect );

	/*
	** This function was combining the pixel color with the background,
	** so it never looked correct.
	*/
//	SetTextColor( hDC, RGB( 0, 240, 0 ));
//	DrawFocusRect(	hDC, &dst_rect );
			
	if ( Get_State() == DrawButton::PRESSED_STATE ) {
		MyFontPtr->Print( 
			hDC, 
			String, 
			rect, 
			TEXT_PRESSED_COLOR, 
			TEXT_PRESSED_SHADOW_COLOR, 
			TPF_BUTTON,
			TPF_SHADOW );

	} else if ( Get_State() == DrawButton::FOCUS_STATE ) {
		MyFontPtr->Print( 
			hDC, 
			String, 
			rect, 
			TEXT_FOCUSED_COLOR, 
			TEXT_FOCUSED_SHADOW_COLOR, 
			TPF_BUTTON,
			TPF_SHADOW );

	} else {
		MyFontPtr->Print( 
			hDC, 
			String, 
			rect, 
			TEXT_NORMAL_COLOR,	
			TEXT_NORMAL_SHADOW_COLOR, 
			TPF_BUTTON,
			TPF_SHADOW );
	}
}


//*****************************************************************************
// DrawButton::Is_Mouse_In_Region -- Check if mouse values are in button area.
// 
// INPUT: 		int mouse_x  -- mouse x position
//				int mouse_y  -- mouse y position
//
//	OUTPUT: 	bool -- true of false.
//
// WARNINGS:	No keyboard/mouse/paint handling built in.  Do manually.
//				Note: width is shortened below to accomodate actual bitmap area.
//
// HISTORY:                                                                
//   07/15/1996  MML : Created.                                            
//=============================================================================

bool DrawButton::Is_Mouse_In_Region ( int mouse_x, int mouse_y )
{
	if ( mouse_x < 0 || mouse_y < 0 ) {
		return( false );
	}

	if (( mouse_x >= rect.left )	&& 
		( mouse_y >= rect.top )		&&
		( mouse_x <= rect.left + StretchedWidth ) && 
		( mouse_y <= rect.top  + StretchedHeight )) {
		return ( TRUE );
	}
	return ( FALSE );
}

//*****************************************************************************
// DrawButton::Return_Bitmap 
//
//	    Return name of correct bitmap based on state of button.
// 
// INPUT:  		none.
//
// OUTPUT: 		char *bitmap -- name of bitmap file.
//
// WARNINGS:	No keyboard/mouse/paint handling built in.  Do manually.
//
// HISTORY:                                                                
//   07/15/1996  MML : Created.                                            
//=============================================================================

char *DrawButton::Return_Bitmap ( void )
{
	if ( ButtonState == PRESSED_STATE ) {
		return ( PressedBitmap );
	} else if ( ButtonState == FOCUS_STATE ) {
		return ( FocusBitmap );
	} else {
		return ( NormalBitmap );
	}
}

//*****************************************************************************
// DrawButton::Return_Area -- Return x, y and width and height of button.
// 
// INPUT:  		RECT area -- holds the x,y,width,height information.
//
// OUTPUT: 		none.
//
// WARNINGS:	No keyboard/mouse/paint handling built in.  Do manually.
//
// HISTORY:                                                                
//   07/15/1996  MML : Created.                                            
//=============================================================================

void DrawButton::Return_Area ( RECT *area )
{
	area->left		= rect.left;
	area->top		= rect.top;
	area->right		= rect.left +	StretchedWidth;
	area->bottom	= rect.top  +	StretchedHeight;
}

void DrawButton::Return_Area ( Rect *area )
{
	area->X			= MyRect.X;
	area->Y			= MyRect.Y;
	area->Width		= MyRect.Width;
	area->Height	= MyRect.Height;
}

void DrawButton::Return_Text_Area ( Rect *area )
{
	area->X			= TextRect.X;
	area->Y			= TextRect.Y;
	area->Width		= TextRect.Width;
	area->Height	= TextRect.Height;
}


//*****************************************************************************
// DrawButton::Set_Stretched_Width -- Set draw width of button.
// 
// INPUT:  		int value -- destination width size.
//
//OUTPUT: 		none.
//
// WARNINGS:	none.
//
// HISTORY:    08/12/1996  MML : Created.                                            
//=============================================================================

int DrawButton::Set_Stretched_Width	 ( int value )
{
	int nWidth = StretchedWidth;

	StretchedWidth = value;
	return ( nWidth );
}

//*****************************************************************************
// DrawButton::Set_Stretched_Height -- Set draw height of button.
// 
// INPUT:  		int value -- destination height size.
//
// OUTPUT: 		none.
//
// WARNINGS:	none.
//
// HISTORY:    08/12/1996  MML : Created.                                            
//=============================================================================

int DrawButton::Set_Stretched_Height ( int value )
{
	int nHeight = StretchedHeight;

	StretchedHeight = value;
	return( nHeight );
}