/* 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. */ // DlgInfoSheet.cpp : implementation file // #include "stdafx.h" #ifdef _DEBUG #undef new #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif #define INFO_WIDTH 200 ///////////////////////////////////////////////////////////////////////////// // CDlgInfoSheet IMPLEMENT_DYNAMIC(CDlgInfoSheet, CPropertySheet) #define CALLACTIVEPAGE(function, parameter) \ if( pgActivPage == &m_PgInfoGlobal) \ m_PgInfoGlobal.function( parameter); \ else if( pgActivPage == &m_PgInfoMip) \ m_PgInfoMip.function( parameter); \ else if( pgActivPage == &m_PgInfoNone) \ m_PgInfoNone.function( parameter); \ else if( pgActivPage == &m_PgInfoPos) \ m_PgInfoPos.function( parameter); \ else if( pgActivPage == &m_PgInfoRendering) \ m_PgInfoRendering.function( parameter); \ else if( pgActivPage == &m_PgInfoAnim) \ m_PgInfoAnim.function( parameter); \ else if( pgActivPage == &m_PgInfoCollision) \ m_PgInfoCollision.function( parameter); \ else if( pgActivPage == &m_PgAttachingPlacement) \ m_PgAttachingPlacement.function( parameter); \ else if( pgActivPage == &m_PgAttachingSound) \ m_PgAttachingSound.function( parameter); CDlgInfoSheet::CDlgInfoSheet(CWnd* pWndParent) : CPropertySheet(AFX_IDS_APP_TITLE, pWndParent) { m_LastViewUpdated = NULL; m_InfoMode = -1; // Add all pages so frame could get bounding sizes of all of them AddPage( &m_PgInfoNone); AddPage( &m_PgInfoGlobal); AddPage( &m_PgInfoMip); AddPage( &m_PgInfoRendering); AddPage( &m_PgInfoPos); AddPage( &m_PgInfoAnim); AddPage( &m_PgInfoCollision); AddPage( &m_PgAttachingPlacement); AddPage( &m_PgAttachingSound); SetActivePage(0); } CDlgInfoSheet::CDlgInfoSheet(UINT nIDCaption, CWnd* pParentWnd, UINT iSelectPage) :CPropertySheet(nIDCaption, pParentWnd, iSelectPage) { } CDlgInfoSheet::CDlgInfoSheet(LPCTSTR pszCaption, CWnd* pParentWnd, UINT iSelectPage) :CPropertySheet(pszCaption, pParentWnd, iSelectPage) { } CDlgInfoSheet::~CDlgInfoSheet() { } BEGIN_MESSAGE_MAP(CDlgInfoSheet, CPropertySheet) //{{AFX_MSG_MAP(CDlgInfoSheet) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CDlgInfoSheet message handlers void CDlgInfoSheet::PostNcDestroy() { CPropertySheet::PostNcDestroy(); delete this; } void CDlgInfoSheet::DoDataExchange(CDataExchange* pDX) { CPropertyPage *pgActivPage = GetActivePage(); CALLACTIVEPAGE(UpdateData, pDX->m_bSaveAndValidate); CPropertySheet::DoDataExchange(pDX); } static INDEX iLastNormalPage = 2; static INDEX iLastMappingPage = 2; BOOL CDlgInfoSheet::OnIdle(LONG lCount) { CModelerDoc* pDoc = theApp.GetDocument(); CModelerView *pAnyView = CModelerView::GetActiveMappingNormalView(); CModelerView *pModelerView = CModelerView::GetActiveView(); CModelerView *pModelerMappingView = CModelerView::GetActiveMappingView(); INDEX ctPages = GetPageCount(); if( m_InfoMode == IM_NORMAL) iLastNormalPage = GetPageIndex(GetActivePage()); if( m_InfoMode == IM_MAPPING) iLastMappingPage = GetPageIndex(GetActivePage()); // If no view found and info mode is not IM_NONE if( pAnyView == NULL) { if( m_InfoMode != IM_NONE) { HWND hwndActive = ::GetActiveWindow(); m_InfoMode = IM_NONE; m_LastViewUpdated = NULL; for( INDEX iPage=0; iPagem_ModelObject.IsUpToDate( m_Updateable)) bRefresh = TRUE; if( bRefresh) { UpdateData( FALSE); m_Updateable.MarkUpdated(); } CPropertyPage *pgActivPage = GetActivePage(); CALLACTIVEPAGE(OnIdle, lCount); return TRUE; } BOOL CDlgInfoSheet::PreTranslateMessage(MSG* pMsg) { CMainFrame* pMainFrame = STATIC_DOWNCAST(CMainFrame, AfxGetMainWnd()); BOOL bAlt = (GetKeyState( VK_MENU)&0x8000) != 0; if(pMsg->message==WM_KEYDOWN) { // if any of string edit controls has input BOOL bEditingString = (::IsWindow(m_PgAttachingPlacement.m_hWnd)&& m_PgAttachingPlacement.GetDlgItem( IDC_ATTACHING_PLACEMENT_NAME) == CWnd::GetFocus()) || (::IsWindow(m_PgInfoCollision.m_hWnd)&& m_PgInfoCollision.GetDlgItem( IDC_COLLISION_BOX_NAME) == CWnd::GetFocus()); if( (pMsg->wParam==VK_SPACE) && !bEditingString) { return TRUE; } else if( pMsg->wParam=='Q' && !bEditingString) { pMainFrame->ToggleInfoWindow(); return TRUE; } else if( pMsg->wParam=='C' && !bEditingString) { CustomSetActivePage( &m_PgInfoCollision); return FALSE; } else if( pMsg->wParam=='R' && !bEditingString) { CustomSetActivePage( &m_PgInfoRendering); return TRUE; } else if( pMsg->wParam=='A' && !bEditingString) { CustomSetActivePage( &m_PgAttachingPlacement); return TRUE; } else if( pMsg->wParam=='S' && !bEditingString) { CustomSetActivePage( &m_PgAttachingSound); return TRUE; } else if( pMsg->wParam=='P' && !bEditingString) { CustomSetActivePage( &m_PgInfoPos); return TRUE; } else if( pMsg->wParam=='G' && !bEditingString) { CustomSetActivePage( &m_PgInfoGlobal); return TRUE; } else if( pMsg->wParam=='M' && !bEditingString) { CustomSetActivePage( &m_PgInfoMip); return TRUE; } else if( pMsg->wParam=='N' && !bEditingString) { CustomSetActivePage( &m_PgInfoAnim); return TRUE; } if( (pMsg->wParam>='A') && (pMsg->wParam<='Z') && !bEditingString) { return TRUE; } } return CPropertySheet::PreTranslateMessage(pMsg); } void CDlgInfoSheet::CustomSetActivePage( CPropertyPage *pppToActivate) { if( GetActivePage() == pppToActivate) return; INDEX ctPages = GetPageCount(); for( INDEX iPage=0; iPage < ctPages; iPage++) { if( pppToActivate == GetPage( iPage)) { CPropertySheet::SetActivePage( iPage); return; } } }