1206 lines
37 KiB
C++
1206 lines
37 KiB
C++
/*
|
|
=======================================================================================
|
|
Name : podialog.cpp
|
|
|
|
Author : vincent lhullier Date :26/08/97
|
|
|
|
Description : implementation file for PO editor dialog boxes
|
|
=======================================================================================
|
|
Modification -> Author : Date :
|
|
Description :
|
|
=======================================================================================
|
|
*/
|
|
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
#include "stdafx.h"
|
|
#include "ACP_Base.h"
|
|
#include "ITF.h"
|
|
#include "TUT.h"
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
#define D_PhysiCol_Define
|
|
#include "incGAM.h"
|
|
//#define PO_FRIEND
|
|
#include "PO.h"
|
|
//#undef PO_FRIEND
|
|
#undef D_PhysiCol_Define
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
#include "incOPD.h"
|
|
#include "podialog.h"
|
|
#include "x:\Cpa\Main\inc\_EditId.h"
|
|
#include "..\..\GLIGLOU\MULTIDRV\inc\VisuS_st.h"
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
|
|
/*
|
|
=======================================================================================
|
|
=======================================================================================
|
|
CPOVseModif
|
|
=======================================================================================
|
|
=======================================================================================
|
|
*/
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : constructor
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
CPOVseModif::CPOVseModif( EditorPO *_p_oPO, GEO_tdxHandleToVisualSet _hVSE, ACP_tdxIndex _xNbModifs ) : CPA_Modif( 0, "Vse treshold" )
|
|
{
|
|
ACP_tdxIndex xIndex;
|
|
|
|
m_p_oPO = _p_oPO;
|
|
m_hVisualSet = _hVSE;
|
|
m_xNbModifs = _xNbModifs;
|
|
if (m_xNbModifs)
|
|
{
|
|
m_d_xIndex = (ACP_tdxIndex *) malloc ( m_xNbModifs * sizeof( ACP_tdxIndex ) );
|
|
m_d_xDiff = (MTH_tdxReal *) malloc ( m_xNbModifs * sizeof( MTH_tdxReal ) );
|
|
|
|
for (xIndex = 0; xIndex < m_xNbModifs; xIndex++ )
|
|
m_d_xIndex[ xIndex ] = -1;
|
|
}
|
|
}
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : destructor
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
CPOVseModif::~CPOVseModif( void )
|
|
{
|
|
if (m_xNbModifs)
|
|
{
|
|
free( m_d_xIndex );
|
|
free( m_d_xDiff );
|
|
}
|
|
}
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : Do the modif
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
CPOVseModif::Do( void )
|
|
{
|
|
ACP_tdxIndex xModif;
|
|
MTH_tdxReal xTreshold;
|
|
ACP_tdxHandleOfObject xGeometric;
|
|
|
|
for ( xModif = 0; xModif < m_xNbModifs; xModif++)
|
|
{
|
|
if (m_d_xIndex[ xModif ] != -1)
|
|
{
|
|
GLI_vGetVisualSetLOD( m_hVisualSet, m_d_xIndex[ xModif ], &xTreshold, &xGeometric );
|
|
xTreshold += m_d_xDiff[ xModif ];
|
|
GLI_vSetVisualSetLOD( m_hVisualSet, m_d_xIndex[ xModif ], xTreshold, xGeometric );
|
|
}
|
|
}
|
|
if (m_p_oPO->fn_p_oGetVSESection())
|
|
m_p_oPO->fn_p_oGetVSESection()->fn_vWriteSection();
|
|
(((DEV_MultiDevice*)g_oFrameGest.ma_p_oWinArray[2][2]->GetActiveView())->DrawObject());
|
|
return TRUE;
|
|
}
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : UnDo the modif
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
CPOVseModif::Undo( void )
|
|
{
|
|
ACP_tdxIndex xModif;
|
|
MTH_tdxReal xTreshold;
|
|
ACP_tdxHandleOfObject xGeometric;
|
|
|
|
for ( xModif = 0; xModif < m_xNbModifs; xModif++)
|
|
{
|
|
if (m_d_xIndex[ xModif ] != -1)
|
|
{
|
|
GLI_vGetVisualSetLOD( m_hVisualSet, m_d_xIndex[ xModif ], &xTreshold, &xGeometric );
|
|
xTreshold -= m_d_xDiff[ xModif ];
|
|
GLI_vSetVisualSetLOD( m_hVisualSet, m_d_xIndex[ xModif ], xTreshold, xGeometric );
|
|
}
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : set modification for a given treshold
|
|
_xLod -> index of lod (treshold)
|
|
_xDiff -> difference between new and old treshold
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void CPOVseModif::m_fn_vSetDiff( ACP_tdxIndex _xLod, MTH_tdxReal _xDiff )
|
|
{
|
|
ACP_tdxIndex xModif;
|
|
|
|
for (xModif = 0; xModif < m_xNbModifs; xModif++)
|
|
if (m_d_xIndex[ xModif ] == -1)
|
|
break;
|
|
|
|
if (xModif == m_xNbModifs)
|
|
return;
|
|
|
|
m_d_xIndex[ xModif ] = _xLod;
|
|
m_d_xDiff[ xModif ] = _xDiff;
|
|
}
|
|
|
|
/*
|
|
=======================================================================================
|
|
=======================================================================================
|
|
CPODlgVse
|
|
=======================================================================================
|
|
=======================================================================================
|
|
*/
|
|
IMPLEMENT_DYNCREATE(CPODlgVse, CFormView)
|
|
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : constructor
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
CPODlgVse::CPODlgVse(): CFormView(CPODlgVse::IDD)
|
|
{
|
|
//{{AFX_DATA_INIT(CPODlgVse)
|
|
// NOTE: the ClassWizard will add member initialization here
|
|
//}}AFX_DATA_INIT
|
|
m_p_oParentDLL = NULL;
|
|
m_xSwapLod = -1;
|
|
}
|
|
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : destructor
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
CPODlgVse::~CPODlgVse()
|
|
{
|
|
}
|
|
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : Message Map
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
BEGIN_MESSAGE_MAP(CPODlgVse, CFormView)
|
|
//{{AFX_MSG_MAP(CPODlgVse)
|
|
ON_WM_DRAWITEM()
|
|
ON_NOTIFY(UDN_DELTAPOS, IDC_SPIN_CURRENTLOD, OnDeltaposSpinCurrentlod)
|
|
ON_EN_KILLFOCUS(IDC_EDIT_CURRENTLOD, OnKillfocusEditCurrentlod)
|
|
ON_NOTIFY(UDN_DELTAPOS, IDC_SPIN_FROM, OnDeltaposSpinFrom)
|
|
ON_NOTIFY(UDN_DELTAPOS, IDC_SPIN_TO, OnDeltaposSpinTo)
|
|
ON_EN_KILLFOCUS(IDC_EDIT_FROM, OnKillfocusEditFrom)
|
|
ON_EN_KILLFOCUS(IDC_EDIT_TO, OnKillfocusEditTo)
|
|
ON_BN_CLICKED(IDC_BUTTON_APPLY, OnButtonApply)
|
|
ON_BN_CLICKED(IDC_BUTTON_TRESHOLD, OnButtonTreshold)
|
|
ON_BN_DOUBLECLICKED(IDC_BUTTON_TRESHOLD, OnDoubleclickedButtonTreshold)
|
|
ON_WM_DESTROY()
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : Creation of FormView, register window and control
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
BOOL CPODlgVse::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext)
|
|
{
|
|
if ( !CFormView::Create(lpszClassName, lpszWindowName, dwStyle, rect, pParentWnd, nID, pContext) )
|
|
return FALSE;
|
|
|
|
TUT_M_vGetTutDll();
|
|
TUT_M_vRegisterControl( GetSafeHwnd(), "OPD_VisualSetEditionDialog", TUT_e_Window );
|
|
TUT_M_vRegisterControlID( IDC_BUTTON_APPLY, "OPD_Vse_ApplyModifButton", TUT_e_Button );
|
|
TUT_M_vRegisterControlID( IDC_BUTTON_TRESHOLD, "OPD_Vse_ThresholdBar", TUT_e_Button );
|
|
TUT_M_vRegisterControlID( IDC_EDIT_CURRENTLOD, "OPD_Vse_CurrentLod", TUT_e_TextEdit );
|
|
TUT_M_vRegisterControlID( IDC_EDIT_FROM, "OPD_Vse_EditThresholdStart", TUT_e_TextEdit );
|
|
TUT_M_vRegisterControlID( IDC_EDIT_NBLODS, "OPD_Vse_NumberOfLods", TUT_e_TextEdit );
|
|
TUT_M_vRegisterControlID( IDC_EDIT_TO, "OPD_Vse_EditThresholdEnd", TUT_e_TextEdit );
|
|
TUT_M_vRegisterControlID( IDC_SPIN_CURRENTLOD, "OPD_Vse_SpinCurrentLod", TUT_e_Spin );
|
|
TUT_M_vRegisterControlID( IDC_SPIN_FROM, "OPD_Vse_SpinThresholdStart", TUT_e_Spin );
|
|
TUT_M_vRegisterControlID( IDC_SPIN_TO, "OPD_Vse_SpinThresholdEnd", TUT_e_Spin );
|
|
return TRUE;
|
|
}
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : Unregister control from TUT
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void CPODlgVse::OnDestroy()
|
|
{
|
|
TUT_M_vGetTutDll();
|
|
TUT_M_vUnregisterControl( GetSafeHwnd() );
|
|
TUT_M_vUnregisterControlID( IDC_BUTTON_APPLY );
|
|
TUT_M_vUnregisterControlID( IDC_BUTTON_TRESHOLD );
|
|
TUT_M_vUnregisterControlID( IDC_EDIT_CURRENTLOD );
|
|
TUT_M_vUnregisterControlID( IDC_EDIT_FROM );
|
|
TUT_M_vUnregisterControlID( IDC_EDIT_NBLODS );
|
|
TUT_M_vUnregisterControlID( IDC_EDIT_TO );
|
|
TUT_M_vUnregisterControlID( IDC_SPIN_CURRENTLOD );
|
|
TUT_M_vUnregisterControlID( IDC_SPIN_FROM );
|
|
TUT_M_vUnregisterControlID( IDC_SPIN_TO );
|
|
|
|
CFormView::OnDestroy();
|
|
}
|
|
|
|
/*
|
|
=======================================================================================
|
|
CPODlgVse diagnostics
|
|
=======================================================================================
|
|
*/
|
|
#ifdef _DEBUG
|
|
void CPODlgVse::AssertValid() const
|
|
{
|
|
CFormView::AssertValid();
|
|
}
|
|
|
|
void CPODlgVse::Dump(CDumpContext& dc) const
|
|
{
|
|
CFormView::Dump(dc);
|
|
}
|
|
#endif //_DEBUG
|
|
|
|
/*
|
|
=======================================================================================
|
|
Specific functions
|
|
=======================================================================================
|
|
*/
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : update info about a PO object
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void CPODlgVse::fn_vUpdateInfo(class EditorPO *_p_oPO)
|
|
{
|
|
m_fn_vSwapLOD( 0, TRUE, TRUE );
|
|
|
|
if ( (m_p_oPO = _p_oPO) != NULL)
|
|
{
|
|
PO_tdxHandleToPhysicalObject hPO;
|
|
|
|
hPO = _p_oPO->GetStruct();
|
|
if (hPO != NULL)
|
|
{
|
|
m_hVisualSet = PO_fn_hGetVisualSet( hPO );
|
|
m_hCollSet = PO_fn_hGetCollideSet( hPO );
|
|
}
|
|
else
|
|
m_p_oPO = NULL;
|
|
}
|
|
|
|
if (m_p_oPO == NULL)
|
|
{
|
|
m_hVisualSet = 0;
|
|
m_hCollSet = 0;
|
|
}
|
|
|
|
m_fn_vInitVisualSetData( m_hVisualSet );
|
|
m_fn_vShowCollideSet( m_hCollSet );
|
|
}
|
|
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : display info about the visual set
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void CPODlgVse::m_fn_vShowVisualSet( GEO_tdxHandleToVisualSet hVisualSet )
|
|
{
|
|
BOOL bVisible = ( hVisualSet != 0 );
|
|
char szNbLods[10];
|
|
|
|
m_xCurrentLod = 0;
|
|
|
|
GetDlgItem( IDC_BUTTON_TRESHOLD )->ShowWindow( bVisible );
|
|
GetDlgItem( IDC_STATIC_NBLODS )->ShowWindow( bVisible );
|
|
GetDlgItem( IDC_EDIT_NBLODS )->ShowWindow( bVisible );
|
|
GetDlgItem( IDC_STATIC_CURRENTLOD )->ShowWindow( bVisible );
|
|
GetDlgItem( IDC_STATIC_CURLOD )->ShowWindow( bVisible );
|
|
GetDlgItem( IDC_EDIT_CURRENTLOD )->ShowWindow( bVisible );
|
|
((CEdit *) GetDlgItem( IDC_EDIT_CURRENTLOD ))->SetReadOnly( m_xNbLods <= 1 );
|
|
GetDlgItem( IDC_SPIN_CURRENTLOD )->ShowWindow( bVisible && (m_xNbLods > 1));
|
|
GetDlgItem( IDC_STATIC_FROM )->ShowWindow( bVisible );
|
|
GetDlgItem( IDC_EDIT_FROM )->ShowWindow( bVisible );
|
|
GetDlgItem( IDC_SPIN_FROM )->ShowWindow( bVisible );
|
|
GetDlgItem( IDC_STATIC_TO )->ShowWindow( bVisible );
|
|
GetDlgItem( IDC_EDIT_TO )->ShowWindow( bVisible );
|
|
GetDlgItem( IDC_SPIN_TO )->ShowWindow( bVisible );
|
|
GetDlgItem( IDC_BUTTON_APPLY )->ShowWindow( bVisible );
|
|
|
|
if (!bVisible)
|
|
return;
|
|
|
|
GetDlgItem( IDC_EDIT_NBLODS )->SetWindowText( itoa( m_xNbLods, szNbLods, 10) );
|
|
m_fn_vShowCurrentLod();
|
|
}
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : initialize data about visual set
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void CPODlgVse::m_fn_vInitVisualSetData( GEO_tdxHandleToVisualSet hVisualSet )
|
|
{
|
|
if (hVisualSet == 0)
|
|
{
|
|
m_xCurrentLod = -1;
|
|
}
|
|
else
|
|
{
|
|
m_xNbLods = (ACP_tdxIndex) GLI_lGetVisualSetNumbertOfLOD( hVisualSet );
|
|
for( m_xCurrentLod = 0; m_xCurrentLod < m_xNbLods; m_xCurrentLod ++ )
|
|
GLI_vGetVisualSetLOD( hVisualSet, m_xCurrentLod, &m_a_xTresholds[m_xCurrentLod], &m_a_xGeometrics[m_xCurrentLod] );
|
|
m_a_xTresholds[ 0 ] = 0;
|
|
m_xCurrentLod = 0;
|
|
}
|
|
m_fn_vShowVisualSet( hVisualSet );
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : display info about current lod
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void CPODlgVse::m_fn_vShowCurrentLod( )
|
|
{
|
|
char szValue[10];
|
|
|
|
GetDlgItem( IDC_SPIN_FROM)->ShowWindow( m_xCurrentLod != 0 );
|
|
GetDlgItem( IDC_SPIN_TO)->ShowWindow( m_xCurrentLod != m_xNbLods - 1 );
|
|
|
|
GetDlgItem( IDC_EDIT_CURRENTLOD )->SetWindowText( itoa( m_xCurrentLod, szValue, 10 ) );
|
|
|
|
//GetDlgItem( IDC_EDIT_FROM )->SetWindowText( m_xCurrentLod == 0 ? "0" : ftoa ((int) m_a_xTresholds[m_xCurrentLod - 1], szValue, 10) );
|
|
sprintf( szValue, "%g", (m_xCurrentLod == 0) ? 0 : m_a_xTresholds[m_xCurrentLod] );
|
|
GetDlgItem( IDC_EDIT_FROM )->SetWindowText( szValue );
|
|
((CEdit *) GetDlgItem( IDC_EDIT_FROM ))->SetReadOnly( m_xCurrentLod == 0 );
|
|
//GetDlgItem( IDC_EDIT_TO )->SetWindowText( (m_xCurrentLod + 1 == m_xNbLods) ? "infini" : itoa( (int) m_a_xTresholds[m_xCurrentLod], szValue, 10) );
|
|
if (m_xCurrentLod + 1 == m_xNbLods )
|
|
strcpy( szValue, "infini");
|
|
else
|
|
sprintf( szValue, "%g", m_a_xTresholds[ m_xCurrentLod + 1] );
|
|
GetDlgItem( IDC_EDIT_TO )->SetWindowText( szValue );
|
|
((CEdit *) GetDlgItem( IDC_EDIT_TO ))->SetReadOnly( m_xCurrentLod+1 == m_xNbLods );
|
|
|
|
GetDlgItem( IDC_BUTTON_TRESHOLD )->Invalidate();
|
|
}
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : display info about collide set
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void CPODlgVse::m_fn_vShowCollideSet( PCS_tdxHandleToPhysicalCollSet hCollSet )
|
|
{
|
|
}
|
|
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : change value of a treshold
|
|
cIndex -> index of lod (and treshold)
|
|
xValue -> new treshold value
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void CPODlgVse::m_fn_vChangeTreshold( ACP_tdxIndex _xIndex, MTH_tdxReal _xValue)
|
|
{
|
|
MTH_tdxReal xMin, xMax;
|
|
|
|
if ( _xIndex == 0 )
|
|
_xValue = 0;
|
|
else
|
|
{
|
|
xMin = m_a_xTresholds[ _xIndex - 1 ];
|
|
xMax = (_xIndex == m_xNbLods - 1) ? -1 : m_a_xTresholds[ _xIndex + 1];
|
|
|
|
if (_xValue < xMin)
|
|
_xValue = xMin;
|
|
else if ( (xMax != -1) && (_xValue > xMax) )
|
|
_xValue = xMax;
|
|
}
|
|
m_a_xTresholds[ _xIndex ] = _xValue;
|
|
m_fn_vShowCurrentLod();
|
|
}
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : Get index of clicked lod in sheme drawn in IDC_BUTTON_TRESHOLD button
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
ACP_tdxIndex CPODlgVse::m_fn_xGetClickedLodIndex( void )
|
|
{
|
|
CButton *p_oBt = (CButton *) GetDlgItem( IDC_BUTTON_TRESHOLD );
|
|
POINT stPoint;
|
|
RECT stRect;
|
|
long lHeight, lLodHeight, lY;
|
|
ACP_tdxIndex xLod = -1;
|
|
|
|
GetCursorPos( &stPoint );
|
|
p_oBt->ScreenToClient( &stPoint );
|
|
|
|
if ( (stPoint.x >= 5) && (stPoint.x <= 12) )
|
|
{
|
|
p_oBt->GetClientRect( &stRect );
|
|
lHeight = stRect.bottom - stRect.top;
|
|
lLodHeight = (lHeight - 9) / m_xNbLods;
|
|
lY = ( lHeight - (lLodHeight * m_xNbLods) ) / 2;
|
|
while (lY < stPoint.y)
|
|
{
|
|
if (++xLod == m_xNbLods)
|
|
{
|
|
xLod = -1;
|
|
break;
|
|
}
|
|
lY += lLodHeight;
|
|
}
|
|
}
|
|
return xLod;
|
|
}
|
|
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : swap/restore swap of LOD to force drawing of a given LOD
|
|
_xLod -> index of lod to force
|
|
_bRestore -> TRUE to restore initial Visual Set
|
|
_bRedraw -> TRUE if world must be redrawn
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void CPODlgVse::m_fn_vSwapLOD( ACP_tdxIndex _xLod, BOOL _bRestore, BOOL _bRedraw )
|
|
{
|
|
ACP_tdxHandleOfObject xGeometric0, xGeometric;
|
|
MTH_tdxReal xTreshold0, xTreshold;
|
|
|
|
if (_bRestore)
|
|
{
|
|
if (m_xSwapLod != -1)
|
|
{
|
|
((struct GEO_tdstVisualSet_ *) m_hVisualSet)->xNbLodDefinitions = m_xNbLods;
|
|
GLI_vGetVisualSetLOD( m_hVisualSet, 0, &xTreshold0, &xGeometric0 );
|
|
GLI_vGetVisualSetLOD( m_hVisualSet, m_xSwapLod, &xTreshold, &xGeometric );
|
|
GLI_vSetVisualSetLOD( m_hVisualSet, m_xSwapLod, xTreshold, xGeometric0 );
|
|
GLI_vSetVisualSetLOD( m_hVisualSet, 0, xTreshold0, xGeometric );
|
|
m_xSwapLod = -1;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (m_xSwapLod != -1)
|
|
m_fn_vSwapLOD( 0, TRUE, FALSE );
|
|
|
|
GLI_vGetVisualSetLOD( m_hVisualSet, 0, &xTreshold0, &xGeometric0 );
|
|
GLI_vGetVisualSetLOD( m_hVisualSet, _xLod, &xTreshold, &xGeometric );
|
|
GLI_vSetVisualSetLOD( m_hVisualSet, _xLod, xTreshold, xGeometric0 );
|
|
GLI_vSetVisualSetLOD( m_hVisualSet, 0, xTreshold0, xGeometric );
|
|
((GEO_tdstVisualSet *) m_hVisualSet)->xNbLodDefinitions = 1;
|
|
m_xSwapLod = _xLod;
|
|
}
|
|
|
|
if (_bRedraw)
|
|
(((DEV_MultiDevice*)g_oFrameGest.ma_p_oWinArray[2][2]->GetActiveView())->DrawObject());
|
|
}
|
|
|
|
|
|
/*
|
|
=======================================================================================
|
|
MESSAGE HANDLER
|
|
=======================================================================================
|
|
*/
|
|
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : WM_DRAWITEM
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void CPODlgVse::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDIS)
|
|
{
|
|
if (nIDCtl == IDC_BUTTON_TRESHOLD)
|
|
{
|
|
if (m_hVisualSet != 0)
|
|
{
|
|
// draw treshold bar
|
|
RECT rcLod;
|
|
RECT rcTreshold;
|
|
long lHeight;
|
|
long lLodHeight;
|
|
long lCurrentY;
|
|
ACP_tdxIndex xLod;
|
|
char szValue[10];
|
|
|
|
CBitmap oInfini;
|
|
CBrush oWhiteBrush(RGB(255,255,255));
|
|
CBrush oGrayBrush(RGB(128,128,128));
|
|
CBrush oBlackBrush(RGB(0,0,0));
|
|
CPen oRedPen( PS_SOLID, 1, RGB(255,0,0));
|
|
CPen oBlackPen( PS_SOLID, 1, RGB(0,0,0));
|
|
CPen oWhitePen( PS_SOLID, 1, RGB(255,255,255));
|
|
CDC *pDC = CDC::FromHandle( lpDIS->hDC );
|
|
|
|
lHeight = lpDIS->rcItem.bottom - lpDIS->rcItem.top;
|
|
lLodHeight = (lHeight - 9) / m_xNbLods;
|
|
lCurrentY = lpDIS->rcItem.top + (( lHeight - (lLodHeight * m_xNbLods) ) / 2);
|
|
|
|
rcLod.left = lpDIS->rcItem.left + 5;
|
|
rcLod.right = rcLod.left + 8;
|
|
|
|
rcTreshold.left = rcLod.right + 2;
|
|
rcTreshold.right = lpDIS->rcItem.right - 5;
|
|
|
|
for ( xLod = 0; xLod < m_xNbLods; xLod ++)
|
|
{
|
|
rcLod.top = lCurrentY;
|
|
rcLod.bottom = rcLod.top + lLodHeight - 1;
|
|
|
|
rcTreshold.top = lCurrentY - 5;
|
|
rcTreshold.bottom = rcTreshold.top + 12;
|
|
//itoa( xLod == 0 ? 0 : (int) m_a_xTresholds[xLod - 1], szValue, 10);
|
|
sprintf( szValue, "%g", /*(xLod == 0) ? 0 : */m_a_xTresholds[xLod] );
|
|
|
|
pDC->SelectObject( (xLod == m_xCurrentLod)?oRedPen:(xLod & 1)?oBlackPen:oWhitePen );
|
|
pDC->SelectObject( (xLod == m_xSwapLod) ? oGrayBrush : ((xLod & 1) ? oBlackBrush : oWhiteBrush) );
|
|
|
|
pDC->Rectangle( &rcLod );
|
|
pDC->DrawText( szValue, strlen( szValue ), &rcTreshold, DT_VCENTER | DT_LEFT );
|
|
|
|
lCurrentY += lLodHeight;
|
|
}
|
|
|
|
oInfini.LoadBitmap( IDB_BITMAP_INFINI );
|
|
pDC->DrawState( CPoint( rcTreshold.left, lCurrentY - 4), CSize(22,8) , &oInfini, DST_BITMAP|DSS_MONO, &oBlackBrush );
|
|
|
|
oInfini.DeleteObject();
|
|
oWhiteBrush.DeleteObject();
|
|
oBlackBrush.DeleteObject();
|
|
oWhitePen.DeleteObject();
|
|
oBlackPen.DeleteObject();
|
|
oRedPen.DeleteObject();
|
|
}
|
|
}
|
|
CFormView::OnDrawItem(nIDCtl, lpDIS);
|
|
}
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : UDN_DELTAPOS on IDC_SPIN_CURRENTLOD
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void CPODlgVse::OnDeltaposSpinCurrentlod(NMHDR* pNMHDR, LRESULT* pResult)
|
|
{
|
|
NM_UPDOWN* pNMUpDown = (NM_UPDOWN*)pNMHDR;
|
|
|
|
if ( pNMUpDown->iDelta < 0)
|
|
if (m_xCurrentLod == m_xNbLods - 1)
|
|
m_xCurrentLod = 0;
|
|
else
|
|
m_xCurrentLod++;
|
|
else
|
|
if (m_xCurrentLod == 0)
|
|
m_xCurrentLod = m_xNbLods - 1;
|
|
else
|
|
m_xCurrentLod--;
|
|
|
|
m_fn_vShowCurrentLod();
|
|
|
|
*pResult = 1;
|
|
}
|
|
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : EN_KILLFOCUS on IDC_EDIT_CURRENTLOD
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void CPODlgVse::OnKillfocusEditCurrentlod()
|
|
{
|
|
char szText[10];
|
|
|
|
GetDlgItem( IDC_EDIT_CURRENTLOD )->GetWindowText( szText, 10 );
|
|
m_xCurrentLod = atoi( szText );
|
|
if (m_xCurrentLod >= m_xNbLods )
|
|
m_xCurrentLod = m_xNbLods - 1;
|
|
else if( m_xCurrentLod < 0)
|
|
m_xCurrentLod = 0;
|
|
|
|
m_fn_vShowCurrentLod();
|
|
}
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : UDN_DELTAPOS on IDC_SPIN_FROM
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void CPODlgVse::OnDeltaposSpinFrom(NMHDR* pNMHDR, LRESULT* pResult)
|
|
{
|
|
MTH_tdxReal xValue;
|
|
MTH_tdxReal xDelta;
|
|
|
|
NM_UPDOWN* pNMUpDown = (NM_UPDOWN*)pNMHDR;
|
|
xDelta = -1 * (MTH_tdxReal) pNMUpDown->iDelta;
|
|
|
|
if (GetKeyState( VK_SHIFT) & 0x8000)
|
|
xDelta /= 10;
|
|
|
|
xValue = m_a_xTresholds[ m_xCurrentLod ] + xDelta;
|
|
m_fn_vChangeTreshold( m_xCurrentLod , xValue );
|
|
|
|
*pResult = 1;
|
|
}
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : EN_KILLFOCUS on IDC_EDIT_FROM
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void CPODlgVse::OnKillfocusEditFrom()
|
|
{
|
|
char szText[20];
|
|
|
|
GetDlgItem( IDC_EDIT_FROM )->GetWindowText( szText, 20 );
|
|
m_fn_vChangeTreshold( m_xCurrentLod, (float) atof( szText ) );
|
|
}
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : UDN_DELTAPOS on IDC_SPIN_TO
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void CPODlgVse::OnDeltaposSpinTo(NMHDR* pNMHDR, LRESULT* pResult)
|
|
{
|
|
MTH_tdxReal xValue;
|
|
MTH_tdxReal xDelta;
|
|
|
|
NM_UPDOWN* pNMUpDown = (NM_UPDOWN*)pNMHDR;
|
|
xDelta = -1 * (MTH_tdxReal) pNMUpDown->iDelta;
|
|
|
|
if (GetKeyState( VK_SHIFT) & 0x8000)
|
|
xDelta /= 10;
|
|
|
|
xValue = m_a_xTresholds[ m_xCurrentLod + 1] + xDelta;
|
|
m_fn_vChangeTreshold( m_xCurrentLod + 1, xValue );
|
|
|
|
*pResult = 1;
|
|
}
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : EN_KILLFOCUS on IDC_EDIT_TO
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void CPODlgVse::OnKillfocusEditTo()
|
|
{
|
|
char szText[20];
|
|
|
|
GetDlgItem( IDC_EDIT_TO )->GetWindowText( szText, 20 );
|
|
m_fn_vChangeTreshold( m_xCurrentLod + 1, (float) atof( szText ) );
|
|
}
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : BN_CLICKED on IDC_BUTTON_APPLY
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void CPODlgVse::OnButtonApply()
|
|
{
|
|
MTH_tdxReal a_xOldTreshold[ 10 ];
|
|
MTH_tdxReal xDiff;
|
|
ACP_tdxIndex xLod;
|
|
char cNbDiff;
|
|
|
|
|
|
for( cNbDiff = 0, xLod = 0; xLod < m_xNbLods; xLod++ )
|
|
{
|
|
GLI_vGetVisualSetLOD( m_hVisualSet, xLod, &a_xOldTreshold[ xLod ], &m_a_xGeometrics[xLod] );
|
|
if (a_xOldTreshold[ xLod ] != m_a_xTresholds[ xLod ])
|
|
cNbDiff++;
|
|
}
|
|
|
|
if ( !cNbDiff )
|
|
return;
|
|
|
|
/* create modif object */
|
|
CPOVseModif *p_oModif = new CPOVseModif( m_p_oPO, m_hVisualSet, cNbDiff );
|
|
for ( xLod = 0; xLod < m_xNbLods; xLod ++)
|
|
{
|
|
xDiff = m_a_xTresholds[ xLod ] - a_xOldTreshold[ xLod ];
|
|
if ( xDiff )
|
|
p_oModif->m_fn_vSetDiff( xLod, xDiff );
|
|
}
|
|
|
|
m_p_oParentDLL->GetInterface()->GetMultiDevice()->GetEditManager()->AskFor( p_oModif );
|
|
}
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : BN_CLICKED on IDC_BUTTON_TRESHOLD
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void CPODlgVse::OnButtonTreshold()
|
|
{
|
|
ACP_tdxIndex xLod;
|
|
|
|
if ( (xLod = m_fn_xGetClickedLodIndex()) != -1)
|
|
{
|
|
m_xCurrentLod = xLod;
|
|
m_fn_vShowCurrentLod();
|
|
}
|
|
}
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : BN_DBLCLICKED on IDC_BUTTON_TRESHOLD
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void CPODlgVse::OnDoubleclickedButtonTreshold()
|
|
{
|
|
ACP_tdxIndex xLod;
|
|
|
|
if ( (xLod = m_fn_xGetClickedLodIndex()) != -1)
|
|
{
|
|
m_fn_vSwapLOD( xLod, (xLod == m_xSwapLod), TRUE );
|
|
GetDlgItem( IDC_BUTTON_TRESHOLD )->Invalidate();
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
=======================================================================================
|
|
=======================================================================================
|
|
CPODlgList class
|
|
=======================================================================================
|
|
=======================================================================================
|
|
*/
|
|
IMPLEMENT_DYNCREATE(CPODlgList, CFormView)
|
|
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : constructor
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
CPODlgList::CPODlgList() : CFormView(CPODlgList::IDD)
|
|
{
|
|
//{{AFX_DATA_INIT(CPODlgList)
|
|
// NOTE: the ClassWizard will add member initialization here
|
|
//}}AFX_DATA_INIT
|
|
}
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : destructor
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
CPODlgList::~CPODlgList()
|
|
{
|
|
}
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : Message Map
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
BEGIN_MESSAGE_MAP(CPODlgList, CFormView)
|
|
//{{AFX_MSG_MAP(CPODlgList)
|
|
ON_WM_SIZE()
|
|
ON_NOTIFY(TVN_SELCHANGED, IDC_TREE_PO, OnSelchangedTreePos)
|
|
ON_WM_DESTROY()
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : Creation of FormView, register window and control
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
BOOL CPODlgList::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext)
|
|
{
|
|
if ( !CFormView::Create(lpszClassName, lpszWindowName, dwStyle, rect, pParentWnd, nID, pContext) )
|
|
return FALSE;
|
|
|
|
TUT_M_vGetTutDll();
|
|
TUT_M_vRegisterControl( GetSafeHwnd(),"OPD_PhysicalObjectListDialog", TUT_e_Window );
|
|
TUT_M_vRegisterControlID( IDC_TREE_PO,"OPD_PhysicalObjectList", TUT_e_TreeCtrl );
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : Unregister control from TUT
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void CPODlgList::OnDestroy()
|
|
{
|
|
TUT_M_vGetTutDll();
|
|
TUT_M_vUnregisterControl( GetSafeHwnd() );
|
|
TUT_M_vUnregisterControlID( IDC_TREE_PO );
|
|
|
|
CFormView::OnDestroy();
|
|
}
|
|
|
|
|
|
/*
|
|
=======================================================================================
|
|
Diagnostic functions
|
|
=======================================================================================
|
|
*/
|
|
#ifdef _DEBUG
|
|
void CPODlgList::AssertValid() const
|
|
{
|
|
CFormView::AssertValid();
|
|
}
|
|
|
|
void CPODlgList::Dump(CDumpContext& dc) const
|
|
{
|
|
CFormView::Dump(dc);
|
|
}
|
|
#endif //_DEBUG
|
|
|
|
/*
|
|
=======================================================================================
|
|
CPODlgList specific functions
|
|
=======================================================================================
|
|
*/
|
|
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : search by name a child of a tree item
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
HTREEITEM CPODlgList::fn_hSearchTreeChild( CTreeCtrl *_p_oTree, HTREEITEM _hParent, CString _cstrName )
|
|
{
|
|
HTREEITEM hChild;
|
|
|
|
hChild = _p_oTree->GetChildItem( _hParent );
|
|
while (hChild != NULL)
|
|
{
|
|
if ( _cstrName.CompareNoCase( _p_oTree->GetItemText( hChild ) ) == 0 )
|
|
break;
|
|
hChild = _p_oTree->GetNextSiblingItem( hChild );
|
|
}
|
|
return hChild;
|
|
}
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : search by Data a child of a tree item
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
HTREEITEM CPODlgList::fn_hSearchTreeChild( CTreeCtrl *_p_oTree, HTREEITEM _hParent, DWORD _dwData )
|
|
{
|
|
HTREEITEM hChild;
|
|
|
|
hChild = _p_oTree->GetChildItem( _hParent );
|
|
while (hChild != NULL)
|
|
{
|
|
if ( _p_oTree->GetItemData( hChild ) == _dwData )
|
|
break;
|
|
hChild = _p_oTree->GetNextSiblingItem( hChild );
|
|
}
|
|
return hChild;
|
|
}
|
|
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : search in tree item that include given PO
|
|
_p_oTree -> tree
|
|
_p_oPO -> PO to search the parent
|
|
Returns (HTREEITEM) hItem of PO parent
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
HTREEITEM CPODlgList::fn_hGetPOParentItem( CTreeCtrl *_p_oTree, EditorPO *_p_oPO )
|
|
{
|
|
CPA_BaseObject *p_oOwner;
|
|
CPA_BaseObject *p_oOwnerOwner;
|
|
HTREEITEM hCurrent;
|
|
HTREEITEM hFather;
|
|
|
|
/*
|
|
* Get parent HTREEITEM of PO
|
|
*/
|
|
if ((p_oOwner = _p_oPO->GetOwner()) == NULL)
|
|
return m_hWorldItem;
|
|
|
|
if ( strcmp( p_oOwner->fn_p_szGetType(), C_szObjectTableTypeName) == 0 )
|
|
{
|
|
if (m_hObjectTable != NULL)
|
|
{
|
|
p_oOwnerOwner = p_oOwner->GetOwner();
|
|
if (p_oOwnerOwner == NULL)
|
|
hCurrent = m_hWithoutActor;
|
|
else
|
|
hCurrent = fn_hSearchTreeChild( _p_oTree, m_hObjectTable, p_oOwnerOwner->GetName());
|
|
}
|
|
else
|
|
hCurrent = NULL;
|
|
}
|
|
else
|
|
{
|
|
hCurrent = m_hModelItem;
|
|
}
|
|
|
|
if (hCurrent != NULL)
|
|
hFather = fn_hSearchTreeChild( _p_oTree, hCurrent, p_oOwner->GetName());
|
|
else
|
|
hFather = NULL;
|
|
|
|
return hFather;
|
|
}
|
|
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : fill list of PO object present in memory
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void CPODlgList::fn_vRefreshListContent(void)
|
|
{
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
CTreeCtrl *p_oTree = (CTreeCtrl *) GetDlgItem( IDC_TREE_PO );
|
|
HTREEITEM hCurrent;
|
|
HTREEITEM hFather;
|
|
HTREEITEM hSelected, hNewSelected = NULL;
|
|
DWORD dwSelectedData = 0;
|
|
CString cstrSelectedText = "";
|
|
|
|
CPA_BaseObjectList *p_oPOList;
|
|
CPA_BaseObject *p_oPO;
|
|
CPA_BaseObject *p_oOwner;
|
|
CPA_BaseObject *p_oOwnerOwner;
|
|
|
|
Position xPos;
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
|
|
/*
|
|
* Init
|
|
*/
|
|
if ( (hSelected = p_oTree->GetSelectedItem()) != NULL)
|
|
{
|
|
dwSelectedData = p_oTree->GetItemData( hSelected );
|
|
cstrSelectedText = p_oTree->GetItemText( hSelected );
|
|
}
|
|
|
|
p_oTree->DeleteAllItems();
|
|
m_hWorldItem = m_hModelItem = m_hObjectTable = m_hWithoutActor = NULL;
|
|
|
|
p_oPOList = m_p_oParentDLL->GetMainWorld()->fn_p_oGetOriginalObjectList( C_szPhysicalObjectTypeName );
|
|
|
|
if (p_oPOList != NULL)
|
|
{
|
|
xPos = p_oPOList->GetHeadPosition();
|
|
while (xPos)
|
|
{
|
|
p_oPO = p_oPOList->GetNext( xPos );
|
|
ASSERT( p_oPO );
|
|
|
|
/*
|
|
* Get parent HTREEITEM of PO
|
|
*/
|
|
if ((p_oOwner = p_oPO->GetOwner()) == NULL)
|
|
{
|
|
if (m_hWorldItem == NULL)
|
|
if ( (m_hWorldItem = p_oTree->InsertItem( "World Physical objects" )) != NULL)
|
|
{
|
|
p_oTree->SetItemData( m_hWorldItem, 0 );
|
|
if ( (hSelected != NULL) && (dwSelectedData == 0) && (hNewSelected == NULL ) )
|
|
if (cstrSelectedText.CompareNoCase( "World Physical objects" ) == 0)
|
|
hNewSelected = m_hWorldItem;
|
|
}
|
|
hFather = m_hWorldItem;
|
|
}
|
|
else
|
|
{
|
|
if ( strcmp( p_oOwner->fn_p_szGetType(), C_szObjectTableTypeName) == 0 )
|
|
{
|
|
if (m_hObjectTable == NULL)
|
|
if ( (m_hObjectTable = p_oTree->InsertItem( "Object Tables" )) != NULL)
|
|
{
|
|
p_oTree->SetItemData( m_hObjectTable, 0 );
|
|
if ( (hSelected != NULL) && (dwSelectedData == 0) && (hNewSelected == NULL ) )
|
|
if (cstrSelectedText.CompareNoCase( "Object Tables" ) == 0)
|
|
hNewSelected = m_hObjectTable;
|
|
}
|
|
|
|
if (m_hObjectTable != NULL)
|
|
{
|
|
p_oOwnerOwner = p_oOwner->GetOwner();
|
|
if (p_oOwnerOwner == NULL)
|
|
{
|
|
if (m_hWithoutActor == NULL )
|
|
if ( (m_hWithoutActor = p_oTree->InsertItem( "Without owner", m_hObjectTable )) != NULL)
|
|
{
|
|
p_oTree->SetItemData( m_hWithoutActor, 0 );
|
|
if ( (hSelected != NULL) && (dwSelectedData == 0) && (hNewSelected == NULL ) )
|
|
if (cstrSelectedText.CompareNoCase( "Without owner" ) == 0)
|
|
hNewSelected = m_hWithoutActor;
|
|
}
|
|
hCurrent = m_hWithoutActor;
|
|
}
|
|
else
|
|
{
|
|
if ( (hCurrent = fn_hSearchTreeChild( p_oTree, m_hObjectTable, p_oOwnerOwner->GetName())) == NULL)
|
|
if ( (hCurrent = p_oTree->InsertItem( p_oOwnerOwner->GetName(), m_hObjectTable )) != NULL)
|
|
{
|
|
p_oTree->SetItemData( hCurrent, 0 );
|
|
if ( (hSelected != NULL) && (dwSelectedData == 0) && (hNewSelected == NULL ) )
|
|
if (cstrSelectedText.CompareNoCase( p_oOwnerOwner->GetName() ) == 0)
|
|
hNewSelected = hCurrent;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
hCurrent = NULL;
|
|
}
|
|
else
|
|
{
|
|
if (m_hModelItem == NULL)
|
|
if ( (m_hModelItem = p_oTree->InsertItem( "Model PO" )) != NULL)
|
|
{
|
|
p_oTree->SetItemData( m_hModelItem, 0 );
|
|
if ( (hSelected != NULL) && (dwSelectedData == 0) && (hNewSelected == NULL ) )
|
|
if (cstrSelectedText.CompareNoCase( "Model PO" ) == 0)
|
|
hNewSelected = m_hModelItem;
|
|
}
|
|
hCurrent = m_hModelItem;
|
|
}
|
|
|
|
if (hCurrent != NULL)
|
|
{
|
|
if ( (hFather = fn_hSearchTreeChild( p_oTree, hCurrent, p_oOwner->GetName())) == NULL)
|
|
if ( (hFather = p_oTree->InsertItem( p_oOwner->GetName(), hCurrent )) != NULL)
|
|
{
|
|
p_oTree->SetItemData( hFather, 0 );
|
|
if ( (hSelected != NULL) && (dwSelectedData == 0) && (hNewSelected == NULL ) )
|
|
if (cstrSelectedText.CompareNoCase( p_oOwner->GetName() ) == 0)
|
|
hNewSelected = hFather;
|
|
}
|
|
}
|
|
}
|
|
/*
|
|
* add item
|
|
*/
|
|
if (hFather != NULL)
|
|
{
|
|
if ((hCurrent = p_oTree->InsertItem( p_oPO->GetName(), hFather )) != NULL)
|
|
{
|
|
p_oTree->SetItemData( hCurrent, (DWORD) p_oPO );
|
|
if ( (DWORD) p_oPO == dwSelectedData )
|
|
hNewSelected = hCurrent;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
p_oTree->SelectItem( hNewSelected );
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : set current selected item in tree of PO
|
|
_p_oPO -> PO object
|
|
_p_oActor -> actor object
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void CPODlgList::fn_vSetCurrentItem( EditorPO *_p_oPO, CPA_BaseObject *_p_oActor )
|
|
{
|
|
CTreeCtrl *p_oTree = (CTreeCtrl *) GetDlgItem( IDC_TREE_PO );
|
|
HTREEITEM hItem = NULL;
|
|
|
|
if (_p_oActor)
|
|
{
|
|
CPA_BaseObject *p_oOwner;
|
|
if
|
|
(
|
|
( (hItem = m_hObjectTable) != NULL )
|
|
&& ( ( p_oOwner = _p_oActor->GetOwner() ) != NULL )
|
|
&& ( ( p_oOwner = p_oOwner->GetOwner() ) != NULL )
|
|
)
|
|
{
|
|
hItem = fn_hSearchTreeChild( p_oTree, hItem, p_oOwner->GetName() );
|
|
}
|
|
}
|
|
else if (_p_oPO)
|
|
{
|
|
if ( (hItem = fn_hGetPOParentItem( p_oTree, _p_oPO )) != NULL)
|
|
{
|
|
hItem = fn_hSearchTreeChild( p_oTree, hItem, (DWORD) _p_oPO );
|
|
}
|
|
}
|
|
|
|
p_oTree->SelectItem( hItem );
|
|
|
|
}
|
|
|
|
/*
|
|
=======================================================================================
|
|
CPODlgList message handlers
|
|
=======================================================================================
|
|
*/
|
|
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : WM_SIZE
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void CPODlgList::OnSize(UINT nType, int cx, int cy)
|
|
{
|
|
CFormView::OnSize(nType, cx, cy);
|
|
|
|
CTreeCtrl *p_oTree = (CTreeCtrl *) GetDlgItem( IDC_TREE_PO );
|
|
if (p_oTree)
|
|
{
|
|
RECT stRect;
|
|
stRect.left = stRect.top = 5;
|
|
stRect.right = cx - 10;
|
|
stRect.bottom = cy - 10;
|
|
p_oTree->MoveWindow( &stRect );
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : TVN_SELCHANGED on IDC_TREE_PO
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void CPODlgList::OnSelchangedTreePos(NMHDR* pNMHDR, LRESULT* pResult)
|
|
{
|
|
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
|
|
HTREEITEM hItem = pNMTreeView->itemNew.hItem;
|
|
CTreeCtrl *p_oTree = (CTreeCtrl *) GetDlgItem( IDC_TREE_PO );
|
|
EditorPO *p_oPO;
|
|
|
|
if (p_oTree)
|
|
{
|
|
if (hItem)
|
|
p_oPO = (EditorPO *) p_oTree->GetItemData( hItem );
|
|
else
|
|
p_oPO = NULL;
|
|
m_p_oParentDLL->fn_vDisplayPOInfo( p_oPO );
|
|
}
|
|
|
|
*pResult = 0;
|
|
}
|