2 ===========================================================================
5 Copyright (C) 1999-2011 id Software LLC, a ZeniMax Media company.
7 This file is part of the Doom 3 GPL Source Code (?Doom 3 Source Code?).
9 Doom 3 Source Code is free software: you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
14 Doom 3 Source Code is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with Doom 3 Source Code. If not, see <http://www.gnu.org/licenses/>.
22 In addition, the Doom 3 Source Code is also subject to certain additional terms. You should have received a copy of these additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the Doom 3 Source Code. If not, please request a copy in writing from id Software at the address below.
24 If you have questions concerning this license or the applicable additional terms, you may contact in writing id Software LLC, c/o ZeniMax Media Inc., Suite 120, Rockville, Maryland 20850 USA.
26 ===========================================================================
29 #include "../../idlib/precompiled.h"
32 #include "../../sys/win32/rc/guied_resource.h"
33 #include "../common/ColorButton.h"
34 #include "../common/MaskEdit.h"
37 #include "GEItemPropsDlg.h"
38 #include "GEPropertyPage.h"
42 RVITEMPROPS_GENERAL = 0,
50 class rvGEItemPropsImagePage : public rvGEPropertyPage
54 rvGEItemPropsImagePage ( idDict* dictValues );
56 virtual bool Init ( void );
57 virtual bool SetActive ( void );
58 virtual bool KillActive ( void );
59 virtual int HandleMessage ( UINT msg, WPARAM wParam, LPARAM lParam );
63 void UpdateCheckedStates ( void );
68 rvGEItemPropsImagePage::rvGEItemPropsImagePage ( idDict* dict )
75 rvGEItemPropsImagePage::Init
77 Subclass the custom controls on the page
80 bool rvGEItemPropsImagePage::Init ( void )
82 NumberEdit_Attach ( GetDlgItem ( mPage, IDC_GUIED_ITEMMATSCALEX ) );
83 NumberEdit_Attach ( GetDlgItem ( mPage, IDC_GUIED_ITEMMATSCALEY ) );
84 NumberEdit_Attach ( GetDlgItem ( mPage, IDC_GUIED_ITEMBORDERSIZE ) );
91 rvGEItemPropsImagePage::UpdateCheckedStates
93 Updates the enabled state of all the controls that are linked to a checkbox
96 void rvGEItemPropsImagePage::UpdateCheckedStates ( void )
104 enable = !IsExpression ( mDict->GetString ( "backcolor", "1,1,1,1" ) );
105 EnableWindow ( GetDlgItem ( mPage, IDC_GUIED_USEBACKCOLOR ), enable );
107 state = IsDlgButtonChecked ( mPage, IDC_GUIED_USEBACKCOLOR ) && IsWindowEnabled ( GetDlgItem ( mPage, IDC_GUIED_USEBACKCOLOR ) );
108 EnableWindow ( GetDlgItem ( mPage, IDC_GUIED_ITEMBACKCOLOR ), state );
109 EnableWindow ( GetDlgItem ( mPage, IDC_GUIED_ITEMBACKCOLORALPHA ), state );
111 state = IsDlgButtonChecked ( mPage, IDC_GUIED_USEMATERIAL) != 0;
112 EnableWindow ( GetDlgItem ( mPage, IDC_GUIED_ITEMBACKGROUND ), state );
113 EnableWindow ( GetDlgItem ( mPage, IDC_GUIED_ITEMVARIABLEBACKGROUND ), state );
114 EnableWindow ( GetDlgItem ( mPage, IDC_GUIED_ITEMMATSCALEX ), state );
115 EnableWindow ( GetDlgItem ( mPage, IDC_GUIED_ITEMMATSCALEY ), state );
116 EnableWindow ( GetDlgItem ( mPage, IDC_GUIED_XSCALE_STATIC), state );
117 EnableWindow ( GetDlgItem ( mPage, IDC_GUIED_YSCALE_STATIC), state );
119 GetWindowText ( GetDlgItem ( mPage, IDC_GUIED_ITEMBORDERSIZE ), temp, 64 );
120 enable = !IsExpression ( mDict->GetString ( "bordersize", "0" ) );
121 EnableWindow ( GetDlgItem ( mPage, IDC_GUIED_ITEMBORDERSIZE ), enable );
123 state = atol( temp ) ? true : false;
124 rstate = IsDlgButtonChecked ( mPage, IDC_GUIED_USEBORDERCOLOR ) != 0;
125 enable = !IsExpression ( mDict->GetString ( "bordercolor", "1,1,1,1" ) );
126 EnableWindow ( GetDlgItem ( mPage, IDC_GUIED_USEBORDERCOLOR ), state && enable );
127 EnableWindow ( GetDlgItem ( mPage, IDC_GUIED_USEBORDERMATERIAL ), state && enable);
128 EnableWindow ( GetDlgItem ( mPage, IDC_GUIED_ITEMBORDERCOLOR ), rstate && state && enable);
129 EnableWindow ( GetDlgItem ( mPage, IDC_GUIED_ITEMBORDERCOLORALPHA ), rstate && state && enable );
130 EnableWindow ( GetDlgItem ( mPage, IDC_GUIED_ITEMBORDERMATERIAL ), !rstate && state );
132 state = (state && !rstate) || IsDlgButtonChecked ( mPage, IDC_GUIED_USEMATERIAL);
133 enable = !IsExpression ( mDict->GetString ( "matcolor", "1,1,1,1" ) );
134 EnableWindow ( GetDlgItem ( mPage, IDC_GUIED_ITEMMATCOLORSTATIC ), state && enable );
135 EnableWindow ( GetDlgItem ( mPage, IDC_GUIED_ITEMMATCOLOR ), state && enable );
136 EnableWindow ( GetDlgItem ( mPage, IDC_GUIED_ITEMMATCOLORALPHA ), state && enable );
141 rvGEItemPropsImagePage::HandleMessage
143 Handles messages for the text item properties page
146 int rvGEItemPropsImagePage::HandleMessage ( UINT msg, WPARAM wParam, LPARAM lParam )
151 ColorButton_DrawItem ( GetDlgItem ( mPage, wParam ), (LPDRAWITEMSTRUCT)lParam );
155 switch ( LOWORD(wParam) )
157 case IDC_GUIED_ITEMBORDERSIZE:
158 if ( HIWORD(wParam) == EN_CHANGE )
160 UpdateCheckedStates ( );
164 case IDC_GUIED_USEBORDERCOLOR:
165 case IDC_GUIED_USEBORDERMATERIAL:
166 case IDC_GUIED_USEBACKCOLOR:
167 case IDC_GUIED_USEMATERIAL:
168 UpdateCheckedStates ( );
171 case IDC_GUIED_ITEMBACKCOLORALPHA:
172 case IDC_GUIED_ITEMMATCOLORALPHA:
173 case IDC_GUIED_ITEMBORDERCOLORALPHA:
175 AlphaButton_OpenPopup ( GetDlgItem ( mPage, LOWORD(wParam) ) );
179 case IDC_GUIED_ITEMBORDERCOLOR:
180 case IDC_GUIED_ITEMBACKCOLOR:
181 case IDC_GUIED_ITEMMATCOLOR:
184 ZeroMemory ( &col, sizeof(col) );
185 col.lStructSize = sizeof(col);
186 col.lpCustColors = gApp.GetOptions().GetCustomColors ( );
187 col.hwndOwner = mPage;
188 col.hInstance = NULL;
189 col.Flags = CC_RGBINIT;
190 col.rgbResult = ColorButton_GetColor ( GetDlgItem ( mPage, LOWORD(wParam) ) );
191 if ( ChooseColor ( &col ) )
193 ColorButton_SetColor ( GetDlgItem ( mPage, LOWORD(wParam) ), col.rgbResult );
201 return rvGEPropertyPage::HandleMessage ( msg, wParam, lParam );
206 rvGEItemPropsImagePage::SetActive
208 Initializes the text properties page by copying data from the attached
209 window into the controls
212 bool rvGEItemPropsImagePage::SetActive ( void )
214 gApp.GetOptions().SetLastOptionsPage ( RVITEMPROPS_IMAGE );
216 ColorButton_SetColor ( GetDlgItem ( mPage, IDC_GUIED_ITEMBACKCOLOR ), mDict->GetString ( "backcolor", "1,1,1,1" ) );
217 AlphaButton_SetColor ( GetDlgItem ( mPage, IDC_GUIED_ITEMBACKCOLORALPHA ), mDict->GetString ( "backcolor", "1,1,1,1" ) );
219 ColorButton_SetColor ( GetDlgItem ( mPage, IDC_GUIED_ITEMMATCOLOR ), mDict->GetString ( "matcolor", "1,1,1,1" ) );
220 AlphaButton_SetColor ( GetDlgItem ( mPage, IDC_GUIED_ITEMMATCOLORALPHA ), mDict->GetString ( "matcolor", "1,1,1,1" ) );
222 ColorButton_SetColor ( GetDlgItem ( mPage, IDC_GUIED_ITEMBORDERCOLOR ), mDict->GetString ( "bordercolor", "0,0,0,1" ) );
223 AlphaButton_SetColor ( GetDlgItem ( mPage, IDC_GUIED_ITEMBORDERCOLORALPHA ), mDict->GetString ( "bordercolor", "0,0,0,1" ) );
225 SetWindowText ( GetDlgItem ( mPage, IDC_GUIED_ITEMBACKGROUND ), idStr(mDict->GetString ( "background", "" )).StripQuotes ( ) );
226 SetWindowText ( GetDlgItem ( mPage, IDC_GUIED_ITEMBORDERMATERIAL ), idStr(mDict->GetString ( "borderShader", "" )).StripQuotes ( ) );
227 SetWindowText ( GetDlgItem ( mPage, IDC_GUIED_ITEMBORDERSIZE ), idStr(mDict->GetString ( "bordersize", "0" )).StripQuotes ( ) );
229 SetWindowText ( GetDlgItem ( mPage, IDC_GUIED_ITEMMATSCALEX ), idStr(mDict->GetString ( "matscalex", "1" )).StripQuotes ( ) );
230 SetWindowText ( GetDlgItem ( mPage, IDC_GUIED_ITEMMATSCALEY ), idStr(mDict->GetString ( "matscaley", "1" )).StripQuotes ( ) );
232 CheckDlgButton ( mPage, IDC_GUIED_ITEMVARIABLEBACKGROUND, mDict->GetBool ( "variablebackground", "0" ) );
234 CheckDlgButton ( mPage, IDC_GUIED_USEMATERIAL, idStr(mDict->GetString ( "background", "" )).StripQuotes ( ).Length()?BST_CHECKED:BST_UNCHECKED );
235 CheckDlgButton ( mPage, IDC_GUIED_USEBACKCOLOR, idStr(mDict->GetString ( "backcolor", "" )).StripQuotes ( ).Length()?BST_CHECKED:BST_UNCHECKED );
237 CheckRadioButton ( mPage, IDC_GUIED_USEBORDERCOLOR, IDC_GUIED_USEBORDERMATERIAL,
238 idStr(mDict->GetString("borderShader","")).Length()?IDC_GUIED_USEBORDERMATERIAL:IDC_GUIED_USEBORDERCOLOR );
240 UpdateCheckedStates ( );
247 rvGEItemPropsImagePage::KillActive
249 Applys the settings currently stored in the property page back into the attached window
252 bool rvGEItemPropsImagePage::KillActive ( void )
255 bool matcolor = false;
258 if ( IsDlgButtonChecked ( mPage, IDC_GUIED_USEMATERIAL ) )
262 GetWindowText ( GetDlgItem(mPage,IDC_GUIED_ITEMBACKGROUND), temp, 1024 );
266 mDict->Set ( "background", s );
269 GetWindowText ( GetDlgItem ( mPage, IDC_GUIED_ITEMMATSCALEX ), temp, 1024 );
271 if ( val >= 0.999f && val <= 1.001f )
273 mDict->Delete ( "matscalex" );
277 mDict->Set ( "matscalex", idStr::FloatArrayToString( &val, 1, 8 ) );
280 GetWindowText ( GetDlgItem ( mPage, IDC_GUIED_ITEMMATSCALEY ), temp, 1024 );
282 if ( val >= 0.999f && val <= 1.001f )
284 mDict->Delete ( "matscaley" );
288 mDict->Set ( "matscaley", idStr::FloatArrayToString( &val, 1, 8 ) );
291 if ( IsDlgButtonChecked ( mPage, IDC_GUIED_ITEMVARIABLEBACKGROUND ) )
293 mDict->Set ( "variablebackground", "1" );
297 mDict->Delete ( "variablebackground" );
302 mDict->Delete ( "background" );
303 mDict->Delete ( "variablebackground" );
304 mDict->Delete ( "matscalex" );
305 mDict->Delete ( "matscaley" );
308 if ( IsDlgButtonChecked ( mPage, IDC_GUIED_USEBACKCOLOR ) )
310 if ( IsWindowEnabled ( GetDlgItem ( mPage, IDC_GUIED_ITEMBACKCOLOR ) ) )
312 COLORREF color = ColorButton_GetColor ( GetDlgItem ( mPage, IDC_GUIED_ITEMBACKCOLOR ) );
313 COLORREF alpha = ColorButton_GetColor ( GetDlgItem ( mPage, IDC_GUIED_ITEMBACKCOLORALPHA ) );
314 mDict->Set ( "backcolor", StringFromVec4 ( idVec4((float)GetRValue ( color ) / 255.0f, (float)GetGValue ( color ) / 255.0f, (float)GetBValue ( color ) / 255.0f, (float)GetRValue(alpha )/255.0f ) ) );
319 mDict->Delete ( "backcolor" );
322 GetWindowText ( GetDlgItem ( mPage, IDC_GUIED_ITEMBORDERSIZE ), temp, 1024 );
325 if ( IsWindowEnabled ( GetDlgItem ( mPage, IDC_GUIED_ITEMBORDERSIZE) ) )
327 mDict->Set ( "bordersize", va("%d", atoi(temp) ) );
330 if ( IsDlgButtonChecked ( mPage, IDC_GUIED_USEBORDERCOLOR ) )
332 if ( IsWindowEnabled ( GetDlgItem ( mPage, IDC_GUIED_ITEMBORDERCOLOR ) ) )
334 COLORREF color = ColorButton_GetColor ( GetDlgItem ( mPage, IDC_GUIED_ITEMBORDERCOLOR ) );
335 COLORREF alpha = ColorButton_GetColor ( GetDlgItem ( mPage, IDC_GUIED_ITEMBORDERCOLORALPHA ) );
336 mDict->Set ( "bordercolor", StringFromVec4 ( idVec4((float)GetRValue ( color ) / 255.0f, (float)GetGValue ( color ) / 255.0f, (float)GetBValue ( color ) / 255.0f, (float)GetRValue(alpha )/255.0f ) ) );
338 mDict->Delete ( "borderShader" );
342 GetWindowText ( GetDlgItem ( mPage, IDC_GUIED_ITEMBORDERMATERIAL ), temp, 1024 );
346 mDict->Set ( "borderShader", s );
347 mDict->Delete ( "bordercolor" );
353 mDict->Delete ( "bordersize" );
354 mDict->Delete ( "bordercolor" );
355 mDict->Delete ( "borderShader" );
360 if ( IsWindowEnabled ( GetDlgItem ( mPage, IDC_GUIED_ITEMMATCOLOR ) ) )
362 COLORREF color = ColorButton_GetColor ( GetDlgItem ( mPage, IDC_GUIED_ITEMMATCOLOR ) );
363 COLORREF alpha = ColorButton_GetColor ( GetDlgItem ( mPage, IDC_GUIED_ITEMMATCOLORALPHA ) );
364 mDict->Set ( "matcolor", StringFromVec4 ( idVec4((float)GetRValue ( color ) / 255.0f, (float)GetGValue ( color ) / 255.0f, (float)GetBValue ( color ) / 255.0f, (float)GetRValue(alpha )/255.0f ) ) );
369 mDict->Delete ( "matcolor" );
375 class rvGEItemPropsTextPage : public rvGEPropertyPage
379 rvGEItemPropsTextPage ( idDict* dictValues );
381 virtual bool Init ( void );
382 virtual bool SetActive ( void );
383 virtual bool KillActive ( void );
384 virtual int HandleMessage ( UINT msg, WPARAM wParam, LPARAM lParam );
388 void UpdateCheckedStates ( void );
393 rvGEItemPropsTextPage::rvGEItemPropsTextPage ( idDict* dict )
400 rvGEItemPropsTextPage::Init
402 Subclass the custom controls on the page
405 bool rvGEItemPropsTextPage::Init ( void )
407 NumberEdit_Attach ( GetDlgItem ( mPage, IDC_GUIED_ITEMTEXTSCALE ) );
408 NumberEdit_Attach ( GetDlgItem ( mPage, IDC_GUIED_ITEMTEXTALIGNX ) );
409 NumberEdit_Attach ( GetDlgItem ( mPage, IDC_GUIED_ITEMTEXTALIGNY ) );
411 SendMessage ( GetDlgItem ( mPage, IDC_GUIED_ITEMTEXTALIGN ), CB_ADDSTRING, 0, (LPARAM)"Left" );
412 SendMessage ( GetDlgItem ( mPage, IDC_GUIED_ITEMTEXTALIGN ), CB_ADDSTRING, 0, (LPARAM)"Center" );
413 SendMessage ( GetDlgItem ( mPage, IDC_GUIED_ITEMTEXTALIGN ), CB_ADDSTRING, 0, (LPARAM)"Right" );
415 SendMessage ( GetDlgItem ( mPage, IDC_GUIED_ITEMTEXTFONT ), CB_ADDSTRING, 0, (LONG)"<default>" );
420 folders = fileSystem->ListFiles( "fonts", "/" );
422 for ( i = 0; i < folders->GetNumFiles(); i++ ) {
423 if ( folders->GetFile(i)[0] == '.' ) {
427 SendMessage ( GetDlgItem ( mPage, IDC_GUIED_ITEMTEXTFONT ), CB_ADDSTRING, 0, (LONG)folders->GetFile(i) );
430 fileSystem->FreeFileList( folders );
437 rvGEItemPropsTextPage::UpdateCheckedStates
439 Updates the enabled state of all the controls that are linked to a checkbox
442 void rvGEItemPropsTextPage::UpdateCheckedStates ( void )
448 state = IsDlgButtonChecked ( mPage, IDC_GUIED_USETEXT ) != 0;
449 enable = !IsExpression ( mDict->GetString ( "forecolor", "1,1,1,1" ) );
451 EnableWindow ( GetDlgItem ( mPage, IDC_GUIED_ITEMFORECOLOR ), state && enable );
452 EnableWindow ( GetDlgItem ( mPage, IDC_GUIED_ITEMFORECOLORALPHA ), state && enable );
454 EnableWindow ( GetDlgItem ( mPage, IDC_GUIED_ITEMTEXT ), state );
455 EnableWindow ( GetDlgItem ( mPage, IDC_GUIED_ITEMTEXTSCALE ), state );
456 EnableWindow ( GetDlgItem ( mPage, IDC_GUIED_ITEMTEXTSCALE ), state );
457 EnableWindow ( GetDlgItem ( mPage, IDC_GUIED_ITEMTEXTALIGN ), state );
458 EnableWindow ( GetDlgItem ( mPage, IDC_GUIED_ITEMTEXTALIGNX ), state );
459 EnableWindow ( GetDlgItem ( mPage, IDC_GUIED_ITEMTEXTALIGNY ), state );
460 EnableWindow ( GetDlgItem ( mPage, IDC_GUIED_ITEMTEXTFONT), state );
461 EnableWindow ( GetDlgItem ( mPage, IDC_GUIED_ITEMTEXTNOWRAP), state );
463 EnableWindow ( GetDlgItem ( mPage, IDC_GUIED_STATIC_ALIGNMENT ), state );
464 EnableWindow ( GetDlgItem ( mPage, IDC_GUIED_STATIC_X ), state );
465 EnableWindow ( GetDlgItem ( mPage, IDC_GUIED_STATIC_Y ), state );
466 EnableWindow ( GetDlgItem ( mPage, IDC_GUIED_STATIC_SCALE ), state );
467 EnableWindow ( GetDlgItem ( mPage, IDC_GUIED_STATIC_COLOR ), state );
468 EnableWindow ( GetDlgItem ( mPage, IDC_GUIED_STATIC_FONT), state );
473 rvGEItemPropsTextPage::HandleMessage
475 Handles messages for the text item properties page
478 int rvGEItemPropsTextPage::HandleMessage ( UINT msg, WPARAM wParam, LPARAM lParam )
483 ColorButton_DrawItem ( GetDlgItem ( mPage, wParam ), (LPDRAWITEMSTRUCT)lParam );
487 switch ( LOWORD(wParam) )
489 case IDC_GUIED_ITEMTEXTFONT:
492 case IDC_GUIED_USETEXT:
493 UpdateCheckedStates ( );
496 case IDC_GUIED_ITEMFORECOLORALPHA:
497 AlphaButton_OpenPopup ( GetDlgItem ( mPage, LOWORD(wParam) ) );
500 case IDC_GUIED_ITEMFORECOLOR:
503 ZeroMemory ( &col, sizeof(col) );
504 col.lStructSize = sizeof(col);
505 col.lpCustColors = gApp.GetOptions().GetCustomColors ( );
506 col.hwndOwner = mPage;
507 col.hInstance = NULL;
508 col.Flags = CC_RGBINIT;
509 col.rgbResult = ColorButton_GetColor ( GetDlgItem ( mPage, LOWORD(wParam) ) );
510 if ( ChooseColor ( &col ) )
512 ColorButton_SetColor ( GetDlgItem ( mPage, LOWORD(wParam) ), col.rgbResult );
520 return rvGEPropertyPage::HandleMessage ( msg, wParam, lParam );
525 rvGEItemPropsTextPage::SetActive
527 Initializes the text properties page by copying data from the attached
528 window into the controls
531 bool rvGEItemPropsTextPage::SetActive ( void )
533 gApp.GetOptions().SetLastOptionsPage ( RVITEMPROPS_TEXT );
535 ColorButton_SetColor ( GetDlgItem ( mPage, IDC_GUIED_ITEMFORECOLOR ), mDict->GetString ( "forecolor", "1,1,1,1" ) );
536 AlphaButton_SetColor ( GetDlgItem ( mPage, IDC_GUIED_ITEMFORECOLORALPHA ), mDict->GetString ( "forecolor", "1,1,1,1" ) );
538 SetWindowText ( GetDlgItem ( mPage, IDC_GUIED_ITEMTEXT ), idStr(mDict->GetString ( "text", "" )).StripQuotes ( ) );
539 SetWindowText ( GetDlgItem ( mPage, IDC_GUIED_ITEMTEXTSCALE ), mDict->GetString ( "textscale", "1.0" ) );
540 SetWindowText ( GetDlgItem ( mPage, IDC_GUIED_ITEMTEXTALIGNX ), mDict->GetString ( "textalignx", "0" ) );
541 SetWindowText ( GetDlgItem ( mPage, IDC_GUIED_ITEMTEXTALIGNY ), mDict->GetString ( "textaligny", "0" ) );
543 SendMessage ( GetDlgItem ( mPage, IDC_GUIED_ITEMTEXTALIGN ), CB_SETCURSEL, atoi(mDict->GetString("textalign", "0")), 0 );
545 // Figure out which font to select
546 idStr font = mDict->GetString ( "font", "" );
548 font.StripQuotes ( );
550 fontSel = SendMessage ( GetDlgItem ( mPage, IDC_GUIED_ITEMTEXTFONT ), CB_FINDSTRING, -1, (LONG)font.c_str () );
551 SendMessage ( GetDlgItem ( mPage, IDC_GUIED_ITEMTEXTFONT ), CB_SETCURSEL, 0, 0 );
552 SendMessage ( GetDlgItem ( mPage, IDC_GUIED_ITEMTEXTFONT ), CB_SETCURSEL, fontSel==-1?0:fontSel, 0 );
554 CheckDlgButton ( mPage, IDC_GUIED_USETEXT, idStr(mDict->GetString ( "text", "" )).Length()?BST_CHECKED:BST_UNCHECKED );
555 CheckDlgButton ( mPage, IDC_GUIED_ITEMTEXTNOWRAP, atoi(idStr(mDict->GetString ( "nowrap", "0" )).StripQuotes())?BST_CHECKED:BST_UNCHECKED );
557 UpdateCheckedStates ( );
564 rvGEItemPropsTextPage::KillActive
566 Applys the settings currently stored in the property page back into the attached window
569 bool rvGEItemPropsTextPage::KillActive ( void )
576 if ( IsDlgButtonChecked ( mPage, IDC_GUIED_USETEXT ) )
578 if ( IsWindowEnabled ( GetDlgItem ( mPage, IDC_GUIED_ITEMFORECOLOR ) ) )
580 COLORREF color = ColorButton_GetColor ( GetDlgItem ( mPage, IDC_GUIED_ITEMFORECOLOR ) );
581 COLORREF alpha = ColorButton_GetColor ( GetDlgItem ( mPage, IDC_GUIED_ITEMFORECOLORALPHA ) );
582 mDict->Set ( "forecolor", StringFromVec4 ( idVec4((float)GetRValue ( color ) / 255.0f, (float)GetGValue ( color ) / 255.0f, (float)GetBValue ( color ) / 255.0f, (float)GetRValue(alpha )/255.0f ) ) );
585 GetWindowText ( GetDlgItem(mPage,IDC_GUIED_ITEMTEXT), temp, 1024 );
589 mDict->Set ( "text", s );
591 GetWindowText ( GetDlgItem(mPage,IDC_GUIED_ITEMTEXTSCALE), temp, 1024 );
593 mDict->Set ( "textscale", idStr::FloatArrayToString( &f, 1, 8 ) );
595 i = SendMessage ( GetDlgItem ( mPage, IDC_GUIED_ITEMTEXTALIGN ), CB_GETCURSEL, 0, 0 );
599 mDict->Set ( "textalign", s );
603 mDict->Delete ( "textalign" );
606 GetWindowText ( GetDlgItem(mPage,IDC_GUIED_ITEMTEXTALIGNX), temp, 1024 );
610 mDict->Set ( "textalignx", va("%d", i ) );
614 mDict->Delete ( "textalignx" );
617 GetWindowText ( GetDlgItem(mPage,IDC_GUIED_ITEMTEXTALIGNY), temp, 1024 );
621 mDict->Set ( "textaligny", va("%d", i ) );
625 mDict->Delete ( "textaligny" );
628 int fontSel = SendMessage ( GetDlgItem ( mPage, IDC_GUIED_ITEMTEXTFONT ), CB_GETCURSEL, 0, 0 );
631 mDict->Delete ( "font" );
635 char fontName[MAX_PATH];
636 SendMessage ( GetDlgItem ( mPage, IDC_GUIED_ITEMTEXTFONT ), CB_GETLBTEXT, fontSel, (LONG)fontName );
637 mDict->Set ( "font", idStr("\"fonts/") + idStr(fontName) + idStr("\"" ) );
640 if ( IsDlgButtonChecked ( mPage, IDC_GUIED_ITEMTEXTNOWRAP ) )
642 mDict->Set ( "nowrap", "1" );
646 mDict->Delete ( "nowrap" );
651 mDict->Delete ( "text" );
652 mDict->Delete ( "textscale" );
653 mDict->Delete ( "textalign" );
654 mDict->Delete ( "textalignx" );
655 mDict->Delete ( "textaligny" );
656 mDict->Delete ( "forecolor" );
657 mDict->Delete ( "font" );
663 class rvGEItemPropsKeysPage : public rvGEPropertyPage
667 rvGEItemPropsKeysPage ( idDict* dictValues, rvGEWindowWrapper* wrapper );
669 virtual bool Init ( void );
670 virtual bool SetActive ( void );
671 virtual int HandleMessage ( UINT msg, WPARAM wParam, LPARAM lParam );
676 rvGEWindowWrapper* mWrapper;
679 rvGEItemPropsKeysPage::rvGEItemPropsKeysPage ( idDict* dict, rvGEWindowWrapper* wrapper )
685 INT_PTR CALLBACK ModifyItemKeyDlg_WndProc ( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
691 const idKeyValue* keyValue = (const idKeyValue*) lParam;
692 MaskEdit_Attach ( GetDlgItem ( hwnd, IDC_GUIED_ITEMKEY ), " \t\r\n" );
693 SetWindowText ( GetDlgItem ( hwnd, IDC_GUIED_ITEMVALUE ), idStr(keyValue->GetValue()).StripQuotes ( ) );
694 if ( idStr::Icmp ( keyValue->GetKey(), "guied_temp" ) )
696 if ( !idStr::Icmp ( keyValue->GetKey(), "name" ) || !idStr::Icmp ( keyValue->GetKey(), "rect" ) )
698 // Dont allow editing the name keyname
699 EnableWindow ( GetDlgItem ( hwnd, IDC_GUIED_ITEMKEY ), FALSE );
702 SetWindowText ( GetDlgItem ( hwnd, IDC_GUIED_ITEMKEY ), keyValue->GetKey() );
703 SetFocus ( GetDlgItem ( hwnd, IDC_GUIED_ITEMVALUE ) );
704 SendMessage( GetDlgItem ( hwnd, IDC_GUIED_ITEMVALUE ), EM_SETSEL, 0, -1 );
706 SetWindowText ( hwnd, "New Item Key" );
709 SetWindowLong ( hwnd, GWL_USERDATA, lParam );
714 switch ( LOWORD(wParam) )
721 const idKeyValue* keyValue = (const idKeyValue*) GetWindowLong ( hwnd, GWL_USERDATA );
723 GetWindowText ( GetDlgItem ( hwnd, IDC_GUIED_ITEMKEY ), key, 1024 );
724 GetWindowText ( GetDlgItem ( hwnd, IDC_GUIED_ITEMVALUE ), value, 1024 );
726 if ( strlen ( key ) < 1 )
728 gApp.MessageBox ( va("Invalid key name '%s'", key), MB_OK|MB_ICONERROR );
732 // FIXME: MrE may never change key value pairs directly!
733 //keyValue->GetKey() = key;
734 //keyValue->GetValue = value;
736 EndDialog ( hwnd, 1);
742 EndDialog ( hwnd, 0 );
751 int rvGEItemPropsKeysPage::HandleMessage ( UINT msg, WPARAM wParam, LPARAM lParam )
757 NMHDR* nm = (NMHDR*) lParam;
759 // There are a few protected keys that need to dissallow deleting so
760 // check to see if the newly selected key is one of them and if so then
761 // disable the delete button
762 if ( nm->code == LVN_ITEMCHANGED )
764 NMLISTVIEW* nmlv = (NMLISTVIEW*) nm;
765 if ( nmlv->uNewState & LVIS_SELECTED )
767 const idKeyValue* keyValue = (idKeyValue*) nmlv->lParam;
770 if ( !idStr::Icmp ( keyValue->GetKey(), "name" ) || !idStr::Icmp ( keyValue->GetKey(), "rect" ) )
772 EnableWindow ( GetDlgItem ( mPage, IDC_GUIED_DELETEKEY ), FALSE );
776 EnableWindow ( GetDlgItem ( mPage, IDC_GUIED_DELETEKEY ), TRUE );
784 switch ( LOWORD(wParam) )
786 case IDC_GUIED_ADDKEY:
788 HWND list = GetDlgItem ( mPage, IDC_GUIED_ITEMKEYS );
789 mDict->Set( "guied_temp", "" );
790 const idKeyValue* key = mDict->FindKey ( "guied_temp" );
792 idStr old = key->GetValue();
795 if ( DialogBoxParam ( gApp.GetInstance (), MAKEINTRESOURCE(IDD_GUIED_ITEMKEY), mPage, ModifyItemKeyDlg_WndProc, (LPARAM)key ) )
799 finalValue = key->GetValue();
800 if ( !mWrapper->VerfiyStateKey ( key->GetKey(), finalValue ) )
803 finalValue += key->GetValue();
805 if ( !mWrapper->VerfiyStateKey ( key->GetKey(), finalValue ) )
807 gApp.MessageBox ( va("Invalid property value '%s' for property '%s'", key->GetValue().c_str(), key->GetKey().c_str()), MB_OK|MB_ICONERROR );
812 mDict->Set( key->GetKey(), finalValue );
815 ZeroMemory ( &item, sizeof(item) );
816 item.mask = LVIF_TEXT|LVIF_PARAM;
817 item.iItem = ListView_GetItemCount ( list );
818 item.pszText = (LPSTR)key->GetKey().c_str ( );
819 item.lParam = (LONG) key;
820 int index = ListView_InsertItem ( list, &item );
822 finalValue.StripQuotes ( );
823 ListView_SetItemText ( list, index, 1, (LPSTR)finalValue.c_str ( ) );
829 mDict->Delete ( "guied_temp" );
836 case IDC_GUIED_EDITKEY:
838 HWND list = GetDlgItem ( mPage, IDC_GUIED_ITEMKEYS );
839 int index = ListView_GetNextItem ( list, -1, LVNI_SELECTED );
844 item.mask = LVIF_PARAM;
845 ListView_GetItem ( list, &item );
846 const idKeyValue* key = (const idKeyValue*)item.lParam;
851 if ( DialogBoxParam ( gApp.GetInstance (), MAKEINTRESOURCE(IDD_GUIED_ITEMKEY), mPage, ModifyItemKeyDlg_WndProc, (LPARAM)key ) )
855 finalValue = key->GetValue();
856 if ( !mWrapper->VerfiyStateKey ( key->GetKey(), finalValue ) )
859 finalValue += key->GetValue();
861 if ( !mWrapper->VerfiyStateKey ( key->GetKey(), finalValue ) )
863 gApp.MessageBox ( va("Invalid property value '%s' for property '%s'", key->GetValue().c_str(), key->GetKey().c_str()), MB_OK|MB_ICONERROR );
868 // FIXME: MrE is this the right thing todo?
869 mDict->Set( key->GetKey(), finalValue );
870 //key->GetValue() = finalValue;
872 ListView_SetItemText ( list, index, 0, (LPSTR)key->GetKey().c_str() );
874 finalValue.StripQuotes ( );
875 ListView_SetItemText ( list, index, 1, (LPSTR)finalValue.c_str() );
883 case IDC_GUIED_DELETEKEY:
885 HWND list = GetDlgItem ( mPage, IDC_GUIED_ITEMKEYS );
886 int index = ListView_GetNextItem ( list, -1, LVNI_SELECTED );
891 item.mask = LVIF_PARAM;
892 ListView_GetItem ( list, &item );
893 const idKeyValue* key = (const idKeyValue*)item.lParam;
896 mDict->Delete ( key->GetKey() );
898 ListView_DeleteItem ( list, index );
906 return rvGEPropertyPage::HandleMessage ( msg, wParam, lParam );
911 rvGEItemPropsKeysPage::Init
913 Called when the advanced page is first initialized. Setup the extended
914 control styles and add the key/value columns
917 bool rvGEItemPropsKeysPage::Init ( void )
922 // Get the list control
923 list = GetDlgItem ( mPage, IDC_GUIED_ITEMKEYS );
926 GetClientRect ( list, &rWindow );
928 // Set the full row select for better visual appearance
929 ListView_SetExtendedListViewStyle ( list, LVS_EX_FULLROWSELECT );
931 // Add the key column
933 col.mask = LVCF_TEXT|LVCF_WIDTH;
934 col.cx = .3 * (rWindow.right - rWindow.left);
936 ListView_InsertColumn ( list, 0, &col );
938 // Add the value column
939 col.pszText = "Value";
940 col.cx = (rWindow.right - rWindow.left) - col.cx;
941 ListView_InsertColumn ( list, 1, &col );
948 rvGEItemPropsKeysPage::SetActive
950 Called when the advanced page is made active and will add an entry to
951 the keys list view for each key in the properties dictionary
954 bool rvGEItemPropsKeysPage::SetActive ( void )
959 gApp.GetOptions().SetLastOptionsPage ( RVITEMPROPS_KEYS );
961 // Get listview control
962 list = GetDlgItem ( mPage, IDC_GUIED_ITEMKEYS );
965 // Delete anything already in there
966 ListView_DeleteAllItems ( list );
968 // Add each key in the properties dictionary
969 for ( i = 0; i < mDict->GetNumKeyVals(); i ++ )
971 const idKeyValue* key = mDict->GetKeyVal ( i );
976 ZeroMemory ( &item, sizeof(item) );
977 item.mask = LVIF_TEXT|LVIF_PARAM;
978 item.iItem = ListView_GetItemCount ( list );
979 item.pszText = (LPSTR)key->GetKey().c_str ( );
980 item.lParam = (LONG) key;
981 int index = ListView_InsertItem ( list, &item );
984 value = key->GetValue();
985 value.StripQuotes ( );
986 ListView_SetItemText ( list, index, 1, (LPSTR)value.c_str() );
992 class rvGEItemPropsGeneralPage : public rvGEPropertyPage
996 rvGEItemPropsGeneralPage ( idDict* dict, rvGEWindowWrapper::EWindowType type );
998 virtual bool SetActive ( void );
999 virtual bool KillActive ( void );
1000 virtual bool Init ( void );
1001 virtual int HandleMessage ( UINT msg, WPARAM wParam, LPARAM lParam );
1005 void UpdateCheckedStates ( void );
1011 rvGEItemPropsGeneralPage::rvGEItemPropsGeneralPage ( idDict* dict, rvGEWindowWrapper::EWindowType type )
1014 mType = rvGEWindowWrapper::WindowTypeToString ( type );
1019 rvGEItemPropsGeneralPage::UpdateCheckedStates
1021 Updates the enabled state of all the controls that are linked to a checkbox
1024 void rvGEItemPropsGeneralPage::UpdateCheckedStates ( void )
1030 rvGEItemPropsGeneralPage::HandleMessage
1032 Handles messages for the general item properties page
1035 int rvGEItemPropsGeneralPage::HandleMessage ( UINT msg, WPARAM wParam, LPARAM lParam )
1041 switch ( LOWORD(wParam) )
1048 return rvGEPropertyPage::HandleMessage ( msg, wParam, lParam );
1053 rvGEItemPropsGeneralPage::Init
1055 Subclass the custom controls on the page
1058 bool rvGEItemPropsGeneralPage::Init ( void )
1060 MaskEdit_Attach ( GetDlgItem ( mPage, IDC_GUIED_ITEMNAME ), " \t\n\r" );
1067 rvGEItemPropsGeneralPage::SetActive
1069 Initializes the general properties page by copying data from the attached
1070 window into the controls
1073 bool rvGEItemPropsGeneralPage::SetActive ( void )
1078 gApp.GetOptions().SetLastOptionsPage ( RVITEMPROPS_GENERAL );
1080 SetWindowText ( GetDlgItem ( mPage, IDC_GUIED_ITEMNAME ), idStr(mDict->GetString ( "name", "unnamed" )).StripQuotes ( ) );
1082 enable = !IsExpression ( mDict->GetString ( "visible", "1" ) );
1083 CheckDlgButton ( mPage, IDC_GUIED_ITEMVISIBLE, atol(idStr(mDict->GetString ( "visible", "1" )).StripQuotes ( ))?BST_CHECKED:BST_UNCHECKED );
1084 EnableWindow ( GetDlgItem ( mPage, IDC_GUIED_ITEMVISIBLE ), enable );
1086 enable = !IsExpression ( mDict->GetString ( "notime", "0" ) );
1087 CheckDlgButton ( mPage, IDC_GUIED_ITEMNOTIME, atol(idStr(mDict->GetString ( "notime", "0" )).StripQuotes ( ))?BST_CHECKED:BST_UNCHECKED );
1088 EnableWindow ( GetDlgItem ( mPage, IDC_GUIED_ITEMNOTIME ), enable );
1090 enable = !IsExpression ( mDict->GetString ( "noevents", "0" ) );
1091 CheckDlgButton ( mPage, IDC_GUIED_ITEMNOEVENTS, atol(idStr(mDict->GetString ( "noevents", "0" )).StripQuotes ( ))?BST_CHECKED:BST_UNCHECKED );
1092 EnableWindow ( GetDlgItem ( mPage, IDC_GUIED_ITEMNOEVENTS ), enable );
1094 enable = !IsExpression ( mDict->GetString ( "noclip", "0" ) );
1095 CheckDlgButton ( mPage, IDC_GUIED_ITEMNOCLIP, atol(idStr(mDict->GetString ( "noclip", "0" )).StripQuotes ( ))?BST_CHECKED:BST_UNCHECKED );
1096 EnableWindow ( GetDlgItem ( mPage, IDC_GUIED_ITEMNOCLIP ), enable );
1098 enable = !IsExpression ( mDict->GetString ( "nocursor", "0" ) );
1099 EnableWindow ( GetDlgItem ( mPage, IDC_GUIED_ITEMNOCURSOR ), enable );
1100 CheckDlgButton ( mPage, IDC_GUIED_ITEMNOCURSOR, atol(idStr(mDict->GetString ( "nocursor", "0" )).StripQuotes ( ))?BST_CHECKED:BST_UNCHECKED );
1102 SetWindowText ( GetDlgItem ( mPage, IDC_GUIED_TYPE ), mType );
1104 UpdateCheckedStates ( );
1112 rvGEItemPropsGeneralPage::KillActive
1114 Applys the settings currently stored in the property page back into the attached window
1117 bool rvGEItemPropsGeneralPage::KillActive ( void )
1121 GetWindowText ( GetDlgItem(mPage,IDC_GUIED_ITEMNAME), temp, 1024 );
1122 mDict->Set ( "name", temp );
1124 if ( IsWindowEnabled ( GetDlgItem ( mPage, IDC_GUIED_ITEMVISIBLE ) ) )
1126 if ( IsDlgButtonChecked ( mPage, IDC_GUIED_ITEMVISIBLE ) )
1128 mDict->Set ( "visible" , "1" );
1132 mDict->Set ( "visible" , "0" );
1136 if ( IsWindowEnabled ( GetDlgItem ( mPage, IDC_GUIED_ITEMNOTIME ) ) )
1138 if ( IsDlgButtonChecked ( mPage, IDC_GUIED_ITEMNOTIME ) )
1140 mDict->Set ( "notime" , "1" );
1144 mDict->Delete ( "notime" );
1148 if ( IsWindowEnabled ( GetDlgItem ( mPage, IDC_GUIED_ITEMNOEVENTS ) ) )
1150 if ( IsDlgButtonChecked ( mPage, IDC_GUIED_ITEMNOEVENTS ) )
1152 mDict->Set ( "noevents" , "1" );
1156 mDict->Delete ( "noevents" );
1160 if ( IsWindowEnabled ( GetDlgItem ( mPage, IDC_GUIED_ITEMNOCLIP ) ) )
1162 if ( IsDlgButtonChecked ( mPage, IDC_GUIED_ITEMNOCLIP ) )
1164 mDict->Set ( "noclip" , "1" );
1168 mDict->Delete ( "noclip" );
1172 if ( IsWindowEnabled ( GetDlgItem ( mPage, IDC_GUIED_ITEMNOCURSOR ) ) )
1174 if ( IsDlgButtonChecked ( mPage, IDC_GUIED_ITEMNOCURSOR ) )
1176 mDict->Set ( "nocursor" , "1" );
1180 mDict->Delete ( "nocursor" );
1189 GEItemPropsDlg_DoModal
1191 Starts the item properties dialog
1194 bool GEItemPropsDlg_DoModal ( HWND parent, idWindow* window, idDict& dict )
1196 PROPSHEETHEADER propsh;
1197 PROPSHEETPAGE propsp[4];
1198 rvGEWindowWrapper* wrapper;
1201 wrapper = rvGEWindowWrapper::GetWrapper ( window );
1204 // Start the destination dictionary with the values in the window dictionary
1206 dict.Copy ( wrapper->GetStateDict ( ));
1208 propsp[RVITEMPROPS_GENERAL].dwSize = sizeof(PROPSHEETPAGE);
1209 propsp[RVITEMPROPS_GENERAL].dwFlags = PSP_USETITLE;
1210 propsp[RVITEMPROPS_GENERAL].hInstance = win32.hInstance;
1211 propsp[RVITEMPROPS_GENERAL].pszTemplate = MAKEINTRESOURCE(IDD_GUIED_ITEMPROPS_GENERAL);
1212 propsp[RVITEMPROPS_GENERAL].pfnDlgProc = rvGEPropertyPage::WndProc;
1213 propsp[RVITEMPROPS_GENERAL].pszTitle = "General";
1214 propsp[RVITEMPROPS_GENERAL].lParam = (LONG)new rvGEItemPropsGeneralPage ( &dict, wrapper->GetWindowType ( ) );
1216 propsp[RVITEMPROPS_IMAGE].dwSize = sizeof(PROPSHEETPAGE);
1217 propsp[RVITEMPROPS_IMAGE].dwFlags = PSP_USETITLE;
1218 propsp[RVITEMPROPS_IMAGE].hInstance = win32.hInstance;
1219 propsp[RVITEMPROPS_IMAGE].pszTemplate = MAKEINTRESOURCE(IDD_GUIED_ITEMPROPS_IMAGE);
1220 propsp[RVITEMPROPS_IMAGE].pfnDlgProc = rvGEPropertyPage::WndProc;
1221 propsp[RVITEMPROPS_IMAGE].pszTitle = "Image";
1222 propsp[RVITEMPROPS_IMAGE].lParam = (LONG)new rvGEItemPropsImagePage ( &dict );;
1224 propsp[RVITEMPROPS_TEXT].dwSize = sizeof(PROPSHEETPAGE);
1225 propsp[RVITEMPROPS_TEXT].dwFlags = PSP_USETITLE;
1226 propsp[RVITEMPROPS_TEXT].hInstance = win32.hInstance;
1227 propsp[RVITEMPROPS_TEXT].pszTemplate = MAKEINTRESOURCE(IDD_GUIED_ITEMPROPS_TEXT);
1228 propsp[RVITEMPROPS_TEXT].pfnDlgProc = rvGEPropertyPage::WndProc;
1229 propsp[RVITEMPROPS_TEXT].pszTitle = "Text";
1230 propsp[RVITEMPROPS_TEXT].lParam = (LONG)new rvGEItemPropsTextPage ( &dict );;
1232 propsp[RVITEMPROPS_KEYS].dwSize = sizeof(PROPSHEETPAGE);
1233 propsp[RVITEMPROPS_KEYS].dwFlags = PSP_USETITLE;
1234 propsp[RVITEMPROPS_KEYS].hInstance = win32.hInstance;
1235 propsp[RVITEMPROPS_KEYS].pszTemplate = MAKEINTRESOURCE(IDD_GUIED_ITEMPROPS_KEYS);
1236 propsp[RVITEMPROPS_KEYS].pfnDlgProc = rvGEPropertyPage::WndProc;
1237 propsp[RVITEMPROPS_KEYS].pszTitle = "Keys";
1238 propsp[RVITEMPROPS_KEYS].lParam = (LONG)new rvGEItemPropsKeysPage ( &dict, wrapper );
1240 propsh.dwSize = sizeof(PROPSHEETHEADER);
1241 propsh.nStartPage = gApp.GetOptions().GetLastOptionsPage ( );
1242 propsh.dwFlags = PSH_PROPSHEETPAGE|PSH_NOAPPLYNOW|PSH_NOCONTEXTHELP;
1243 propsh.hwndParent = parent;
1244 propsh.pszCaption = "Item Properties";
1245 propsh.nPages = RVITEMPROPS_MAX;
1246 propsh.ppsp = (LPCPROPSHEETPAGE)&propsp;
1248 // Bring up the item properties dialog now
1249 result = PropertySheet ( &propsh ) != NULL;
1252 delete (rvGEItemPropsGeneralPage*) propsp[0].lParam;
1253 delete (rvGEItemPropsImagePage*) propsp[1].lParam;
1254 delete (rvGEItemPropsTextPage*) propsp[2].lParam;
1255 delete (rvGEItemPropsKeysPage*) propsp[3].lParam;