/*
** 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 .
*/
/***********************************************************************************************
*** 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/dialogbase.h $*
* *
* Author:: Patrick Smith *
* *
* $Modtime:: 12/03/01 5:09p $*
* *
* $Revision:: 19 $*
* *
*---------------------------------------------------------------------------------------------*
* Functions: *
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
#if defined(_MSC_VER)
#pragma once
#endif
#ifndef __DIALOG_BASE_H
#define __DIALOG_BASE_H
#include "vector.h"
#include "vector3.h"
#include "rect.h"
#include "refcount.h"
#include "bittype.h"
#include "widestring.h"
#include "controladvisesink.h"
#include "win.h"
#include "notify.h"
////////////////////////////////////////////////////////////////
// Forward declarations
////////////////////////////////////////////////////////////////
class DialogControlClass;
class MenuDialogClass;
class PopupDialogClass;
class ChildDialogClass;
class DialogBaseClass;
class DialogTransitionClass;
////////////////////////////////////////////////////////////////
// Usefull Macros
////////////////////////////////////////////////////////////////
#define START_DIALOG(class_name) \
{ class_name *dialog = new class_name; \
dialog->Start_Dialog (); \
REF_PTR_RELEASE (dialog); }
////////////////////////////////////////////////////////////////
// Typedefs
////////////////////////////////////////////////////////////////
typedef bool (CALLBACK *DEFAULT_DLG_CMD_HANDLER) (DialogBaseClass *dialog, int ctrl_id, int mesage_id, DWORD param);
class DialogEvent :
public TypedEventPtr
{
public:
typedef enum
{
STARTED = 1,
DESTROY,
ACTIVATED,
DEACTIVATED,
} EventID;
//! Retrieve event
inline EventID GetEventID(void) const
{return mEvent;}
DialogEvent(EventID event, DialogBaseClass* dialog) :
TypedEventPtr(dialog),
mEvent(event)
{}
private:
EventID mEvent;
};
////////////////////////////////////////////////////////////////
//
// DialogBaseClass
//
// These dialogs are analagous to Windows dialogs. They are
// initialized from an RC file, however the dialog template is
// only parsed - the window isn't actually created.
//
////////////////////////////////////////////////////////////////
class DialogBaseClass : public RefCountClass, public ControlAdviseSinkClass,
public Notifier
{
public:
////////////////////////////////////////////////////////////////
// Public friends
////////////////////////////////////////////////////////////////
friend class DialogMgrClass;
////////////////////////////////////////////////////////////////
// Public constructors/destructors
////////////////////////////////////////////////////////////////
DialogBaseClass (int res_id);
virtual ~DialogBaseClass (void);
////////////////////////////////////////////////////////////////
// Public methods
////////////////////////////////////////////////////////////////
//
// RTTI
//
virtual MenuDialogClass * As_MenuDialogClass (void) { return NULL; }
virtual PopupDialogClass * As_PopupDialogClass (void) { return NULL; }
virtual ChildDialogClass * As_ChildDialogClass (void) { return NULL; }
int Get_Dlg_ID(void) const {return DialogResID;}
//
// Display methods
//
virtual void Render (void);
void Show (bool onoff) { IsVisible = onoff; }
bool Is_Visible (void) const { return IsVisible; }
void Set_Dirty(bool onoff=true);
//
// Position control
//
const RectClass & Get_Rect (void) const { return Rect; }
void Set_Rect (const RectClass &rect);
//
// Flow control
//
virtual void Start_Dialog (void);
virtual void End_Dialog (void);
virtual bool Is_Running (void) { return IsRunning; }
//
// Control access
//
DialogControlClass * Get_Dlg_Item (int id) const;
DialogControlClass * Find_Control (const Vector2 &mouse_pos);
void Add_Control (DialogControlClass *control);
void Remove_Control (DialogControlClass *control);
DialogControlClass * Find_Next_Control (DialogControlClass *control, int direction = 1);
DialogControlClass * Find_Next_Group_Control (DialogControlClass *control, int direction = 1);
int Get_Control_Count (void) const { return ControlList.Count (); }
DialogControlClass * Get_Control (int index) const { return ControlList[index]; }
//
// Control enable state access
//
void Enable_Dlg_Item (int id, bool onoff);
bool Is_Dlg_Item_Enabled (int id);
//
// Control text access
//
const WCHAR * Get_Dlg_Item_Text (int id) const;
void Set_Dlg_Item_Text (int id, const WCHAR *text);
int Get_Dlg_Item_Int (int id) const;
void Set_Dlg_Item_Int (int id, int value);
float Get_Dlg_Item_Float (int id) const;
void Set_Dlg_Item_Float (int id, float value);
//
// Control "check" access
//
void Check_Dlg_Button (int id, bool onoff);
bool Is_Dlg_Button_Checked (int id) const;
//
// Child dialog access
//
void Add_Child_Dialog (ChildDialogClass *child);
void Remove_Child_Dialog (ChildDialogClass *child);
//
// Title access
//
void Get_Title (WideStringClass *title) { *title = Title; }
void Set_Title (const WCHAR *title) { Title = title; }
//
// Activation access
//
virtual bool Is_Active (void);
virtual bool Wants_Activation (void) { return true; }
//
// Transition control
//
virtual DialogTransitionClass * Get_Transition_In (DialogBaseClass *prev_dlg) { return NULL; }
virtual DialogTransitionClass * Get_Transition_Out (DialogBaseClass *next_dlg) { return NULL; }
virtual void Set_Controls_Hidden (bool onoff) { AreControlsHidden = onoff; }
virtual bool Are_Controls_Hidden (void) const { return AreControlsHidden; }
//
// Notifications
//
virtual void On_Command (int ctrl_id, int mesage_id, DWORD param);
//
// Default processing support
//
static void Set_Default_Command_Handler (DEFAULT_DLG_CMD_HANDLER ptr) { DefaultCmdHandler = ptr; }
static DEFAULT_DLG_CMD_HANDLER Get_Default_Command_Handler (void) { return DefaultCmdHandler; }
DECLARE_NOTIFIER(DialogEvent)
protected:
////////////////////////////////////////////////////////////////
// Protected typedefs
////////////////////////////////////////////////////////////////
typedef DynamicVectorClass CONTROL_LIST;
typedef DynamicVectorClass DIALOG_LIST;
////////////////////////////////////////////////////////////////
// Protected methods
////////////////////////////////////////////////////////////////
virtual void On_Init_Dialog (void);
virtual void On_Destroy (void) {}
virtual void On_Activate (bool onoff);
virtual bool On_Key_Down (uint32 key_id, uint32 key_data);
virtual void On_Unicode_Char(uint16 unicode);
virtual void On_Mouse_Wheel (int direction);
virtual bool On_Key_Up (uint32 key_id);
virtual void On_Frame_Update (void);
virtual void On_Periodic (void) {}
void Free_Controls (void);
void Update_Mouse_State (void);
int Find_Focus_Control (void);
int Find_Control_Index (DialogControlClass *control);
void Send_Mouse_Input (DialogControlClass *control, const Vector2 &mouse_pos);
void Build_Control_List (CONTROL_LIST &list);
void Set_Default_Focus (void);
////////////////////////////////////////////////////////////////
// Protected member data
////////////////////////////////////////////////////////////////
WideStringClass Title;
RectClass Rect;
int DialogResID;
CONTROL_LIST ControlList;
DIALOG_LIST ChildDialogList;
DialogControlClass * LastFocusControl;
bool IsVisible;
bool AreControlsHidden;
bool IsRunning;
int LastMouseClickTime;
static DEFAULT_DLG_CMD_HANDLER DefaultCmdHandler;
};
#endif //__DIALOG_BASE_H