HeaderTemplate.cpp 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250
  1. /*
  2. ** Command & Conquer Generals(tm)
  3. ** Copyright 2025 Electronic Arts Inc.
  4. **
  5. ** This program is free software: you can redistribute it and/or modify
  6. ** it under the terms of the GNU General Public License as published by
  7. ** the Free Software Foundation, either version 3 of the License, or
  8. ** (at your option) any later version.
  9. **
  10. ** This program is distributed in the hope that it will be useful,
  11. ** but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. ** GNU General Public License for more details.
  14. **
  15. ** You should have received a copy of the GNU General Public License
  16. ** along with this program. If not, see <http://www.gnu.org/licenses/>.
  17. */
  18. ////////////////////////////////////////////////////////////////////////////////
  19. // //
  20. // (c) 2001-2003 Electronic Arts Inc. //
  21. // //
  22. ////////////////////////////////////////////////////////////////////////////////
  23. // FILE: HeaderTemplate.cpp /////////////////////////////////////////////////
  24. //-----------------------------------------------------------------------------
  25. //
  26. // Electronic Arts Pacific.
  27. //
  28. // Confidential Information
  29. // Copyright (C) 2002 - All Rights Reserved
  30. //
  31. //-----------------------------------------------------------------------------
  32. //
  33. // created: Aug 2002
  34. //
  35. // Filename: HeaderTemplate.cpp
  36. //
  37. // author: Chris Huybregts
  38. //
  39. // purpose: The header template system is used to maintain a unified look across
  40. // windows. It also allows Localization to customize the looks based
  41. // on language fonts.
  42. //
  43. //-----------------------------------------------------------------------------
  44. ///////////////////////////////////////////////////////////////////////////////
  45. //-----------------------------------------------------------------------------
  46. // SYSTEM INCLUDES ////////////////////////////////////////////////////////////
  47. //-----------------------------------------------------------------------------
  48. //-----------------------------------------------------------------------------
  49. // USER INCLUDES //////////////////////////////////////////////////////////////
  50. //-----------------------------------------------------------------------------
  51. #include "PreRTS.h"
  52. #include "Common/INI.h"
  53. #include "Common/Filesystem.h"
  54. #include "Common/Registry.h"
  55. #include "GameClient/HeaderTemplate.h"
  56. #include "GameClient/GameFont.h"
  57. #include "GameClient/GlobalLanguage.h"
  58. #ifdef _INTERNAL
  59. // for occasional debugging...
  60. //#pragma optimize("", off)
  61. //#pragma MESSAGE("************************************** WARNING, optimization disabled for debugging purposes")
  62. #endif
  63. //-----------------------------------------------------------------------------
  64. // DEFINES ////////////////////////////////////////////////////////////////////
  65. //-----------------------------------------------------------------------------
  66. const FieldParse HeaderTemplateManager::m_headerFieldParseTable[] =
  67. {
  68. { "Font", INI::parseQuotedAsciiString, NULL, offsetof( HeaderTemplate, m_fontName ) },
  69. { "Point", INI::parseInt, NULL, offsetof( HeaderTemplate, m_point) },
  70. { "Bold", INI::parseBool, NULL, offsetof( HeaderTemplate, m_bold ) },
  71. { NULL, NULL, NULL, 0 },
  72. };
  73. HeaderTemplateManager *TheHeaderTemplateManager = NULL;
  74. //-----------------------------------------------------------------------------
  75. // PUBLIC FUNCTIONS ///////////////////////////////////////////////////////////
  76. //-----------------------------------------------------------------------------
  77. void INI::parseHeaderTemplateDefinition( INI *ini )
  78. {
  79. AsciiString name;
  80. HeaderTemplate *hTemplate;
  81. // read the name
  82. const char* c = ini->getNextToken();
  83. name.set( c );
  84. // find existing item if present
  85. hTemplate = TheHeaderTemplateManager->findHeaderTemplate( name );
  86. if( hTemplate == NULL )
  87. {
  88. // allocate a new item
  89. hTemplate = TheHeaderTemplateManager->newHeaderTemplate( name );
  90. } // end if
  91. else
  92. {
  93. DEBUG_CRASH(( "[LINE: %d in '%s'] Duplicate header Template %s found!", ini->getLineNum(), ini->getFilename().str(), name.str() ));
  94. }
  95. // parse the ini definition
  96. ini->initFromINI( hTemplate, TheHeaderTemplateManager->getFieldParse() );
  97. } // end parseCommandButtonDefinition
  98. HeaderTemplate::HeaderTemplate( void ) :
  99. m_font(NULL),
  100. m_point(0),
  101. m_bold(FALSE)
  102. {
  103. //Added By Sadullah Nader
  104. //Initializations missing and needed
  105. m_fontName.clear();
  106. m_name.clear();
  107. }
  108. HeaderTemplate::~HeaderTemplate( void ){}
  109. HeaderTemplateManager::HeaderTemplateManager( void )
  110. {}
  111. HeaderTemplateManager::~HeaderTemplateManager( void )
  112. {
  113. HeaderTemplateListIt it = m_headerTemplateList.begin();
  114. while(it != m_headerTemplateList.end())
  115. {
  116. HeaderTemplate *hTemplate = *it;
  117. if(hTemplate)
  118. {
  119. hTemplate->m_font = NULL;
  120. delete hTemplate;
  121. }
  122. it = m_headerTemplateList.erase(it);
  123. }
  124. }
  125. void HeaderTemplateManager::init( void )
  126. {
  127. INI ini;
  128. AsciiString fname;
  129. fname.format("Data\\%s\\HeaderTemplate.ini", GetRegistryLanguage().str());
  130. OSVERSIONINFO osvi;
  131. osvi.dwOSVersionInfoSize=sizeof(OSVERSIONINFO);
  132. if (GetVersionEx(&osvi))
  133. { //check if we're running Win9x variant since they may need different fonts
  134. if (osvi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS)
  135. { AsciiString tempName;
  136. tempName.format("Data\\%s\\HeaderTemplate9x.ini", GetRegistryLanguage().str());
  137. if (TheFileSystem->doesFileExist(tempName.str()))
  138. fname = tempName;
  139. }
  140. }
  141. ini.load( fname, INI_LOAD_OVERWRITE, NULL );
  142. populateGameFonts();
  143. }
  144. HeaderTemplate *HeaderTemplateManager::findHeaderTemplate( AsciiString name )
  145. {
  146. HeaderTemplateListIt it = m_headerTemplateList.begin();
  147. while(it != m_headerTemplateList.end())
  148. {
  149. HeaderTemplate *hTemplate = *it;
  150. if(hTemplate->m_name.compare(name) == 0)
  151. return hTemplate;
  152. ++it;
  153. }
  154. return NULL;
  155. }
  156. HeaderTemplate *HeaderTemplateManager::newHeaderTemplate( AsciiString name )
  157. {
  158. HeaderTemplate *newHTemplate = NEW HeaderTemplate;
  159. DEBUG_ASSERTCRASH(newHTemplate, ("Unable to create a new Header Template in HeaderTemplateManager::newHeaderTemplate"));
  160. if(!newHTemplate)
  161. return NULL;
  162. newHTemplate->m_name = name;
  163. m_headerTemplateList.push_front(newHTemplate);
  164. return newHTemplate;
  165. }
  166. GameFont *HeaderTemplateManager::getFontFromTemplate( AsciiString name )
  167. {
  168. HeaderTemplate *ht = findHeaderTemplate( name );
  169. if(!ht)
  170. {
  171. //DEBUG_LOG(("HeaderTemplateManager::getFontFromTemplate - Could not find header %s\n", name.str()));
  172. return NULL;
  173. }
  174. return ht->m_font;
  175. }
  176. HeaderTemplate *HeaderTemplateManager::getFirstHeader( void )
  177. {
  178. HeaderTemplateListIt it = m_headerTemplateList.begin();
  179. if( it == m_headerTemplateList.end())
  180. return NULL;
  181. return *it;
  182. }
  183. HeaderTemplate *HeaderTemplateManager::getNextHeader( HeaderTemplate *ht )
  184. {
  185. HeaderTemplateListIt it = m_headerTemplateList.begin();
  186. while(it != m_headerTemplateList.end())
  187. {
  188. if(*it == ht)
  189. {
  190. ++it;
  191. if( it == m_headerTemplateList.end())
  192. return NULL;
  193. return *it;
  194. }
  195. ++it;
  196. }
  197. return NULL;
  198. }
  199. void HeaderTemplateManager::headerNotifyResolutionChange( void )
  200. {
  201. populateGameFonts();
  202. }
  203. //-----------------------------------------------------------------------------
  204. // PRIVATE FUNCTIONS //////////////////////////////////////////////////////////
  205. //-----------------------------------------------------------------------------
  206. void HeaderTemplateManager::populateGameFonts( void )
  207. {
  208. HeaderTemplateListIt it = m_headerTemplateList.begin();
  209. while(it != m_headerTemplateList.end())
  210. {
  211. HeaderTemplate *hTemplate = *it;
  212. Real pointSize = TheGlobalLanguageData->adjustFontSize(hTemplate->m_point);
  213. GameFont *font = TheFontLibrary->getFont(hTemplate->m_fontName, pointSize,hTemplate->m_bold);
  214. DEBUG_ASSERTCRASH(font,("HeaderTemplateManager::populateGameFonts - Could not find font %s %d",hTemplate->m_fontName, hTemplate->m_point));
  215. hTemplate->m_font = font;
  216. ++it;
  217. }
  218. }