// PageGCMDSMotionSheet.cpp : implementation file // #include "stdafx.h" #include "worldcreator.h" #include "PageGCMDSMotionSheet.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CPageGCMDSMotionSheet property page IMPLEMENT_DYNCREATE(CPageGCMDSMotionSheet, CPropertyPage) CPageGCMDSMotionSheet::CPageGCMDSMotionSheet() : CPropertyPage(CPageGCMDSMotionSheet::IDD) { //{{AFX_DATA_INIT(CPageGCMDSMotionSheet) //}}AFX_DATA_INIT m_lLastApackColumnCount = 0; m_rpGCMDS = NULL; } CPageGCMDSMotionSheet::~CPageGCMDSMotionSheet() { } void CPageGCMDSMotionSheet::DoDataExchange(CDataExchange* pDX) { CPropertyPage::DoDataExchange(pDX); //{{AFX_DATA_MAP(CPageGCMDSMotionSheet) DDX_Control(pDX, IDC_LIST_CHREVENT, m_ctrlChrEvent); DDX_Control(pDX, IDC_LIST_MOTLET, m_ctrlMotlet); DDX_Control(pDX, IDC_TREE_MOTIONSHEET, m_ctrlMotionSheet); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CPageGCMDSMotionSheet, CPropertyPage) //{{AFX_MSG_MAP(CPageGCMDSMotionSheet) ON_WM_DESTROY() ON_NOTIFY(TVN_SELCHANGED, IDC_TREE_MOTIONSHEET, OnSelchangedTreeMotionsheet) ON_NOTIFY(LVN_COLUMNCLICK, IDC_LIST_MOTLET, OnColumnclickListMotlet) ON_WM_SHOWWINDOW() ON_WM_CONTEXTMENU() //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CPageGCMDSMotionSheet message handlers BOOL CPageGCMDSMotionSheet::OnInitDialog() { CPropertyPage::OnInitDialog(); // TODO: Add extra initialization here m_ImgTreeIcon.Create( IDB_TREEICON, 16, 2, RGB(255,255,255) ); m_ctrlMotionSheet.SetImageList( &m_ImgTreeIcon, TVSIL_NORMAL ); DWORD dwExtStyle; dwExtStyle = m_ctrlMotlet.GetExtendedStyle(); dwExtStyle |= LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES; m_ctrlMotlet.SetExtendedStyle( dwExtStyle ); m_ctrlMotlet.InsertColumn( 0, "", LVCFMT_LEFT, 20 ); m_ctrlMotlet.InsertColumn( 1, "È®·üÁ¡À¯µµ", LVCFMT_LEFT, 80 ); m_ctrlMotlet.SetColumnType( 0, GLCT_NORMAL ); dwExtStyle = m_ctrlChrEvent.GetExtendedStyle(); dwExtStyle |= LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES; m_ctrlChrEvent.SetExtendedStyle( dwExtStyle ); m_ctrlChrEvent.InsertColumn( 0, "", LVCFMT_LEFT, 20 ); m_ctrlChrEvent.InsertColumn( 1, "ÁÖ À̺¥Æ®", LVCFMT_LEFT, 135 ); m_ctrlChrEvent.InsertColumn( 2, "º¸Á¶ À̺¥Æ®", LVCFMT_LEFT, 135 ); m_ctrlChrEvent.InsertColumn( 3, "¹ß»ýÈ®·ü(ºÐÀÚ)", LVCFMT_LEFT, 30 ); m_ctrlChrEvent.InsertColumn( 4, "¹ß»ýÈ®·ü(ºÐ¸ð)", LVCFMT_LEFT, 30 ); m_dlgEventKeyframeSlider.Create(this); m_dlgEventKeyframeSlider.SetWindowPos( NULL, 0, 530, 0, 0, SWP_NOZORDER|SWP_NOSIZE ); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void CPageGCMDSMotionSheet::UpdateDataByGCMDS( CZ3DGCMDS* pGCMDS ) { char szTmp[100]; m_rpGCMDS = pGCMDS; m_ctrlMotionSheet.SetGCMDS(m_rpGCMDS); UpdateMotionSheetTree(); for(int i = m_lLastApackColumnCount; i >= 0; --i ) { m_ctrlMotlet.DeleteColumn( i+1 ); } m_lLastApackColumnCount = pGCMDS->GetAniHolderCount(); for( i = 0; i < m_lLastApackColumnCount; ++i ) { sprintf( szTmp, "APack #%d", i ); m_ctrlMotlet.InsertColumn( i+1, szTmp, LVCFMT_LEFT, 140 ); } m_ctrlMotlet.InsertColumn( i+1, "È®·üÁ¡À¯µµ", LVCFMT_LEFT, 80 ); UpdateMotletList( NULL ); UpdateEventList( NULL ); } void CPageGCMDSMotionSheet::UpdateMotionSheetTree() { std::map* pmap; std::map::iterator it; std::map mapMotionSheet2TreeItem; std::map::iterator itM2T; m_ctrlMotionSheet.DeleteAllItems(); m_rpGCMDS->RetrieveMotionSheetList( pmap ); for( it = pmap->begin(); it != pmap->end(); ++it ) { Z3DMOTIONSHEET* pSheet = it->second; HTREEITEM hParent = NULL; itM2T = mapMotionSheet2TreeItem.find( pSheet->rpParentSheet ); if( mapMotionSheet2TreeItem.end() != itM2T ) { hParent = itM2T->second; } HTREEITEM hItem = m_ctrlMotionSheet.InsertItem( TVIF_TEXT | TVIF_PARAM | TVIF_IMAGE | TVIF_SELECTEDIMAGE, g_TokSheetName.GetString( it->first ), 0, 0, 0, 0, NULL, hParent, TVI_LAST ); mapMotionSheet2TreeItem[pSheet] = hItem; // motion sheet ¿¡ ¼ÓÇÑ motlet ¾ÆÀÌÅÛµé Ãß°¡ std::map &mapTok2Motlet = pSheet->mapTok2Motlet; std::map::iterator itT2M; for( itT2M = mapTok2Motlet.begin(); itT2M != mapTok2Motlet.end(); ++itT2M ) { m_ctrlMotionSheet.InsertItem( TVIF_TEXT | TVIF_PARAM | TVIF_IMAGE | TVIF_SELECTEDIMAGE, g_TokMotionName.GetString(itT2M->first), 1, 1, 0, 0, (long)(itT2M->second), hItem, TVI_LAST ); } } } void CPageGCMDSMotionSheet::UpdateMotletList( Z3DMOTLET* pMotlet ) { char szTmp[100]; m_ctrlMotlet.DeleteAllItems(); if( NULL == pMotlet ) { return; } int i, j; long lPrevProbSum = 0; for( i = 0; i < pMotlet->lCount; ++i ) { m_ctrlMotlet.InsertItem( i, itoa(i, szTmp, 10) ); for( j = 0; j < m_lLastApackColumnCount; ++j ) { m_ctrlMotlet.SetItemText( i, j+1, g_TokFileName.GetString( pMotlet->pTokArr[i].pArray[j] ) ); } m_ctrlMotlet.SetItemText( i, j+1, itoa(pMotlet->pProbabilityIdx[i] - lPrevProbSum, szTmp, 10) ); lPrevProbSum = pMotlet->pProbabilityIdx[i]; } } void CPageGCMDSMotionSheet::UpdateEventList( const char* szApackFileName ) { m_ctrlChrEvent.DeleteAllItems(); if( NULL == szApackFileName ) { m_dlgEventKeyframeSlider.ShowWindow(FALSE); return; } Z3DTOK tokApackFileName = g_TokFileName.GetTOK(szApackFileName); if( NULL_TOK == tokApackFileName ) { m_dlgEventKeyframeSlider.ShowWindow(FALSE); return; } CWnd* pCurrentFocus = GetFocus(); m_dlgEventKeyframeSlider.ShowWindow(TRUE); pCurrentFocus->SetFocus(); std::map* >* pmap; std::map* >::iterator it; CZ3DChrEventGenerator::_RetrieveEventDataList(pmap); if( pmap->end() == (it = pmap->find(tokApackFileName)) ) { return; } std::vector &rvecEventElement = *(it->second); for( int i = 0; i < rvecEventElement.size(); ++i ) { //rvecEventElement[i] Z3D_EVENT_ELEMENT. } //m_ctrlChrEvent.InsertItem( 0, szApackFileName ); } void CPageGCMDSMotionSheet::OnDestroy() { CPropertyPage::OnDestroy(); // TODO: Add your message handler code here } void CPageGCMDSMotionSheet::OnSelchangedTreeMotionsheet(NMHDR* pNMHDR, LRESULT* pResult) { NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR; // TODO: Add your control notification handler code here UpdateMotletList( (Z3DMOTLET*)(pNMTreeView->itemNew.lParam) ); UpdateEventList( NULL ); *pResult = 0; } void CPageGCMDSMotionSheet::OnColumnclickListMotlet(NMHDR* pNMHDR, LRESULT* pResult) { NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; // TODO: Add your control notification handler code here if( 0 < pNMListView->iSubItem && pNMListView->iSubItem <= m_lLastApackColumnCount ) { CString strApackFileName = m_ctrlMotlet.GetItemText( pNMListView->iItem, pNMListView->iSubItem ); UpdateEventList( strApackFileName ); } else { UpdateEventList( NULL ); } *pResult = 0; } void CPageGCMDSMotionSheet::OnShowWindow(BOOL bShow, UINT nStatus) { CPropertyPage::OnShowWindow(bShow, nStatus); // TODO: Add your message handler code here if( FALSE == bShow ) { m_dlgEventKeyframeSlider.ShowWindow(FALSE); } } void CPageGCMDSMotionSheet::OnContextMenu(CWnd* pWnd, CPoint point) { // TODO: Add your message handler code here if( m_ctrlMotionSheet.GetSafeHwnd() == pWnd->GetSafeHwnd() ) { // context menu for 'motion sheet tree' OnMotionSheetTreeContextMenu(point); } else if( m_ctrlMotlet.GetSafeHwnd() == pWnd->GetSafeHwnd() ) { // context menu for 'motlet list(Apack setting)' } else if( m_ctrlChrEvent.GetSafeHwnd() == pWnd->GetSafeHwnd() ) { // context menu for 'ChrEvent list' } else { CPropertyPage::OnContextMenu( pWnd, point ); } } void CPageGCMDSMotionSheet::OnMotionSheetTreeContextMenu(CPoint point) { CMenu menuTmp; CMenu* pContextMenu; menuTmp.LoadMenu( IDR_MENU_GCMDS ); pContextMenu = menuTmp.GetSubMenu( 0 ); CPoint ptClient; UINT uFlags; ptClient = point; m_ctrlMotionSheet.ScreenToClient( &ptClient ); HTREEITEM hItem = m_ctrlMotionSheet.HitTest( ptClient, &uFlags ); if( NULL == hItem ) { pContextMenu->EnableMenuItem( ID_MENUITEM_ADDMOTIONSHEET, MF_ENABLED ); pContextMenu->EnableMenuItem( ID_MENUITEM_ADDMOTION, MF_GRAYED ); pContextMenu->EnableMenuItem( ID_MENUITEM_DELETEMOTION, MF_GRAYED ); } else { long lData = m_ctrlMotionSheet.GetItemData( hItem ); if( 0 == lData ) { pContextMenu->EnableMenuItem( ID_MENUITEM_ADDMOTIONSHEET, MF_ENABLED ); pContextMenu->EnableMenuItem( ID_MENUITEM_ADDMOTION, MF_ENABLED ); pContextMenu->EnableMenuItem( ID_MENUITEM_DELETEMOTION, MF_ENABLED ); } else { pContextMenu->EnableMenuItem( ID_MENUITEM_ADDMOTIONSHEET, MF_GRAYED ); pContextMenu->EnableMenuItem( ID_MENUITEM_ADDMOTION, MF_GRAYED ); pContextMenu->EnableMenuItem( ID_MENUITEM_DELETEMOTION, MF_ENABLED ); } } pContextMenu->TrackPopupMenu( TPM_LEFTALIGN, point.x, point.y, this, NULL ); }