reman3/Rayman_X/cpa/tempgrp/OGD/src/dlgcarac.cpp

238 lines
7.7 KiB
C++

// dlgcaract.cpp : implementation file
//
#ifdef ACTIVE_EDITOR
#include "stdafx.h"
#include "ACP_Base.h"
#include "incITF.h"
#include "dlgcarac.hpp"
#undef CPA_WANTS_IMPORT
#undef CPA_EXPORT
#define CPA_WANTS_EXPORT
#include "OGD.h"
#undef CPA_WANTS_EXPORT
#define CPA_WANTS_IMPORT
#include "3Dinterf.hpp"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
extern char *g_szElementTypeName[];
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
#define C_iBorderSize 5
#define M_CtrlList() ((CListCtrl*) GetDlgItem(IDC_LIST_ELEMENTS))
#define M_GetClientRect( pWnd, poRect ) (pWnd) -> GetWindowRect( poRect );ScreenToClient( poRect )
#define M_GetClientRectId( Id, poRect ) M_GetClientRect( GetDlgItem( Id ), poRect )
#define M_SetClientRect( pWnd, poRect ) (pWnd) -> MoveWindow( poRect )
#define M_SetClientRectId( Id, poRect ) M_SetClientRect( GetDlgItem( Id ), poRect )
#define M_GetElementType(_szName,_Type) for( (_Type) = 0 ; strcmpi(g_szElementTypeName[_Type],"END") && strcmpi(g_szElementTypeName[_Type],_szName) ; (_Type)++);
#define M_ForEachElement( oList, oElement, Pos )\
for( oElement = (oList) . GetHeadElement( Pos ) ; \
oElement ; \
oElement = (oList) . GetNextElement( Pos ) )
/////////////////////////////////////////////////////////////////////////////
// CDlgCaract dialog
IMPLEMENT_DYNCREATE(CDlgCaract,CFormView)
CDlgCaract::CDlgCaract(CWnd* pParent /*=NULL*/)
:CFormView(CDlgCaract::IDD)
{
m_p_oParentDLL = NULL;
m_bFirstInit = TRUE;
m_p_oCurrentObject = NULL;
m_p_oSuperObject = NULL;
}
void CDlgCaract::DoDataExchange(CDataExchange* pDX)
{
CFormView::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CDlgCaract, CFormView)
//{{AFX_MSG_MAP(CDlgCaract)
ON_WM_SIZE()
ON_NOTIFY( LVN_ITEMCHANGED , IDC_LIST_ELEMENTS, OnChangeList )
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDlgCaract message handlers
void CDlgCaract::fn_vUpdateInfo(CPA_SuperObject *_p_oSprObj, Geometry3D *_p_oObject)
{
if( m_bFirstInit )
{
m_bFirstInit = FALSE;
fn_vInitList();
}
if(_p_oObject && (m_p_oCurrentObject != _p_oObject))
{
ACP_tdxHandleOfObject p_tdstGeom = _p_oObject -> GetStruct();
m_Data_cName.Format("%s",_p_oObject->GetName());
m_Data_lNbPoints = (long)GEO_xGetGeometricObjectNumberOfPoints(p_tdstGeom);
m_Data_lNbEdges = (long)GEO_xGetGeometricObjectNumberOfEdges(p_tdstGeom);
m_Data_lNbBdV = (long)GEO_xGetGeometricObjectNumberOfParallelBox(p_tdstGeom);
m_Data_lNbElements = (long)GEO_xGetGeometricObjectNumberOfElements(p_tdstGeom);
// elements
fn_vUpdateList( _p_oObject );
}
else if( ! _p_oObject )
{
m_Data_cName = "No Object";
fn_vUpdateList( NULL );
}
m_p_oSuperObject = _p_oSprObj;
m_p_oCurrentObject = _p_oObject;
//
fn_vShowValue( IDC_STATIC_NBPOINTS, m_Data_lNbPoints );
fn_vShowValue( IDC_STATIC_NBEDGES, m_Data_lNbEdges );
fn_vShowValue( IDC_STATIC_NBBDV, m_Data_lNbBdV );
fn_vShowValue( IDC_ELEMENTS, m_Data_lNbElements );
if(GetDlgItem(IDC_EDIT_NAME))
GetDlgItem(IDC_EDIT_NAME)->SetWindowText( m_Data_cName );
GetDlgItem(IDC_EDIT_NAME)->EnableWindow(m_p_oCurrentObject != NULL);
//
UpdateData(FALSE);
}
void CDlgCaract::fn_vShowValue(int _nID, long _lValue)
{
CString oCst;
CWnd *p_oWnd = GetDlgItem(_nID) ;
if(p_oWnd)
{
oCst.Format("%ld",_lValue);
p_oWnd->SetWindowText(oCst);
}
}
void CDlgCaract::fn_vInitList()
{
int iTaille = M_CtrlList()->GetStringWidth("m");
CString csNum;
M_CtrlList()->InsertColumn(0,"Element",LVCFMT_LEFT,iTaille*15);
M_CtrlList()->InsertColumn(1,"Type",LVCFMT_CENTER,iTaille*4);
M_CtrlList()->InsertColumn(2,"Size",LVCFMT_RIGHT,iTaille*4);
M_CtrlList()->InsertColumn(3,"BdV",LVCFMT_RIGHT,iTaille*4);
}
void CDlgCaract::fn_vUpdateList(Geometry3D *_p_oObject)
{
M_CtrlList()->DeleteAllItems();
if( _p_oObject )
{
long iInd;
POSITION xPos;
SectionElement *p_oElementSection;
char szShortSectionName[SCR_CV_ui_Cfg_MaxLenName];
iInd = 0;
M_ForEachElement( _p_oObject -> m_oListOfElementSections, p_oElementSection, xPos )
{
ACP_tdxHandleOfObject p_tdstGeom = _p_oObject -> GetStruct();
ACP_tdxIndex xElementType;
char *p_cElement, *p_cName;
CString oCst;
strcpy( szShortSectionName, (const char*)p_oElementSection -> GetReferencedSectionName() );
p_cElement = strstr( szShortSectionName, "Element" ) + strlen("Element");
p_cName = strchr( p_cElement, ':' );
*p_cName++ = 0;
M_GetElementType( p_cElement , xElementType );
M_CtrlList()->InsertItem(iInd, p_cName,0);
switch(xElementType)
{
case GEO_C_xElementIndexedTriangles: M_CtrlList()->SetItemText( iInd, 1, "ITr" ); break;
case GEO_C_xElementFaceMapDescriptors: M_CtrlList()->SetItemText( iInd, 1, "FMD" ); break;
case GEO_C_xElementSprites: M_CtrlList()->SetItemText( iInd, 1, "Spr" ); break;
case GEO_C_xElementTMeshes: M_CtrlList()->SetItemText( iInd, 1, "TMs" ); break;
case GEO_C_xElementPoints: M_CtrlList()->SetItemText( iInd, 1, "Pts" ); break;
case GEO_C_xElementLines: M_CtrlList()->SetItemText( iInd, 1, "Lin" ); break;
case GEO_C_xElementSpheres: M_CtrlList()->SetItemText( iInd, 1, "Sph" ); break;
case GEO_C_xElementAlignedBoxes: M_CtrlList()->SetItemText( iInd, 1, "Box" ); break;
case GEO_C_xElementAltimap: M_CtrlList()->SetItemText( iInd, 1, "Atm" ); break;
}
oCst.Format("%d",_p_oObject->fn_xGetNbIndexedElements(iInd));
M_CtrlList()->SetItemText(iInd,2,oCst);
if( GEO_xGetParallelBoxIndexOfElement( p_tdstGeom, iInd ) != GEO_C_xNoParallelBox )
oCst.Format("%d",GEO_xGetParallelBoxIndexOfElement( p_tdstGeom, iInd ));
else
oCst = " ";
M_CtrlList()->SetItemText(iInd,3,oCst);
iInd++;
}
}
}
void CDlgCaract::OnSize(UINT nType, int cx, int cy)
{
if(GetDlgItem(IDC_EDIT_NAME))
{
CRect oRectDlg, oRectList, oRectBorder, oRectName;
M_GetClientRect( this, &oRectDlg );
M_GetClientRectId( IDC_LIST_ELEMENTS, &oRectList );
M_GetClientRectId( IDC_STATIC_BORDER, &oRectBorder );
M_GetClientRectId( IDC_EDIT_NAME, &oRectName );
// recompute pos
oRectBorder . left = oRectList . left = oRectDlg . left + C_iBorderSize;
oRectBorder . right = oRectList . right = oRectDlg . right - C_iBorderSize;
oRectList . bottom = max( oRectList . top + 20 , oRectDlg . bottom - C_iBorderSize );
oRectName . left = oRectBorder . left + C_iBorderSize;
oRectName . right = oRectBorder . right - C_iBorderSize;
// set pos
M_SetClientRectId( IDC_LIST_ELEMENTS, &oRectList );
M_SetClientRectId( IDC_STATIC_BORDER, &oRectBorder );
M_SetClientRectId( IDC_EDIT_NAME, &oRectName );
}
}
void CDlgCaract::OnChangeList(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_LISTVIEW* pnmv = (NM_LISTVIEW *)pNMHDR;
if( (pnmv->uOldState & LVIS_SELECTED) && !(pnmv->uNewState & LVIS_SELECTED) )
{
// unselect
m_p_oParentDLL -> mfn_vShowOrHideElement( FALSE );
}
else if( pnmv->uNewState & LVIS_SELECTED )
{
// select
m_p_oParentDLL -> mfn_vShowOrHideElement( TRUE, m_p_oSuperObject, m_p_oCurrentObject, pnmv -> iItem );
}
*pResult = 0;
}
#endif //ACTIVE_EDITOR