|
|
//========= Copyright � 1996-2005, Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
// $NoKeywords: $
//
//=============================================================================//
// RunMapExpertDlg.cpp : implementation file
//
#include "stdafx.h"
#include "hammer.h"
#include "RunMapExpertDlg.h"
#include "RunMapCfgDlg.h"
#include "mapdoc.h"
#include "gridnav.h"
// memdbgon must be the last include file in a .cpp file!!!
#include <tier0/memdbgon.h>
/////////////////////////////////////////////////////////////////////////////
// CRunMapExpertDlg dialog
CRunMapExpertDlg::CRunMapExpertDlg(CWnd* pParent /*=NULL*/) : CDialog(CRunMapExpertDlg::IDD, pParent) { //{{AFX_DATA_INIT(CRunMapExpertDlg)
//}}AFX_DATA_INIT
m_pActiveSequence = NULL; m_bNoUpdateCmd = FALSE; m_bSwitchMode = FALSE; m_bWaitForKeypress = FALSE; }
void CRunMapExpertDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CRunMapExpertDlg)
DDX_Control(pDX, IDC_CONFIGURATIONS, m_cCmdSequences); DDX_Control(pDX, IDC_MOVEUP, m_cMoveUp); DDX_Control(pDX, IDC_MOVEDOWN, m_cMoveDown); DDX_Control(pDX, IDC_ENSUREFN, m_cEnsureFn); DDX_Control(pDX, IDC_ENSURECHECK, m_cEnsureCheck); DDX_Control(pDX, IDC_PARAMETERS, m_cParameters); DDX_Control(pDX, IDC_COMMAND, m_cCommand); DDX_Check(pDX, IDC_WAITFORKEYPRESS, m_bWaitForKeypress); //}}AFX_DATA_MAP
DDX_Control(pDX, IDC_COMMANDLIST, m_cCommandList); }
// dvs: this is duplicated in OPTBuild.cpp!!
enum { id_InsertParmMapFileNoExt = 0x100, id_InsertParmMapFile, id_InsertParmMapPath, id_InsertParmBspDir, id_InsertParmExeDir, id_InsertParmGameDir,
id_InsertParmEnd };
enum { id_BrExecutable = 0x150, id_BrChangeDir, id_BrCopyFile, id_BrDelFile, id_BrRenameFile,
id_BrGameProgram, id_BrVISProgram, id_BrBSPProgram, id_BrLIGHTProgram,
id_BrGenerateGridNav,
id_BrEnd };
BEGIN_MESSAGE_MAP(CRunMapExpertDlg, CDialog) //{{AFX_MSG_MAP(CRunMapExpertDlg)
ON_BN_CLICKED(IDC_BROWSECOMMAND, OnBrowsecommand) ON_LBN_SELCHANGE(IDC_COMMANDLIST, OnSelchangeCommandlist) ON_BN_CLICKED(IDC_INSERTPARM, OnInsertparm) ON_BN_CLICKED(IDC_MOVEDOWN, OnMovedown) ON_BN_CLICKED(IDC_MOVEUP, OnMoveup) ON_BN_CLICKED(IDC_NEW, OnNew) ON_BN_CLICKED(IDC_NORMAL, OnNormal) ON_BN_CLICKED(IDC_REMOVE, OnRemove) ON_EN_UPDATE(IDC_COMMAND, OnUpdateCommand) ON_EN_UPDATE(IDC_PARAMETERS, OnUpdateParameters) ON_BN_CLICKED(IDC_ENSURECHECK, OnEnsurecheck) ON_EN_UPDATE(IDC_ENSUREFN, OnUpdateEnsurefn) ON_CBN_SELCHANGE(IDC_CONFIGURATIONS, OnSelchangeConfigurations) ON_BN_CLICKED(IDC_EDITCONFIGS, OnEditconfigs) ON_COMMAND_EX_RANGE(id_InsertParmMapFileNoExt, id_InsertParmEnd, HandleInsertParm) ON_COMMAND_EX_RANGE(id_BrExecutable, id_BrEnd, HandleInsertCommand) //}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CRunMapExpertDlg message handlers
BOOL CRunMapExpertDlg::HandleInsertCommand(UINT nID) // insert a parm at the current cursor location into the parameters
// edit control
{ PCCOMMAND pCommand = GetCommandAtIndex(NULL);
if(!pCommand) return TRUE; // no command
if(nID == id_BrExecutable) { CFileDialog dlg(TRUE, "exe", NULL, OFN_HIDEREADONLY | OFN_FILEMUSTEXIST | OFN_NOCHANGEDIR, "Executable Files|*.exe||", this); if(dlg.DoModal() == IDCANCEL) return TRUE; m_cCommand.SetWindowText(dlg.m_ofn.lpstrFile); pCommand->iSpecialCmd = 0; } else { pCommand->iSpecialCmd = 0;
switch(nID) { case id_BrCopyFile: pCommand->iSpecialCmd = CCCopyFile; break; case id_BrDelFile: pCommand->iSpecialCmd = CCDelFile; break; case id_BrRenameFile: pCommand->iSpecialCmd = CCRenameFile; break; case id_BrChangeDir: pCommand->iSpecialCmd = CCChangeDir; break; case id_BrGameProgram: m_cCommand.SetWindowText("$game_exe"); break; case id_BrVISProgram: m_cCommand.SetWindowText("$vis_exe"); break; case id_BrLIGHTProgram: m_cCommand.SetWindowText("$light_exe"); break; case id_BrBSPProgram: m_cCommand.SetWindowText("$bsp_exe"); break; case id_BrGenerateGridNav: pCommand->iSpecialCmd = CCGenerateGridNav; break; }
if(pCommand->iSpecialCmd) pCommand->bLongFilenames = TRUE;
OnSelchangeCommandlist(); UpdateCommandWithEditFields(-1); }
return TRUE; }
void CRunMapExpertDlg::OnBrowsecommand(void) { CMenu menu; menu.CreatePopupMenu(); menu.AppendMenu(MF_STRING, id_BrExecutable, "Executable"); menu.AppendMenu(MF_STRING, id_BrChangeDir, "Change Directory"); menu.AppendMenu(MF_STRING, id_BrCopyFile, "Copy File"); menu.AppendMenu(MF_STRING, id_BrDelFile, "Delete File"); menu.AppendMenu(MF_STRING, id_BrRenameFile, "Rename File"); menu.AppendMenu(MF_SEPARATOR); menu.AppendMenu(MF_STRING, id_BrBSPProgram, "BSP program"); menu.AppendMenu(MF_STRING, id_BrVISProgram, "VIS program"); menu.AppendMenu(MF_STRING, id_BrLIGHTProgram, "LIGHT program"); menu.AppendMenu(MF_STRING, id_BrGameProgram, "Game program");
// the generate grid nav command only appears if grid nav is enabled
CMapDoc* pMapDoc = CMapDoc::GetActiveMapDoc(); if ( pMapDoc && pMapDoc->GetGridNav() && pMapDoc->GetGridNav()->IsEnabled() ) { menu.AppendMenu(MF_SEPARATOR); menu.AppendMenu(MF_STRING, id_BrGenerateGridNav, "Generate Grid Nav"); }
// track menu
CWnd *pButton = GetDlgItem(IDC_BROWSECOMMAND); CRect r; pButton->GetWindowRect(r); menu.TrackPopupMenu(TPM_LEFTALIGN | TPM_LEFTBUTTON, r.left, r.bottom, this, NULL); }
LPCTSTR CRunMapExpertDlg::GetCmdString(PCCOMMAND pCommand) { switch(pCommand->iSpecialCmd) { case 0: return pCommand->szRun; case CCCopyFile: return "Copy File"; case CCDelFile: return "Delete File"; case CCRenameFile: return "Rename File"; case CCChangeDir: return "Change Directory"; case CCGenerateGridNav: return "Generate Grid Nav"; }
return ""; }
void CRunMapExpertDlg::OnSelchangeCommandlist() { int iIndex = -1;
// change the selection in the command list - update the command
// and parameters edit boxes
PCCOMMAND pCommand = GetCommandAtIndex(&iIndex); // enable/disable controls
BOOL bEnable = pCommand ? TRUE : FALSE; int iEnableCmds[] = { // edit fields:
IDC_COMMAND, IDC_PARAMETERS, IDC_ENSUREFN,
// checkboxes/buttons:
IDC_ENSURECHECK, IDC_INSERTPARM, IDC_BROWSECOMMAND,
-1 };
m_bNoUpdateCmd = TRUE; for(int i = 0; iEnableCmds[i] != -1; i++) { CWnd *pWnd = GetDlgItem(iEnableCmds[i]); pWnd->EnableWindow(bEnable); if(bEnable == FALSE) { // ensure fields are cleared if we're disabling them
if(i < 3) pWnd->SetWindowText(""); else ((CButton*)pWnd)->SetCheck(0); } } m_bNoUpdateCmd = FALSE;
if(!pCommand) return;
// set moveup/movedown buttons
m_cMoveUp.EnableWindow(iIndex != 0); m_cMoveDown.EnableWindow(iIndex != m_cCommandList.GetCount() - 1); m_bNoUpdateCmd = TRUE;
m_cCommand.SetWindowText(GetCmdString(pCommand)); m_cParameters.SetWindowText(pCommand->szParms); m_cEnsureCheck.SetCheck(pCommand->bEnsureCheck); m_cEnsureFn.SetWindowText(pCommand->szEnsureFn); // don't forget to call this:
OnEnsurecheck();
m_bNoUpdateCmd = FALSE; }
BOOL CRunMapExpertDlg::HandleInsertParm(UINT nID) // insert a parm at the current cursor location into the parameters
// edit control
{ LPCTSTR pszInsert;
switch (nID) { case id_InsertParmMapFileNoExt: pszInsert = "$file"; break; case id_InsertParmMapFile: pszInsert = "$file.$ext"; break; case id_InsertParmMapPath: pszInsert = "$path"; break; case id_InsertParmExeDir: pszInsert = "$exedir"; break; case id_InsertParmBspDir: pszInsert = "$bspdir"; break; case id_InsertParmGameDir: default: pszInsert = "$gamedir"; break; }
Assert(pszInsert); if(!pszInsert) return TRUE;
m_cParameters.ReplaceSel(pszInsert);
return TRUE; }
void CRunMapExpertDlg::OnInsertparm(void) { // two stages - name/description OR data itself
CMenu menu; menu.CreatePopupMenu(); menu.AppendMenu(MF_STRING, id_InsertParmMapFileNoExt, "Map Filename (no extension)"); menu.AppendMenu(MF_STRING, id_InsertParmMapFile, "Map Filename (with extension)"); menu.AppendMenu(MF_STRING, id_InsertParmMapPath, "Map Path (no filename)"); menu.AppendMenu(MF_SEPARATOR); menu.AppendMenu(MF_STRING, id_InsertParmExeDir, "Game Executable Directory"); menu.AppendMenu(MF_STRING, id_InsertParmBspDir, "BSP Directory"); menu.AppendMenu(MF_STRING, id_InsertParmGameDir, "Game Directory");
// track menu
CWnd *pButton = GetDlgItem(IDC_INSERTPARM); CRect r; pButton->GetWindowRect(r); menu.TrackPopupMenu(TPM_LEFTALIGN | TPM_LEFTBUTTON, r.left, r.bottom, this, NULL); }
void CRunMapExpertDlg::DeleteCommand(int iIndex) { // kill the command at that index (deletes the dataptr memory too)
PCCOMMAND pCommand = GetCommandAtIndex(&iIndex); m_cCommandList.DeleteString(iIndex);
if(iIndex >= m_cCommandList.GetCount()-1) iIndex = m_cCommandList.GetCount()-1;
m_cCommandList.SetCurSel(iIndex); // selection has "changed"
OnSelchangeCommandlist();
delete pCommand; }
void CRunMapExpertDlg::AddCommand(int iIndex, PCCOMMAND pCommand) { // add a command to the list at the index specified in iIndex (-1 to add
// at end of list.)
CString str; str.Format("%s %s", GetCmdString(pCommand), pCommand->szParms); iIndex = m_cCommandList.InsertString(iIndex, str); m_cCommandList.SetItemDataPtr(iIndex, PVOID(pCommand)); }
void CRunMapExpertDlg::MoveCommand(int iIndex, BOOL bUp) { PCCOMMAND pCommand = GetCommandAtIndex(&iIndex); if(!pCommand) return;
// keep check state of item in listbox
BOOL bChecked = m_cCommandList.GetCheck(iIndex);
// don't bother with the string - that's made from the command/parms
// struct that the item's dataptr points to
m_cCommandList.DeleteString(iIndex);
int iNewIndex = iIndex + (bUp ? -1 : +1); AddCommand(iNewIndex, pCommand);
// restore check state saved above
m_cCommandList.SetCheck(iNewIndex, bChecked);
// selection has changed
m_cCommandList.SetCurSel(iNewIndex); OnSelchangeCommandlist(); }
void CRunMapExpertDlg::OnMovedown() { MoveCommand(-1, FALSE); }
void CRunMapExpertDlg::OnMoveup() { MoveCommand(-1, TRUE); }
void CRunMapExpertDlg::OnNew() { // add a command
PCCOMMAND pCommand = new CCOMMAND; memset(pCommand, 0, sizeof(CCOMMAND)); AddCommand(-1, pCommand); m_cCommandList.SetCurSel(m_cCommandList.GetCount()-1); // sleection has changed
OnSelchangeCommandlist(); }
void CRunMapExpertDlg::OnNormal() { m_bSwitchMode = TRUE; SaveCommandsToSequence();
CHammer *pApp = (CHammer*) AfxGetApp(); pApp->SaveSequences();
UpdateData(); EndDialog(IDOK); }
void CRunMapExpertDlg::UpdateCommandWithEditFields(int iIndex) { PCCOMMAND pCommand = GetCommandAtIndex(&iIndex); // update command struct with edit fields:
m_cCommand.GetWindowText(pCommand->szRun, MAX_PATH); m_cParameters.GetWindowText(pCommand->szParms, MAX_PATH); m_cEnsureFn.GetWindowText(pCommand->szEnsureFn, MAX_PATH); pCommand->bEnsureCheck = m_cEnsureCheck.GetCheck();
// save checked state..
BOOL bCmdChecked = m_cCommandList.GetCheck(iIndex);
// update list by deleting/adding command
m_cCommandList.SetRedraw(FALSE); m_cCommandList.DeleteString(iIndex); AddCommand(iIndex, pCommand); m_cCommandList.SetCurSel(iIndex); m_cCommandList.SetRedraw(TRUE); m_cCommandList.Invalidate();
m_cCommandList.SetCheck(iIndex, bCmdChecked);
// DON'T call OnCommandlistSelchange() here
}
PCCOMMAND CRunMapExpertDlg::GetCommandAtIndex(int *piIndex) { // make sure we're pointing at something:
int iIndex = -1; if(piIndex == NULL) piIndex = &iIndex; // return the current command structure
if(piIndex[0] == -1) piIndex[0] = m_cCommandList.GetCurSel(); if(piIndex[0] == LB_ERR) return NULL; PCCOMMAND pCommand = PCCOMMAND(m_cCommandList.GetItemDataPtr(piIndex[0])); return pCommand; }
void CRunMapExpertDlg::OnRemove() { // kill the current command
int iIndex = m_cCommandList.GetCurSel(); if(iIndex == LB_ERR) return; DeleteCommand(iIndex); }
void CRunMapExpertDlg::OnUpdateCommand() { if(!m_bNoUpdateCmd) { // make sure no special command is contained here ..
// (this is only ever called when the user types
// in the command edit field.)
PCCOMMAND pCommand = GetCommandAtIndex(NULL); if(pCommand->iSpecialCmd) { // clear out command .. set the noupdatecmd
// flag so we don't get into a stack overflow
m_bNoUpdateCmd = TRUE; m_cCommand.SetWindowText(""); m_bNoUpdateCmd = FALSE; pCommand->iSpecialCmd = 0; } UpdateCommandWithEditFields(-1); } }
void CRunMapExpertDlg::OnUpdateParameters() { if(!m_bNoUpdateCmd) UpdateCommandWithEditFields(-1); }
void CRunMapExpertDlg::OnEnsurecheck() { if(!m_bNoUpdateCmd) UpdateCommandWithEditFields(-1); // enable/disable edit field
m_cEnsureFn.EnableWindow(m_cEnsureCheck.GetCheck()); }
void CRunMapExpertDlg::OnUpdateEnsurefn() { if(!m_bNoUpdateCmd) UpdateCommandWithEditFields(-1); }
void CRunMapExpertDlg::InitSequenceList() { // add all the information from the CHammer object into
// the dialog box ..
CHammer *pApp = (CHammer*) AfxGetApp();
m_cCmdSequences.ResetContent();
// add the configurations into the list ..
int iSize = pApp->m_CmdSequences.GetSize();
if(iSize == 0) { // add a default configuration
CCommandSequence *pSeq = new CCommandSequence; strcpy(pSeq->m_szName, "Default"); ((CHammer*)AfxGetApp())->m_CmdSequences.Add(pSeq); iSize = 1; }
for(int i = 0; i < iSize; i++) { CCommandSequence *pSeq = pApp->m_CmdSequences[i]; int iIndex = m_cCmdSequences.AddString(pSeq->m_szName); m_cCmdSequences.SetItemDataPtr(iIndex, PVOID(pSeq)); } m_pActiveSequence = NULL; m_cCmdSequences.SetCurSel(0); OnSelchangeConfigurations(); }
BOOL CRunMapExpertDlg::OnInitDialog() { CDialog::OnInitDialog(); int iSequence = AfxGetApp()->GetProfileInt("RunMapExpert", "LastSequence", 0);
InitSequenceList();
m_cCmdSequences.SetCurSel(iSequence); OnSelchangeConfigurations();
return TRUE; }
void CRunMapExpertDlg::OnOK() { SaveCommandsToSequence();
CHammer *pApp = (CHammer*) AfxGetApp(); pApp->SaveSequences();
CDialog::OnOK(); }
void CRunMapExpertDlg::SaveCommandsToSequence() { if(!m_pActiveSequence) return; // nothing set yet
int nCommands = m_cCommandList.GetCount(); m_pActiveSequence->m_Commands.RemoveAll(); for(int i = 0; i < nCommands; i++) { PCCOMMAND pCommand = PCCOMMAND(m_cCommandList.GetItemDataPtr(i)); pCommand->bEnable = m_cCommandList.GetCheck(i); if (!strcmp(pCommand->szRun, "$game_exe")) pCommand->bNoWait = TRUE; m_pActiveSequence->m_Commands.Add(*pCommand); // free the memory:
delete pCommand; } }
void CRunMapExpertDlg::OnSelchangeConfigurations() { // save the current command list back into the previously active
// command sequence
SaveCommandsToSequence();
int iSel = m_cCmdSequences.GetCurSel(); if(iSel == LB_ERR) // nothing there
{ m_pActiveSequence = NULL; return; }
AfxGetApp()->WriteProfileInt("RunMapExpert", "LastSequence", iSel);
CCommandSequence *pSeq = (CCommandSequence*) m_cCmdSequences.GetItemDataPtr(iSel);
// delete strings from listbox (dataptrs already deleted
// in SaveCommandsToSequence())
m_cCommandList.ResetContent();
m_pActiveSequence = pSeq;
// add the commands from this sequence into the command listbox ..
CCommandArray &Commands = pSeq->m_Commands; for(int i = 0; i < Commands.GetSize(); i++) { PCCOMMAND pCommand = new CCOMMAND(Commands[i]); AddCommand(i, pCommand); m_cCommandList.SetCheck(i, pCommand->bEnable); }
// set to 0th element in list ..
m_cCommandList.SetCurSel(0); OnSelchangeCommandlist(); }
void CRunMapExpertDlg::OnEditconfigs() { CRunMapCfgDlg dlg; SaveCommandsToSequence(); if(dlg.DoModal() == IDOK) InitSequenceList(); }
void CRunMapExpertDlg::OnCancel() { SaveCommandsToSequence();
CHammer *pApp = (CHammer*) AfxGetApp(); pApp->SaveSequences();
CDialog::OnCancel(); }
|