/* 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. */ // InfoSheet.cpp : implementation file // #include "stdafx.h" #include "InfoSheet.h" #ifdef _DEBUG #undef new #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CInfoSheet #define CALLACTIVEPAGE(function, parameter) \ if( pgActivPage == &m_PgGlobal) \ m_PgGlobal.function( parameter); \ if( pgActivPage == &m_PgTerrain) \ m_PgTerrain.function( parameter); \ if( pgActivPage == &m_PgPosition) \ m_PgPosition.function( parameter); \ if( pgActivPage == &m_PgRenderingStatistics) \ m_PgRenderingStatistics.function( parameter); \ if( pgActivPage == &m_PgPolygon) \ m_PgPolygon.function( parameter); \ if( pgActivPage == &m_PgShadow) \ m_PgShadow.function( parameter); \ if( pgActivPage == &m_PgSector) \ m_PgSector.function( parameter); \ if( pgActivPage == &m_PgTexture) \ m_PgTexture.function( parameter); \ if( pgActivPage == &m_PgPrimitive) \ m_PgPrimitive.function( parameter); IMPLEMENT_DYNAMIC(CInfoSheet, CPropertySheet) CInfoSheet::CInfoSheet(CWnd* pWndParent) : CPropertySheet(AFX_IDS_APP_TITLE, pWndParent) { // Add all pages so frame could get bounding sizes of all of them AddPage( &m_PgGlobal); AddPage( &m_PgTerrain); AddPage( &m_PgPosition); AddPage( &m_PgPrimitive); //AddPage( &m_PgRenderingStatistics); AddPage( &m_PgPolygon); AddPage( &m_PgShadow); AddPage( &m_PgSector); AddPage( &m_PgTexture); SoftSetActivePage(0); // set mode that will be discarded on first OnIdle() m_ModeID = INFO_MODE_ALL; } CInfoSheet::~CInfoSheet() { } // don't take focus void CInfoSheet::SoftSetActivePage( INDEX iActivePage) { // get active view CWorldEditorView *pWorldEditorView = theApp.GetActiveView(); SetActivePage( iActivePage); if( pWorldEditorView != NULL) { // pWorldEditorView->SetFocus(); } } BEGIN_MESSAGE_MAP(CInfoSheet, CPropertySheet) //{{AFX_MSG_MAP(CInfoSheet) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CInfoSheet message handlers void CInfoSheet::DoDataExchange(CDataExchange* pDX) { CPropertyPage *pgActivPage = GetActivePage(); CALLACTIVEPAGE(UpdateData, pDX->m_bSaveAndValidate); CPropertySheet::DoDataExchange(pDX); } void CInfoSheet::DeleteAllPages() { // disable data exchange theApp.m_bDisableDataExchange = TRUE; INDEX iPagesCt, i; iPagesCt = GetPageCount(); for( i=0; iSetFocus(); } } else { // if CSG is on if( pDoc->m_iMode == CSG_MODE) { ASSERT(pDoc->m_pwoSecondLayer != NULL); // if CSG is done with primitive force info mode: INFO_MODE_PRIMITIVE if( pDoc->m_bPrimitiveMode) { if( m_ModeID != INFO_MODE_PRIMITIVE) { // primitive mode includes position page SetInfoModePrimitive(); } } // else force info mode: INFO_MODE_POSITION else { if( m_ModeID != INFO_MODE_POSITION) { // no primitive page, only position page SetInfoModePosition(); } } } // else if we are in entity mode and only one entity is selected, // force info mode: INFO_MODE_POSITION else if( (pDoc->m_iMode == ENTITY_MODE) && (pDoc->m_selEntitySelection.Count() == 1) ) { if( m_ModeID != INFO_MODE_POSITION) { SetInfoModePosition(); } } // else if we are in polygon mode else if( pDoc->m_iMode == POLYGON_MODE) { if( m_ModeID == INFO_MODE_POLYGON) { if( GetActivePage() == &m_PgTexture) _iLastActivePgInPolygonMode = 1; else if( GetActivePage() == &m_PgShadow)_iLastActivePgInPolygonMode = 2; else _iLastActivePgInPolygonMode = 3; } if( m_ModeID != INFO_MODE_POLYGON) { SetInfoModePolygon(); } } // else if we are in sector mode else if( pDoc->m_iMode == SECTOR_MODE) { if( m_ModeID != INFO_MODE_SECTOR) { SetInfoModeSector(); } } // else if we are in terrain mode else if( pDoc->m_iMode == TERRAIN_MODE) { if( m_ModeID != INFO_MODE_TERRAIN) { SetInfoModeTerrain(); } } // we are not in CSG mode nor in single entity mode, force info mode: INFO_MODE_GLOBAL else { if( m_ModeID != INFO_MODE_GLOBAL) { SetInfoModeGlobal(); } } } // call OnIdle() for active page CPropertyPage *pgActivPage = GetActivePage(); CALLACTIVEPAGE(OnIdle, lCount); return TRUE; } void CInfoSheet::PostNcDestroy() { CPropertySheet::PostNcDestroy(); delete this; } BOOL CInfoSheet::PreTranslateMessage(MSG* pMsg) { CWorldEditorDoc* pDoc = theApp.GetActiveDocument(); CMainFrame* pMainFrame = STATIC_DOWNCAST(CMainFrame, AfxGetMainWnd()); BOOL bAlt = (GetKeyState( VK_MENU)&0x8000) != 0; if(pMsg->message==WM_KEYDOWN) { // get active document BOOL bSectorNameTyping = FALSE; CPropertyPage *pgActivPage = GetActivePage(); if(pgActivPage == &m_PgSector) { bSectorNameTyping = m_PgSector.GetDlgItem( IDC_SECTOR_NAME) == CWnd::GetFocus(); } if( (pMsg->wParam==VK_SPACE) && !bSectorNameTyping) { // don't translate message return TRUE; } // if we have valid document if( (pDoc != NULL) && !bSectorNameTyping) { if( (pMsg->wParam==VK_ADD) || (pMsg->wParam==VK_SUBTRACT) || (pMsg->wParam=='E') || (pMsg->wParam=='S') || (pMsg->wParam=='P') || (pMsg->wParam=='Z') || (pMsg->wParam=='Q') || (pMsg->wParam== VK_DECIMAL) ) { // post this message to main frame ::PostMessage( pMainFrame->m_hWnd, WM_KEYDOWN, pMsg->wParam, pMsg->lParam); // don't translate message return TRUE; } } } return CPropertySheet::PreTranslateMessage(pMsg); }