/*
**	Command & Conquer Renegade(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 : Combat																		  *
 *                                                                                             *
 *                     $Archive:: /Commando/Code/wwui/dialogtext.cpp           $*
 *                                                                                             *
 *                       Author:: Patrick Smith                                                *
 *                                                                                             *
 *                     $Modtime:: 11/08/01 12:14a                                             $*
 *                                                                                             *
 *                    $Revision:: 19                                                          $*
 *                                                                                             *
 *---------------------------------------------------------------------------------------------*
 * Functions:                                                                                  *
 * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */

#include "dialogtext.h"
#include "stylemgr.h"


////////////////////////////////////////////////////////////////
//
//	DialogButtonClass
//
////////////////////////////////////////////////////////////////
DialogTextClass::DialogTextClass (void)	:
	IsTitle (false)
{
	Set_Wants_Focus (false);

	//
	//	Set the font for the text renderer
	//
	StyleMgrClass::Assign_Font (&TextRenderer, StyleMgrClass::FONT_CONTROLS);	
	StyleMgrClass::Configure_Renderer (&ControlRenderer);	
	return ;
}


////////////////////////////////////////////////////////////////
//
//	Render
//
////////////////////////////////////////////////////////////////
void
DialogTextClass::Render (void)
{
	if (Style & WS_VISIBLE) {
	
		//
		//	Update the text renderer (if necessary)
		//
		if (IsDirty) {
			Create_Text_Renderer ();
		}

		if (IsTitle) {
			GlowRenderer.Render ();
		}
		
		//
		//	Render the control
		//
		TextRenderer.Render ();
		ControlRenderer.Render ();

		DialogControlClass::Render ();
  	}
	return ;
}


////////////////////////////////////////////////////////////////
//
//	Create_Text_Renderer
//
////////////////////////////////////////////////////////////////
void
DialogTextClass::Create_Text_Renderer (void)
{
	TextRenderer.Reset ();
	ControlRenderer.Reset ();

	if ((Style & SS_TYPEMASK) == SS_ETCHEDHORZ) {
		
		//
		//	Determine which color to draw the outline in
		//
		int color	= StyleMgrClass::Get_Line_Color ();
		if (IsEnabled == false) {
			color		= StyleMgrClass::Get_Disabled_Line_Color ();
		}

		//
		//	Draw the line
		//
		ControlRenderer.Add_Line (Rect.Upper_Left (), Rect.Upper_Right (), 1.0F, color);

	} else if ((Style & SS_TYPEMASK) == SS_BLACKFRAME) {

		//
		//	Determine which color to draw the outline in
		//
		int color	= StyleMgrClass::Get_Line_Color ();
		if (IsEnabled == false) {
			color		= StyleMgrClass::Get_Disabled_Line_Color ();
		}

		//
		//	Draw the outline
		//
		ControlRenderer.Add_Outline (Rect, 1.0F, color);

	} else {
	
		//
		//	Determine how to justify the text
		//
		StyleMgrClass::JUSTIFICATION justification = StyleMgrClass::LEFT_JUSTIFY;
		if ((Style & 0xF) == SS_RIGHT) {
			justification = StyleMgrClass::RIGHT_JUSTIFY;
		} else if ((Style & 0xF) == SS_CENTER) {
			justification = StyleMgrClass::CENTER_JUSTIFY;
		}

		//
		//	Determine if the text should be centered vertically
		//
		bool is_vcentered = ((Style & SS_CENTERIMAGE) == SS_CENTERIMAGE);

		//
		//	Draw the text
		//
		if (IsTitle) {		
			
			//
			//	Render the title text using a glow
			//
			GlowRenderer.Reset_Polys ();
			StyleMgrClass::Render_Glow (Title, &GlowRenderer, Rect, 5, 5, RGB_TO_INT32 (14, 0, 0), StyleMgrClass::CENTER_JUSTIFY);
			StyleMgrClass::Render_Text (Title, &TextRenderer, RGB_TO_INT32 (255, 255, 36), 0, Rect, false, false, StyleMgrClass::CENTER_JUSTIFY, true);

		} else if ((Style & 0x0F) == SS_LEFTNOWORDWRAP) {

			//
			//	Render the text using the default color scheme or the overriden
			// color scheme
			//
			if (IsTextColorOverridden == false) {
				StyleMgrClass::Render_Text (Title, &TextRenderer, Rect, true, true,
										justification, IsEnabled, is_vcentered);
			} else {
				StyleMgrClass::Render_Text (Title, &TextRenderer, VRGB_TO_INT32 (TextColor),
										RGB_TO_INT32 (0, 0, 0), Rect, true, true, justification, is_vcentered);
			}

		} else {

			//
			//	Render the text using the default color scheme or the overriden
			// color scheme
			//
			if (IsTextColorOverridden == false) {
				StyleMgrClass::Render_Wrapped_Text_Ex (Title, &TextRenderer, Rect, true, is_vcentered, IsEnabled, justification);
			} else {
				StyleMgrClass::Render_Wrapped_Text_Ex (Title, &TextRenderer, VRGB_TO_INT32 (TextColor),
										RGB_TO_INT32 (0, 0, 0), Rect, true, is_vcentered, justification);
			}
		}
	}

	return ;
}


////////////////////////////////////////////////////////////////
//
//	On_Create
//
////////////////////////////////////////////////////////////////
void
DialogTextClass::On_Create (void)
{
	if (Title.Get_Length () >= 2) {
		
		//
		//	Does this string have special formatting?
		//
		if (Title[0] == L'%' && Title[1] == L't') {
			
			//
			//	Strip off the preceding format specifier
			//
			WideStringClass text	= Title.Peek_Buffer () + 2;
			Title						= text;

			//
			//	Keep in mind that this is a "Title"
			//
			IsTitle = true;
			StyleMgrClass::Assign_Font (&TextRenderer, StyleMgrClass::FONT_TITLE);
			StyleMgrClass::Assign_Font (&GlowRenderer, StyleMgrClass::FONT_TITLE);	

			GlowRenderer.Build_Sentence (Title);

		} else if (Title[0] == L'%' && Title[1] == L'h') {
			
			//
			//	Support a "header" style font
			//
			StyleMgrClass::Assign_Font (&TextRenderer, StyleMgrClass::FONT_LG_CONTROLS);

			//
			//	Strip off the preceding format specifier
			//
			WideStringClass text	= Title.Peek_Buffer () + 2;
			Title						= text;
		
		} else if (Title[0] == L'%' && Title[1] == L's') {
			
			//
			//	Support a "small" style font
			//
			StyleMgrClass::Assign_Font (&TextRenderer, StyleMgrClass::FONT_TOOLTIPS);

			//
			//	Strip off the preceding format specifier
			//
			WideStringClass text	= Title.Peek_Buffer () + 2;
			Title						= text;
		}

	}

	return ;
}
