This repository has been archived on 2025-02-27. You can view files and clone it, but cannot push or open issues or pull requests.
CnC_Renegade/Code/wwui/listctrl.h

485 lines
16 KiB
C++

/*
** 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/listctrl.h $*
* *
* Author:: Patrick Smith *
* *
* $Modtime:: 10/26/01 4:10p $*
* *
* $Revision:: 19 $*
* *
*---------------------------------------------------------------------------------------------*
* Functions: *
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
#if defined(_MSC_VER)
#pragma once
#endif
#ifndef __LIST_CTRL_H
#define __LIST_CTRL_H
#include "dialogcontrol.h"
#include "vector3.h"
#include "vector.h"
#include "render2d.h"
#include "bittype.h"
#include "scrollbarctrl.h"
#include "render2dsentence.h"
#include "listiconmgr.h"
////////////////////////////////////////////////////////////////
// Forward declarations
////////////////////////////////////////////////////////////////
class ListColumnClass;
class ListCtrlClass;
class ListRowClass;
class TextureClass;
////////////////////////////////////////////////////////////////
// Typedefs
////////////////////////////////////////////////////////////////
typedef int (CALLBACK *LISTCTRL_SORT_CALLBACK) (ListCtrlClass *list_ctrl, int item_index1, int item_index2, uint32 user_param);
////////////////////////////////////////////////////////////////
//
// ListCtrlClass
//
////////////////////////////////////////////////////////////////
class ListCtrlClass : public DialogControlClass
{
public:
////////////////////////////////////////////////////////////////
// Public constants
////////////////////////////////////////////////////////////////
typedef enum
{
SORT_NONE = 0,
SORT_ASCENDING,
SORT_DESCENDING
} SORT_TYPE;
////////////////////////////////////////////////////////////////
// Public constructors/destructors
////////////////////////////////////////////////////////////////
ListCtrlClass (void);
virtual ~ListCtrlClass (void);
////////////////////////////////////////////////////////////////
// Public methods
////////////////////////////////////////////////////////////////
// RTTI
virtual ListCtrlClass * As_ListCtrlClass (void) { return this; }
//
// From DialogControlClass
//
void Render (void);
void Set_Tabstop(float stop);
//
// Column support
//
void Auto_Size_Columns (float col_spacing = 2.0F);
void Auto_Size_Columns_Include_Contents (float col_spacing = 2.0F);
void Add_Column (const WCHAR *column_name, float width, const Vector3 &color);
void Set_Column_Color (int col_index, const Vector3 &color);
bool Remove_Column (int col_index);
void Delete_All_Columns (void);
int Get_Column_Count(void) const;
//
// Content control
//
int Find_Entry(int col_index, const WCHAR* text);
int Insert_Entry (int index, const WCHAR *text);
bool Set_Entry_Text (int index, int col_index, const WCHAR *text);
bool Set_Entry_Int (int index, int col_index, int value);
bool Set_Entry_Color (int index, int col_index, const Vector3 &color);
bool Set_Entry_Data (int index, int col_index, uint32 user_data);
bool Select_Entry (int index, bool onoff);
uint32 Get_Entry_Data (int index, int col_index);
const WCHAR * Get_Entry_Text (int index, int col_index);
bool Is_Entry_Selected (int index);
bool Delete_Entry (int index);
void Delete_All_Entries (void);
int Get_Entry_Count (void) const;
//
// Row height support
//
void Set_Min_Row_Height (int height);
int Get_Min_Row_Height (void) const { return MinRowHeight; }
//
// Icon support
//
void Add_Icon (int index, int col_index, const char *texture_name);
void Reset_Icons (int index, int col_index);
void Set_Icon_Size (float width, float height);
//
// Selection support
//
int Get_Curr_Sel (void) const { return CurrSel; }
void Set_Curr_Sel (int new_sel);
void Allow_Selection(bool onoff) {IsSelectionAllowed = onoff;}
void Allow_NoSelection(bool onoff) {IsNoSelectionAllowed = onoff;}
void Allow_Multiple_Selection (bool onoff) { IsMultipleSelection = onoff; }
int Get_First_Selected (void) const;
int Get_Next_Selected (int index) const;
void Select_All (bool select = true);
bool Toggle_Entry_Selection (int index);
//
// Sort support
//
void Sort (LISTCTRL_SORT_CALLBACK sort_callback, uint32 user_param);
void Set_Sort_Designator (int col_index, SORT_TYPE type);
void Sort_Alphabetically (int col_index, SORT_TYPE type);
//
// Scroll support
//
void Scroll_To_End (void);
//
// Advise-sink callbacks
//
void On_VScroll (ScrollBarCtrlClass *scrollbar, int ctrl_id, int new_position);
void On_VScroll_Page (ScrollBarCtrlClass *scrollbar, int ctrl_id, int direction);
protected:
////////////////////////////////////////////////////////////////
// Protected methods
////////////////////////////////////////////////////////////////
void Set_Sel (int new_sel, bool notify);
void On_LButton_Down (const Vector2 &mouse_pos);
void On_LButton_DblClk (const Vector2 &mouse_pos);
void On_LButton_Up (const Vector2 &mouse_pos);
void On_Mouse_Move (const Vector2 &mouse_pos);
void On_Mouse_Wheel (int direction);
void On_Set_Cursor (const Vector2 &mouse_pos);
void On_Set_Focus (void);
void On_Kill_Focus (DialogControlClass *focus);
bool On_Key_Down (uint32 key_id, uint32 key_data);
void On_Create (void);
void On_Destroy (void);
void Update_Client_Rect (void);
void Create_Control_Renderer (void);
void Create_Text_Renderers (void);
int Entry_From_Pos (const Vector2 &mouse_pos);
int Col_From_Pos (const Vector2 &mouse_pos);
void Get_Entry_Rect (int index, RectClass &rect);
void Update_Scroll_Pos (void);
void Update_Scroll_Bar_Visibility (void);
void Update_Row_Height (int row_index);
void Quick_Sort (int start_index, int end_index, LISTCTRL_SORT_CALLBACK sort_callback, uint32 user_param);
int Find_Last_Page_Top_Entry (void);
void Scroll_Page (int direction);
int Find_End_Of_Page (void);
int Find_Top_Of_Page (int bottom_index);
void Render_Entry (const RectClass &rect, int col_index, int row_index);
static int CALLBACK Default_Sort_Callback (ListCtrlClass *list_ctrl, int item_index1, int item_index2, uint32 user_param);
////////////////////////////////////////////////////////////////
// Protected constants
////////////////////////////////////////////////////////////////
enum
{
NORMAL = 0,
DISABLED,
STATE_MAX
};
////////////////////////////////////////////////////////////////
// Protected typedefs
////////////////////////////////////////////////////////////////
typedef DynamicVectorClass<ListColumnClass *> COL_LIST;
typedef DynamicVectorClass<ListRowClass *> ROW_LIST;
////////////////////////////////////////////////////////////////
// Protected member data
////////////////////////////////////////////////////////////////
Render2DClass HilightRenderer;
Render2DClass ControlRenderer;
Render2DClass UnderlineRenderer;
Render2DSentenceClass HeaderRenderer;
Render2DSentenceClass TextRenderer;
ListIconMgrClass IconMgr;
int RowBorderHeight;
int ScrollPos;
int CurrSel;
int CurrState;
int LastPageTopEntryIndex;
ScrollBarCtrlClass ScrollBarCtrl;
bool IsScrollBarDisplayed;
bool IsSelectionAllowed;
bool IsNoSelectionAllowed;
bool IsMultipleSelection;
int SortColumn;
SORT_TYPE SortType;
float PulsePercent;
float PulseDirection;
float MinRowHeight;
RectClass TextRect;
RectClass HeaderRect;
COL_LIST ColList;
ROW_LIST RowInfoList;
};
////////////////////////////////////////////////////////////////
//
// ListEntryClass
//
////////////////////////////////////////////////////////////////
class ListEntryClass
{
public:
////////////////////////////////////////////////////////////////
// Public constructors/destructors
////////////////////////////////////////////////////////////////
ListEntryClass (void) :
Name (L""),
Color (1, 1, 1),
UserData (0) {}
ListEntryClass (const WCHAR *name) :
Name (name),
Color (1, 1, 1),
UserData (0) {}
~ListEntryClass (void) { Reset_Icons (); }
////////////////////////////////////////////////////////////////
// Public methods
////////////////////////////////////////////////////////////////
//
// Name access
//
const WCHAR * Get_Name (void) const { return Name; }
void Set_Name (const WCHAR *name) { Name = name; }
//
// Color access
//
const Vector3 & Get_Color (void) const { return Color; }
void Set_Color (const Vector3 &color) { Color = color; }
//
// User data access
//
uint32 Get_User_Data (void) const { return UserData; }
void Set_User_Data (uint32 user_data) { UserData = user_data; }
//
// Icon support
//
int Get_Icon_Count (void) const { return IconList.Count (); }
const char * Get_Icon (int index) { return IconList[index]; }
void Add_Icon (const char *name) { IconList.Add (name); }
void Reset_Icons (void) { IconList.Delete_All (); }
private:
////////////////////////////////////////////////////////////////
// Private member data
////////////////////////////////////////////////////////////////
WideStringClass Name;
Vector3 Color;
uint32 UserData;
DynamicVectorClass<StringClass> IconList;
};
////////////////////////////////////////////////////////////////
//
// ListColumnClass
//
////////////////////////////////////////////////////////////////
class ListColumnClass
{
public:
////////////////////////////////////////////////////////////////
// Public constructors/destructors
////////////////////////////////////////////////////////////////
ListColumnClass (void) :
Width (0) { Reset_Contents (); }
~ListColumnClass (void) { Free_Data (); }
////////////////////////////////////////////////////////////////
// Public operators
////////////////////////////////////////////////////////////////
bool operator== (const ListColumnClass &src) const { return false; }
bool operator!= (const ListColumnClass &src) const { return true; }
////////////////////////////////////////////////////////////////
// Public methods
////////////////////////////////////////////////////////////////
//
// Name access
//
const WCHAR * Get_Name (void) const { return Header.Get_Name (); }
void Set_Name (const WCHAR *name) { Header.Set_Name (name); }
//
// Width access
//
float Get_Width (void) const { return Width; }
void Set_Width (float width) { Width = width; }
//
// Color access
//
const Vector3 & Get_Color (void) const { return Header.Get_Color (); }
void Set_Color (const Vector3 &color) { Header.Set_Color (color); }
//
// Entry access
//
void Move_Entry (int old_index, int new_index);
void Swap_Entries (int index1, int index2);
int Insert_Entry (int index, const WCHAR *entry_name);
int Get_Entry_Count (void) const { return EntryList.Count (); }
bool Delete_Entry (int index);
void Delete_All_Entries (void);
void Set_Entry_Text (int index, const WCHAR *text) { EntryList[index]->Set_Name (text); }
const WCHAR * Get_Entry_Text (int index) const { return EntryList[index]->Get_Name (); }
void Set_Entry_Color (int index, const Vector3 &color) { EntryList[index]->Set_Color (color); }
const Vector3 & Get_Entry_Color (int index) const { return EntryList[index]->Get_Color (); }
void Set_Entry_Data (int index, uint32 data) { EntryList[index]->Set_User_Data (data); }
uint32 Get_Entry_Data (int index) const { return EntryList[index]->Get_User_Data (); }
int Get_Icon_Count (int index) const { return EntryList[index]->Get_Icon_Count (); }
const char * Get_Icon (int index, int icon_index) { return EntryList[index]->Get_Icon (icon_index); }
void Add_Icon (int index, const char *name) { EntryList[index]->Add_Icon (name); }
void Reset_Icons (int index) { EntryList[index]->Reset_Icons (); }
//
// Cleanup
//
void Reset_Contents (void);
private:
////////////////////////////////////////////////////////////////
// Private methods
////////////////////////////////////////////////////////////////
void Free_Data (void);
////////////////////////////////////////////////////////////////
// Private data types
////////////////////////////////////////////////////////////////
typedef DynamicVectorClass<ListEntryClass *> ENTRY_LIST;
////////////////////////////////////////////////////////////////
// Private member data
////////////////////////////////////////////////////////////////
ListEntryClass Header;
ENTRY_LIST EntryList;
float Width;
};
////////////////////////////////////////////////////////////////
//
// ListRowClass
//
////////////////////////////////////////////////////////////////
class ListRowClass
{
public:
////////////////////////////////////////////////////////////////
// Public constructors/destructors
////////////////////////////////////////////////////////////////
ListRowClass (void) :
Height (0),
IsSelected (false) { }
~ListRowClass (void) { }
////////////////////////////////////////////////////////////////
// Public operators
////////////////////////////////////////////////////////////////
bool operator== (const ListRowClass &src) const { return false; }
bool operator!= (const ListRowClass &src) const { return true; }
////////////////////////////////////////////////////////////////
// Public methods
////////////////////////////////////////////////////////////////
//
// Height access
//
float Get_Height (void) const { return Height; }
void Set_Height (float height) { Height = height; }
//
// Selection access
//
bool Is_Selected (void) const { return IsSelected; }
void Select (bool onoff) { IsSelected = onoff; }
private:
////////////////////////////////////////////////////////////////
// Private member data
////////////////////////////////////////////////////////////////
float Height;
bool IsSelected;
};
#endif //__LIST_CTRL_H