// DlgAnim.cpp : implementation file // /////////////////////////////////////////////////////////////////////////////// // INCLUDES /////////////////////////////////////////////////////////////////////////////// //#undef _DEBUG #include "stdafx.h" //#define _DEBUG #include "ACP_Base.h" #include "ITF.h" #include "TAC.h" #include "TFa.h" #include "OAc.h" #include "ACInterf.hpp" #include "DlgAnim.hpp" #include "STModif.hpp" #include "..\Main\Inc\_EditID.h" #include "TUT.h" /////////////////////////////////////////////////////////////////////////////// // ??? /////////////////////////////////////////////////////////////////////////////// #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif /////////////////////////////////////////////////////////////////////////////// // MACROS /////////////////////////////////////////////////////////////////////////////// #define M_LBAnim() ( (CListBox*) GetDlgItem( IDC_LB_ANIM ) ) #define M_BTCreate() ( (CButton*) GetDlgItem( IDC_BT_CREATESTATES ) ) #define M_BTMore() ( (CButton*) GetDlgItem( IDC_BT_MORE) ) #define M_CBFamily() ( (CComboBox*) GetDlgItem( IDC_COMBO_FAMILY) ) #define M_GetCurrentFamily() ( m_p_oParentDLL ? m_p_oParentDLL -> mfn_p_oGetCurrentFamily() : NULL ) #define M_GetCurrentAction() ( m_p_oParentDLL ? m_p_oParentDLL -> mfn_p_oGetCurrentAction() : NULL ) #define M_GetCurrentState() ( m_p_oParentDLL ? m_p_oParentDLL -> mfn_p_oGetCurrentState() : NULL ) #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_ShowControl( Id ) GetDlgItem( Id ) -> EnableWindow( TRUE ); GetDlgItem( Id ) -> ShowWindow( SW_SHOW ); #define M_HideControl( Id ) GetDlgItem( Id ) -> EnableWindow( FALSE ); GetDlgItem( Id ) -> ShowWindow( SW_HIDE ); #define M_MakeDo( p_oModif ) m_p_oParentDLL -> M_GetEditManager() -> AskFor ( p_oModif ) /////////////////////////////////////////////////////////////////////////////// // CONSTANTS /////////////////////////////////////////////////////////////////////////////// #define C_iBorderSize 2 #define C_uiPMDefault 2000 #define C_uiPMCreateNormal (C_uiPMDefault + 1) #define C_uiPMCreateTransitional (C_uiPMDefault + 2) // CPA_Ed_1 Mihaela Tancu begin #define C_uiPMCreateNormalMove (C_uiPMDefault + 3) #define C_uiPMCreateTransitionalMove (C_uiPMDefault + 4) // CPA_Ed_1 Mihaela Tancu end ///////////////////////////////////////////////////////////////////////////// // CDlgAnimList ///////////////////////////////////////////////////////////////////////////// IMPLEMENT_DYNCREATE(CDlgAnimList, CFormView) CDlgAnimList::CDlgAnimList() : CFormView(CDlgAnimList::IDD) { //{{AFX_DATA_INIT(CDlgAnimList) // NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT m_bAllFamilies = FALSE; } CDlgAnimList::~CDlgAnimList() { } void CDlgAnimList::DoDataExchange(CDataExchange* pDX) { CFormView::DoDataExchange(pDX); //{{AFX_DATA_MAP(CDlgAnimList) // NOTE: the ClassWizard will add DDX and DDV calls here //}}AFX_DATA_MAP } /*----------------------------------------------------------------------------- * Description : create & register controls for TUT module *---------------------------------------------------------------------------*/ BOOL CDlgAnimList::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwRequestedStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext) { BOOL bResult = CFormView::Create( lpszClassName, lpszWindowName, dwRequestedStyle, rect, pParentWnd, nID, pContext ); // register controls TUT_M_vGetTutDll(); TUT_M_vRegisterControlID( IDC_LB_ANIM, "TAC_STM_ANIMSLIST_LIST", TUT_e_ListBox ); TUT_M_vRegisterControlID( IDC_BT_CREATESTATES, "TAC_STM_ANIMSLIST_BTCREATE", TUT_e_Button ); TUT_M_vRegisterControlID( IDC_COMBO_FAMILY, "TAC_STM_ANIMSLIST_CBFAMILY", TUT_e_ComboBox ); TUT_M_vRegisterControlID( IDC_BT_MORE, "TAC_STM_ANIMSLIST_BTMORE", TUT_e_Button ); // return bResult; } BEGIN_MESSAGE_MAP(CDlgAnimList, CFormView) //{{AFX_MSG_MAP(CDlgAnimList) ON_WM_DESTROY() ON_WM_SIZE() ON_BN_CLICKED(IDC_BT_CREATESTATES, OnBtCreatestates) ON_LBN_SELCHANGE(IDC_LB_ANIM, OnSelchangeLbAnim) ON_BN_CLICKED(IDC_BT_MORE, OnBtMore) ON_CBN_SELCHANGE(IDC_COMBO_FAMILY, OnSelchangeComboFamily) ON_WM_DRAWITEM() // CPA_Ed_1 Mihaela Tancu begin ON_WM_MOUSEMOVE() // CPA_Ed_1 Mihaela Tancu end //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CDlgAnimList diagnostics ///////////////////////////////////////////////////////////////////////////// #ifdef _DEBUG void CDlgAnimList::AssertValid() const { CFormView::AssertValid(); } void CDlgAnimList::Dump(CDumpContext& dc) const { CFormView::Dump(dc); } #endif //_DEBUG ///////////////////////////////////////////////////////////////////////////// // CDlgAnimList message handlers ///////////////////////////////////////////////////////////////////////////// // ---------------------------------------------------------------------------- // Description : handle function for msg WM_DESTROY : unregister controls for TUT // ---------------------------------------------------------------------------- void CDlgAnimList::OnDestroy() { TUT_M_vGetTutDll(); TUT_M_vUnregisterControlID( IDC_LB_ANIM ); TUT_M_vUnregisterControlID( IDC_BT_CREATESTATES ); TUT_M_vUnregisterControlID( IDC_COMBO_FAMILY ); TUT_M_vUnregisterControlID( IDC_BT_MORE ); CFormView::OnDestroy(); } // ---------------------------------------------------------------------------- // Description : handle function for msg WM_SIZE // ---------------------------------------------------------------------------- void CDlgAnimList::OnSize(UINT nType, int cx, int cy) { if(GetDlgItem(IDC_LB_ANIM)) { CRect oRectDlg, oRectList, oRectBTCreate, oRectBTMore, oRectST, oRectCB; int iSize; // get pos M_GetClientRect( this, &oRectDlg ); M_GetClientRectId( IDC_BT_CREATESTATES, &oRectBTCreate ); M_GetClientRectId( IDC_ST_ANIM, &oRectST ); M_GetClientRectId( IDC_LB_ANIM, &oRectList ); M_GetClientRectId( IDC_COMBO_FAMILY, &oRectCB ); M_GetClientRectId( IDC_BT_MORE, &oRectBTMore ); // Left Align oRectCB . left = oRectList . left = oRectDlg . left + C_iBorderSize; // Right Align oRectCB . right = oRectList . right = oRectDlg . right - C_iBorderSize; // Bottom Align oRectList . bottom = max( oRectList . top, oRectDlg . bottom - C_iBorderSize ); // BT iSize = oRectBTMore . Width(); oRectBTMore . left = oRectST . right + C_iBorderSize; oRectBTMore . right = oRectBTMore . left + iSize; oRectBTCreate . left = oRectBTMore . right + C_iBorderSize; oRectBTCreate . right = min( oRectBTCreate . left + 85, oRectDlg . right - C_iBorderSize ); // set pos M_SetClientRectId( IDC_BT_CREATESTATES, &oRectBTCreate ); M_SetClientRectId( IDC_LB_ANIM, &oRectList ); M_SetClientRectId( IDC_COMBO_FAMILY, &oRectCB ); M_SetClientRectId( IDC_BT_MORE, &oRectBTMore ); } } // ----------------------------------------------------------------------------- // Description : intercept the popup menu entry // ---------------------------------------------------------------------------*/ BOOL CDlgAnimList::OnCommand(WPARAM wParam, LPARAM lParam) { switch(LOWORD(wParam)) { case C_uiPMCreateNormal: mfn_vCreateStates( TRUE ); break; case C_uiPMCreateTransitional: mfn_vCreateStates( FALSE ); break; // CPA_Ed_1 Mihaela Tancu begin case C_uiPMCreateNormalMove: mfn_vCreateStatesMove( TRUE ); break; case C_uiPMCreateTransitionalMove: mfn_vCreateStatesMove( FALSE ); break; // CPA_Ed_1 Mihaela Tancu end default : return CFormView::OnCommand(wParam, lParam); } return TRUE; } // ---------------------------------------------------------------------------- // Description : Intercept all messages // ---------------------------------------------------------------------------- BOOL CDlgAnimList::PreTranslateMessage(MSG* pMsg) { if( ( pMsg->hwnd == GetDlgItem(IDC_LB_ANIM)->m_hWnd ) && ( pMsg -> message == WM_RBUTTONDOWN ) ) { return OnRButtonDownLbAnim( pMsg ); } else if ( ( pMsg->hwnd == GetDlgItem(IDC_LB_ANIM)->m_hWnd ) && ( pMsg -> message == WM_LBUTTONDOWN ) ) { /* if( ( GetKeyState( VK_SHIFT ) & 0xff00) ) return TRUE; */ return OnLButtonDownLbAnim( pMsg ); } // CPA_Ed_1 Mihaela Tancu begin else if (pMsg -> message == WM_LBUTTONUP ) { return OnLButtonUpLbAnim( pMsg ); } // CPA_Ed_1 Mihaela Tancu end return CFormView::PreTranslateMessage(pMsg); } // ---------------------------------------------------------------------------- // Author : MT // Creation : 13/08/97 // // Description : // ---------------------------------------------------------------------------- void CDlgAnimList::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDIS) { if ( ( nIDCtl == IDC_LB_ANIM ) && ( M_LBAnim() -> IsWindowEnabled() ) && ( lpDIS->itemID != LB_ERR) ) { mfn_vOnDrawItemListBoxAnimation( lpDIS ) ; } else CFormView::OnDrawItem(nIDCtl, lpDIS); } // ---------------------------------------------------------------------------- // Description : handle function for msg CBN_SELCHANGE on CB Family // ---------------------------------------------------------------------------- void CDlgAnimList::OnBtMore() { if ( m_bAllFamilies ) { int iIndex = M_CBFamily() -> GetCurSel(); if( ( iIndex != CB_ERR ) && ( (CPA_Family*)M_CBFamily() -> GetItemData( iIndex ) != M_GetCurrentFamily() ) ) return; } m_bAllFamilies = ! m_bAllFamilies; if( m_bAllFamilies ) { // show Cb Family CRect oRectDlg, oRectList, oRectSTAnim, oRectCB; // get pos M_GetClientRect( this, &oRectDlg ); M_GetClientRectId( IDC_ST_ANIM, &oRectSTAnim ); M_GetClientRectId( IDC_LB_ANIM, &oRectList ); M_GetClientRectId( IDC_COMBO_FAMILY, &oRectCB ); M_HideControl( IDC_ST_ANIM ); M_ShowControl( IDC_ST_FAMILY ); M_ShowControl( IDC_COMBO_FAMILY ); M_BTMore() -> SetWindowText( "-" ); // top Align oRectList . top = oRectCB. bottom + C_iBorderSize; // set pos M_SetClientRectId( IDC_LB_ANIM, &oRectList ); // select current family int iIndex = -1; if( M_GetCurrentFamily() ) { iIndex = M_CBFamily() -> FindStringExact( -1, M_GetCurrentFamily() -> GetName() ); if ( iIndex == CB_ERR ) iIndex = -1; } M_CBFamily() -> SetCurSel( iIndex ); } else { // hide Cb Family CRect oRectDlg, oRectList, oRectSTAnim, oRectCB; // get pos M_GetClientRect( this, &oRectDlg ); M_GetClientRectId( IDC_ST_ANIM, &oRectSTAnim ); M_GetClientRectId( IDC_LB_ANIM, &oRectList ); M_GetClientRectId( IDC_COMBO_FAMILY, &oRectCB ); M_ShowControl( IDC_ST_ANIM ); M_HideControl( IDC_ST_FAMILY ); M_HideControl( IDC_COMBO_FAMILY ); M_BTMore() -> SetWindowText( "+" ); // top Align oRectList . top = oRectCB. top; // set pos M_SetClientRectId( IDC_LB_ANIM, &oRectList ); } } // ---------------------------------------------------------------------------- // Description : handle function for msg CBN_SELCHANGE on CB Family // ---------------------------------------------------------------------------- void CDlgAnimList::OnSelchangeComboFamily() { int iIndex = M_CBFamily() -> GetCurSel(); if ( iIndex != CB_ERR ) { mfn_vFillLBAnimations( (CPA_Family*) M_CBFamily() -> GetItemData( iIndex ) ); } } // ---------------------------------------------------------------------------- // Description : handle function for msg WM_LBUTTONDOWN on ListBox // ---------------------------------------------------------------------------- BOOL CDlgAnimList::OnLButtonDownLbAnim(MSG* pMsg) { CListBox *pLB = M_LBAnim(); BOOL bCtrl = ( ( GetKeyState( VK_CONTROL ) & 0xff00 ) != 0 ); POINT xPos; CRect oRect; BOOL bOutside; int iIndex; xPos.x = LOWORD(pMsg->lParam); xPos.y = HIWORD(pMsg->lParam); iIndex = pLB -> ItemFromPoint ( xPos, bOutside ) ; pLB -> GetItemRect ( iIndex , &oRect ) ; if(oRect . PtInRect ( xPos ) ) { // click on item BOOL bCtrl = ( ( GetKeyState( VK_CONTROL ) & 0xff00 ) != 0 ); BOOL bCurSel = pLB -> GetSel( iIndex ); if( bCurSel ) { // item already selected, deselect it if CTRL if( bCtrl ) pLB -> SetSel( iIndex, FALSE ); } else { // item unselected, select it if( bCtrl ) pLB -> SetSel( iIndex, TRUE ); else { // unselect all pLB -> SelItemRange( FALSE, 0, pLB -> GetCount() ); // select it pLB -> SetSel( iIndex, TRUE ); } } OnSelchangeLbAnim(); pLB -> Invalidate(); // CPA_Ed_1 Mihaela Tancu begin SetCapture(); // CPA_Ed_1 Mihaela Tancu end return TRUE; } return CFormView::PreTranslateMessage(pMsg); } // CPA_Ed_1 Mihaela Tancu begin // ---------------------------------------------------------------------------- // Description : handle function for msg WM_LBUTTONUP on ListBox // Author: Mihaela Tancu // ---------------------------------------------------------------------------- BOOL CDlgAnimList::OnLButtonUpLbAnim(MSG* pMsg) { m_p_oParentDLL -> mfn_iSetIndexListBox( -1); m_p_oStatePrevious = NULL; m_p_oStateTarget = NULL; if (GetCapture() != this) return FALSE; // If this window (view) didn't capture the mouse, // then the user isn't in this window. ReleaseCapture(); // Release the mouse capture established at // the beginning of the mouse drag. SetCursor(M_GetMainApp()->LoadStandardCursor(IDC_ARROW)); CListBox *pLB = (CListBox *)(CWnd::FromHandle(::GetDlgItem( m_p_oParentDLL->mfn_hGetDlgActionContentsHwnd(), IDC_LIST_STATES))); POINT xPos, sPos; GetCursorPos(&xPos); sPos = xPos; CRect oRect; pLB -> ScreenToClient(&xPos); pLB -> GetClientRect( oRect ); m_p_oParentDLL -> mfn_iSetIndexListBox( -1); if( !oRect.PtInRect(xPos)) return 1; //test if the mouse cursor is on one item from the list box CPoint oPoint(xPos); BOOL bOutside; if (!M_GetCurrentAction()->m_oListOfStates.IsEmpty()) { int iIndex = pLB->ItemFromPoint(oPoint, bOutside ) ; if (iIndex != LB_ERR) m_p_oParentDLL->mfn_vChangeState( ((CPA_State *) pLB->GetItemData(iIndex)) ); else m_p_oParentDLL->mfn_vChangeState( NULL ); if (iIndex > 0) m_p_oStatePrevious = (CPA_State *) pLB->GetItemData(iIndex-1); m_p_oStateTarget = (CPA_State *) pLB->GetItemData(iIndex); CRect oRectItem; pLB->GetItemRect(iIndex,&oRectItem); //prepare the informations for creating the states from animations if(oRectItem.PtInRect(xPos)) // if the mouse cursor is on one item from the list box // save the index of that item { m_p_oParentDLL -> mfn_iSetIndexListBox( iIndex); if (iIndex > 0) m_p_oStatePrevious = (CPA_State *) pLB->GetItemData(iIndex-1); m_p_oStateTarget = (CPA_State *) pLB->GetItemData(iIndex); } else { // if the cursor is not on one item!!! (put the states on null) m_p_oStatePrevious = NULL; m_p_oStateTarget = NULL; } } CMenu oPopMenu; // create popup on the mouse position oPopMenu . CreatePopupMenu () ; // fill menu oPopMenu . AppendMenu( MF_STRING , C_uiPMCreateNormalMove, "Normal States"); if (!M_GetCurrentAction()->m_oListOfStates.IsEmpty()) oPopMenu . AppendMenu( MF_STRING , C_uiPMCreateTransitionalMove, "Transitional States"); // register for TUT module TUT_M_vGetTutDll (); TUT_M_vRegisterMenu (this -> m_hWnd , oPopMenu . m_hMenu , sPos.x, sPos.y); oPopMenu . TrackPopupMenu ( TPM_LEFTALIGN|TPM_RIGHTBUTTON, sPos.x, sPos.y , this); oPopMenu . DestroyMenu (); return CFormView::PreTranslateMessage(pMsg); } // ---------------------------------------------------------------------------- // Description : handle function for msg WM_MOUSE on ListBox // Author: Mihaela Tancu // ---------------------------------------------------------------------------- void CDlgAnimList::OnMouseMove(UINT nFlags, CPoint pt) { POINT point; GetCursorPos(&point); if (nFlags & MK_LBUTTON) { CListBox *pLB = (CListBox *)(CWnd::FromHandle(::GetDlgItem( m_p_oParentDLL->mfn_hGetDlgActionContentsHwnd(), IDC_LIST_STATES))); CRect oRect; pLB -> GetWindowRect( oRect ); if(oRect.PtInRect(point)) // change the mouse cursor if it is in the Action Contents list box rect SetCursor(M_GetMainApp()->LoadCursor(IDC_POINTER_CURSOR)); else // change the mouse cursor if it is not in the Action Contents List box rect SetCursor(M_GetMainApp()->LoadStandardCursor(IDC_NO)); } } // CPA_Ed_1 Mihaela Tancu end // ---------------------------------------------------------------------------- // Description : handle function for msg WM_RBUTTONDOWN on ListBox // ---------------------------------------------------------------------------- BOOL CDlgAnimList::OnRButtonDownLbAnim(MSG* pMsg) { CListBox *pLB = M_LBAnim(); int iNbSelected = pLB -> GetSelCount(); BOOL bCanCreate = ( ( iNbSelected > 0 ) && ( M_GetCurrentAction() != NULL ) ); POINT xPos; CMenu oPopupMenu ; xPos.x = LOWORD(pMsg->lParam); xPos.y = HIWORD(pMsg->lParam); // create popup menu oPopupMenu . CreatePopupMenu () ; // fill menu oPopupMenu . AppendMenu( MF_STRING + ( bCanCreate ? MF_ENABLED : MF_GRAYED) , C_uiPMCreateNormal , "Create Normal State(s)" ) ; oPopupMenu . AppendMenu( MF_STRING + ( bCanCreate ? MF_ENABLED : MF_GRAYED) , C_uiPMCreateTransitional , "Create Transitional State(s)" ) ; // display menu pLB->ClientToScreen(&xPos); // ALX TUT_M_vGetTutDll (); TUT_M_vRegisterMenu (this -> m_hWnd , oPopupMenu . m_hMenu , xPos . x , xPos . y); // End ALX oPopupMenu . TrackPopupMenu ( TPM_LEFTALIGN|TPM_RIGHTBUTTON, xPos.x, xPos.y, this); oPopupMenu . DestroyMenu (); return CFormView::PreTranslateMessage(pMsg); } // ---------------------------------------------------------------------------- // Description : handle function for msg BN_CLICKED on BT Create // ---------------------------------------------------------------------------- void CDlgAnimList::OnBtCreatestates() { CMenu oPopMenu; CRect oRect; M_BTCreate() -> GetWindowRect( oRect ); // create popup oPopMenu . CreatePopupMenu () ; // fill menu oPopMenu . AppendMenu( MF_STRING , C_uiPMCreateNormal, "Normal States"); // CPA_Ed_1 Mihaela Tancu begin if (!M_GetCurrentAction()->m_oListOfStates.IsEmpty()) // CPA_Ed_1 Mihaela Tancu end oPopMenu . AppendMenu( MF_STRING , C_uiPMCreateTransitional, "Transitional States"); TUT_M_vGetTutDll (); TUT_M_vRegisterMenu (this -> m_hWnd , oPopMenu . m_hMenu , oRect . left, oRect . bottom); oPopMenu . TrackPopupMenu ( TPM_LEFTALIGN|TPM_RIGHTBUTTON, oRect . left, oRect . bottom , this); oPopMenu . DestroyMenu (); } // ---------------------------------------------------------------------------- // Description : handle function for msg LBN_SELCHANGE on ListBox // ---------------------------------------------------------------------------- void CDlgAnimList::OnSelchangeLbAnim() { CListBox *pLB = M_LBAnim(); int iNbSelected = pLB -> GetSelCount(); if ( iNbSelected < 2 ) { // unselect all for ( int i=0 ; iGetCount() ; i++ ) pLB -> SetItemData( i, 0 ); if ( iNbSelected == 1 ) { // select first int *a_iNewSelection = (int*) malloc( iNbSelected * sizeof( int ) ); pLB -> GetSelItems( iNbSelected, a_iNewSelection ); pLB -> SetItemData( *a_iNewSelection, 1 ); free( a_iNewSelection ); } } else { // one item has been select or unselect // for ( int i=0 ; iGetCount() ; i++ ) { if( pLB -> GetSel( i ) && ( pLB -> GetItemData( i ) == 0 ) ) { // new selection pLB -> SetItemData( i, iNbSelected ); break; } else if ( !pLB -> GetSel( i ) && ( pLB -> GetItemData( i ) != 0 ) ) { // unselect item DWORD dwLast = pLB -> GetItemData( i ); // shift next items for ( int j=0 ; jGetCount() ; j++ ) { if( pLB -> GetItemData( j ) > dwLast ) pLB -> SetItemData( j, pLB -> GetItemData( j ) - 1 ); } pLB -> SetItemData( i, 0 ); break; } } } M_BTCreate() -> EnableWindow( (BOOL)iNbSelected && (BOOL)M_GetCurrentAction() ); } // ---------------------------------------------------------------------------- // Author : MT // Creation : 13/08/97 // // Description : // ---------------------------------------------------------------------------- void CDlgAnimList::mfn_vOnDrawItemListBoxAnimation(LPDRAWITEMSTRUCT lpDIS) { CDC *pDC = CDC::FromHandle( lpDIS->hDC ); char szText[100]; CListBox *pLB = M_LBAnim(); BOOL bSelected = (lpDIS->itemState & ODS_SELECTED ); int iIndex = (int)pLB -> GetItemData( lpDIS->itemID ); pDC->FillSolidRect( &lpDIS->rcItem, GetSysColor( COLOR_WINDOW )); pDC->SetBkMode( TRANSPARENT); pDC->SetTextColor( GetSysColor( COLOR_WINDOWTEXT ) ); // display animation name lpDIS->rcItem.left += 1; pLB->GetText( lpDIS->itemID, szText ); pDC->DrawText( szText, strlen(szText), &lpDIS->rcItem, DT_SINGLELINE | DT_LEFT | DT_VCENTER ); // display selected index if ( bSelected && iIndex ) { itoa( iIndex, szText, 10 ); lpDIS->rcItem.right -= 2; pDC->DrawText( szText, strlen(szText), &lpDIS->rcItem, DT_SINGLELINE | DT_RIGHT | DT_VCENTER ); lpDIS->rcItem.right += 2; lpDIS->rcItem.left -= 1; pDC->InvertRect( &lpDIS->rcItem ); } } // ---------------------------------------------------------------------------- // Description : Set Parent DLL // ---------------------------------------------------------------------------- void CDlgAnimList::mfn_vSetParentDLL(TAction_Interface * _p_oDLL) { m_p_oParentDLL = _p_oDLL; } // ---------------------------------------------------------------------------- // Description : Set Current Family // ---------------------------------------------------------------------------- void CDlgAnimList::mfn_vSetFamily(CPA_Family * _p_oFamily) { // GetCurrent FamilySelected int iCurrent = M_CBFamily() -> GetCurSel(); // select current family int iIndex = -1; if( _p_oFamily ) { iIndex = M_CBFamily() -> FindStringExact( -1, _p_oFamily -> GetName() ); if ( iIndex == CB_ERR ) iIndex = -1; } if( iIndex != iCurrent ) { M_CBFamily() -> SetCurSel( iIndex ); OnSelchangeComboFamily(); } else M_LBAnim() -> SetSel( -1, FALSE ); } // ---------------------------------------------------------------------------- // Description : Fill ListBox Animation // ---------------------------------------------------------------------------- void CDlgAnimList::mfn_vFillLBAnimations(CPA_Family * _p_oFamily) { CListBox *pLB = M_LBAnim(); pLB -> ResetContent(); M_BTCreate() -> EnableWindow( FALSE ); if( _p_oFamily ) { CPA_List oList; _p_oFamily -> GetMainWorld() -> fn_lFindObjects( &oList, "", C_szAnimationTypeName, (CPA_BaseObject*)_p_oFamily ); POSITION xPos = oList . GetHeadPosition(); while( xPos ) { CPA_BaseObject *p_oAnim = oList . GetNext( xPos ); int iIndex = pLB -> AddString( p_oAnim -> GetName() ); if( iIndex != LB_ERR ) pLB -> SetItemData( iIndex, (DWORD) 0); } } pLB -> SetSel( -1, FALSE ); } // ---------------------------------------------------------------------------- // Description : fill ComboBox Families // ---------------------------------------------------------------------------- void CDlgAnimList::mfn_vFillCBFamilies(void) { CComboBox *pCB = M_CBFamily(); pCB -> ResetContent(); M_BTCreate() -> EnableWindow( FALSE ); CPA_BaseObjectList *p_oList = m_p_oParentDLL -> GetMainWorld() -> fn_p_oGetOriginalObjectList( C_szFamilyTypeName ); if( p_oList ) { Position xPos = p_oList -> GetHeadPosition(); while( xPos ) { CPA_BaseObject *p_oFamily = p_oList -> GetNext( xPos ); if( p_oFamily -> fn_bIsAvailable() ) { int iIndex = pCB -> AddString( p_oFamily -> GetName() ); if( iIndex != CB_ERR ) pCB -> SetItemData( iIndex, (DWORD) p_oFamily ); } } } pCB -> SetCurSel( -1 ); } // ---------------------------------------------------------------------------- // Description : Create new states // ---------------------------------------------------------------------------- void CDlgAnimList::mfn_vCreateStates(BOOL _bNormal) { CListBox *pLB = M_LBAnim(); DWORD dwNbSelected = pLB -> GetSelCount(); CPA_BaseObjectList *p_oAnimList; ASSERT( (BOOL) dwNbSelected ); p_oAnimList = m_p_oParentDLL -> GetMainWorld() -> fn_p_oGetOriginalObjectList( C_szAnimationTypeName ); int *a_iSelectedIndexes = (int*) malloc( dwNbSelected * sizeof(int)); pLB -> GetSelItems( dwNbSelected, a_iSelectedIndexes ); State_CreateFromAnims *p_oCreate = new State_CreateFromAnims( m_p_oParentDLL, M_GetCurrentAction() ); if( M_GetCurrentState() ) p_oCreate -> mfn_vSetMecaCard( M_GetCurrentState() -> mfn_p_oGetMecaCard() ); p_oCreate -> mfn_vSetNormalState( _bNormal ); for( DWORD dwNum = 1; dwNum < dwNbSelected+1; dwNum++ ) { // search selected item with order iNum int dwJ = 0; while( ( dwJ < dwNbSelected+1 ) && ( pLB -> GetItemData( a_iSelectedIndexes[dwJ] ) != dwNum ) ) dwJ++; ASSERT( dwJ < dwNbSelected ); CString csAnim; pLB -> GetText( a_iSelectedIndexes[dwJ], csAnim ); CPA_Animation *p_oAnimation = (CPA_Animation*) p_oAnimList -> fn_p_oFindObject( csAnim, C_szAnimationTypeName, M_GetCurrentFamily() ); ASSERT( p_oAnimation ); p_oCreate -> mfn_vAddAnim( p_oAnimation ); } M_MakeDo( p_oCreate ); free( a_iSelectedIndexes ); pLB -> SetSel( -1, FALSE ); M_BTCreate() -> EnableWindow( FALSE ); } // CPA_Ed_1 Mihaela Tancu begin // ---------------------------------------------------------------------------- // Description : Create new states by dragging an animation at one position // Author: Mihaela Tancu // ---------------------------------------------------------------------------- void CDlgAnimList::mfn_vCreateStatesMove(BOOL _bNormal) { CListBox *pLB = M_LBAnim(); DWORD dwNbSelected = pLB -> GetSelCount(); CPA_BaseObjectList *p_oAnimList; ASSERT( (BOOL) dwNbSelected ); // used for invalidate the display of the list box M_LBAnim()->SetRedraw(FALSE); p_oAnimList = m_p_oParentDLL -> GetMainWorld() -> fn_p_oGetOriginalObjectList( C_szAnimationTypeName ); int *a_iSelectedIndexes = (int*) malloc( dwNbSelected * sizeof(int)); pLB -> GetSelItems( dwNbSelected, a_iSelectedIndexes ); State_CreateFromAnimsMove *p_oCreate = new State_CreateFromAnimsMove( m_p_oParentDLL, M_GetCurrentAction(), m_p_oStatePrevious, m_p_oStateTarget,NULL); if( M_GetCurrentState() ) p_oCreate -> mfn_vSetMecaCard( M_GetCurrentState() -> mfn_p_oGetMecaCard() ); p_oCreate -> mfn_vSetNormalState( _bNormal ); for( DWORD dwNum = 1; dwNum < dwNbSelected+1; dwNum++ ) { // search selected item with order iNum int dwJ = 0; while( ( dwJ < dwNbSelected+1 ) && ( pLB -> GetItemData( a_iSelectedIndexes[dwJ] ) != dwNum ) ) dwJ++; ASSERT( dwJ < dwNbSelected ); CString csAnim; pLB -> GetText( a_iSelectedIndexes[dwJ], csAnim ); CPA_Animation *p_oAnimation = (CPA_Animation*) p_oAnimList -> fn_p_oFindObject( csAnim, C_szAnimationTypeName, M_GetCurrentFamily() ); ASSERT( p_oAnimation ); p_oCreate -> mfn_vAddAnim( p_oAnimation ); } M_MakeDo( p_oCreate ); free( a_iSelectedIndexes ); M_LBAnim()->SetRedraw(TRUE); pLB -> SetSel( -1, FALSE ); M_BTCreate() -> EnableWindow( FALSE ); } // CPA_Ed_1 Mihaela Tancu end