// PageGCMDSOutfitSet.cpp : implementation file // #include "stdafx.h" #include "worldcreator.h" #include "PageGCMDSOutfitSet.h" #include "SimpleParser.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CPageGCMDSOutfitSet property page IMPLEMENT_DYNCREATE(CPageGCMDSOutfitSet, CPropertyPage) CPageGCMDSOutfitSet::CPageGCMDSOutfitSet() : CPropertyPage(CPageGCMDSOutfitSet::IDD) { //{{AFX_DATA_INIT(CPageGCMDSOutfitSet) //}}AFX_DATA_INIT m_rpGCMDS = NULL; } CPageGCMDSOutfitSet::~CPageGCMDSOutfitSet() { } void CPageGCMDSOutfitSet::DoDataExchange(CDataExchange* pDX) { CPropertyPage::DoDataExchange(pDX); //{{AFX_DATA_MAP(CPageGCMDSOutfitSet) DDX_Control(pDX, IDC_CHECK_LINK, m_ctrlLink); DDX_Control(pDX, IDC_TREE_OUTFITSET, m_ctrlOutfitSetTree); DDX_Control(pDX, IDC_LIST_MESHTEXTURE, m_ctrlMeshTexture); DDX_Control(pDX, IDC_COMBO_OUTFITSLOT, m_ctrlOutfitSlot); DDX_Control(pDX, IDC_COMBO_OUTFIT, m_ctrlOutfit); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CPageGCMDSOutfitSet, CPropertyPage) //{{AFX_MSG_MAP(CPageGCMDSOutfitSet) ON_BN_CLICKED(IDC_CHECK_LINK, OnCheckLink) ON_NOTIFY(TVN_SELCHANGED, IDC_TREE_OUTFITSET, OnSelchangedTreeOutfitset) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CPageGCMDSOutfitSet message handlers BOOL CPageGCMDSOutfitSet::OnInitDialog() { CPropertyPage::OnInitDialog(); // TODO: Add extra initialization here m_ImgTreeIcon.Create( IDB_TREEICON, 16, 2, RGB(255,255,255) ); m_ctrlOutfitSetTree.SetImageList( &m_ImgTreeIcon, TVSIL_NORMAL ); DWORD dwExtStyle; dwExtStyle = m_ctrlMeshTexture.GetExtendedStyle(); dwExtStyle |= LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES; m_ctrlMeshTexture.SetExtendedStyle( dwExtStyle ); m_ctrlMeshTexture.InsertColumn( 0, "Mesh", LVCFMT_LEFT, 110 ); m_ctrlMeshTexture.InsertColumn( 1, "Texture", LVCFMT_LEFT, 110 ); ToggleByLinkState(); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void CPageGCMDSOutfitSet::UpdateDataByGCMDS( CZ3DGCMDS* pGCMDS ) { if( NULL == pGCMDS ) { return; } m_rpGCMDS = pGCMDS; UpdateOufitSetList( pGCMDS ); UpdateLinkComboBox( pGCMDS ); UpdateOutfitSetProperty( NULL ); } void CPageGCMDSOutfitSet::UpdateLinkComboBox( CZ3DGCMDS* pGCMDS ) { m_ctrlOutfitSlot.ResetContent(); m_ctrlOutfit.ResetContent(); std::vector* pSlot; std::vector* pSlotOC; pGCMDS->RetrieveOutfitSlot( pSlot, pSlotOC ); for( int i = 0; i < pSlot->size(); ++i ) { m_ctrlOutfitSlot.InsertString( -1, g_TokSlotName.GetString( (*pSlot)[i] ) ); } std::map* pMap; std::map::iterator it; pGCMDS->RetrieveOutfitList( pMap ); for( it = pMap->begin(); it != pMap->end(); ++it ) { m_ctrlOutfit.InsertString( -1, g_TokOutfitName.GetString( it->first ) ); } } void CPageGCMDSOutfitSet::UpdateOufitSetList( CZ3DGCMDS* pGCMDS ) { CSimpleParser parser; CString strIndexFileName(pGCMDS->GetNameString()); strIndexFileName += "_outfit_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 ); } m_ctrlOutfitSetTree.DeleteAllItems(); char* szToken; HTREEITEM hParent = NULL; // root HTREEITEM hItem; std::map* pmap; pGCMDS->RetrieveOutfitList( pmap ); std::map mapTok2OutfitInfo( *pmap ); std::map::iterator it; while( szToken = parser.GetNextToken() ) { if( 0 == stricmp( szToken, "*" ) ) // begin with asterisk -> group name { szToken = parser.GetNextToken(); hItem = m_ctrlOutfitSetTree.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_ctrlOutfitSetTree.GetParentItem( hParent ); } else { Z3DTOK tok = g_TokOutfitName.GetTOK( szToken ); it = mapTok2OutfitInfo.find( tok ); if( mapTok2OutfitInfo.end() != it ) { hItem = m_ctrlOutfitSetTree.InsertItem( TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM, szToken, 1, 1, 0, 0, (LPARAM)(it->second), hParent, TVI_LAST ); mapTok2OutfitInfo.erase( it ); } } } for( it = mapTok2OutfitInfo.begin(); it != mapTok2OutfitInfo.end(); ++it ) { hItem = m_ctrlOutfitSetTree.InsertItem( TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM, g_TokOutfitName.GetString(it->first), 1, 1, 0, 0, (LPARAM)(it->second), NULL, TVI_LAST ); } parser.Close(); } void CPageGCMDSOutfitSet::UpdateOutfitSetProperty( Z3DOUTFITINFO* pOutfitInfo ) { m_ctrlMeshTexture.DeleteAllItems(); m_ctrlOutfitSlot.SetCurSel( -1 ); m_ctrlOutfit.SetCurSel( -1 ); if( NULL == pOutfitInfo ) { m_ctrlLink.SetCheck( 0 ); ToggleByLinkState(); return; } for( int i = 0; i < pOutfitInfo->lCount; ++i ) { m_ctrlMeshTexture.InsertItem( i, g_TokFileName.GetString( pOutfitInfo->pTokMeshName[i] ) ); m_ctrlMeshTexture.SetItemText( i, 1, g_TokFileName.GetString( pOutfitInfo->pTokTextureName[i] ) ); } if( NULL_TOK == pOutfitInfo->tokLinkSlot ) { m_ctrlOutfit.SetCurSel( -1 ); m_ctrlOutfitSlot.SetCurSel( -1 ); m_ctrlLink.SetCheck( 0 ); } else { int nIdx = m_ctrlOutfitSlot.FindStringExact(-1, g_TokSlotName.GetString(pOutfitInfo->tokLinkSlot) ); m_ctrlOutfitSlot.SetCurSel( nIdx ); nIdx = m_ctrlOutfit.FindStringExact(-1, g_TokOutfitName.GetString(pOutfitInfo->tokLinkOutfit) ); m_ctrlOutfit.SetCurSel( nIdx ); m_ctrlLink.SetCheck( 1 ); } ToggleByLinkState(); } void CPageGCMDSOutfitSet::ToggleByLinkState() { if( 1 == m_ctrlLink.GetCheck() ) { m_ctrlOutfitSlot.EnableWindow( TRUE ); m_ctrlOutfit.EnableWindow( TRUE ); } else { m_ctrlOutfitSlot.EnableWindow( FALSE ); m_ctrlOutfit.EnableWindow( FALSE ); } } void CPageGCMDSOutfitSet::OnCheckLink() { // TODO: Add your control notification handler code here ToggleByLinkState(); } static void PrintIndent( const int n, FILE* fp ) { for( int i = 0; i < n; ++i ) { fprintf( fp, "\t" ); } } void CPageGCMDSOutfitSet::Save() { if( NULL == m_rpGCMDS ) { return; } FILE* fp; CString strIndexFileName(m_rpGCMDS->GetNameString()); strIndexFileName += "_outfit_index.txt"; fp = fopen( strIndexFileName, "wt" ); if( NULL == fp ) { return; } int nIndent = 0; HTREEITEM hItem = m_ctrlOutfitSetTree.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_ctrlOutfitSetTree.GetItem( &tvitem ); if( 0 == tvitem.lParam ) // group name { PrintIndent( nIndent, fp ); fprintf( fp, "*%s\n", szTmp ); ++nIndent; hParent = hItem; hItem = m_ctrlOutfitSetTree.GetChildItem( hItem ); } else // item name { PrintIndent( nIndent, fp ); fprintf( fp, "%s\n", szTmp ); hItem = m_ctrlOutfitSetTree.GetNextSiblingItem( hItem ); } } if( NULL == hItem ) { if( NULL != hParent ) { // move up 1 level hItem = m_ctrlOutfitSetTree.GetNextSiblingItem( hParent ); hParent = m_ctrlOutfitSetTree.GetParentItem( hParent ); PrintIndent( --nIndent, fp ); fprintf( fp, ";\n\n" ); } } } fclose(fp); } void CPageGCMDSOutfitSet::OnSelchangedTreeOutfitset(NMHDR* pNMHDR, LRESULT* pResult) { NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR; // TODO: Add your control notification handler code here UpdateOutfitSetProperty( (Z3DOUTFITINFO*)(pNMTreeView->itemNew.lParam) ); *pResult = 0; }