Serious-Engine/Sources/WorldEditor/InfoSheet.cpp
2016-03-11 15:57:17 +02:00

309 lines
8.0 KiB
C++

/* Copyright (c) 2002-2012 Croteam Ltd. All rights reserved. */
// 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; i<iPagesCt; i++)
RemovePage( 0);
// enable data exchange
theApp.m_bDisableDataExchange = FALSE;
}
void CInfoSheet::SetInfoModeGlobal(void)
{
m_ModeID = INFO_MODE_GLOBAL;
DeleteAllPages();
AddPage( &m_PgGlobal);
//AddPage( &m_PgRenderingStatistics);
SoftSetActivePage(0);
}
void CInfoSheet::SetInfoModePosition(void)
{
m_ModeID = INFO_MODE_POSITION;
DeleteAllPages();
AddPage( &m_PgGlobal);
//AddPage( &m_PgRenderingStatistics);
AddPage( &m_PgPosition);
SoftSetActivePage(1);
}
void CInfoSheet::SetInfoModePrimitive(void)
{
m_ModeID = INFO_MODE_PRIMITIVE;
DeleteAllPages();
AddPage( &m_PgGlobal);
//AddPage( &m_PgRenderingStatistics);
AddPage( &m_PgPosition);
AddPage( &m_PgPrimitive);
SoftSetActivePage(2);
}
INDEX _iLastActivePgInPolygonMode = 1;
void CInfoSheet::SetInfoModePolygon(void)
{
m_ModeID = INFO_MODE_POLYGON;
DeleteAllPages();
AddPage( &m_PgGlobal);
//AddPage( &m_PgRenderingStatistics);
AddPage( &m_PgPolygon);
AddPage( &m_PgShadow);
AddPage( &m_PgTexture);
SoftSetActivePage( _iLastActivePgInPolygonMode);
}
void CInfoSheet::SetInfoModeSector(void)
{
m_ModeID = INFO_MODE_SECTOR;
DeleteAllPages();
AddPage( &m_PgGlobal);
//AddPage( &m_PgRenderingStatistics);
AddPage( &m_PgSector);
SoftSetActivePage(1);
}
void CInfoSheet::SetInfoModeTerrain(void)
{
m_ModeID = INFO_MODE_TERRAIN;
DeleteAllPages();
AddPage( &m_PgGlobal);
AddPage( &m_PgTerrain);
SoftSetActivePage(1);
}
BOOL CInfoSheet::OnIdle(LONG lCount)
{
// get active view
CWorldEditorView *pWorldEditorView = theApp.GetActiveView();
// get active document
CWorldEditorDoc* pDoc = theApp.GetActiveDocument();
// if we don't have view
if( pDoc == NULL)
{
// force info mode: INFO_MODE_GLOBAL
if( m_ModeID != INFO_MODE_GLOBAL)
{
SetInfoModeGlobal();
CMainFrame* pMainFrame = STATIC_DOWNCAST(CMainFrame, AfxGetMainWnd());
pMainFrame->SetFocus();
}
}
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);
}