/*
 *=============================================================================
 *
 *  Filename:			AnimView.cpp
 *  Version:            1.0
 *  Date:				11/03/97
 *  Author:             Vincent Lhullier
 *
 *  Description:		view box to display list of animations
 *						and control to display animation
 *						functions for saving animation in binary format
 *===========================================================================
 */
//#undef DEBUG
#include "stdafx.h"
//#define DEBUG

#include <io.h>

#include "ACP_Base.h"
#include "ITF.h"
#include "DPT.h"
#define D_State_Define
#define D_ObjsTbls_Define
#define D_ZdxStuff_StructureDefine
//#include "DNM.h"
#include "incGAM.h"
#undef D_ZdxStuff_StructureDefine
#undef D_ObjsTbls_Define
#undef D_State_Define

#include "TFA.h"
#include "TAN.h"

#include "animview.h"

//#include "animview.hh"
#include "T3D_res.h"
#include "X:\Cpa\Main\inc\_EditID.h"

#include "T3DWorld.hpp"

/*-----------------------------------------------------------------------------*/
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/*-----------------------------------------------------------------------------*/

/*
 *=============================================================================
 * saving animation in binary file
 *=============================================================================
 */
#define M_RedrawAll()					   (m_p_oT3DInterf -> GetInterface() -> fn_vUpdateAll(E_mc_JustDraw) )
#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 )
/*
 *=============================================================================
 * class AnimView
 *=============================================================================
 */
IMPLEMENT_DYNCREATE(CAnimationView, CFormView)

/*
 *-----------------------------------------------------------------------------
 *  Constructor
 *-----------------------------------------------------------------------------
 */
CAnimationView::CAnimationView(): CFormView(CAnimationView::IDD)
{
	//{{AFX_DATA_INIT(CAnimationView)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
	bInitialUpdate = TRUE;
    m_p_oFamily = NULL;
    m_p_oT3DInterf = NULL;
    m_p_oTool3DWorld = NULL;
    m_p_oCurrentAnim = NULL;
	m_p_oCurrentAction = NULL;	//Mircea Dunka 8.10.1998
}

/*
 *-----------------------------------------------------------------------------
 *  Destructor
 *-----------------------------------------------------------------------------
 */
CAnimationView::~CAnimationView()
{
	m_oBitmapPlay.DeleteObject();
	m_oBitmapStop.DeleteObject();
	m_oBitmapReverse.DeleteObject();
	m_oBitmapForward.DeleteObject();
	m_oBitmapRewind.DeleteObject();
}

/*
 *-----------------------------------------------------------------------------
 *  Data exchange
 *-----------------------------------------------------------------------------
 */
void CAnimationView::DoDataExchange(CDataExchange* pDX)
{
	CFormView::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CAnimationView)
		// NOTE: the ClassWizard will add DDX and DDV calls here
	//}}AFX_DATA_MAP
}


/*
 *-----------------------------------------------------------------------------
 *  Message map
 *-----------------------------------------------------------------------------
 */
BEGIN_MESSAGE_MAP(CAnimationView, CFormView)
	//{{AFX_MSG_MAP(CAnimationView)
	ON_WM_SHOWWINDOW()
	ON_WM_SIZE()
	ON_LBN_SELCHANGE(IDC_LIST_ANIMS, OnSelchangeListAnims)
	ON_LBN_SELCHANGE(IDC_LIST_ACTIONS, OnSelchangeListActions)//Mircea Dunka 6.10.98
	ON_BN_CLICKED(IDC_BUTTON_LOAD, OnButtonLoad)
	ON_BN_CLICKED(IDC_BUTTON_PLAY, OnButtonPlay)
	ON_BN_CLICKED(IDC_BT_REINIT, OnButtonReinit)
	ON_WM_TIMER()
	ON_WM_HSCROLL()
	ON_BN_CLICKED(IDC_BT_ANIM, OnButtonAnim)
	ON_BN_CLICKED(IDC_BT_ACTION, OnButtonAction)
	ON_BN_CLICKED(IDC_BUTTON_STOP, OnButtonStop)
	ON_BN_CLICKED(IDC_BUTTON_FORWARD, OnButtonForward)
	ON_BN_CLICKED(IDC_BUTTON_REVERSE, OnButtonReverse)
	ON_BN_CLICKED(IDC_BUTTON_REWIND, OnButtonRewind)
	ON_BN_CLICKED(IDC_BUTTON_HELP, OnButtonHelp)
	ON_LBN_DBLCLK(IDC_LIST_ANIMS, OnDblclkListAnims)
	ON_WM_MEASUREITEM()
	ON_WM_DRAWITEM()
	ON_WM_HELPINFO()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/*
 *=============================================================================
 * CAnimationView specific functions
 *=============================================================================
 */

void CAnimationView::mfn_vInitDialog( CPA_Family *_p_oCurrentFamily, CPA_Animation *p_oAnimation /*=NULL*/, unsigned short _uwFrame /*=0*/)
{
    CListBox *pLB = (CListBox *) GetDlgItem( IDC_LIST_ANIMS );
//	unsigned char ucFrameRate;

    m_p_oFamily = _p_oCurrentFamily;
    fn_vFillAnimList();
//28.09.98 Mircea Dunka	
	mfn_vFillActionList(); //aded action list
	m_p_oCurrentAnim = p_oAnimation;
//Stefan Dumitrean 28-05-98
	if( !m_p_oCurrentAnim )
	{
		POSITION pos = m_p_oFamily->m_oListOfAnimations.GetHeadPosition();
		while( pos )
		{
			p_oAnimation = m_p_oFamily->m_oListOfAnimations.GetNext(pos);
			if( p_oAnimation && p_oAnimation->fn_bIsAvailable() )
			{
				if( ! m_p_oCurrentAnim )
					m_p_oCurrentAnim = p_oAnimation;
				else
					if( p_oAnimation->GetName() < m_p_oCurrentAnim->GetName() )
						m_p_oCurrentAnim = p_oAnimation;
			}
					
		}
	}
//End Stefan Dumitrean 28-05-98
//end Mircea Dunka - optimization


    if( m_p_oCurrentAnim )
    {
        int iIndex = pLB -> FindStringExact( -1, m_p_oCurrentAnim -> GetName() );
        if( iIndex != LB_ERR )
            pLB -> SetCurSel( iIndex );
            //pLB -> SetTopIndex( iIndex ); Mircea Dunka - SetCurSel already did this
        else
            pLB -> SetCurSel( -1 );

//Stefan Dumitrean 2-06-98
//		ucFrameRate = ((struct tdstAnim3d_*)_p_oAnimation -> GetData() ) -> ucFrameRate;
//		m_uiElapseTime = ucFrameRate ? 1000 / ucFrameRate : 1;
//End Stefan Dumitrean 2-06-98
    }
    OnSelchangeListAnims();
}

/*-----------------------------------------------------------------------------
 *  Description :
 *---------------------------------------------------------------------------*/
void CAnimationView::fn_vBeginAnim( unsigned short _uwFrame)
{
    ASSERT( m_p_oCurrentAnim -> GetData() );

	// begin a new anim
	// so we have to change the frame element3d array
	//-----------------------
	//29.09.98 Mircea Dunka - sometimes it hangs here so I make a little test
	if(m_p_oTool3DWorld -> m_p_oRootFromAnim)
		fn_v3dDataSetFlagModifState(M_GetMSHandle( m_p_oTool3DWorld -> m_p_oRootFromAnim -> GetStruct(), 3dData), TRUE);
	else
		return;
	//end Mircea Dunka

	//	p_st3dData = M_GetMSHandle( m_p_oTool3DWorld -> m_p_oRootFromAnim -> GetStruct(), 3dData);

	PLA_fn_bDoFirstInitOfAnimPlayerForCharacter(m_p_oTool3DWorld->m_p_oRootFromAnim->GetStruct(), (struct tdstAnim3d_*) m_p_oCurrentAnim -> GetData());

    CScrollBar *pSC = (CScrollBar *) GetDlgItem( IDC_SCROLLBAR_FRAME );
    _uwFrame %= ((struct tdstAnim3d_*)m_p_oCurrentAnim -> GetData()) -> uwNumberOfFrames;

    m_p_oTool3DWorld -> mfn_vUpdateHierarchyFromAnim( (struct tdstAnim3d_*)m_p_oCurrentAnim -> GetData(), _uwFrame );
    M_RedrawAll();

	pSC->EnableWindow(TRUE);
	GetDlgItem( IDC_STATIC_CURRENTFRAME )->EnableWindow( TRUE );
	//Mircea Dunka 20.10.98
	GetDlgItem( IDC_STATIC_CURRENTANIMATION )->EnableWindow( TRUE );
	GetDlgItem( IDC_STATIC_CURRENTANIMATION )->SetWindowText( "1" );
//	m_uiTotalNumberOfFrames = m_uiTotalNumberOfFrames ? 1 : m_uiTotalNumberOfFrames;
	pSC->SetScrollRange( 0, m_uiTotalNumberOfFrames - 1);
	//end Mircea Dunka

	GetDlgItem( IDC_BUTTON_PLAY )->EnableWindow( TRUE );
    pSC->SetScrollPos( _uwFrame );
    pSC->Invalidate();
	GetDlgItem( IDC_STATIC_CURRENTFRAME )->SetWindowText( "1" );
    m_bPlay = FALSE;
}

/*-----------------------------------------------------------------------------
 *  Description :
 *---------------------------------------------------------------------------*/
void CAnimationView::fn_vShowFrame(unsigned short _uwFrame)
{
	CPA_Animation* p_oAnimation;
	int uwNumberOfPrevFrames = 0;
	int iCurrentAnimation = 0;
	char szValue[10];

	if(m_bActionPlay)
	{
		POSITION pos = m_p_oCurrentAction->m_oListOfStates.GetHeadPosition();
		while( pos )
		{
			iCurrentAnimation++;
			p_oAnimation = ((CPA_State*)(m_p_oCurrentAction->m_oListOfStates.GetNext(pos)))->mfn_p_oGetAnimation();
			//count the nb. of frames
			tdstAnim3d_* p_stAnim3d = (struct tdstAnim3d_*)p_oAnimation -> GetData();
			//uwNumberOfFrames += ((struct tdstAnim3d_*)p_oAnimation -> GetData()) -> uwNumberOfFrames; 
			if(p_stAnim3d->uwNumberOfFrames + uwNumberOfPrevFrames > _uwFrame)
				break;
			else
				 uwNumberOfPrevFrames += p_stAnim3d->uwNumberOfFrames;
		}
//		if(uwNumberOfFrames < _uwFrame) 
//		{
		//the current animation was found
		_uwFrame -= uwNumberOfPrevFrames;

		if(m_p_oCurrentAnim != p_oAnimation)
		{
			//next (prev) animation 
			m_p_oCurrentAnim = p_oAnimation;
			// begin a new anim
			// so we have to change the frame element3d array
			//-----------------------
			//29.09.98 Mircea Dunka - sometimes it hangs here so I make a little test
			if(m_p_oTool3DWorld -> m_p_oRootFromAnim)
				fn_v3dDataSetFlagModifState(M_GetMSHandle( m_p_oTool3DWorld -> m_p_oRootFromAnim -> GetStruct(), 3dData), TRUE);
			else
				return;
			//end Mircea Dunka
			PLA_fn_bDoFirstInitOfAnimPlayerForCharacter(m_p_oTool3DWorld->m_p_oRootFromAnim->GetStruct(), (struct tdstAnim3d_*) m_p_oCurrentAnim -> GetData());
		    m_p_oTool3DWorld -> mfn_vUpdateHierarchyFromAnim( (struct tdstAnim3d_*)m_p_oCurrentAnim -> GetData(), _uwFrame );
		    M_RedrawAll();
			itoa( iCurrentAnimation, szValue, 10);
			GetDlgItem( IDC_STATIC_CURRENTANIMATION )->SetWindowText( szValue );
			return;
    	}
	}

	itoa( iCurrentAnimation, szValue, 10);
	GetDlgItem( IDC_STATIC_CURRENTANIMATION )->SetWindowText( szValue );

	if( m_bPlay )
        m_p_oTool3DWorld -> mfn_vPlayAnim( (struct tdstAnim3d_*)m_p_oCurrentAnim -> GetData(), _uwFrame );
    else
        m_p_oTool3DWorld -> mfn_vUpdateHierarchyFromAnim( (struct tdstAnim3d_*)m_p_oCurrentAnim -> GetData(), _uwFrame );

    M_RedrawAll();
}

/*
 *-----------------------------------------------------------------------------
 *  first initialisation
 *-----------------------------------------------------------------------------
 */
void CAnimationView::m_fn_vEnableControl( BOOL _bEnable )
{
    GetDlgItem( IDC_BT_REINIT )->EnableWindow( _bEnable );
	GetDlgItem( IDC_BUTTON_LOAD )->EnableWindow( _bEnable );
	GetDlgItem( IDC_BT_ACTION )->EnableWindow( _bEnable );
	GetDlgItem( IDC_BT_ANIM )->EnableWindow( _bEnable );
	GetDlgItem( IDC_LIST_ACTIONS )->EnableWindow( _bEnable );
	GetDlgItem( IDC_LIST_ANIMS )->EnableWindow( _bEnable );
	GetDlgItem( IDC_SCROLLBAR_FRAME )->EnableWindow( _bEnable );
	GetDlgItem( IDC_SLIDER )->EnableWindow( _bEnable );
//Stefan Dumitrean 28-05-98
	m_p_oFamilySelDialog->EnableWindow( _bEnable );
//End Stefan Dumitrean 28-05-98

}

/*
 *-----------------------------------------------------------------------------
 *  stop playing animation
 *-----------------------------------------------------------------------------
 */
void CAnimationView::m_fn_vStopAnim( void )
{
	if (m_bPlay)
	{
        CScrollBar *pSC = (CScrollBar *) GetDlgItem( IDC_SCROLLBAR_FRAME );

		KillTimer( m_uiPlayTimer );
		m_bPlay = FALSE;
		m_fn_vEnableControl( TRUE );
        fn_vShowFrame( pSC->GetScrollPos() );
	}
}

/*
 *=============================================================================
 * CAnimationView diagnostics
 *=============================================================================
 */
#ifdef _DEBUG
void CAnimationView::AssertValid() const
{
	CFormView::AssertValid();
}

void CAnimationView::Dump(CDumpContext& dc) const
{
	CFormView::Dump(dc);
}
#endif //_DEBUG

/*
 *=============================================================================
 * CAnimationView messages handlers
 *=============================================================================
 */

/*
 *-----------------------------------------------------------------------------
 *  first initialisation
 *-----------------------------------------------------------------------------
 */
void CAnimationView::OnInitialUpdate()
{
	CFormView::OnInitialUpdate();

	if (!bInitialUpdate)
		return;

	bInitialUpdate = FALSE;

	/*
	 * load bitmap and set bitmap in play button
	 */
	m_oBitmapRewind.LoadBitmap( IDB_BITMAP_REWIND );
	m_oBitmapReverse.LoadBitmap( IDB_BITMAP_REVERSE );
	m_oBitmapStop.LoadBitmap( IDB_BITMAP_STOP );
	m_oBitmapPlay.LoadBitmap( IDB_BITMAP_PLAY );
	m_oBitmapForward.LoadBitmap( IDB_BITMAP_FORWARD );

	((CButton *) GetDlgItem( IDC_BUTTON_REWIND ))->SetBitmap( HBITMAP(m_oBitmapRewind) );
	((CButton *) GetDlgItem( IDC_BUTTON_REVERSE ))->SetBitmap( HBITMAP(m_oBitmapReverse) );
	((CButton *) GetDlgItem( IDC_BUTTON_STOP ))->SetBitmap( HBITMAP(m_oBitmapStop) );
	((CButton *) GetDlgItem( IDC_BUTTON_PLAY ))->SetBitmap( HBITMAP(m_oBitmapPlay) );
	((CButton *) GetDlgItem( IDC_BUTTON_FORWARD ))->SetBitmap( HBITMAP(m_oBitmapForward) );

    m_bAllAnims = TRUE;
	m_bAllActions = TRUE;		//Mircea Dunka 15.10.1998
	m_bActionPlay = FALSE;		//Mircea Dunka 12.10.1998

	//Mircea Dunka
    if(m_bActionPlay)
		GetDlgItem( IDC_BT_ANIM ) -> SetWindowText( m_bAllActions ? "Show Loaded Actions" : "Show All Actions");
	else
		GetDlgItem( IDC_BT_ANIM ) -> SetWindowText( m_bAllAnims ? "Show Loaded Animations" : "Show All Animations");
	GetDlgItem( IDC_BT_ACTION )->SetWindowText( m_bActionPlay ? "Show Family Animation" : "Show Action Animation");
	//end Mircea Dunka

	/*
	 * Init data for animation play
	 */
    m_uiElapseTime = 1;
	m_bPlay = FALSE;
}

/*
 *-----------------------------------------------------------------------------
 *  WM_SHOWWINDOW
 *-----------------------------------------------------------------------------
 */
void CAnimationView::OnShowWindow(BOOL bShow, UINT nStatus)
{
	CFormView::OnShowWindow(bShow, nStatus);
    OnInitialUpdate();
}

/*
 *-----------------------------------------------------------------------------
 *  WM_SIZE
 *-----------------------------------------------------------------------------
 */
void CAnimationView::OnSize(UINT nType, int cx, int cy)
{
	CFormView::OnSize(nType, cx, cy);
	/*
	if (!bInitialUpdate)
	{
        GetDlgItem( IDC_BT_ANIM )->MoveWindow( 5, 5, 150, 15 );
        GetDlgItem( IDC_LIST_ANIMS )->MoveWindow( 5, 23, 150, cy - 26 );
	}
	*/
	if( GetDlgItem( IDC_LIST_ANIMS ) )
	{
        CRect oRectDlg, oRectList;

        M_GetClientRect( this, &oRectDlg );
        M_GetClientRectId( IDC_LIST_ANIMS, &oRectList );

		oRectList . bottom = oRectDlg . bottom - 5;

        M_SetClientRectId( IDC_LIST_ANIMS, &oRectList );
	}
	//Mircea Dunka 5.10.1998
	if( GetDlgItem( IDC_LIST_ACTIONS ) )
	{
        CRect oRectDlg, oRectList;

        M_GetClientRect( this, &oRectDlg );
        M_GetClientRectId( IDC_LIST_ACTIONS, &oRectList );

		oRectList . bottom = oRectDlg . bottom - 5;

        M_SetClientRectId( IDC_LIST_ACTIONS, &oRectList );
	}
	//end Mircea Dunka
}

/*
 *-----------------------------------------------------------------------------
 *  BN_CLICKED on IDC_BT_ANIM
 *  change Animations List content
 *-----------------------------------------------------------------------------
 */

//Mircea Dunka 16.10.1998
void CAnimationView::OnButtonAnim()
{
	if(m_bActionPlay)
	{
		m_bAllActions = !m_bAllActions;
		GetDlgItem( IDC_BT_ANIM ) -> SetWindowText( m_bAllActions ? "Show Loaded Actions" : "Show All Actions");
		GetDlgItem( IDC_LIST_ACTIONS ) -> SetFocus();
		mfn_vFillActionList();
	}
	else
	{
		m_bAllAnims = !m_bAllAnims;
		GetDlgItem( IDC_BT_ANIM ) -> SetWindowText( m_bAllAnims ? "Show Loaded Animations" : "Show All Animations");
		GetDlgItem( IDC_LIST_ANIMS ) -> SetFocus();
		fn_vFillAnimList();
	}
}
//end Mircea Dunka

/*
 *-----------------------------------------------------------------------------
 *  LBN_SELCHANGE on IDC_LIST_FAMILIES
 *  display in list of animation list of family animations
 *-----------------------------------------------------------------------------
 */
void CAnimationView::fn_vFillAnimList()
{
	CListBox		*p_oAnimLB = (CListBox *) GetDlgItem( IDC_LIST_ANIMS );
	POSITION		xPos;
	CPA_Animation	*p_oAnim;

	/*
	 * empty the animation list box
	 */
    p_oAnimLB -> ResetContent();

    xPos = m_p_oFamily->m_oListOfAnimations.GetHeadPosition();
    while( xPos )
    {
        p_oAnim = m_p_oFamily->m_oListOfAnimations.GetNext( xPos );
        if( m_bAllAnims || p_oAnim -> fn_bIsAvailable() )
        {
            int iIndex = p_oAnimLB->AddString( p_oAnim->GetName() );
            if ( iIndex != LB_ERR )
            {
                p_oAnimLB->SetItemData( iIndex, (long) p_oAnim );
            }
        }
    }
}


//Mircea Dunka 27.09.98 - actions
BOOL fn_bIsActionAvailable(CPA_Action* p_oAction)
{
	CPA_Animation* p_oAnimation;
	if( !p_oAction )
		return FALSE;
	POSITION pos = p_oAction->m_oListOfStates.GetHeadPosition();
	if(!pos)
		return FALSE;
	while(pos)
	{
		p_oAnimation = ((CPA_State*)(p_oAction->m_oListOfStates.GetNext(pos)))->mfn_p_oGetAnimation();
		if(!p_oAnimation || !p_oAnimation->fn_bIsAvailable() )
			return FALSE;
	}
	return TRUE;
}


/*
 *-----------------------------------------------------------------------------
 *  LBN_SELCHANGE on IDC_LIST_FAMILIES
 *  display in list of action list of family animations
 *-----------------------------------------------------------------------------
 */
void CAnimationView::mfn_vFillActionList()
{
	CListBox		*p_oActionLB = (CListBox *) GetDlgItem( IDC_LIST_ACTIONS );
	POSITION		xPos;
	CPA_Action		*p_oAction;

	/*
	 * empty action list box
	 */
    p_oActionLB -> ResetContent();

    xPos = m_p_oFamily->m_oListOfActions.GetHeadPosition();
    while( xPos )
    {
        p_oAction = m_p_oFamily->m_oListOfActions.GetNext( xPos );
 
		if( m_bAllActions || fn_bIsActionAvailable(p_oAction))
        {
			int iIndex = p_oActionLB->AddString( p_oAction->GetName() );
			if ( iIndex != LB_ERR )
			{
				p_oActionLB->SetItemData( iIndex, (long) p_oAction );
			}
		}
    }
}
//end Mircea Dunka

/*
 *-----------------------------------------------------------------------------
 *  LBN_SELCHANGE on IDC_LIST_FAMILIES
 *  display in list of animation list of family animations
 *-----------------------------------------------------------------------------
 */
void CAnimationView::OnSelchangeListAnims()
{
    CListBox    *p_oLB = (CListBox *) GetDlgItem( IDC_LIST_ANIMS );
    int         iIndex = p_oLB->GetCurSel();
    BOOL        bLoad = FALSE;

    m_p_oCurrentAnim = NULL;

	if (iIndex != LB_ERR)
	{
		m_bActionPlay = FALSE;
		m_p_oCurrentAnim = (CPA_Animation *) p_oLB->GetItemData( iIndex );
        if( m_p_oCurrentAnim -> fn_bIsAvailable() )
        {
            bLoad = TRUE;
        }
	}

    if ( bLoad )
    {
		char szValue[10];
		unsigned char ucFrameRate;
		CSliderCtrl *pSlider = (CSliderCtrl*)GetDlgItem( IDC_SLIDER );
//ANNECY CT 20/02/98{
        //GetDlgItem( IDC_BUTTON_LOAD )->ShowWindow( FALSE );
		GetDlgItem( IDC_BUTTON_LOAD )->SetWindowText("ReLoad");
//ENDANNECY CT}
        itoa( ((struct tdstAnim3d_*)m_p_oCurrentAnim -> GetData()) -> uwNumberOfFrames, szValue, 10);
		GetDlgItem( IDC_EDIT_FRAME )->SetWindowText( szValue );
        itoa( ((struct tdstAnim3d_*)m_p_oCurrentAnim -> GetData()) -> ucMaxNumberOfElements, szValue, 10);
		GetDlgItem( IDC_EDIT_CHANNEL )->SetWindowText( szValue );
//Mircea Dunka
		itoa(1, szValue, 10);
		GetDlgItem( IDC_EDIT_ANIMATIONS )->SetWindowText( szValue );
		GetDlgItem( IDC_EDIT_SELECTION_STATUS )->SetWindowText("The animation is O.K.");
		m_uiTotalNumberOfFrames = ((struct tdstAnim3d_*)m_p_oCurrentAnim -> GetData()) -> uwNumberOfFrames;
//end Mircea Dunka
        m_uwInitFrame = 0;
        fn_vBeginAnim( m_uwInitFrame );
		ucFrameRate = ((struct tdstAnim3d_*)m_p_oCurrentAnim -> GetData() ) -> ucFrameRate;
		m_uiElapseTime = ucFrameRate ? 1000 / ucFrameRate : 1;
		itoa( ucFrameRate, szValue, 10 );
		GetDlgItem( IDC_EDIT_SPEED ) -> SetWindowText( szValue );
		GetDlgItem( IDC_STATIC_CURRENTSPEED ) -> SetWindowText( szValue );
		pSlider -> SetRange( 1, 255 );
		pSlider -> SetPos( ucFrameRate );
    }
    else
    {
//ANNECY CT 20/02/98{
		GetDlgItem( IDC_BUTTON_LOAD )->SetWindowText("Load");
        //GetDlgItem( IDC_BUTTON_LOAD )->ShowWindow( TRUE );
//ENDANNECY CT}
		GetDlgItem( IDC_EDIT_FRAME )->SetWindowText( "" );
//Mircea Dunka		
		GetDlgItem( IDC_EDIT_ANIMATIONS )->SetWindowText( "" );
		GetDlgItem( IDC_EDIT_SELECTION_STATUS )->SetWindowText("The animation isn't loaded");
//end Mircea Dunka
		GetDlgItem( IDC_EDIT_CHANNEL )->SetWindowText( "" );
		GetDlgItem( IDC_EDIT_SPEED ) -> SetWindowText( "" );
		GetDlgItem( IDC_STATIC_CURRENTSPEED ) -> SetWindowText( "" );
    }

    GetDlgItem( IDC_BUTTON_REWIND )->EnableWindow( bLoad );
    GetDlgItem( IDC_BUTTON_REVERSE )->EnableWindow( bLoad );
    GetDlgItem( IDC_BUTTON_STOP )->EnableWindow( bLoad );
    GetDlgItem( IDC_BUTTON_PLAY )->EnableWindow( bLoad );
    GetDlgItem( IDC_BUTTON_FORWARD )->EnableWindow( bLoad );
    GetDlgItem( IDC_STATIC_CURRENTFRAME )->EnableWindow( bLoad );
	GetDlgItem( IDC_STATIC_CURRENTANIMATION )->EnableWindow( bLoad );
    GetDlgItem( IDC_BT_REINIT )->EnableWindow( bLoad );
    GetDlgItem( IDC_SLIDER )->EnableWindow( bLoad );
}

//Mircea Dunka
/*
 *-----------------------------------------------------------------------------
 *  LBN_SELCHANGE on IDC_LIST_ACTIONS
 *  display in list of animation list of family animations
 *-----------------------------------------------------------------------------
 */
void CAnimationView::OnSelchangeListActions()
{
    BOOL        bLoad = TRUE;
	BOOL		bFirstAnimation = TRUE;
	WORD		uwNumberOfAvailableAnimations = 0;
	WORD		uwMaxNumberOfElements = 0;
	WORD		uwFrameRate = 0;
	char		szValue[10];

	m_p_oCurrentAction = NULL;
	m_p_oCurrentAnim = NULL;
    m_uiTotalNumberOfFrames = 0;
	m_uiNumberOfAnimations = 0;
	
	CListBox *p_oAnimLB = (CListBox *) GetDlgItem( IDC_LIST_ANIMS );	
    CListBox    *p_oActionLB = (CListBox *) GetDlgItem( IDC_LIST_ACTIONS );
    int         iIndex = p_oActionLB->GetCurSel();
	
	if (iIndex != LB_ERR)
	{
		m_bActionPlay = TRUE;		//Mircea Dunka 12.10.1998
		GetDlgItem( IDC_BT_ANIM ) -> SetWindowText( m_bAllActions ? "Show Loaded Actions" : "Show All Actions");
		GetDlgItem( IDC_BT_ACTION )->SetWindowText("Show Family Animation");
		//get the current action (the selected one)
		m_p_oCurrentAction = (CPA_Action *) p_oActionLB->GetItemData( iIndex );
		//empty the animation list.
		p_oAnimLB -> ResetContent();
		//and refill it with the current action's animations
		CPA_Animation *p_oAnimation;
		POSITION pos = m_p_oCurrentAction->m_oListOfStates.GetHeadPosition();
		if(!pos)
			bLoad = FALSE;
		while( pos )
		{
			p_oAnimation = ((CPA_State*)(m_p_oCurrentAction->m_oListOfStates.GetNext(pos)))->mfn_p_oGetAnimation();
			m_uiNumberOfAnimations += 1;
			if( p_oAnimation && p_oAnimation->fn_bIsAvailable() )
			{
				//get the current animation
				if(bFirstAnimation)
				{
					m_p_oCurrentAnim = p_oAnimation;
					bFirstAnimation = FALSE;
					//see the "mfn_p_oGetDefaultState" member from CPA_Action
				}
				//refill the animation list.
				iIndex = p_oAnimLB->AddString( p_oAnimation->GetName() );
				if ( iIndex != LB_ERR )
				{
					p_oAnimLB->SetItemData( iIndex, (long)p_oAnimation );
				}

				uwNumberOfAvailableAnimations += 1;
				//count the total nb. of frames
				m_uiTotalNumberOfFrames += ((struct tdstAnim3d_*)p_oAnimation -> GetData()) -> uwNumberOfFrames; 
				//count the max nb. of channels (elements)
				if( uwMaxNumberOfElements < ((struct tdstAnim3d_*)p_oAnimation -> GetData()) -> ucMaxNumberOfElements)
					uwMaxNumberOfElements = ((struct tdstAnim3d_*)p_oAnimation -> GetData()) -> ucMaxNumberOfElements;
				//count the medium frame rate		
				uwFrameRate += ((struct tdstAnim3d_*)p_oAnimation -> GetData() ) -> ucFrameRate;
			}
			else
				bLoad = FALSE; //the current animation isn't loaded => the action isn't loaded
		}
	}
	else
		bLoad = FALSE; //no valid (complete) action (or no selection) in the list box

	//display the total nb. of animations
	itoa(m_uiNumberOfAnimations, szValue, 10);
	GetDlgItem( IDC_EDIT_ANIMATIONS )->SetWindowText( szValue );

	if(bLoad) //if the selected action is OK,
	{
		//display the total nb. of frames
		itoa(m_uiTotalNumberOfFrames, szValue, 10);
		GetDlgItem( IDC_EDIT_FRAME )->SetWindowText( szValue );

		//display the max nb. of channels (elements)
		itoa(uwMaxNumberOfElements, szValue, 10);
		GetDlgItem( IDC_EDIT_CHANNEL )->SetWindowText( szValue );
		
		//display the medium frame rate
		if(m_uiNumberOfAnimations)
			uwFrameRate = uwFrameRate/uwNumberOfAvailableAnimations;
		m_uiElapseTime = uwFrameRate ? 1000 / uwFrameRate : 1;
		itoa( uwFrameRate, szValue, 10 );
		GetDlgItem( IDC_EDIT_SPEED ) -> SetWindowText( szValue );
		GetDlgItem( IDC_STATIC_CURRENTSPEED ) -> SetWindowText( szValue );
		CSliderCtrl *pSlider = (CSliderCtrl*)GetDlgItem( IDC_SLIDER );
		pSlider -> SetRange( 1, 255 );
		pSlider -> SetPos( uwFrameRate );
		
		m_uwInitFrame = 0;
		if( !m_p_oCurrentAnim )
			return;

		fn_vBeginAnim( m_uwInitFrame );
		GetDlgItem( IDC_EDIT_SELECTION_STATUS )->SetWindowText("The action is O.K.");
	}
	else
	{
		char szBuffer[255];
		WORD uwMissingAnims = m_uiNumberOfAnimations - uwNumberOfAvailableAnimations;
		switch(uwMissingAnims)
		{
		case 0:	wsprintf(szBuffer, "Bad action. No anims!!!");break;
		case 1:	wsprintf(szBuffer, "Bad action. %d missing anim", uwMissingAnims);break;
		default:wsprintf(szBuffer, "Bad action. %d missing anims", uwMissingAnims);
		}
		GetDlgItem( IDC_EDIT_SELECTION_STATUS )->SetWindowText(szBuffer);
		GetDlgItem( IDC_EDIT_FRAME )->SetWindowText( "" );
		GetDlgItem( IDC_EDIT_CHANNEL )->SetWindowText( "" );
		GetDlgItem( IDC_EDIT_SPEED )-> SetWindowText( "" );
		GetDlgItem( IDC_STATIC_CURRENTSPEED ) -> SetWindowText( "" );
	}

	p_oAnimLB->SetCurSel(-1);
    GetDlgItem( IDC_BUTTON_REWIND )->EnableWindow( bLoad );
	GetDlgItem( IDC_BUTTON_REVERSE )->EnableWindow( bLoad );
    GetDlgItem( IDC_BUTTON_STOP )->EnableWindow( bLoad );
    GetDlgItem( IDC_BUTTON_PLAY )->EnableWindow( bLoad );
    GetDlgItem( IDC_BUTTON_FORWARD )->EnableWindow( bLoad );
    GetDlgItem( IDC_STATIC_CURRENTFRAME )->EnableWindow( bLoad );
	GetDlgItem( IDC_STATIC_CURRENTANIMATION )->EnableWindow( bLoad );
	GetDlgItem( IDC_BUTTON_LOAD )->EnableWindow( bLoad );
    GetDlgItem( IDC_BT_REINIT )->EnableWindow( bLoad );
    GetDlgItem( IDC_SLIDER )->EnableWindow( bLoad );
}
//end Mircea Dunka


/*
 *-----------------------------------------------------------------------------
 * BN_CLICKED on IDC_BUTTON_LOAD
 *-----------------------------------------------------------------------------
 */
void CAnimationView::OnButtonLoad()
{
	if(!m_p_oCurrentAnim)
		return;
	HCURSOR     hWaitCursor;
	HCURSOR     hOldCursor;

	hWaitCursor = AfxGetApp()->LoadStandardCursor( IDC_WAIT );
	hOldCursor = SetCursor( hWaitCursor );
	
//Mircea Dunka 11.10.98
	GetDlgItem( IDC_EDIT_SELECTION_STATUS )->SetWindowText("Loading ...");
	//GetDlgItem( IDC_BUTTON_LOAD )->SetWindowText("Loading ...");
    GetDlgItem( IDC_BUTTON_LOAD )->EnableWindow( FALSE );
    m_p_oCurrentAnim -> GetEditor() -> fn_bLoadBaseObject( m_p_oCurrentAnim );

	//ANNECY CT 20/02/98{
	GetDlgItem( IDC_BUTTON_LOAD )->SetWindowText("ReLoad");
	//ENDANNECY CT}
    GetDlgItem( IDC_BUTTON_LOAD )->EnableWindow( TRUE );
	GetDlgItem( IDC_EDIT_SELECTION_STATUS )->SetWindowText("Animation loaded");
//end Mircea Dunka 11.10.98

	SetCursor( hOldCursor );

    GetDlgItem( IDC_LIST_ANIMS )->Invalidate();
    OnSelchangeListAnims();
}


//Mircea Dunka
/*
 *-----------------------------------------------------------------------------
 * BN_CLICKED on IDC_BT_ACTION //Mircea Dunka 8.10.1998
 *-----------------------------------------------------------------------------
 */
void CAnimationView::OnButtonAction()
{
	CString szListingType;
	GetDlgItem( IDC_BT_ACTION )->GetWindowText(szListingType);
	if(szListingType.CompareNoCase("show family animation") == 0)
	{
		//fill the animation list with all the animations
		fn_vFillAnimList();
		m_bActionPlay = FALSE;		//Mircea Dunka 12.10.1998
		GetDlgItem( IDC_BT_ACTION )->SetWindowText("Show Action Animation");
		GetDlgItem( IDC_BT_ANIM ) -> SetWindowText( m_bAllAnims ? "Show Loaded Animations" : "Show All Animations");

		((CListBox*)GetDlgItem( IDC_LIST_ACTIONS )) -> SetCurSel(-1);
		((CListBox*)GetDlgItem( IDC_LIST_ANIMS )) -> SetCurSel(0);
		GetDlgItem( IDC_LIST_ANIMS ) -> SetFocus();
	}
	else
	{
		//fill the animation list with the animations of the current action
		//if no action is selected, a message box will appear
		CListBox *p_oActionLB = (CListBox *) GetDlgItem( IDC_LIST_ACTIONS );
		int iIndex = p_oActionLB->GetCurSel();
		if (iIndex == LB_ERR)
			if( (iIndex =  p_oActionLB -> SetCurSel(0)) == LB_ERR) //check again, to see if there are any actions
			{
				GetDlgItem( IDC_EDIT_SELECTION_STATUS )->SetWindowText("The family doesn't contain any action");
				return;
			}

		m_p_oCurrentAction = (CPA_Action *) p_oActionLB->GetItemData( iIndex );
		//!!!
		//empty the animation list.
		//!!!
		CListBox *p_oAnimLB = (CListBox *) GetDlgItem( IDC_LIST_ANIMS );
		p_oAnimLB -> ResetContent();
		CPA_Animation *p_oAnimation;
		POSITION pos = m_p_oCurrentAction->m_oListOfStates.GetHeadPosition();
		while( pos )
		{
			p_oAnimation = ((CPA_State*)(m_p_oCurrentAction->m_oListOfStates.GetNext(pos)))->mfn_p_oGetAnimation();
			if( p_oAnimation && p_oAnimation->fn_bIsAvailable() )
			{
				iIndex = p_oAnimLB->AddString( p_oAnimation->GetName() );
				if ( iIndex != LB_ERR )
					p_oAnimLB->SetItemData( iIndex, (long)p_oAnimation );
			}
		}
		
		m_bActionPlay = TRUE;		//Mircea Dunka 12.10.1998
		p_oAnimLB -> SetCurSel(0);
		GetDlgItem( IDC_BT_ACTION )->SetWindowText("Show Family Animation");
		GetDlgItem( IDC_BT_ANIM ) -> SetWindowText( m_bAllActions ? "Show Loaded Actions" : "Show All Actions");
		GetDlgItem( IDC_LIST_ANIMS ) -> SetFocus();
	}
}
//end Mircea Dunka


/*
 *-----------------------------------------------------------------------------
 * LBN_DBLCLK on IDC_LIST_ANIMS
 *-----------------------------------------------------------------------------
 */
void CAnimationView::OnDblclkListAnims()
{
	OnButtonLoad();
}

/*
 *-----------------------------------------------------------------------------
 * BN_CLICKED on IDC_BUTTON_REWIND
 *-----------------------------------------------------------------------------
 */
void CAnimationView::OnButtonRewind()
{
	OnHScroll( SB_LEFT, 0, (CScrollBar *) GetDlgItem( IDC_SCROLLBAR_FRAME ) );
}

/*
 *-----------------------------------------------------------------------------
 * BN_CLICKED on IDC_BUTTON_REVERSE
 *-----------------------------------------------------------------------------
 */
void CAnimationView::OnButtonReverse()
{
	m_bReverse = TRUE;
	//Mircea Dunka 19.10.98
	if (!m_bPlay &&	(m_uiTotalNumberOfFrames > 1))
	//end Mircea Dunka
	{
		m_bPlay = TRUE;
		m_fn_vEnableControl( FALSE );
		m_uiPlayTimer = SetTimer( 1, m_uiElapseTime, NULL );
	}
}

/*
 *-----------------------------------------------------------------------------
 * BN_CLICKED on IDC_BUTTON_STOP
 *-----------------------------------------------------------------------------
 */
void CAnimationView::OnButtonStop()
{
	m_fn_vStopAnim();
}

/*
 *-----------------------------------------------------------------------------
 * BN_CLICKED on IDC_BUTTON_PLAY
 *-----------------------------------------------------------------------------
 */
void CAnimationView::OnButtonPlay()
{
	m_bReverse = FALSE;
	//Mircea Dunka 19.10.98
	if (!m_bPlay &&	(m_uiTotalNumberOfFrames > 1))
	//end Mircea Dunka
	{
		m_bPlay = TRUE;
		m_fn_vEnableControl( FALSE );
		m_uiPlayTimer = SetTimer( 1, m_uiElapseTime, NULL );
	}
}


/*
 *-----------------------------------------------------------------------------
 * BN_CLICKED on IDC_BUTTON_FORWARD
 *-----------------------------------------------------------------------------
 */
void CAnimationView::OnButtonForward()
{
	OnHScroll( SB_RIGHT, 0, (CScrollBar *) GetDlgItem( IDC_SCROLLBAR_FRAME ) );
}

/*
 *-----------------------------------------------------------------------------
 * BN_CLICKED on IDC_BT_REINIT
 *-----------------------------------------------------------------------------
 */
void CAnimationView::OnButtonReinit()
{
	char szValue[10];
	unsigned char ucFrameRate;
	CSliderCtrl *pSlider = (CSliderCtrl*)GetDlgItem( IDC_SLIDER );

	if( m_p_oCurrentAnim && m_p_oCurrentAnim -> GetData() )
	{
		ucFrameRate = ((struct tdstAnim3d_*)m_p_oCurrentAnim -> GetData() ) -> ucFrameRate;
		m_uiElapseTime = ucFrameRate ? 1000 / ucFrameRate : 1;
		itoa( ucFrameRate, szValue, 10 );
		GetDlgItem( IDC_EDIT_SPEED ) -> SetWindowText( szValue );
		GetDlgItem( IDC_STATIC_CURRENTSPEED ) -> SetWindowText( szValue );
		pSlider -> SetRange( 1, 255 );
		pSlider -> SetPos( ucFrameRate );
		if( m_bPlay )
		{
			KillTimer( m_uiPlayTimer );
			m_uiPlayTimer = SetTimer( 1, m_uiElapseTime, NULL );
		}
	}
}

/*
 *-----------------------------------------------------------------------------
 * WM_TIMER
 *-----------------------------------------------------------------------------
 */
void CAnimationView::OnTimer(UINT nIDEvent)
{
	OnHScroll( m_bReverse?SB_LINELEFT:SB_LINERIGHT, 0, (CScrollBar *) GetDlgItem( IDC_SCROLLBAR_FRAME ) );
	CFormView::OnTimer(nIDEvent);
}


/*
 *-----------------------------------------------------------------------------
 * WM_HSCROLL
 *-----------------------------------------------------------------------------
 */
void CAnimationView::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
	int		iCurValue;
	int		iNewValue;
	int     iMax, iMin;
	char	szValue[10];

	if( GetDlgItem( IDC_SLIDER ) == (CWnd*)pScrollBar )
	{
		iNewValue = ((CSliderCtrl*)GetDlgItem( IDC_SLIDER )) -> GetPos();
		itoa( iNewValue, szValue, 10);
		GetDlgItem( IDC_STATIC_CURRENTSPEED ) -> SetWindowText( szValue );
		m_uiElapseTime = iNewValue ? 1000 / iNewValue : 1;
		if( m_bPlay )
		{
			KillTimer( m_uiPlayTimer );
			m_uiPlayTimer = SetTimer( 1, m_uiElapseTime, NULL );
		}
	}
	else
	{
		//IDC_SCROLLBARFRAME
		iCurValue = pScrollBar->GetScrollPos();
		iNewValue = iCurValue;

		pScrollBar->GetScrollRange( &iMin, &iMax);

		switch ( nSBCode )
		{
			case SB_LEFT:
				iNewValue = iMin;
				break;
			case SB_RIGHT:
				iNewValue = iMax;
				break;
			case SB_PAGELEFT :
				iNewValue -= 4;
			case SB_LINELEFT :
				iNewValue --;
				if (iNewValue < iMin)
					iNewValue = iMax;
				break;
			case SB_PAGERIGHT :
				iNewValue += 4;
			case SB_LINERIGHT:
				iNewValue ++;
				if (iNewValue > iMax)
					iNewValue = iMin;
				break;
			case SB_THUMBPOSITION:
			case SB_THUMBTRACK:
				iNewValue = nPos;
				break;
			case SB_ENDSCROLL:
				return;
		}

		if (iNewValue != iCurValue)
		{
			pScrollBar->SetScrollPos( iNewValue );
			iNewValue = pScrollBar->GetScrollPos();
			if (iNewValue != iCurValue)
			{
				itoa( iNewValue + 1, szValue, 10);
				GetDlgItem( IDC_STATIC_CURRENTFRAME )->SetWindowText( szValue );
				fn_vShowFrame( iNewValue );
			}
		}
	}
}

/*
 *-----------------------------------------------------------------------------
 * WM_MEASUREITEM
 *-----------------------------------------------------------------------------
 */
void CAnimationView::OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct)
{
	//Mircea Dunka 5.10.98 IDC_LIST_ACTIONS added
	if ( (nIDCtl == IDC_LIST_ANIMS) || (nIDCtl == IDC_LIST_FAMILIES) || (nIDCtl == IDC_LIST_ACTIONS) )
		lpMeasureItemStruct->itemHeight = 14;
	CFormView::OnMeasureItem(nIDCtl, lpMeasureItemStruct);
}

//Mircea Dunka - Code optimization + action list drawing
/*
 *-----------------------------------------------------------------------------
 * WM_DRAWITEM
 *-----------------------------------------------------------------------------
 */
void CAnimationView::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDIS)
{

	//Mircea Dunka 5.10.98 IDC_LIST_ACTIONS added so if was changed to switch
		CDC                 *pDC = CDC::FromHandle( lpDIS->hDC );
		CListBox            *pLB = (CListBox *) GetDlgItem( nIDCtl );
		BOOL                bSelected = (lpDIS->itemState & ODS_SELECTED );
		BOOL				bLoad = TRUE;
		CFont				oBoldFont;
		CFont				*p_oOldFont = NULL;
		CPA_Animation		*p_oAnim = NULL;
		CPA_Action			*p_oAction = NULL;
		CPA_Family		    *p_oFamily = NULL;
		PLOGFONT			plf = NULL;

	switch (nIDCtl)
	{
	case  IDC_LIST_ANIMS:
		if (lpDIS->itemID == -1)
			return;
		p_oAnim = (CPA_Animation *) pLB->GetItemData( lpDIS->itemID );
		pDC->FillSolidRect( &lpDIS->rcItem, GetSysColor( COLOR_WINDOW ));

        if (p_oAnim->fn_bIsAvailable())
		{
			plf = (PLOGFONT) LocalAlloc(LPTR, sizeof(LOGFONT));
			lstrcpy(plf->lfFaceName, "MS Sans Serif");
			plf->lfWeight = FW_BOLD ;
			plf->lfHeight = 8;
			plf->lfEscapement = 0;
			oBoldFont.CreateFontIndirect(plf);
			p_oOldFont = pDC->SelectObject( &oBoldFont );
		}

		pDC->SetBkMode( TRANSPARENT);
		pDC->SetTextColor( GetSysColor( COLOR_WINDOWTEXT ) );

		pDC->DrawText( p_oAnim->GetName(), strlen(p_oAnim->GetName()), &lpDIS->rcItem, DT_SINGLELINE | DT_LEFT | DT_VCENTER );
		if (bSelected)
			pDC->InvertRect( &lpDIS->rcItem );
		if (p_oOldFont)
		{
			pDC->SelectObject( p_oOldFont );
			oBoldFont.DeleteObject();
		}
	break;
	case  IDC_LIST_ACTIONS:
		if (lpDIS->itemID == -1)
			return;
		p_oAction = (CPA_Action *) pLB->GetItemData( lpDIS->itemID );

		bLoad = fn_bIsActionAvailable(p_oAction);
		pDC->FillSolidRect( &lpDIS->rcItem, GetSysColor( COLOR_WINDOW ));
		if(bLoad)
		{
			plf = (PLOGFONT) LocalAlloc(LPTR, sizeof(LOGFONT));
			lstrcpy(plf->lfFaceName, "MS Sans Serif");
			plf->lfWeight = FW_BOLD ;
			plf->lfHeight = 8;
			plf->lfEscapement = 0;
			oBoldFont.CreateFontIndirect(plf);
			p_oOldFont = pDC->SelectObject( &oBoldFont );
		}
		pDC->SetBkMode( TRANSPARENT);
		pDC->SetTextColor( GetSysColor( COLOR_WINDOWTEXT ) );

		pDC->DrawText( p_oAction->GetName(), strlen(p_oAction->GetName()), &lpDIS->rcItem, DT_SINGLELINE | DT_LEFT | DT_VCENTER );
		if (bSelected)
			pDC->InvertRect( &lpDIS->rcItem );
		if (p_oOldFont)
		{
			pDC->SelectObject( p_oOldFont );
			oBoldFont.DeleteObject();
		}
	break;
	case IDC_LIST_FAMILIES:
    	if (lpDIS->itemID == -1)
			return;
		p_oFamily = (CPA_Family *) pLB->GetItemData( lpDIS->itemID );
		pDC->FillSolidRect( &lpDIS->rcItem, GetSysColor( COLOR_WINDOW ));

        if (p_oFamily->fn_bIsAvailable())
		{
			plf = (PLOGFONT) LocalAlloc(LPTR, sizeof(LOGFONT));
			lstrcpy(plf->lfFaceName, "MS Sans Serif");
			plf->lfWeight = FW_BOLD ;
			plf->lfHeight = 8;
			plf->lfEscapement = 0;
			oBoldFont.CreateFontIndirect(plf);
			p_oOldFont = pDC->SelectObject( &oBoldFont );
		}

		pDC->SetBkMode( TRANSPARENT);
		pDC->SetTextColor( GetSysColor( COLOR_WINDOWTEXT ) );

		pDC->DrawText( p_oFamily->GetName(), strlen(p_oFamily->GetName()), &lpDIS->rcItem, DT_SINGLELINE | DT_LEFT | DT_VCENTER );
		if (bSelected)
			pDC->InvertRect( &lpDIS->rcItem );
		if (p_oOldFont)
		{
			pDC->SelectObject( p_oOldFont );
			oBoldFont.DeleteObject();
		}
    break;
    default:
		CFormView::OnDrawItem(nIDCtl, lpDIS);
	}
}
//end Mircea Dunka

/*
 *-----------------------------------------------------------------------------
 * PreTranslate message
 *-----------------------------------------------------------------------------
 */
BOOL CAnimationView::PreTranslateMessage(MSG* pMsg)
{
    if( m_bPlay )
	{
		if (pMsg->message == WM_KEYDOWN)
		{
			switch( (int) pMsg->wParam )
			{
				case VK_HOME:
					OnButtonRewind();
					return 1;
				case VK_LEFT:
					OnButtonReverse();
					return 1;
				case VK_DOWN:
				case VK_ESCAPE:
					OnButtonStop();
					return 1;
				case VK_RIGHT:
					OnButtonPlay();
					return 1;
				case VK_END:
					OnButtonForward();
					return 1;
			}
		}
	}
	return CFormView::PreTranslateMessage(pMsg);
}

/*
 *-----------------------------------------------------------------------------
 * WM_HELPINFO
 *-----------------------------------------------------------------------------
 */
BOOL CAnimationView::OnHelpInfo(HELPINFO* pHelpInfo)
{
    /*
	UINT	uiCommand = HELP_CONTEXT;
	DWORD	dwContext = IDJ_ANIMVIEWER;
	POINT	stMousePos;
	CWnd	*p_oWnd;

	GetCursorPos( &stMousePos );
	ScreenToClient( &stMousePos );
	p_oWnd = ChildWindowFromPoint( stMousePos, CWP_SKIPINVISIBLE );

    if ( p_oWnd == GetDlgItem( IDC_LIST_ANIMS ) )
	{
		uiCommand = HELP_CONTEXTPOPUP;
		dwContext = IDP_ANIMATIONLISTBOX;
	}
	else if ( (p_oWnd == GetDlgItem(IDC_EDIT_CHANNEL )) || (p_oWnd == GetDlgItem(IDC_EDIT_FRAME)) )
	{
		uiCommand = HELP_CONTEXTPOPUP;
		dwContext = IDP_ANIMINFO;
	}
	else if ( p_oWnd == GetDlgItem( IDC_BUTTON_LOAD ) )
	{
		uiCommand = HELP_CONTEXT;
		dwContext = IDJ_LOADINGANIMATION;
	}
	else if
		(
			(p_oWnd == GetDlgItem(IDC_SCROLLBAR_FRAME)) ||
			(p_oWnd == GetDlgItem(IDC_BUTTON_REWIND)) ||
			(p_oWnd == GetDlgItem(IDC_BUTTON_REVERSE)) ||
			(p_oWnd == GetDlgItem(IDC_BUTTON_STOP)) ||
			(p_oWnd == GetDlgItem(IDC_BUTTON_PLAY)) ||
			(p_oWnd == GetDlgItem(IDC_BUTTON_FORWARD))
		)
	{
		uiCommand = HELP_CONTEXT;
		dwContext = IDJ_PLAYINGANIMATION;
	}

	if (_access( "Edt_data\\tools\\TAN\\animview.hlp", 0) != 0)
	{
		MessageBox("Help File : Edt_data\\tools\\TAN\\animview.hlp not found" );
		return TRUE;
	}

	::WinHelp(	m_hWnd,
				"Edt_Data\\tools\\TAN\\animview.hlp",
				uiCommand,
				dwContext
			);
    */
	return CFormView::OnHelpInfo(pHelpInfo);
}

/*
 *-----------------------------------------------------------------------------
 * BN_CLICKED on IDC_BUTTON_HELP
 *-----------------------------------------------------------------------------
 */
void CAnimationView::OnButtonHelp()
{
	OnHelpInfo(NULL);
}
