gennamesdialog.cpp 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357
  1. /*
  2. ** Command & Conquer Generals Zero Hour(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. *** 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 ***
  20. ***********************************************************************************************
  21. * *
  22. * Project Name : Max2W3D *
  23. * *
  24. * $Archive:: /Commando/Code/Tools/max2w3d/gennamesdialog.cpp $*
  25. * *
  26. * Original Author:: Greg Hjelstrom *
  27. * *
  28. * $Author:: Greg_h $*
  29. * *
  30. * $Modtime:: 12/06/00 3:24p $*
  31. * *
  32. * $Revision:: 2 $*
  33. * *
  34. *---------------------------------------------------------------------------------------------*
  35. * Functions: *
  36. * GenNamesDialogClass::GenNamesDialogClass -- Constructor *
  37. * GenNamesDialogClass::~GenNamesDialogClass -- Destructor *
  38. * GenNamesDialogClass::Get_Options -- Get_Options *
  39. * GenNamesDialogClass::Ok_To_Exit -- verifies that the input is valid *
  40. * GenNamesDialogClass::Toggle_Name_Assignment -- toggles the controls related to name assig *
  41. * GenNamesDialogClass::Toggle_Collision_Bits_Assignment -- toggles the controls related to *
  42. * GenNamesDialogClass::Dialog_Proc -- windows dialog proc *
  43. * _gen_names_dialog_proc -- dialog proc that "thunks" to the class's dialog proc *
  44. * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
  45. #include "gennamesdialog.h"
  46. #include "dllmain.h"
  47. #include "resource.h"
  48. static BOOL CALLBACK _gen_names_dialog_proc(HWND Hwnd,UINT message,WPARAM wParam,LPARAM lParam);
  49. /**********************************************************************************************
  50. **
  51. ** GenNamesDialogClass Implementation
  52. **
  53. **********************************************************************************************/
  54. /***********************************************************************************************
  55. * GenNamesDialogClass::GenNamesDialogClass -- Constructor *
  56. * *
  57. * INPUT: *
  58. * *
  59. * OUTPUT: *
  60. * *
  61. * WARNINGS: *
  62. * *
  63. * HISTORY: *
  64. *=============================================================================================*/
  65. GenNamesDialogClass::GenNamesDialogClass(Interface * maxinterface) :
  66. Hwnd(NULL),
  67. Options(NULL),
  68. MaxInterface(maxinterface),
  69. NameIndexSpin(NULL)
  70. {
  71. }
  72. /***********************************************************************************************
  73. * GenNamesDialogClass::~GenNamesDialogClass -- Destructor *
  74. * *
  75. * INPUT: *
  76. * *
  77. * OUTPUT: *
  78. * *
  79. * WARNINGS: *
  80. * *
  81. * HISTORY: *
  82. * 10/10/2000 gth : Created. *
  83. *=============================================================================================*/
  84. GenNamesDialogClass::~GenNamesDialogClass(void)
  85. {
  86. ReleaseISpinner(NameIndexSpin);
  87. }
  88. /***********************************************************************************************
  89. * GenNamesDialogClass::Get_Options -- Get_Options *
  90. * *
  91. * presents the dialog to the user and records his selections into the passed-in options *
  92. * structure. *
  93. * *
  94. * INPUT: *
  95. * options - pointer to a OptionsStruct to store the users input in. *
  96. * *
  97. * OUTPUT: *
  98. * true - user pressed ok and entered valid input *
  99. * *
  100. * WARNINGS: *
  101. * *
  102. * HISTORY: *
  103. * 10/10/2000 gth : Created. *
  104. *=============================================================================================*/
  105. bool GenNamesDialogClass::Get_Options(OptionsStruct * options)
  106. {
  107. Options = options;
  108. // Put up the options dialog box.
  109. BOOL result = DialogBoxParam
  110. (
  111. AppInstance,
  112. MAKEINTRESOURCE (IDD_GENERATE_NAMES_DIALOG),
  113. MaxInterface->GetMAXHWnd(),
  114. (DLGPROC) _gen_names_dialog_proc,
  115. (LPARAM) this
  116. );
  117. if (result == TRUE) {
  118. return true;
  119. } else {
  120. return false;
  121. }
  122. }
  123. /***********************************************************************************************
  124. * GenNamesDialogClass::Ok_To_Exit -- verifies that the input is valid *
  125. * *
  126. * INPUT: *
  127. * *
  128. * OUTPUT: *
  129. * true - dialog contains valid input *
  130. * *
  131. * WARNINGS: *
  132. * *
  133. * HISTORY: *
  134. * 10/10/2000 gth : Created. *
  135. *=============================================================================================*/
  136. bool GenNamesDialogClass::Ok_To_Exit(void)
  137. {
  138. if (IsDlgButtonChecked(Hwnd,IDC_ASSIGN_NAMES_CHECK) == BST_CHECKED) {
  139. // just check that the user entered a name
  140. char buf[W3D_NAME_LEN];
  141. GetWindowText(GetDlgItem(Hwnd,IDC_BASE_NAME_EDIT),buf,sizeof(buf));
  142. if (strlen(buf) == 0) {
  143. MessageBox(Hwnd,"Please enter a root name to use.\n","Error",MB_OK);
  144. return false;
  145. } else {
  146. return true;
  147. }
  148. }
  149. return true;
  150. }
  151. /***********************************************************************************************
  152. * GenNamesDialogClass::Toggle_Name_Assignment -- toggles the controls related to name assignm *
  153. * *
  154. * INPUT: *
  155. * *
  156. * OUTPUT: *
  157. * *
  158. * WARNINGS: *
  159. * *
  160. * HISTORY: *
  161. * 10/10/2000 gth : Created. *
  162. *=============================================================================================*/
  163. void GenNamesDialogClass::Toggle_Name_Assignment(void)
  164. {
  165. bool onoff = (IsDlgButtonChecked(Hwnd,IDC_ASSIGN_NAMES_CHECK) == BST_CHECKED);
  166. EnableWindow(GetDlgItem(Hwnd,IDC_BASE_NAME_EDIT),onoff);
  167. EnableWindow(GetDlgItem(Hwnd,IDC_LOD_INDEX_EDIT),onoff);
  168. EnableWindow(GetDlgItem(Hwnd,IDC_LOD_INDEX_SPIN),onoff);
  169. EnableWindow(GetDlgItem(Hwnd,IDC_NAME_INDEX_EDIT),onoff);
  170. EnableWindow(GetDlgItem(Hwnd,IDC_NAME_INDEX_SPIN),onoff);
  171. }
  172. /***********************************************************************************************
  173. * GenNamesDialogClass::Toggle_Collision_Bits_Assignment -- toggles the controls related to co *
  174. * *
  175. * INPUT: *
  176. * *
  177. * OUTPUT: *
  178. * *
  179. * WARNINGS: *
  180. * *
  181. * HISTORY: *
  182. * 10/10/2000 gth : Created. *
  183. *=============================================================================================*/
  184. void GenNamesDialogClass::Toggle_Collision_Bits_Assignment(void)
  185. {
  186. bool onoff = (IsDlgButtonChecked(Hwnd,IDC_ASSIGN_COLLISION_BITS_CHECK) == BST_CHECKED);
  187. EnableWindow(GetDlgItem(Hwnd,IDC_COLLISION_PHYSICAL),onoff);
  188. EnableWindow(GetDlgItem(Hwnd,IDC_COLLISION_PROJECTILE),onoff);
  189. EnableWindow(GetDlgItem(Hwnd,IDC_COLLISION_VIS),onoff);
  190. EnableWindow(GetDlgItem(Hwnd,IDC_COLLISION_CAMERA),onoff);
  191. EnableWindow(GetDlgItem(Hwnd,IDC_COLLISION_VEHICLE),onoff);
  192. }
  193. /***********************************************************************************************
  194. * GenNamesDialogClass::Dialog_Proc -- windows dialog proc *
  195. * *
  196. * INPUT: *
  197. * *
  198. * OUTPUT: *
  199. * *
  200. * WARNINGS: *
  201. * *
  202. * HISTORY: *
  203. * 10/10/2000 gth : Created. *
  204. *=============================================================================================*/
  205. bool GenNamesDialogClass::Dialog_Proc(HWND hWnd,UINT message,WPARAM wParam,LPARAM)
  206. {
  207. switch (message ) {
  208. case WM_INITDIALOG:
  209. NameIndexSpin = SetupIntSpinner
  210. (
  211. Hwnd,
  212. IDC_NAME_INDEX_SPIN,
  213. IDC_NAME_INDEX_EDIT,
  214. MIN_NAME_INDEX,MAX_NAME_INDEX,INITIAL_NAME_INDEX
  215. );
  216. // limit the base name edit box to 10 characters
  217. SendDlgItemMessage(Hwnd,IDC_BASE_NAME_EDIT,EM_LIMITTEXT,MAX_ROOT_NAME_LEN,0);
  218. // limit the suffix and prefix edit boxes
  219. SendDlgItemMessage(Hwnd,IDC_PREFIX_EDIT,EM_LIMITTEXT,MAX_PREFIX_LEN,0);
  220. SendDlgItemMessage(Hwnd,IDC_SUFFIX_EDIT,EM_LIMITTEXT,MAX_SUFFIX_LEN,0);
  221. // set initial name to root of the filename
  222. char buf[_MAX_FNAME];
  223. _splitpath(MaxInterface->GetCurFileName(),NULL,NULL,buf,NULL);
  224. buf[MAX_ROOT_NAME_LEN+1] = 0;
  225. SetWindowText(GetDlgItem(Hwnd,IDC_BASE_NAME_EDIT),buf);
  226. // init radio buttons
  227. CheckDlgButton(Hwnd,IDC_AFFECT_ALL_RADIO,BST_UNCHECKED);
  228. CheckDlgButton(Hwnd,IDC_AFFECT_SELECTED_RADIO,BST_CHECKED);
  229. // init the check boxes
  230. CheckDlgButton(Hwnd,IDC_ASSIGN_NAMES_CHECK,BST_CHECKED);
  231. CheckDlgButton(Hwnd,IDC_ASSIGN_PREFIX_CHECK,BST_UNCHECKED);
  232. CheckDlgButton(Hwnd,IDC_ASSIGN_SUFFIX_CHECK,BST_UNCHECKED);
  233. CheckDlgButton(Hwnd,IDC_ASSIGN_COLLISION_BITS_CHECK,BST_CHECKED);
  234. CheckDlgButton(Hwnd,IDC_COLLISION_PHYSICAL,BST_CHECKED);
  235. CheckDlgButton(Hwnd,IDC_COLLISION_PROJECTILE,BST_CHECKED);
  236. CheckDlgButton(Hwnd,IDC_COLLISION_VIS,BST_CHECKED);
  237. CheckDlgButton(Hwnd,IDC_COLLISION_CAMERA,BST_CHECKED);
  238. CheckDlgButton(Hwnd,IDC_COLLISION_VEHICLE,BST_CHECKED);
  239. return 1;
  240. case WM_COMMAND:
  241. switch (LOWORD(wParam))
  242. {
  243. case IDOK:
  244. if (Ok_To_Exit()) {
  245. // general options
  246. Options->AssignNames = (IsDlgButtonChecked(Hwnd,IDC_ASSIGN_NAMES_CHECK) == BST_CHECKED);
  247. Options->AssignPrefix = (IsDlgButtonChecked(Hwnd,IDC_ASSIGN_PREFIX_CHECK) == BST_CHECKED);
  248. Options->AssignSuffix = (IsDlgButtonChecked(Hwnd,IDC_ASSIGN_SUFFIX_CHECK) == BST_CHECKED);
  249. Options->AssignCollisionBits = (IsDlgButtonChecked(Hwnd,IDC_ASSIGN_COLLISION_BITS_CHECK) == BST_CHECKED);
  250. Options->OnlyAffectSelected = (IsDlgButtonChecked(Hwnd,IDC_AFFECT_SELECTED_RADIO) == BST_CHECKED);
  251. // naming options
  252. Options->NameIndex = NameIndexSpin->GetIVal();
  253. GetWindowText(GetDlgItem(Hwnd,IDC_BASE_NAME_EDIT),Options->RootName,sizeof(Options->RootName));
  254. GetWindowText(GetDlgItem(Hwnd,IDC_PREFIX_EDIT),Options->PrefixName,sizeof(Options->PrefixName));
  255. GetWindowText(GetDlgItem(Hwnd,IDC_SUFFIX_EDIT),Options->SuffixName,sizeof(Options->SuffixName));
  256. // collision options
  257. Options->PhysicalCollision = (IsDlgButtonChecked(Hwnd,IDC_COLLISION_PHYSICAL) == BST_CHECKED);
  258. Options->ProjectileCollision = (IsDlgButtonChecked(Hwnd,IDC_COLLISION_PROJECTILE) == BST_CHECKED);
  259. Options->VisCollision = (IsDlgButtonChecked(Hwnd,IDC_COLLISION_VIS) == BST_CHECKED);
  260. Options->CameraCollision = (IsDlgButtonChecked(Hwnd,IDC_COLLISION_CAMERA) == BST_CHECKED);
  261. Options->VehicleCollision = (IsDlgButtonChecked(Hwnd,IDC_COLLISION_VEHICLE) == BST_CHECKED);
  262. EndDialog(Hwnd, 1);
  263. }
  264. break;
  265. case IDCANCEL:
  266. EndDialog(Hwnd, 0);
  267. break;
  268. case IDC_ASSIGN_NAMES_CHECK:
  269. Toggle_Name_Assignment();
  270. break;
  271. case IDC_ASSIGN_PREFIX_CHECK:
  272. EnableWindow(GetDlgItem(Hwnd,IDC_PREFIX_EDIT),(IsDlgButtonChecked(Hwnd,IDC_ASSIGN_SUFFIX_CHECK) == BST_CHECKED));
  273. break;
  274. case IDC_ASSIGN_SUFFIX_CHECK:
  275. EnableWindow(GetDlgItem(Hwnd,IDC_SUFFIX_EDIT),(IsDlgButtonChecked(Hwnd,IDC_ASSIGN_SUFFIX_CHECK) == BST_CHECKED));
  276. break;
  277. case IDC_ASSIGN_COLLISION_BITS_CHECK:
  278. Toggle_Collision_Bits_Assignment();
  279. break;
  280. }
  281. return 1;
  282. }
  283. return 0;
  284. }
  285. /***********************************************************************************************
  286. * _gen_names_dialog_proc -- dialog proc that "thunks" to the class's dialog proc *
  287. * *
  288. * INPUT: *
  289. * *
  290. * OUTPUT: *
  291. * *
  292. * WARNINGS: *
  293. * *
  294. * HISTORY: *
  295. * 10/10/2000 gth : Created. *
  296. *=============================================================================================*/
  297. static BOOL CALLBACK _gen_names_dialog_proc(HWND hwnd,UINT message,WPARAM wparam,LPARAM lparam)
  298. {
  299. static GenNamesDialogClass * dialog = NULL;
  300. if (message == WM_INITDIALOG) {
  301. dialog = (GenNamesDialogClass *)lparam;
  302. dialog->Hwnd = hwnd;
  303. }
  304. if (dialog) {
  305. return dialog->Dialog_Proc(hwnd, message, wparam, lparam);
  306. } else {
  307. return FALSE;
  308. }
  309. }