// PageGCMDSAttachmentSet.cpp : implementation file // #include "stdafx.h" #include "worldcreator.h" #include "PageGCMDSAttachmentSet.h" #include "SimpleParser.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CPageGCMDSAttachmentSet property page IMPLEMENT_DYNCREATE(CPageGCMDSAttachmentSet, CPropertyPage) CPageGCMDSAttachmentSet::CPageGCMDSAttachmentSet() : CPropertyPage(CPageGCMDSAttachmentSet::IDD) { //{{AFX_DATA_INIT(CPageGCMDSAttachmentSet) // NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT m_rpGCMDS = NULL; } CPageGCMDSAttachmentSet::~CPageGCMDSAttachmentSet() { } void CPageGCMDSAttachmentSet::DoDataExchange(CDataExchange* pDX) { CPropertyPage::DoDataExchange(pDX); //{{AFX_DATA_MAP(CPageGCMDSAttachmentSet) DDX_Control(pDX, IDC_COMBO_WEAPONTYPE, m_ctrlWeaponType); DDX_Control(pDX, IDC_EDIT_MESHNAME, m_ctrlMeshName); DDX_Control(pDX, IDC_EDIT_TEXTURENAME, m_ctrlTextureName); DDX_Control(pDX, IDC_TREE_ATTACHMENTSET, m_ctrlAttachmentTree); DDX_Control(pDX, IDC_LIST_HOLDER, m_ctrlHolderList); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CPageGCMDSAttachmentSet, CPropertyPage) //{{AFX_MSG_MAP(CPageGCMDSAttachmentSet) ON_NOTIFY(TVN_SELCHANGED, IDC_TREE_ATTACHMENTSET, OnSelchangedTreeAttachmentset) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CPageGCMDSAttachmentSet message handlers BOOL CPageGCMDSAttachmentSet::OnInitDialog() { CPropertyPage::OnInitDialog(); // TODO: Add extra initialization here m_ImgTreeIcon.Create( IDB_TREEICON, 16, 2, RGB(255,255,255) ); m_ctrlAttachmentTree.SetImageList( &m_ImgTreeIcon, TVSIL_NORMAL ); DWORD dwExtStyle; dwExtStyle = m_ctrlHolderList.GetExtendedStyle(); dwExtStyle |= LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES; m_ctrlHolderList.SetExtendedStyle( dwExtStyle ); m_ctrlHolderList.InsertColumn( 0, " ", LVCFMT_LEFT, 20 ); m_ctrlHolderList.InsertColumn( 1, "»À´ë", LVCFMT_LEFT, 80 ); m_ctrlHolderList.InsertColumn( 2, "POS", LVCFMT_LEFT, 80 ); m_ctrlHolderList.InsertColumn( 3, "ROT", LVCFMT_LEFT, 80 ); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void CPageGCMDSAttachmentSet::UpdateDataByGCMDS( CZ3DGCMDS* pGCMDS ) { if( NULL == pGCMDS ) { return; } m_rpGCMDS = pGCMDS; UpdateAttachmentTree(); } void CPageGCMDSAttachmentSet::UpdateAttachmentTree() { CSimpleParser parser; CString strIndexFileName(m_rpGCMDS->GetNameString()); strIndexFileName += "_attachment_index.txt"; if( false == parser.OpenFile( strIndexFileName, NULL ) ) { FILE* fp = fopen( strIndexFileName, "wt" ); if( NULL == fp ) { return; } fclose( fp ); // just creating empty file parser.OpenFile( strIndexFileName, NULL ); // open the empty file with parser } m_ctrlAttachmentTree.DeleteAllItems(); char* szToken; HTREEITEM hParent = NULL; // root HTREEITEM hItem; std::map* pmap; m_rpGCMDS->RetrieveAttachmentList( pmap ); std::map mapTok2AttachmentInfo( *pmap ); std::map::iterator it; while( szToken = parser.GetNextToken() ) { if( 0 == stricmp( szToken, "*" ) ) // begin with asterisk -> group name { szToken = parser.GetNextToken(); hItem = m_ctrlAttachmentTree.InsertItem( TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM, szToken, 0, 0, 0, 0, 0, hParent, TVI_LAST ); hParent = hItem; } else if( 0 == stricmp( ";", szToken ) ) { hParent = m_ctrlAttachmentTree.GetParentItem( hParent ); } else { Z3DTOK tok = g_TokAttachmentName.GetTOK( szToken ); it = mapTok2AttachmentInfo.find( tok ); if( mapTok2AttachmentInfo.end() != it ) { hItem = m_ctrlAttachmentTree.InsertItem( TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM, szToken, 1, 1, 0, 0, (LPARAM)(it->second), hParent, TVI_LAST ); mapTok2AttachmentInfo.erase( it ); } } } for( it = mapTok2AttachmentInfo.begin(); it != mapTok2AttachmentInfo.end(); ++it ) { hItem = m_ctrlAttachmentTree.InsertItem( TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM, g_TokAttachmentName.GetString(it->first), 1, 1, 0, 0, (LPARAM)(it->second), NULL, TVI_LAST ); } parser.Close(); } static void PrintIndent( const int n, FILE* fp ) { for( int i = 0; i < n; ++i ) { fprintf( fp, "\t" ); } } void CPageGCMDSAttachmentSet::Save() { if( NULL == m_rpGCMDS ) { return; } FILE* fp; CString strIndexFileName(m_rpGCMDS->GetNameString()); strIndexFileName += "_attachment_index.txt"; fp = fopen( strIndexFileName, "wt" ); if( NULL == fp ) { return; } int nIndent = 0; HTREEITEM hItem = m_ctrlAttachmentTree.GetChildItem( NULL ); HTREEITEM hParent = NULL; char szTmp[300]; TVITEM tvitem; tvitem.mask = TVIF_PARAM | TVIF_TEXT; tvitem.pszText = szTmp; tvitem.cchTextMax = 300; while( !(NULL == hItem && hParent == NULL) ) { if( hItem ) { tvitem.hItem = hItem; m_ctrlAttachmentTree.GetItem( &tvitem ); if( 0 == tvitem.lParam ) // group name { PrintIndent( nIndent, fp ); fprintf( fp, "*%s\n", szTmp ); ++nIndent; hParent = hItem; hItem = m_ctrlAttachmentTree.GetChildItem( hItem ); } else // item name { PrintIndent( nIndent, fp ); fprintf( fp, "%s\n", szTmp ); hItem = m_ctrlAttachmentTree.GetNextSiblingItem( hItem ); } } if( NULL == hItem ) { if( NULL != hParent ) { // move up 1 level hItem = m_ctrlAttachmentTree.GetNextSiblingItem( hParent ); hParent = m_ctrlAttachmentTree.GetParentItem( hParent ); PrintIndent( --nIndent, fp ); fprintf( fp, ";\n\n" ); } } } fclose(fp); } void CPageGCMDSAttachmentSet::UpdateWeaponTypeControl( Z3DATTACHMENTINFO* pAttachmentInfo ) { if( NULL == pAttachmentInfo ) { m_ctrlWeaponType.SetCurSel( -1 ); return; } m_ctrlWeaponType.SetCurSel( pAttachmentInfo->lType ); } void CPageGCMDSAttachmentSet::UpdateMeshNameControl( Z3DATTACHMENTINFO* pAttachmentInfo ) { if( NULL == pAttachmentInfo ) { m_ctrlMeshName.SetWindowText( "" ); return; } m_ctrlMeshName.SetWindowText( g_TokFileName.GetString(pAttachmentInfo->tokMeshFile) ); } void CPageGCMDSAttachmentSet::UpdateTextureNameControl( Z3DATTACHMENTINFO* pAttachmentInfo ) { if( NULL == pAttachmentInfo ) { m_ctrlTextureName.SetWindowText( "" ); return; } m_ctrlTextureName.SetWindowText( g_TokFileName.GetString(pAttachmentInfo->tokTextureFile) ); } void CPageGCMDSAttachmentSet::UpdateHolderListControl( Z3DATTACHMENTINFO* pAttachmentInfo ) { char szTmp[100]; m_ctrlHolderList.DeleteAllItems(); if( NULL == pAttachmentInfo ) { return; } for( int i = 0; i < pAttachmentInfo->lHolderCount; ++i ) { m_ctrlHolderList.InsertItem( i, itoa(i, szTmp, 10 ) ); m_ctrlHolderList.SetItemText( i, 1, g_TokSkeletonPartName.GetString( pAttachmentInfo->pHolderInfo[i].tokSkelPart ) ); sprintf( szTmp, "%f %f %f", pAttachmentInfo->pHolderInfo[i].vPos.x, pAttachmentInfo->pHolderInfo[i].vPos.y, pAttachmentInfo->pHolderInfo[i].vPos.z ); m_ctrlHolderList.SetItemText( i, 2, szTmp ); sprintf( szTmp, "%f %f %f %f", pAttachmentInfo->pHolderInfo[i].qRot.x, pAttachmentInfo->pHolderInfo[i].qRot.y, pAttachmentInfo->pHolderInfo[i].qRot.z, pAttachmentInfo->pHolderInfo[i].qRot.w ); m_ctrlHolderList.SetItemText( i, 3, szTmp ); } } void CPageGCMDSAttachmentSet::OnSelchangedTreeAttachmentset(NMHDR* pNMHDR, LRESULT* pResult) { NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR; // TODO: Add your control notification handler code here Z3DATTACHMENTINFO* pAttachmentInfo = (Z3DATTACHMENTINFO*)(pNMTreeView->itemNew.lParam); UpdateWeaponTypeControl( pAttachmentInfo ); UpdateMeshNameControl( pAttachmentInfo ); UpdateTextureNameControl( pAttachmentInfo ); UpdateHolderListControl( pAttachmentInfo ); *pResult = 0; }