| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538 |
- /*
- ** 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: Gadget.h /////////////////////////////////////////////////////////////
- //-----------------------------------------------------------------------------
- //
- // Westwood Studios Pacific.
- //
- // Confidential Information
- // Copyright (C) 2001 - All Rights Reserved
- //
- //-----------------------------------------------------------------------------
- //
- // Project: RTS3
- //
- // File name: Gadget.h
- //
- // Created: Colin Day, June 2001
- //
- // Desc: Game GUI user interface gadget controls
- //
- //-----------------------------------------------------------------------------
- ///////////////////////////////////////////////////////////////////////////////
- #pragma once
- #ifndef __GADGET_H_
- #define __GADGET_H_
- // SYSTEM INCLUDES ////////////////////////////////////////////////////////////
- // USER INCLUDES //////////////////////////////////////////////////////////////
- #include "GameClient/GameWindow.h"
- #include "GameClient/Image.h"
- // FORWARD REFERENCES /////////////////////////////////////////////////////////
- // TYPE DEFINES ///////////////////////////////////////////////////////////////
- enum
- {
- GADGET_SIZE = 16,
- HORIZONTAL_SLIDER_THUMB_WIDTH = 13,
- HORIZONTAL_SLIDER_THUMB_HEIGHT = 16,
- ENTRY_TEXT_LEN = 256,
- STATIC_TEXT_LEN = 256,
- };
- // for listboxes
- enum
- {
- TEXT_X_OFFSET = 5,
- TEXT_Y_OFFSET = 2,
- TEXT_WIDTH_OFFSET = 7,
- TOTAL_OUTLINE_HEIGHT = 2 // Sum of heights of tom and bottom outline
- };
- enum
- {
- LISTBOX_TEXT = 1,
- LISTBOX_IMAGE = 2
- };
- // Gadget window styles, keep in same order as WindowStyleNames[]
- enum
- {
-
- GWS_PUSH_BUTTON = 0x00000001,
- GWS_RADIO_BUTTON = 0x00000002,
- GWS_CHECK_BOX = 0x00000004,
- GWS_VERT_SLIDER = 0x00000008,
- GWS_HORZ_SLIDER = 0x00000010,
- GWS_SCROLL_LISTBOX = 0x00000020,
- GWS_ENTRY_FIELD = 0x00000040,
- GWS_STATIC_TEXT = 0x00000080,
- GWS_PROGRESS_BAR = 0x00000100,
- GWS_USER_WINDOW = 0x00000200,
- GWS_MOUSE_TRACK = 0x00000400,
- GWS_ANIMATED = 0x00000800,
- GWS_TAB_STOP = 0x00001000,
- GWS_TAB_CONTROL = 0x00002000,
- GWS_TAB_PANE = 0x00004000,
- GWS_COMBO_BOX = 0x00008000,
- GWS_ALL_SLIDER = GWS_VERT_SLIDER | GWS_HORZ_SLIDER, // for convenience
- GWS_GADGET_WINDOW = GWS_PUSH_BUTTON |
- GWS_RADIO_BUTTON |
- GWS_TAB_CONTROL |
- GWS_CHECK_BOX |
- GWS_VERT_SLIDER |
- GWS_HORZ_SLIDER |
- GWS_SCROLL_LISTBOX |
- GWS_ENTRY_FIELD |
- GWS_STATIC_TEXT |
- GWS_COMBO_BOX |
- GWS_PROGRESS_BAR,
- };
- // Gadget paramaters
- enum
- {
- GP_DONT_UPDATE = 0x00000001,
- };
- // Gadget game messages (sent to their owners)
- enum GadgetGameMessage
- {
- // Generic messages supported by all gadgets
- GGM_LEFT_DRAG = 16384,
- GGM_SET_LABEL,
- GGM_GET_LABEL,
- GGM_FOCUS_CHANGE,
- GGM_RESIZED,
- GGM_CLOSE, // This is the message that's passed to a window if it's registered as a"right Click Menu"
- // Button messages
- GBM_MOUSE_ENTERING,
- GBM_MOUSE_LEAVING,
- GBM_SELECTED,
- GBM_SELECTED_RIGHT, // Right click selection
- GBM_SET_SELECTION,
- // Slider messages
- GSM_SLIDER_TRACK,
- GSM_SET_SLIDER,
- GSM_SET_MIN_MAX,
- GSM_SLIDER_DONE,
- // Listbox messages
- GLM_ADD_ENTRY,
- GLM_DEL_ENTRY,
- GLM_DEL_ALL,
- GLM_SELECTED,
- GLM_DOUBLE_CLICKED,
- GLM_RIGHT_CLICKED,
- // GLM_SET_INSERTPOS, // Not used since we now use multi column listboxes
- GLM_SET_SELECTION,
- GLM_GET_SELECTION,
- GLM_TOGGLE_MULTI_SELECTION,
- GLM_GET_TEXT,
- // GLM_SET_TEXT, // Not used Removed just to make sure
- GLM_SET_UP_BUTTON,
- GLM_SET_DOWN_BUTTON,
- GLM_SET_SLIDER,
- GLM_SCROLL_BUFFER,
- GLM_UPDATE_DISPLAY,
- GLM_GET_ITEM_DATA,
- GLM_SET_ITEM_DATA,
- //ComboBox Messages
- GCM_ADD_ENTRY,
- GCM_DEL_ENTRY,
- GCM_DEL_ALL,
- GCM_SELECTED,
- GCM_GET_TEXT,
- GCM_SET_TEXT,
- GCM_EDIT_DONE,
- GCM_GET_ITEM_DATA,
- GCM_SET_ITEM_DATA,
- GCM_GET_SELECTION,
- GCM_SET_SELECTION,
- GCM_UPDATE_TEXT,
-
- // Entry field messages
- GEM_GET_TEXT,
- GEM_SET_TEXT,
- GEM_EDIT_DONE,
- GEM_UPDATE_TEXT, //added so the parent will maintain real life status of the edit box.
- // Slider messages
- GPM_SET_PROGRESS,
- };
- // border types
- enum
- {
- BORDER_CORNER_UL = 0,
- BORDER_CORNER_UR,
- BORDER_CORNER_LL,
- BORDER_CORNER_LR,
- BORDER_VERTICAL_LEFT,
- BORDER_VERTICAL_LEFT_SHORT,
- BORDER_VERTICAL_RIGHT,
- BORDER_VERTICAL_RIGHT_SHORT,
- BORDER_HORIZONTAL_TOP,
- BORDER_HORIZONTAL_TOP_SHORT,
- BORDER_HORIZONTAL_BOTTOM,
- BORDER_HORIZONTAL_BOTTOM_SHORT,
- NUM_BORDER_PIECES
- };
- // GadgetMsg ------------------------------------------------------------------
- //-----------------------------------------------------------------------------
- typedef struct _GadgetMsg
- {
- GameWindow *window; // Originator of message
- Int data; // Data field
- Int data2; // Data field
- } GadgetMsgStruct, *GadgetMsg;
- // SliderMsg ------------------------------------------------------------------
- //-----------------------------------------------------------------------------
- typedef struct _SliderMsg
- {
- GameWindow *window; // Originator of message
- Int minVal; // Minimum slider value
- Int maxVal; // Maximum slider value
- Int position; // Current position of the slider
- } SliderMsgStruct, *SliderMsg;
- // ListboxMsg -----------------------------------------------------------------
- //-----------------------------------------------------------------------------
- typedef struct _ListboxMsg
- {
- GameWindow *window; // Originator of message
- Int position; // Position of the entry
- } ListboxMsgStruct, *ListboxMsg;
- // SliderData -----------------------------------------------------------------
- //-----------------------------------------------------------------------------
- typedef struct _SliderData
- {
- Int minVal; // Minimum slider value
- Int maxVal; // Maximum slider value
- // The following fields are for internal use and
- // should not be initialized by the user
- Real numTicks; // Number of ticks between min and max
- Int position; // Current position of the slider
- } SliderData;
- // EntryData ------------------------------------------------------------------
- //-----------------------------------------------------------------------------
- typedef struct _EntryData
- {
- DisplayString *text; ///< the entry text
- DisplayString *sText; ///< for displaying 'secret' text
- DisplayString *constructText; ///< for foriegn text construction
- Bool secretText; ///< If TRUE text appears as astericks
- Bool numericalOnly; ///< If TRUE only numbers are allowed as input
- Bool alphaNumericalOnly; ///< If TRUE only numbers and letters are allowed as input
- Bool aSCIIOnly; ///< If TRUE ascii allowed as input
- Short maxTextLen; ///< Max length of edit text
- // Colin: The very notion of entry width makes no sense to me since
- // we already have a gadget width, and the max characters for
- // an entry box so I am removing this.
- // Short entryWidth; ///< Width, in pixels, of the entry box
- // The following fields are for internal use and
- // should not be initialized by the user
- Bool receivedUnichar; // If TRUE system just processed a UniChar
- Bool drawTextFromStart; // if FALSE, make sure end of text is visible
- GameWindow *constructList; // Listbox for construct list.
- UnsignedShort charPos; // Position of current character
- UnsignedShort conCharPos; // Position of current contruct character
- } EntryData;
- // TextData -------------------------------------------------------------------
- //-----------------------------------------------------------------------------
- typedef struct _TextData
- {
- DisplayString *text; ///< the text data
- Bool centered;
- } TextData;
- // ListEntryCell --------------------------------------------------------------
- //-----------------------------------------------------------------------------
- typedef struct _ListEntryCell
- {
- Int cellType; // Holds either LISTBOX_TEXT or LISTBOX_IMAGE
- Color color; // use this color
- void *data; // pointer to either a DisplayString or an image
- void *userData; // Attach user data to the cell
- Int width; // Used if this is an image and we don't want to use the default
- Int height; // used if this is an image and we don't want ot use the default
- } ListEntryCell;
- // ListEntryRow ---------------------------------------------------------------
- //-----------------------------------------------------------------------------
- typedef struct _ListEntryRow
- {
- // The following fields are for internal use and
- // should not be initialized by the user
- Int listHeight; // calculated total Height at the bottom of this entry
- Byte height; // Maintain the height of the row
- ListEntryCell *cell; // Holds the array of ListEntry Cells
-
- } ListEntryRow;
- // ListboxData ----------------------------------------------------------------
- //-----------------------------------------------------------------------------
- typedef struct _ListboxData
- {
- Short listLength; // Max Number of entries in the list
- Short columns; // Number of Columns each line has
- Int *columnWidthPercentage; // Holds the percentage value of each column in an Int array;
- Bool autoScroll; // If add exceeds number of lines in display
- // scroll up automatically
- Bool autoPurge; // If add exceeds number of entries in list
- // delete top entry automatically
- Bool scrollBar; // Automatically create the up/down/slider buttons
- Bool multiSelect; // Allow for multiple selections
- Bool forceSelect; // Do not allow users to unselect from a listbox
- Bool scrollIfAtEnd; // If we're looking at the bottom of the listbox when a new entry is added,
- // scroll up automatically
- Bool audioFeedback; // Audio click feedback?
- //
- // The following fields are for internal use and should not be initialized
- // by the user
- //
- Int *columnWidth; // Pointer to array of column widths based off of user input
- ListEntryRow *listData; // Pointer to an array of ListEntryRows that we create when we first create the List
- GameWindow *upButton; // Child window for up arrow
- GameWindow *downButton; // Child window for down arrow
- GameWindow *slider; // Child window for slider bar
- Int totalHeight; // total height of all entries
- Short endPos; // End Insertion position
- Short insertPos; // Insertion position
- Int selectPos; // Position of current selected entry (for SINGLE select)
- Int *selections; // Pointer to array of selections (for MULTI select)
- Short displayHeight; // Height in pixels of listbox display region
- // this is computed based on the existance
- // of a title or not.
- UnsignedInt doubleClickTime; //
- Short displayPos; // Position of current display entry in pixels
- } ListboxData;
- // ComboBoxData ---------------------------------------------------------------
- //-----------------------------------------------------------------------------
- typedef struct _ComboBoxData
- {
- Bool isEditable; // Determines if the Combo box is a combo box or a dropdown box
- Int maxDisplay; // Holds the count for the maximum displayed in the lisbox before the slider appears
- Int maxChars; // Holds how many characters can be in the listbox/edit box.
- Bool asciiOnly; // Used to notify the Text Entry box if it is suppose to allow only ascii characters
- Bool lettersAndNumbersOnly; // Used to notify the Text Entry Box if it is to only allow letters and numbers
- ListboxData *listboxData; // Needed for the listbox component of the combo box
- EntryData *entryData; // Needed for the text entry component of the combo box
- //
- // The following fields are for internal use and should not be initialized
- // by the user
- //
- Bool dontHide; // A flag we'll use that'll determine if we hide the listbox or not when selected
- Int entryCount; // Current number of entries.
- GameWindow *dropDownButton; // Child window for drop down button
- GameWindow *editBox; // Child window for edit box
- GameWindow *listBox; // Child window for list box
- } ComboBoxData;
- // RadioButtonData ------------------------------------------------------------
- //-----------------------------------------------------------------------------
- typedef struct _RadioButtonData
- {
- Int screen; ///< screen identifier
- Int group; ///< group identifier
- } RadioButtonData;
- // PushButtonData -------------------------------------------------------------
- //-----------------------------------------------------------------------------
- #define NO_CLOCK 0
- #define NORMAL_CLOCK 1
- #define INVERSE_CLOCK 2
- typedef struct _PushButtonData
- {
- UnsignedByte drawClock; ///< We only want to draw the clock if, well, we want to
- Int percentClock; ///< The percentage of the clock we want to draw
- Color colorClock; ///< The color to display the clock at
- Bool drawBorder; ///< We only want to draw the border if we want to
- Color colorBorder; ///< The color for the border around the button
- void *userData; ///< random additional data we can set
- const Image *overlayImage; ///< An overlay image (like a veterancy symbol)
- AsciiString altSound; ///< use an alternitive sound if one is set
- } PushButtonData;
- // TabControlData ------------------------------------------------------------
- //-----------------------------------------------------------------------------
- enum //Tab Position
- {
- TP_CENTER,//Orientation
- TP_TOPLEFT,
- TP_BOTTOMRIGHT,
- TP_TOP_SIDE,//... on which side
- TP_RIGHT_SIDE,
- TP_LEFT_SIDE,
- TP_BOTTOM_SIDE
- };
- enum
- {
- NUM_TAB_PANES = 8,//(MAX_DRAW_DATA - 1)
- };
- typedef struct _TabControlData
- {
- //Set in editor
- Int tabOrientation;
- Int tabEdge;
- Int tabWidth;
- Int tabHeight;
- Int tabCount;
- GameWindow *subPanes[NUM_TAB_PANES];
- Bool subPaneDisabled[NUM_TAB_PANES];//tabCount will control how many even exist. Individual ones can be disabled
- Int paneBorder;
- //Working computations
- Int activeTab;
- Int tabsLeftLimit;
- Int tabsRightLimit;
- Int tabsTopLimit;
- Int tabsBottomLimit;
- } TabControlData;
- // INLINING ///////////////////////////////////////////////////////////////////
- // EXTERNALS //////////////////////////////////////////////////////////////////
- extern WindowMsgHandledType GadgetPushButtonSystem( GameWindow *window, UnsignedInt msg,
- WindowMsgData mData1, WindowMsgData mData2 );
- extern WindowMsgHandledType GadgetPushButtonInput( GameWindow *window, UnsignedInt msg,
- WindowMsgData mData1, WindowMsgData mData2 );
- extern WindowMsgHandledType GadgetCheckBoxInput( GameWindow *window, UnsignedInt msg,
- WindowMsgData mData1, WindowMsgData mData2 );
- extern WindowMsgHandledType GadgetCheckBoxSystem( GameWindow *window, UnsignedInt msg,
- WindowMsgData mData1, WindowMsgData mData2 );
- extern WindowMsgHandledType GadgetRadioButtonInput( GameWindow *window, UnsignedInt msg,
- WindowMsgData mData1, WindowMsgData mData2 );
- extern WindowMsgHandledType GadgetRadioButtonSystem( GameWindow *window, UnsignedInt msg,
- WindowMsgData mData1, WindowMsgData mData2 );
- extern WindowMsgHandledType GadgetTabControlInput( GameWindow *window, UnsignedInt msg,
- WindowMsgData mData1, WindowMsgData mData2 );
- extern WindowMsgHandledType GadgetTabControlSystem( GameWindow *window, UnsignedInt msg,
- WindowMsgData mData1, WindowMsgData mData2 );
- extern WindowMsgHandledType GadgetListBoxInput( GameWindow *window, UnsignedInt msg,
- WindowMsgData mData1, WindowMsgData mData2 );
- extern WindowMsgHandledType GadgetListBoxMultiInput( GameWindow *window, UnsignedInt msg,
- WindowMsgData mData1, WindowMsgData mData2 );
- extern WindowMsgHandledType GadgetListBoxSystem( GameWindow *window, UnsignedInt msg,
- WindowMsgData mData1, WindowMsgData mData2 );
- extern WindowMsgHandledType GadgetHorizontalSliderInput( GameWindow *window, UnsignedInt msg,
- WindowMsgData mData1, WindowMsgData mData2 );
- extern WindowMsgHandledType GadgetHorizontalSliderSystem( GameWindow *window, UnsignedInt msg,
- WindowMsgData mData1, WindowMsgData mData2 );
- extern WindowMsgHandledType GadgetVerticalSliderInput( GameWindow *window, UnsignedInt msg,
- WindowMsgData mData1, WindowMsgData mData2 );
- extern WindowMsgHandledType GadgetVerticalSliderSystem( GameWindow *window, UnsignedInt msg,
- WindowMsgData mData1, WindowMsgData mData2 );
- extern WindowMsgHandledType GadgetProgressBarSystem( GameWindow *window, UnsignedInt msg,
- WindowMsgData mData1, WindowMsgData mData2 );
- extern WindowMsgHandledType GadgetStaticTextInput( GameWindow *window, UnsignedInt msg,
- WindowMsgData mData1, WindowMsgData mData2 );
- extern WindowMsgHandledType GadgetStaticTextSystem( GameWindow *window, UnsignedInt msg,
- WindowMsgData mData1, WindowMsgData mData2 );
- extern WindowMsgHandledType GadgetTextEntryInput( GameWindow *window, UnsignedInt msg,
- WindowMsgData mData1, WindowMsgData mData2 );
- extern WindowMsgHandledType GadgetTextEntrySystem( GameWindow *window, UnsignedInt msg,
- WindowMsgData mData1, WindowMsgData mData2 );
- extern WindowMsgHandledType GadgetComboBoxInput( GameWindow *window, UnsignedInt msg,
- WindowMsgData mData1, WindowMsgData mData2 );
- extern WindowMsgHandledType GadgetComboBoxSystem( GameWindow *window, UnsignedInt msg,
- WindowMsgData mData1, WindowMsgData mData2 );
- extern Bool InitializeEntryGadget( void );
- extern Bool ShutdownEntryGadget( void );
- // Entry Gadget Functions
- extern void InformEntry( WideChar c );
- // list box stuff
- extern Int GetListboxTopEntry( ListboxData list );
- #endif // __GADGET_H_
|