Files
Client/GameTools/WORLDCREATOR/PageGCMDSListContainer.cpp
LGram16 dd97ddec92 Restructure repository to include all source folders
Move git root from Client/ to src/ to track all source code:
- Client: Game client source (moved to Client/Client/)
- Server: Game server source
- GameTools: Development tools
- CryptoSource: Encryption utilities
- database: Database scripts
- Script: Game scripts
- rylCoder_16.02.2008_src: Legacy coder tools
- GMFont, Game: Additional resources

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-29 20:17:20 +09:00

355 lines
8.1 KiB
C++

// PageGCMDSListContainer.cpp : implementation file
//
#include "stdafx.h"
#include "worldcreator.h"
#include "PageGCMDSListContainer.h"
#include "SimpleParser.h"
#include "Z3DGeneralChrModel.h"
#include <algorithm>
#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<const char*> 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<const char*>::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;
}