mirror of
https://github.com/ptitSeb/Serious-Engine
synced 2024-11-25 11:45:53 +01:00
178 lines
5.1 KiB
C++
178 lines
5.1 KiB
C++
/* 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. */
|
|
|
|
// CSGDesitnationCombo.cpp : implementation file
|
|
//
|
|
|
|
#include "stdafx.h"
|
|
#include "CSGDesitnationCombo.h"
|
|
|
|
#ifdef _DEBUG
|
|
#undef new
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CCSGDesitnationCombo
|
|
|
|
CCSGDesitnationCombo::CCSGDesitnationCombo()
|
|
{
|
|
// set dummy document ptr
|
|
m_pLastDoc = (CWorldEditorDoc *) 0x12345678;
|
|
}
|
|
|
|
CCSGDesitnationCombo::~CCSGDesitnationCombo()
|
|
{
|
|
}
|
|
|
|
|
|
BEGIN_MESSAGE_MAP(CCSGDesitnationCombo, CComboBox)
|
|
//{{AFX_MSG_MAP(CCSGDesitnationCombo)
|
|
ON_CONTROL_REFLECT(CBN_SELCHANGE, OnSelchange)
|
|
ON_CONTROL_REFLECT(CBN_DROPDOWN, OnDropdown)
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CCSGDesitnationCombo message handlers
|
|
|
|
BOOL CCSGDesitnationCombo::OnIdle(LONG lCount)
|
|
{
|
|
// get document ptr
|
|
CWorldEditorDoc* pDoc = theApp.GetActiveDocument();
|
|
|
|
// if document ptr has changed
|
|
// or if document was closed (pDoc == NULL and pLastDoc != NULL)
|
|
// or if document was changed from last OnIdle, refresh CSG destination combo box
|
|
if( (m_pLastDoc != pDoc) ||
|
|
((pDoc == NULL) && (m_pLastDoc != NULL)) ||
|
|
((pDoc != NULL) && !pDoc->m_chDocument.IsUpToDate( m_udComboEntries)) )
|
|
{
|
|
CEntity *penPreviouslySelectedEntity = NULL;
|
|
INDEX iCurrentSelection = GetCurSel();
|
|
if( iCurrentSelection != CB_ERR)
|
|
{
|
|
penPreviouslySelectedEntity = (CEntity *) GetItemData( iCurrentSelection);
|
|
}
|
|
// remove all combo entries
|
|
ResetContent();
|
|
// select entry one by default
|
|
INDEX iSelectedEntryByName = -1;
|
|
INDEX iSelectedEntryByPtr = -1;
|
|
// if document doesn't exist
|
|
if( pDoc == NULL)
|
|
{
|
|
AddString( L"None Available");
|
|
}
|
|
// if document exists
|
|
else
|
|
{
|
|
// for all of the world's entities
|
|
FOREACHINDYNAMICCONTAINER(pDoc->m_woWorld.wo_cenEntities, CEntity, iten)
|
|
{
|
|
// if the entity is brush
|
|
CEntity::RenderType rt = iten->GetRenderType();
|
|
if (rt==CEntity::RT_BRUSH || rt==CEntity::RT_FIELDBRUSH)
|
|
{
|
|
CTString strEntityName = iten->GetName();
|
|
// and it has name property defined
|
|
if( strEntityName != "")
|
|
{
|
|
// add it to CSG destination combo
|
|
INDEX iComboEntry = AddString( CString(strEntityName));
|
|
// set item's data as ptr to current entity
|
|
SetItemData( iComboEntry, (ULONG)(&*iten));
|
|
// try to select previously selected combo entry
|
|
if( strEntityName == m_strLastSelectedName)
|
|
{
|
|
iSelectedEntryByName = iComboEntry;
|
|
}
|
|
if( &iten.Current() == penPreviouslySelectedEntity)
|
|
{
|
|
iSelectedEntryByPtr = iComboEntry;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
ASSERT( (GetCount() != CB_ERR) && (GetCount() != 0) );
|
|
}
|
|
if( iSelectedEntryByPtr != -1) SetCurSel( iSelectedEntryByPtr);
|
|
else if( iSelectedEntryByName != -1) SetCurSel( iSelectedEntryByName);
|
|
else SetCurSel( 0);
|
|
m_udComboEntries.MarkUpdated();
|
|
m_pLastDoc = pDoc;
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
void CCSGDesitnationCombo::SelectBrushEntity( CEntity *penBrush)
|
|
{
|
|
// loop all entries in combo box
|
|
for( INDEX i=0; i<GetCount(); i++)
|
|
{
|
|
// if this is searched brush entity
|
|
if( ((CEntity *) GetItemData( i)) == penBrush)
|
|
{
|
|
// select it
|
|
SetCurSel( i);
|
|
m_strLastSelectedName = penBrush->GetName();
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
CEntity *CCSGDesitnationCombo::GetSelectedBrushEntity(void)
|
|
{
|
|
// assure valid brush entity ptr
|
|
OnIdle( 0);
|
|
|
|
INDEX iCurrentSelection = GetCurSel();
|
|
if( iCurrentSelection == CB_ERR)
|
|
{
|
|
return NULL;
|
|
}
|
|
return (CEntity *) GetItemData( iCurrentSelection);
|
|
}
|
|
|
|
void CCSGDesitnationCombo::OnSelchange()
|
|
{
|
|
CEntity *penSelected = GetSelectedBrushEntity();
|
|
if( penSelected != NULL)
|
|
{
|
|
m_strLastSelectedName = penSelected->GetName();
|
|
}
|
|
}
|
|
|
|
void CCSGDesitnationCombo::OnDropdown()
|
|
{
|
|
INDEX ctItems = GetCount();
|
|
if( ctItems == CB_ERR) return;
|
|
|
|
CRect rectCombo;
|
|
GetWindowRect( &rectCombo);
|
|
|
|
PIX pixScreenHeight = ::GetSystemMetrics(SM_CYSCREEN);
|
|
PIX pixMaxHeight = pixScreenHeight - rectCombo.top;
|
|
|
|
CWnd *pwndParent = GetParent();
|
|
if( pwndParent == NULL) return;
|
|
pwndParent->ScreenToClient( &rectCombo);
|
|
PIX pixNewHeight = GetItemHeight(0)*(ctItems+2);
|
|
rectCombo.bottom = rectCombo.top + ClampUp( pixNewHeight, pixMaxHeight);
|
|
MoveWindow( rectCombo);
|
|
}
|