// PageGCMDSListContainer.cpp : implementation file // #include "stdafx.h" #include "worldcreator.h" #include "PageGCMDSListContainer.h" #include "SimpleParser.h" #include "Z3DGeneralChrModel.h" #include #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CPageGCMDSListContainer property page IMPLEMENT_DYNCREATE(CPageGCMDSListContainer, CPropertyPage) CPageGCMDSListContainer::CPageGCMDSListContainer() : CPropertyPage(CPageGCMDSListContainer::IDD) { //{{AFX_DATA_INIT(CPageGCMDSListContainer) // NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT m_pDlgChrOutfit = NULL; m_pDlgEditGCMDS = NULL; m_bEditGCMDSMode = false; m_pChrModel = NULL; } CPageGCMDSListContainer::~CPageGCMDSListContainer() { SAFE_DELETE( m_pDlgChrOutfit ); SAFE_DELETE( m_pChrModel ); } void CPageGCMDSListContainer::DoDataExchange(CDataExchange* pDX) { CPropertyPage::DoDataExchange(pDX); //{{AFX_DATA_MAP(CPageGCMDSListContainer) DDX_Control(pDX, IDC_TREEGCMDSLIST, m_TreeGCMDSList); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CPageGCMDSListContainer, CPropertyPage) //{{AFX_MSG_MAP(CPageGCMDSListContainer) ON_WM_DESTROY() ON_NOTIFY(NM_DBLCLK, IDC_TREEGCMDSLIST, OnDblclkTreegcmdslist) ON_NOTIFY(TVN_KEYDOWN, IDC_TREEGCMDSLIST, OnKeydownTreegcmdslist) ON_WM_PARENTNOTIFY() ON_MESSAGE(WM_CHILD_CLOSE, OnChildClose) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CPageGCMDSListContainer message handlers BOOL CPageGCMDSListContainer::OnInitDialog() { CPropertyPage::OnInitDialog(); // TODO: Add extra initialization here m_ImgTreeIcon.Create( IDB_TREEICON, 16, 2, RGB(255,255,255) ); m_TreeGCMDSList.SetImageList( &m_ImgTreeIcon, TVSIL_NORMAL ); CWorldCreatorApp* pApp = (CWorldCreatorApp*)AfxGetApp(); CString strTmp; strTmp.Format( "%s\\GCMDSIndex.txt", pApp->m_strAppPath ); LoadGCMDSIndex( strTmp ); m_pDlgChrOutfit = new CDlgChrOutfit; m_pDlgChrOutfit->Create(this); m_pDlgChrOutfit->SetWindowPos( NULL, 0, 640, 0, 0, SWP_NOSIZE | SWP_NOZORDER ); m_pDlgEditGCMDS = new CDlgEditGCMDS; m_pDlgEditGCMDS->Create(this); m_pDlgEditGCMDS->SetWindowPos( NULL, 0, 200, 0, 0, SWP_NOSIZE | SWP_NOZORDER ); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } bool CPageGCMDSListContainer::LoadGCMDSIndex(const char *szFilename) { CSimpleParser parser; std::vector vecGCMDSName; if( false == parser.OpenFile( szFilename, NULL ) ) { FILE* fp = fopen( szFilename, "wt" ); if( NULL == fp ) { return false; } fclose( fp ); // just creating empty file } m_TreeGCMDSList.DeleteAllItems(); char* szToken; HTREEITEM hParent = NULL; // root HTREEITEM hItem; /*CMainFrame* pMainFrame = (CMainFrame*)AfxGetApp()->m_pMainWnd; CWorldCreatorView* pView = pMainFrame->GetActiveView(); CCharacterControl& rChrControl = pView->m_ChrManager;*/ CZ3DGeneralChrModel::_RetrieveCMDSNameList( vecGCMDSName ); while( szToken = parser.GetNextToken() ) { if( 0 == stricmp( szToken, "*" ) ) // begin with asterisk -> group name { szToken = parser.GetNextToken(); hItem = m_TreeGCMDSList.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_TreeGCMDSList.GetParentItem( hParent ); } else { std::vector::iterator it; for( it = vecGCMDSName.begin(); it != vecGCMDSName.end(); it++ ) { if( 0 == stricmp( *it, szToken ) ) { vecGCMDSName.erase( it ); hItem = m_TreeGCMDSList.InsertItem( TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM, szToken, 1, 1, 0, 0, 1, hParent, TVI_LAST ); break; } } } } for( int i = 0; i < vecGCMDSName.size(); ++i ) { hItem = m_TreeGCMDSList.InsertItem( TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM, vecGCMDSName[i], 1, 1, 0, 0, 1, NULL, TVI_LAST ); } //m_TreeGCMDSList.SortChildren( NULL ); parser.Close(); return true; } void CPageGCMDSListContainer::OnDestroy() { CPropertyPage::OnDestroy(); // TODO: Add your message handler code here CWorldCreatorApp* pApp = (CWorldCreatorApp*)AfxGetApp(); CString strTmp; strTmp.Format( "%s\\GCMDSIndex.txt", pApp->m_strAppPath ); SaveGCMDSIndex( strTmp ); m_pDlgChrOutfit->DestroyWindow(); } static void PrintIndent( const int n, FILE* fp ) { for( int i = 0; i < n; ++i ) { fprintf( fp, "\t" ); } } bool CPageGCMDSListContainer::SaveGCMDSIndex(const char *szFilename) { FILE* fp; fp = fopen( szFilename, "wt" ); if( NULL == fp ) { return false; } int nIndent = 0; HTREEITEM hItem = m_TreeGCMDSList.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_TreeGCMDSList.GetItem( &tvitem ); if( 0 == tvitem.lParam ) // group name { PrintIndent( nIndent, fp ); fprintf( fp, "*%s\n", szTmp ); ++nIndent; hParent = hItem; hItem = m_TreeGCMDSList.GetChildItem( hItem ); } else if( 1 == tvitem.lParam ) // file name { PrintIndent( nIndent, fp ); fprintf( fp, "%s\n", szTmp ); hItem = m_TreeGCMDSList.GetNextSiblingItem( hItem ); } } if( NULL == hItem ) { if( NULL != hParent ) { // move up 1 level hItem = m_TreeGCMDSList.GetNextSiblingItem( hParent ); hParent = m_TreeGCMDSList.GetParentItem( hParent ); PrintIndent( --nIndent, fp ); fprintf( fp, ";\n" ); } } } fclose(fp); return true; } void CPageGCMDSListContainer::OnDblclkTreegcmdslist(NMHDR* pNMHDR, LRESULT* pResult) { // TODO: Add your control notification handler code here BeginGCMDSEdit(); *pResult = 0; } void CPageGCMDSListContainer::OnKeydownTreegcmdslist(NMHDR* pNMHDR, LRESULT* pResult) { TV_KEYDOWN* pTVKeyDown = (TV_KEYDOWN*)pNMHDR; // TODO: Add your control notification handler code here if( VK_RETURN == pTVKeyDown->wVKey ) { BeginGCMDSEdit(); } *pResult = 0; } void CPageGCMDSListContainer::BeginGCMDSEdit() { TVITEM tvitem; char szTmp[300]; POINT pt; ::GetCursorPos( &pt ); m_TreeGCMDSList.ScreenToClient( &pt ); UINT uFlag = TVHT_ONITEM; tvitem.hItem = m_TreeGCMDSList.HitTest( CPoint(pt), &uFlag ); //tvitem.hItem = m_TreeGCMDSList.GetSelectedItem(); if( NULL == tvitem.hItem ) { return; } tvitem.mask = TVIF_TEXT | TVIF_PARAM; tvitem.pszText = szTmp; tvitem.cchTextMax = 300; m_TreeGCMDSList.GetItem( &tvitem ); if( 0 == tvitem.lParam ) // lParam == 0 -> group name { return; } m_pDlgEditGCMDS->SetGCMDSFile( tvitem.pszText ); m_bEditGCMDSMode = true; m_pDlgEditGCMDS->ShowWindow(SW_SHOW); m_TreeGCMDSList.EnableWindow( FALSE ); //CMainFrame *mf = (CMainFrame*)AfxGetApp()->m_pMainWnd; //CWorldCreatorView* av = (CWorldCreatorView*)mf->GetActiveView(); //av->m_ChrManager. CZ3DCharacterModel::GetTotalCharacterCount(); m_pChrModel = new CZ3DEditorGeneralChrModel; m_pChrModel->Init( tvitem.pszText ); } void CPageGCMDSListContainer::EndGCMDSEdit() { SAFE_DELETE( m_pChrModel ); m_bEditGCMDSMode = false; m_pDlgEditGCMDS->ShowWindow(SW_HIDE); m_TreeGCMDSList.EnableWindow( TRUE ); } BOOL CPageGCMDSListContainer::OnSetActive() { // TODO: Add your specialized code here and/or call the base class m_pDlgChrOutfit->ShowWindow(SW_SHOW); if( m_bEditGCMDSMode ) { m_pDlgEditGCMDS->ShowWindow(SW_SHOW); } return CPropertyPage::OnSetActive(); } BOOL CPageGCMDSListContainer::OnKillActive() { // TODO: Add your specialized code here and/or call the base class m_pDlgChrOutfit->ShowWindow(SW_HIDE); m_pDlgEditGCMDS->ShowWindow(SW_HIDE); return CPropertyPage::OnKillActive(); } LRESULT CPageGCMDSListContainer::OnChildClose(WPARAM wParam, LPARAM lParam) { if( (CDlgEditGCMDS*)wParam == m_pDlgEditGCMDS ) { EndGCMDSEdit(); } return 0; }