/* Copyright (c) 2002-2012 Croteam Ltd. This program is free software; you can redistribute it and/or modify it under the terms of version 2 of the GNU General Public License as published by the Free Software Foundation 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, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ // DlgPgSector.cpp : implementation file // #include "stdafx.h" #include "DlgPgSector.h" #ifdef _DEBUG #undef new #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CDlgPgSector property page IMPLEMENT_DYNCREATE(CDlgPgSector, CPropertyPage) CDlgPgSector::CDlgPgSector() : CPropertyPage(CDlgPgSector::IDD) { //{{AFX_DATA_INIT(CDlgPgSector) m_iBrowseModeRadio = -1; m_strSectorName = _T(""); m_radioInclude = -1; //}}AFX_DATA_INIT if( CTString( CStringA(theApp.GetProfileString(L"World editor", L"Color browsing mode (info)"))) == CTString("RGB")) { m_iBrowseModeRadio = 0; } else { m_iBrowseModeRadio = 1; } m_colLastSectorAmbientColor = -1; m_bLastSectorAmbientColorMixed = FALSE; m_SectorAmbientColor.SetPickerType( CColoredButton::PT_MFC); m_ctrlClassificationFlags.SetDialogPtr(this); m_ctrlVisibilityFlags.SetDialogPtr(this); m_ctrlClassificationFlags.SetEditableMask(0xFFFF0000); m_ctrlVisibilityFlags.SetEditableMask(0x0000FFFF); } CDlgPgSector::~CDlgPgSector() { } #define MIXED_NAME "Mixed name" void CDlgPgSector::DoDataExchange(CDataExchange* pDX) { if( theApp.m_bDisableDataExchange) return; CPropertyPage::DoDataExchange(pDX); // mark that property page has been modified SetModified( TRUE); // obtain document CWorldEditorDoc* pDoc = theApp.GetDocument(); if( pDoc == NULL) return; // sector mode must be on if( pDoc->GetEditingMode() != SECTOR_MODE) return; // if dialog is receiving data and control windows are valid if( (pDX->m_bSaveAndValidate == FALSE) && IsWindow( m_SectorAmbientColor.m_hWnd) ) { BOOL bSelectionExists = pDoc->m_selSectorSelection.Count() != 0; m_comboContentType.ResetContent(); for(INDEX iContentType=0; iContentTypem_woWorld.wo_actContentTypes[iContentType].ct_strName; if( strContent == "") break; m_comboContentType.AddString( CString(strContent)); } m_comboEnvironmentType.ResetContent(); for(INDEX iEnvironmentType=0; iEnvironmentTypem_woWorld.wo_aetEnvironmentTypes[iEnvironmentType].et_strName; if( strEnvironment == "") break; m_comboEnvironmentType.AddString( CString(strEnvironment)); } if( bSelectionExists) { BOOL bSameForceField = TRUE; BOOL bSameFog = TRUE; BOOL bSameHaze = TRUE; INDEX iFirstForceField; INDEX iFirstFog; INDEX iFirstHaze; m_comboForceField.ResetContent(); m_comboFog.ResetContent(); m_comboHaze.ResetContent(); CBrush3D *pbrBrush = NULL; INDEX iSector = 0; // for all sectors FOREACHINDYNAMICCONTAINER(pDoc->m_selSectorSelection, CBrushSector, itbsc) { if( iSector == 0) { iFirstForceField = itbsc->GetForceType(); iFirstFog = itbsc->GetFogType(); iFirstHaze = itbsc->GetHazeType(); } INDEX iForceField = itbsc->GetForceType(); if( iForceField != iFirstForceField) bSameForceField = FALSE; INDEX iFog = itbsc->GetFogType(); if( iFog != iFirstFog) bSameFog = FALSE; INDEX iHaze = itbsc->GetHazeType(); if( iHaze != iFirstHaze) bSameHaze = FALSE; // get sector brush if( (pbrBrush == NULL) || (pbrBrush == itbsc->bsc_pbmBrushMip->bm_pbrBrush) ) { if( pbrBrush == NULL) { pbrBrush = itbsc->bsc_pbmBrushMip->bm_pbrBrush; for(INDEX iForceField=0; iForceFieldbr_penEntity->GetForceName( iForceField); if( strForceName == "") break; m_comboForceField.AddString( CString(strForceName)); } for(INDEX iFog=0; iFogbr_penEntity->GetFogName( iFog); if( strFogName == "") break; m_comboFog.AddString( CString(strFogName)); } for(INDEX iHaze=0; iHazebr_penEntity->GetHazeName( iHaze); if( strHazeName == "") break; m_comboHaze.AddString( CString(strHazeName)); } } } else { m_comboForceField.ResetContent(); m_comboFog.ResetContent(); m_comboHaze.ResetContent(); bSameForceField = FALSE; bSameFog = FALSE; bSameHaze = FALSE; GetDlgItem( IDC_STATIC_FORCE_FIELD_T)->EnableWindow( FALSE); GetDlgItem( IDC_FORCE_FIELD_COMBO)->EnableWindow( FALSE); GetDlgItem( IDC_STATIC_FOG_T)->EnableWindow( FALSE); GetDlgItem( IDC_FOG_COMBO)->EnableWindow( FALSE); GetDlgItem( IDC_STATIC_HAZE_T)->EnableWindow( FALSE); GetDlgItem( IDC_HAZE_COMBO)->EnableWindow( FALSE); } iSector++; } if( bSameForceField) m_comboForceField.SetCurSel( iFirstForceField); if( bSameFog) m_comboFog.SetCurSel( iFirstFog); if( bSameHaze) m_comboHaze.SetCurSel( iFirstHaze); } BOOL bDisableForce = FALSE; BOOL bDisableFog = FALSE; BOOL bDisableHaze = FALSE; if( m_comboForceField.GetCount() == 0) bDisableForce = TRUE; if( m_comboFog.GetCount() == 0) bDisableFog = TRUE; if( m_comboHaze.GetCount() == 0) bDisableHaze = TRUE; GetDlgItem( IDC_STATIC_FORCE_FIELD_T)->EnableWindow( bSelectionExists&&!bDisableForce); GetDlgItem( IDC_FORCE_FIELD_COMBO)->EnableWindow( bSelectionExists&&!bDisableForce); GetDlgItem( IDC_STATIC_FOG_T)->EnableWindow( bSelectionExists&&!bDisableFog); GetDlgItem( IDC_FOG_COMBO)->EnableWindow( bSelectionExists&&!bDisableFog); GetDlgItem( IDC_STATIC_HAZE_T)->EnableWindow( bSelectionExists&&!bDisableHaze); GetDlgItem( IDC_HAZE_COMBO)->EnableWindow( bSelectionExists&&!bDisableHaze); m_ctrlVisibilityFlags.EnableWindow( bSelectionExists); m_ctrlClassificationFlags.EnableWindow( bSelectionExists); INDEX iSector = 0; BOOL bSameContent = TRUE; INDEX iFirstContent; BOOL bSameEnvironment = TRUE; INDEX iFirstEnvironment; INDEX iInclude=-1; // for all sectors FOREACHINDYNAMICCONTAINER(pDoc->m_selSectorSelection, CBrushSector, itbsc) { CBrushSector &bsc=*itbsc; if( iSector == 0) { iFirstContent = bsc.GetContentType(); iFirstEnvironment = bsc.GetEnvironmentType(); m_SectorAmbientColor.SetColor( bsc.bsc_colAmbient); m_strSectorName = bsc.bsc_strName; m_ctrlVisibilityFlags.SetFlags(bsc.bsc_ulVisFlags); m_ctrlClassificationFlags.SetFlags(bsc.bsc_ulVisFlags); iInclude=(bsc.bsc_ulFlags2&BSCF2_VISIBILITYINCLUDE) ? 0 : 1; } else { if( bsc.GetContentType() != iFirstContent) bSameContent = FALSE; if( bsc.GetEnvironmentType() != iFirstEnvironment) bSameEnvironment = FALSE; if(m_SectorAmbientColor.GetColor() != bsc.bsc_colAmbient) { m_SectorAmbientColor.SetMixedColor(); } if( CTString( CStringA(m_strSectorName)) != bsc.bsc_strName) { m_strSectorName = MIXED_NAME; } m_ctrlVisibilityFlags.MergeFlags(bsc.bsc_ulVisFlags); m_ctrlClassificationFlags.MergeFlags(bsc.bsc_ulVisFlags); INDEX iNewInclude=(bsc.bsc_ulFlags2&BSCF2_VISIBILITYINCLUDE) ? 0 : 1; if( iInclude!=-1 && iNewInclude!=iInclude) { iInclude=-1; } } iSector++; } m_radioInclude=iInclude; m_colLastSectorAmbientColor = m_SectorAmbientColor.GetColor(); m_bLastSectorAmbientColorMixed = !m_SectorAmbientColor.IsColorValid(); m_SectorAmbientColor.EnableWindow( bSelectionExists); m_comboContentType.EnableWindow( bSelectionExists); m_comboEnvironmentType.EnableWindow( bSelectionExists); GetDlgItem( IDC_STATIC_CONTENT_TYPE_T)->EnableWindow( bSelectionExists); GetDlgItem( IDC_STATIC_ENVIRONMENT_TYPE_T)->EnableWindow( bSelectionExists); GetDlgItem( IDC_STATIC_SECTOR_NAME)->EnableWindow( bSelectionExists); GetDlgItem( IDC_SECTOR_NAME)->EnableWindow( bSelectionExists); GetDlgItem( IDC_AMBIENT_COLOR_T)->EnableWindow( bSelectionExists); GetDlgItem( IDC_SECTOR_INCLUDE)->EnableWindow( bSelectionExists); GetDlgItem( IDC_SECTOR_EXCLUDE)->EnableWindow( bSelectionExists); if( bSameContent) m_comboContentType.SetCurSel( iFirstContent); else m_comboContentType.SetCurSel(-1); if( bSameEnvironment) m_comboEnvironmentType.SetCurSel( iFirstEnvironment); else m_comboEnvironmentType.SetCurSel(-1); m_udSectorsData.MarkUpdated(); } //{{AFX_DATA_MAP(CDlgPgSector) DDX_Control(pDX, ID_CLASSIFICATION_FLAGS, m_ctrlClassificationFlags); DDX_Control(pDX, ID_VISIBILITY_FLAGS, m_ctrlVisibilityFlags); DDX_Control(pDX, IDC_STATIC_ENVIRONMENT_TYPE, m_comboEnvironmentType); DDX_Control(pDX, IDC_HAZE_COMBO, m_comboHaze); DDX_Control(pDX, IDC_FOG_COMBO, m_comboFog); DDX_Control(pDX, IDC_FORCE_FIELD_COMBO, m_comboForceField); DDX_Control(pDX, IDC_CONTENT_TYPE_COMBO, m_comboContentType); DDX_Control(pDX, ID_SECTOR_COLOR, m_SectorAmbientColor); DDX_Text(pDX, IDC_SECTOR_NAME, m_strSectorName); DDX_Radio(pDX, IDC_SECTOR_INCLUDE, m_radioInclude); //}}AFX_DATA_MAP // if dialog is giving data and control windows are valid if( (pDX->m_bSaveAndValidate != FALSE) && IsWindow( m_SectorAmbientColor.m_hWnd) ) { // for all sectors FOREACHINDYNAMICCONTAINER(pDoc->m_selSectorSelection, CBrushSector, itbsc) { CBrushSector &bsc=*itbsc; INDEX iNewContent = m_comboContentType.GetCurSel(); if( iNewContent!=CB_ERR) { bsc.SetContentType( iNewContent); } INDEX iNewEnvironment = m_comboEnvironmentType.GetCurSel(); if( iNewEnvironment!=CB_ERR) { bsc.SetEnvironmentType( iNewEnvironment); } if( m_strSectorName != MIXED_NAME) { bsc.bsc_strName = CStringA(m_strSectorName); } INDEX iNewForceField = m_comboForceField.GetCurSel(); if( iNewForceField != CB_ERR) bsc.SetForceType( iNewForceField); INDEX iNewFog = m_comboFog.GetCurSel(); if( iNewFog != CB_ERR) bsc.SetFogType( iNewFog); INDEX iNewHaze = m_comboHaze.GetCurSel(); if( iNewHaze != CB_ERR) bsc.SetHazeType( iNewHaze); m_ctrlVisibilityFlags.ApplyChange(bsc.bsc_ulVisFlags); m_ctrlClassificationFlags.ApplyChange(bsc.bsc_ulVisFlags); if( m_radioInclude!=-1) { if( m_radioInclude==0) bsc.bsc_ulFlags2|=BSCF2_VISIBILITYINCLUDE; else bsc.bsc_ulFlags2&=~BSCF2_VISIBILITYINCLUDE; } } COLOR colAmbient = m_SectorAmbientColor.GetColor(); BOOL bColorChanged = (colAmbient != m_colLastSectorAmbientColor) || (m_bLastSectorAmbientColorMixed && m_SectorAmbientColor.IsColorValid()); if( bColorChanged) { // for all sectors FOREACHINDYNAMICCONTAINER(pDoc->m_selSectorSelection, CBrushSector, itbsc) { // set new color to sectors itbsc->bsc_colAmbient = colAmbient; itbsc->UncacheLightMaps(); } } m_udSectorsData.MarkUpdated(); pDoc->SetModifiedFlag( TRUE); pDoc->UpdateAllViews( NULL); } } BEGIN_MESSAGE_MAP(CDlgPgSector, CPropertyPage) //{{AFX_MSG_MAP(CDlgPgSector) ON_WM_HSCROLL() ON_CBN_DROPDOWN(IDC_CONTENT_TYPE_COMBO, OnDropdownContentTypeCombo) ON_CBN_SELCHANGE(IDC_CONTENT_TYPE_COMBO, OnSelchangeContentTypeCombo) ON_CBN_SELCHANGE(IDC_FORCE_FIELD_COMBO, OnSelchangeForceFieldCombo) ON_CBN_DROPDOWN(IDC_FORCE_FIELD_COMBO, OnDropdownForceFieldCombo) ON_CBN_DROPDOWN(IDC_FOG_COMBO, OnDropdownFogCombo) ON_CBN_SELCHANGE(IDC_FOG_COMBO, OnSelchangeFogCombo) ON_CBN_DROPDOWN(IDC_HAZE_COMBO, OnDropdownHazeCombo) ON_CBN_SELCHANGE(IDC_HAZE_COMBO, OnSelchangeHazeCombo) ON_CBN_DROPDOWN(IDC_STATIC_ENVIRONMENT_TYPE, OnDropdownStaticEnvironmentType) ON_CBN_SELCHANGE(IDC_STATIC_ENVIRONMENT_TYPE, OnSelchangeStaticEnvironmentType) ON_BN_CLICKED(IDC_SECTOR_INCLUDE, OnSectorInclude) ON_BN_CLICKED(IDC_SECTOR_EXCLUDE, OnSectorExclude) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CDlgPgSector message handlers BOOL CDlgPgSector::OnIdle(LONG lCount) { // obtain document CWorldEditorDoc* pDoc = theApp.GetDocument(); if( (pDoc == NULL) || !IsWindow(m_hWnd)) return FALSE; COLOR colSectorAmbientColor = m_SectorAmbientColor.GetColor(); BOOL bColorChanged = (colSectorAmbientColor != m_colLastSectorAmbientColor) || (m_bLastSectorAmbientColorMixed && m_SectorAmbientColor.IsColorValid()); // if color was changed from last idle if( bColorChanged) { // view the color change UpdateData(TRUE); GetDlgItem( ID_SECTOR_COLOR)->Invalidate(); // set new sector color m_colLastSectorAmbientColor = colSectorAmbientColor; m_bLastSectorAmbientColorMixed = FALSE; } // if selections have been changed (they are not up to date) if( !pDoc->m_chSelections.IsUpToDate( m_udSectorsData)) { // update dialog data UpdateData( FALSE); } return TRUE; } void CDlgPgSector::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) { CPropertyPage::OnHScroll(nSBCode, nPos, pScrollBar); UpdateData( TRUE); m_colLastSectorAmbientColor = m_SectorAmbientColor.GetColor(); m_bLastSectorAmbientColorMixed = FALSE; // obtain document CWorldEditorDoc* pDoc = theApp.GetDocument(); if( pDoc == NULL) return; pDoc->SetModifiedFlag(TRUE); } void CDlgPgSector::OnDropdownContentTypeCombo() { m_comboContentType.SetDroppedWidth( 256); } void CDlgPgSector::OnSelchangeContentTypeCombo() { UpdateData( TRUE); } void CDlgPgSector::OnSelchangeForceFieldCombo() { UpdateData( TRUE); } void CDlgPgSector::OnSelchangeFogCombo() { UpdateData( TRUE); } void CDlgPgSector::OnSelchangeHazeCombo() { UpdateData( TRUE); } BOOL CDlgPgSector::PreTranslateMessage(MSG* pMsg) { if(pMsg->message==WM_KEYDOWN && pMsg->wParam==VK_RETURN) { // move coordinates from page to entity and snap them UpdateData( TRUE); // place snapped coordinates back to dialog UpdateData( FALSE); // the message is handled return TRUE; } return CPropertyPage::PreTranslateMessage(pMsg); } void CDlgPgSector::OnDropdownForceFieldCombo() { m_comboForceField.SetDroppedWidth( 256); } void CDlgPgSector::OnDropdownFogCombo() { m_comboFog.SetDroppedWidth( 256); } void CDlgPgSector::OnDropdownHazeCombo() { m_comboHaze.SetDroppedWidth( 256); } void CDlgPgSector::OnDropdownStaticEnvironmentType() { m_comboEnvironmentType.SetDroppedWidth( 256); } void CDlgPgSector::OnSelchangeStaticEnvironmentType() { UpdateData( TRUE); } void CDlgPgSector::OnSectorInclude() { UpdateData( TRUE); } void CDlgPgSector::OnSectorExclude() { UpdateData( TRUE); }