488 lines
22 KiB
C++

/*
** Command & Conquer Generals(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) 2001-2003 Electronic Arts Inc. //
// //
////////////////////////////////////////////////////////////////////////////////
// FILE: GameWindow.h /////////////////////////////////////////////////////////
//-----------------------------------------------------------------------------
//
// Westwood Studios Pacific.
//
// Confidential Information
// Copyright (C) 2001 - All Rights Reserved
//
//-----------------------------------------------------------------------------
//
// Project: RTS3
//
// File name: GameWindow.h
//
// Created: Colin Day, June 2001
//
// Desc: Header for game windowing system for generic windows and GUI
// elements
//
//-----------------------------------------------------------------------------
///////////////////////////////////////////////////////////////////////////////
#pragma once
#ifndef __GAMEWINDOW_H_
#define __GAMEWINDOW_H_
// SYSTEM INCLUDES ////////////////////////////////////////////////////////////
// USER INCLUDES //////////////////////////////////////////////////////////////
#include "Lib/BaseType.h"
#include "Common/GameMemory.h"
#include "GameClient/Image.h"
#include "GameClient/DisplayString.h"
#include "GameClient/WinInstanceData.h"
#include "GameClient/Color.h"
///////////////////////////////////////////////////////////////////////////////
// FORWARD REFERENCES /////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
class GameWindow;
class WindowLayout;
class GameFont;
struct GameWindowEditData;
///////////////////////////////////////////////////////////////////////////////
// TYPE DEFINES ///////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
enum { WIN_COLOR_UNDEFINED = GAME_COLOR_UNDEFINED };
// WindowMsgData --------------------------------------------------------------
//-----------------------------------------------------------------------------
typedef UnsignedInt WindowMsgData;
//-----------------------------------------------------------------------------
enum WindowMsgHandledType { MSG_IGNORED, MSG_HANDLED };
// callback types -------------------------------------------------------------
typedef void (*GameWinMsgBoxFunc)( void ); //used for the Message box callbacks.
typedef void (*GameWinDrawFunc)( GameWindow *,
WinInstanceData * );
typedef void (*GameWinTooltipFunc)( GameWindow *,
WinInstanceData *,
UnsignedInt );
typedef WindowMsgHandledType (*GameWinInputFunc)( GameWindow *,
UnsignedInt,
WindowMsgData,
WindowMsgData );
typedef WindowMsgHandledType (*GameWinSystemFunc)( GameWindow *,
UnsignedInt,
WindowMsgData,
WindowMsgData );
enum
{
WIN_MAX_WINDOWS = 576,
CURSOR_MOVE_TOL_SQ = 4,
TOOLTIP_DELAY = 10,
WIN_TOOLTIP_LEN = 64, // max length of tooltip text
};
// macros for easier conversion -----------------------------------------------
#define SHORTTOLONG(a, b) ((UnsignedShort)(a) | ((UnsignedShort)(b) << 16))
#define LOLONGTOSHORT(a) ((a) & 0x0000FFFF)
#define HILONGTOSHORT(b) (((b) & 0xFFFF0000) >> 16)
// Game window messages -------------------------------------------------------
//-----------------------------------------------------------------------------
enum GameWindowMessage
{
GWM_NONE = 0,
GWM_CREATE, GWM_DESTROY,
GWM_ACTIVATE, GWM_ENABLE,
GWM_LEFT_DOWN, GWM_LEFT_UP,
GWM_LEFT_DOUBLE_CLICK, GWM_LEFT_DRAG,
GWM_MIDDLE_DOWN, GWM_MIDDLE_UP,
GWM_MIDDLE_DOUBLE_CLICK, GWM_MIDDLE_DRAG,
GWM_RIGHT_DOWN, GWM_RIGHT_UP,
GWM_RIGHT_DOUBLE_CLICK, GWM_RIGHT_DRAG,
GWM_MOUSE_ENTERING, GWM_MOUSE_LEAVING,
GWM_WHEEL_UP, GWM_WHEEL_DOWN,
GWM_CHAR, GWM_SCRIPT_CREATE,
// note that GWM_MOUSE_POS is only actually propogated to windows if the static
// sendMousePosMessages is set to true in the window manager file. See the
// comment on the static declaration for addtional info
GWM_INPUT_FOCUS, GWM_MOUSE_POS,
GWM_IME_CHAR, GWM_IME_STRING
};
// WinInputReturnCode ------------------------------------------------------
/** These return codes are returned when after processing events through
* the window system */
//-----------------------------------------------------------------------------
enum WinInputReturnCode
{
WIN_INPUT_NOT_USED = 0,
WIN_INPUT_USED,
};
#define GWM_USER 32768
// Window status flags --------------------------------------------------------
//-----------------------------------------------------------------------------
enum
{
// when you edit this, remember to edit WindowStatusNames[]
WIN_STATUS_NONE = 0x00000000, // No status bits set at all
WIN_STATUS_ACTIVE = 0x00000001, // At the top of the window list
WIN_STATUS_TOGGLE = 0x00000002, // If set, click to toggle
WIN_STATUS_DRAGABLE = 0x00000004, // Window can be dragged
WIN_STATUS_ENABLED = 0x00000008, // Window can receive input
WIN_STATUS_HIDDEN = 0x00000010, // Window is hidden, no input
WIN_STATUS_ABOVE = 0x00000020, // Window is always above others
WIN_STATUS_BELOW = 0x00000040, // Window is always below others
WIN_STATUS_IMAGE = 0x00000080, // Window is drawn with images
WIN_STATUS_TAB_STOP = 0x00000100, // Window is a tab stop
WIN_STATUS_NO_INPUT = 0x00000200, // Window does not take input
WIN_STATUS_NO_FOCUS = 0x00000400, // Window does not take focus
WIN_STATUS_DESTROYED = 0x00000800, // Window has been destroyed
WIN_STATUS_BORDER = 0x00001000, // Window will be drawn with Borders & Corners
WIN_STATUS_SMOOTH_TEXT = 0x00002000, // Window text will be drawn with smoothing
WIN_STATUS_ONE_LINE = 0x00004000, // Window text will be drawn on only one line
WIN_STATUS_NO_FLUSH = 0x00008000, // Window images will not be unloaded when window is hidden
WIN_STATUS_SEE_THRU = 0x00010000, // Will not draw, but it NOT hidden ... does not apply to children
WIN_STATUS_RIGHT_CLICK = 0x00020000, // Window pays attention to right clicks
WIN_STATUS_WRAP_CENTERED = 0x00040000, // Text will be centered on each word wrap or \n
WIN_STATUS_CHECK_LIKE = 0x00080000, // Make push buttons "check-like" with dual state
WIN_STATUS_HOTKEY_TEXT = 0x00100000, // Make push buttons "check-like" with dual state
WIN_STATUS_USE_OVERLAY_STATES = 0x00200000, // Push buttons will use the global automatic rendering overlay for disabled, hilited, and pushed.
WIN_STATUS_NOT_READY = 0x00400000, // A disabled button that is available -- but not yet (power charge, fire delay).
WIN_STATUS_FLASHING = 0x00800000, // Used for buttons that do cameo flashes.
WIN_STATUS_ALWAYS_COLOR = 0x01000000, // Never render these buttons using greyscale renderer when button disabled.
// when you edit this, remember to edit WindowStatusNames[]
};
// Message Box Button flags --------------------------------------------------------
//-----------------------------------------------------------------------------
enum
{
MSG_BOX_YES = 0x01, //Display the yes button
MSG_BOX_NO = 0x02, //Display the No button
MSG_BOX_OK = 0x08, //Display the Ok button
MSG_BOX_CANCEL = 0x04, //Display the Cancel button
};
// WindowMessageBoxData ---------------------------------------------------------
/** Data attached to each Message box window */
//-----------------------------------------------------------------------------
struct WindowMessageBoxData
{
GameWinMsgBoxFunc yesCallback; ///<Function pointer to the Yes Button Callback
GameWinMsgBoxFunc noCallback;///<Function pointer to the No Button Callback
GameWinMsgBoxFunc okCallback;///<Function pointer to the Ok Button Callback
GameWinMsgBoxFunc cancelCallback;///<Function pointer to the Cancel Button Callback
};
// GameWindowEditData ---------------------------------------------------------
/** Data attached to each window specifically for the editor */
//-----------------------------------------------------------------------------
struct GameWindowEditData
{
AsciiString systemCallbackString; ///< string for callback
AsciiString inputCallbackString; ///< string for callback
AsciiString tooltipCallbackString; ///< string for callback
AsciiString drawCallbackString; ///< string for callback
};
// GameWindow -----------------------------------------------------------------
/** Class definition for a game window. These are the basic elements of the
* whole windowing sytem, all windows are GameWindows, as are all GUI controls
* etc. */
//-----------------------------------------------------------------------------
class GameWindow : public MemoryPoolObject
{
MEMORY_POOL_GLUE_ABC( GameWindow ) ///< this abstract class needs memory pool hooks
friend class GameWindowManager;
public:
GameWindow( void );
// already defined by MPO.
// virtual ~GameWindow( void );
/// draw border for this window only, NO child windows or anything
virtual void winDrawBorder( void ) = 0;
Int winSetWindowId( Int id ); ///< set id for this window
Int winGetWindowId( void ); ///< return window id for this window
Int winSetSize( Int width, Int height ); ///< set size
Int winGetSize( Int *width, Int *height ); ///< return size
Int winActivate( void ); ///< pop window to top of list and activate
Int winBringToTop( void ); ///< bring this window to the top of the win list
Int winEnable( Bool enable ); /**< enable/disable a window, a disbled
window can be seen but accepts no input */
Int winHide( Bool hide ); ///< hide/unhide a window
Bool winIsHidden( void ); ///< is this window hidden/
UnsignedInt winSetStatus( UnsignedInt status ); ///< set status bits
UnsignedInt winClearStatus( UnsignedInt status ); ///< clear status bits
UnsignedInt winGetStatus( void ); ///< get status bits
UnsignedInt winGetStyle( void ); ///< get style bits
Int winNextTab( void ); ///< advance focus to next window
Int winPrevTab( void ); ///< change focus to previous window
Int winSetPosition( Int x, Int y ); ///< set window position
Int winGetPosition( Int *x, Int *y ); ///< get window position
Int winGetScreenPosition( Int *x, Int *y ); ///< get screen coordinates
Int winGetRegion( IRegion2D *region ); ///< get window region
Int winSetCursorPosition( Int x, Int y ); ///< set window cursor position
Int winGetCursorPosition( Int *x, Int *y ); ///< get window cursor position
// --------------------------------------------------------------------------
// new methods for setting images
Int winSetEnabledImage( Int index, const Image *image );
Int winSetEnabledColor( Int index, Color color );
Int winSetEnabledBorderColor( Int index, Color color );
const Image *winGetEnabledImage( Int index ) { return m_instData.m_enabledDrawData[ index ].image; }
Color winGetEnabledColor( Int index ) { return m_instData.m_enabledDrawData[ index ].color; }
Color winGetEnabledBorderColor( Int index ) { return m_instData.m_enabledDrawData[ index ].borderColor; }
Int winSetDisabledImage( Int index, const Image *image );
Int winSetDisabledColor( Int index, Color color );
Int winSetDisabledBorderColor( Int index, Color color );
const Image *winGetDisabledImage( Int index ) { return m_instData.m_disabledDrawData[ index ].image; }
Color winGetDisabledColor( Int index ) { return m_instData.m_disabledDrawData[ index ].color; }
Color winGetDisabledBorderColor( Int index ) { return m_instData.m_disabledDrawData[ index ].borderColor; }
Int winSetHiliteImage( Int index, const Image *image );
Int winSetHiliteColor( Int index, Color color );
Int winSetHiliteBorderColor( Int index, Color color );
const Image *winGetHiliteImage( Int index ) { return m_instData.m_hiliteDrawData[ index ].image; }
Color winGetHiliteColor( Int index ) { return m_instData.m_hiliteDrawData[ index ].color; }
Color winGetHiliteBorderColor( Int index ) { return m_instData.m_hiliteDrawData[ index ].borderColor; }
// --------------------------------------------------------------------------
// draw methods and data
Int winDrawWindow( void ); ///< draws the default background
void winSetDrawOffset( Int x, Int y ); ///< set offset for drawing background image data
void winGetDrawOffset( Int *x, Int *y ); ///< get draw offset
void winSetHiliteState( Bool state ); ///< set hilite state
void winSetTooltip( UnicodeString tip ); ///< set tooltip text
Int getTooltipDelay() { return m_instData.m_tooltipDelay; } ///< get tooltip delay
void setTooltipDelay(Int delay) { m_instData.m_tooltipDelay = delay; } ///< set tooltip delay
//-----------------------------------------------------------------------------
// text methods
virtual Int winSetText( UnicodeString newText ); ///< set text string
UnicodeString winGetText( void ); ///< get text string
Int winGetTextLength(); ///< get number of chars in text string
GameFont *winGetFont( void ); ///< get the font being used by this window
virtual void winSetFont( GameFont *font ); ///< set font for window
void winSetEnabledTextColors( Color color, Color borderColor );
void winSetDisabledTextColors( Color color, Color borderColor );
void winSetIMECompositeTextColors( Color color, Color borderColor );
void winSetHiliteTextColors( Color color, Color borderColor );
Color winGetEnabledTextColor( void );
Color winGetEnabledTextBorderColor( void );
Color winGetDisabledTextColor( void );
Color winGetDisabledTextBorderColor( void );
Color winGetIMECompositeTextColor( void );
Color winGetIMECompositeBorderColor( void );
Color winGetHiliteTextColor( void );
Color winGetHiliteTextBorderColor( void );
// window instance data
Int winSetInstanceData( WinInstanceData *data ); ///< copy over instance data
WinInstanceData *winGetInstanceData( void ); ///< get instance data
void *winGetUserData( void ); ///< get the window user data
void winSetUserData( void *userData ); ///< set the user data
// heirarchy methods
Int winSetParent( GameWindow *parent ); ///< set parent
GameWindow *winGetParent( void ); ///< get parent
Bool winIsChild( GameWindow *child ); ///< verifies parent
GameWindow *winGetChild( void ); ///< get the child window
Int winSetOwner( GameWindow *owner ); ///< set owner
GameWindow *winGetOwner( void ); ///< get window's owner
void winSetNext( GameWindow *next ); ///< set next pointer
void winSetPrev( GameWindow *prev ); ///< set prev pointer
GameWindow *winGetNext( void ); ///< get next window in window list
GameWindow *winGetPrev( void ); ///< get previous window in window list
// these are for interacting with a group of windows as a shell "screen"
void winSetNextInLayout( GameWindow *next ); ///< set next in layout
void winSetPrevInLayout( GameWindow *prev ); ///< set prev in layout
void winSetLayout( WindowLayout *layout ); ///< set layout
WindowLayout *winGetLayout( void ); ///< get layout layout
GameWindow *winGetNextInLayout( void ); ///< get next window in layout
GameWindow *winGetPrevInLayout( void ); ///< get prev window in layout
// setting the callbacks ----------------------------------------------------
Int winSetSystemFunc( GameWinSystemFunc system ); ///< set system
Int winSetInputFunc( GameWinInputFunc input ); ///< set input
Int winSetDrawFunc( GameWinDrawFunc draw ); ///< set draw
Int winSetTooltipFunc( GameWinTooltipFunc tooltip ); ///< set tooltip
Int winSetCallbacks( GameWinInputFunc input,
GameWinDrawFunc draw,
GameWinTooltipFunc tooltip ); ///< set draw, input, tooltip
// pick correlation ---------------------------------------------------------
Bool winPointInWindow( Int x, Int y ); /**is point inside this window?
also return TRUE if point is in
a child */
/** given a piont, return the child window which contains the mouse pointer,
if the point is not in a chilc, the function returns the 'window' paramater
back to the caller */
GameWindow *winPointInChild( Int x, Int y, Bool ignoreEnableCheck = FALSE, Bool playDisabledSound = FALSE );
/** finds the child which contains the mouse pointer - reguardless of
the enabled status of the child */
GameWindow *winPointInAnyChild( Int x, Int y, Bool ignoreHidden, Bool ignoreEnableCheck = FALSE );
// get the callbacks for a window -------------------------------------------
GameWinInputFunc winGetInputFunc( void );
GameWinSystemFunc winGetSystemFunc( void );
GameWinDrawFunc winGetDrawFunc( void );
GameWinTooltipFunc winGetTooltipFunc( void );
// editor access only -------------------------------------------------------
void winSetEditData( GameWindowEditData *editData );
GameWindowEditData *winGetEditData( void );
protected:
/// 'images' should be taken care of when we hide ourselves or are destroyed
void freeImages( void ) { }
Bool isEnabled( void ); ///< see if we and our parents are enabled
void normalizeWindowRegion( void ); ///< put UL corner in window region.lo
GameWindow *findFirstLeaf( void ); ///< return first leaf of branch
GameWindow *findLastLeaf( void ); ///< return last leaf of branch
GameWindow *findPrevLeaf( void ); ///< return prev leav in tree
GameWindow *findNextLeaf( void ); ///< return next leaf in tree
// **************************************************************************
Int m_status; // Status bits for this window
ICoord2D m_size; // Width and height of the window
IRegion2D m_region; // Current region occupied by window.
// Low x,y is the window's origin
Int m_cursorX; // window cursor X position if any
Int m_cursorY; // window cursor Y position if any
void *m_userData; // User defined data area
WinInstanceData m_instData; // Class data, varies by window type
void *m_inputData; // Client data
// user defined callbacks
GameWinInputFunc m_input; ///< callback for input
GameWinSystemFunc m_system; ///< callback for system messages
GameWinDrawFunc m_draw; ///< callback for drawing
GameWinTooltipFunc m_tooltip; ///< callback for tooltip execution
GameWindow *m_next, *m_prev; // List of sibling windows
GameWindow *m_parent; // Window which contains this window
GameWindow *m_child; // List of windows within this window
//
// the following are for "layout screens" and ONLY apply to root/parent
// windows in a layout, any children of a window that is part of a layout
// does NOT have layout screen information
//
GameWindow *m_nextLayout; ///< next in layout
GameWindow *m_prevLayout; ///< prev in layout
WindowLayout *m_layout; ///< layout this window is a part of
// game window edit data for the GUIEditor only
GameWindowEditData *m_editData;
}; // end class GameWindow
// ModalWindow ----------------------------------------------------------------
//-----------------------------------------------------------------------------
class ModalWindow : public MemoryPoolObject
{
MEMORY_POOL_GLUE_WITH_USERLOOKUP_CREATE( ModalWindow, "ModalWindow" )
public:
GameWindow *window; // Pointer to Modal Window
ModalWindow *next; // Next Window Pointer
};
EMPTY_DTOR(ModalWindow)
// Errors returned by window functions
enum
{
WIN_ERR_OK = 0, // No Error
WIN_ERR_GENERAL_FAILURE = -1, // General library failure
WIN_ERR_INVALID_WINDOW = -2, // Window parameter was invalid
WIN_ERR_INVALID_PARAMETER = -3, // Parameter was invalid
WIN_ERR_MOUSE_CAPTURED = -4, // Mouse already captured
WIN_ERR_KEYBOARD_CAPTURED = -5, // Keyboard already captured
WIN_ERR_OUT_OF_WINDOWS = -6 // Too many windows have been created
};
// Input capture/release flags
enum
{
WIN_CAPTURE_MOUSE = 0x00000001, // capture mouse
WIN_CAPTURE_KEYBOARD = 0x00000002, // capture keyboard
WIN_CAPTURE_ALL = 0xFFFFFFFF, // capture keyboard and mouse
};
// INLINING ///////////////////////////////////////////////////////////////////
// EXTERNALS //////////////////////////////////////////////////////////////////
extern void GameWinDefaultDraw( GameWindow *window,
WinInstanceData *instData );
extern WindowMsgHandledType GameWinDefaultSystem( GameWindow *window,
UnsignedInt msg,
WindowMsgData mData1,
WindowMsgData mData2 );
extern WindowMsgHandledType GameWinDefaultInput( GameWindow *window,
UnsignedInt msg,
WindowMsgData mData1,
WindowMsgData mData2 );
extern WindowMsgHandledType GameWinBlockInput( GameWindow *window,
UnsignedInt msg,
WindowMsgData mData1,
WindowMsgData mData2 );
extern void GameWinDefaultTooltip( GameWindow *window,
WinInstanceData *instData,
UnsignedInt mouse );
extern const char *WindowStatusNames[];
extern const char *WindowStyleNames[];
#endif // __GAMEWINDOW_H_