summaryrefslogtreecommitdiff
path: root/hammer/runmapexpertdlg.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'hammer/runmapexpertdlg.cpp')
-rw-r--r--hammer/runmapexpertdlg.cpp653
1 files changed, 653 insertions, 0 deletions
diff --git a/hammer/runmapexpertdlg.cpp b/hammer/runmapexpertdlg.cpp
new file mode 100644
index 0000000..0638794
--- /dev/null
+++ b/hammer/runmapexpertdlg.cpp
@@ -0,0 +1,653 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+// $NoKeywords: $
+//
+//=============================================================================//
+// RunMapExpertDlg.cpp : implementation file
+//
+
+#include "stdafx.h"
+#include "hammer.h"
+#include "RunMapExpertDlg.h"
+#include "RunMapCfgDlg.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;
+}
+
+
+void CRunMapExpertDlg::DoDataExchange(CDataExchange* pDX)
+{
+ CDialog::DoDataExchange(pDX);
+ //{{AFX_DATA_MAP(CRunMapExpertDlg)
+ DDX_Control(pDX, IDC_USEPROCESSWND, m_cUseProcessWnd);
+ 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);
+ //}}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_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_BN_CLICKED(IDC_USEPROCESSWND, OnUseprocesswnd)
+ 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;
+ }
+
+ 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");
+
+ // 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";
+ }
+
+ 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_USEPROCESSWND,
+ 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);
+ m_cUseProcessWnd.SetCheck(pCommand->bUseProcessWnd);
+ // 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));
+ pCommand->bUseProcessWnd = TRUE;
+ 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();
+
+ 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->bUseProcessWnd = m_cUseProcessWnd.GetCheck();
+ 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::OnUseprocesswnd()
+{
+ // update the command here..
+ PCCOMMAND pCommand = GetCommandAtIndex(NULL);
+ Assert(pCommand);
+ pCommand->bUseProcessWnd = m_cUseProcessWnd.GetCheck() ? TRUE : FALSE;
+}
+
+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();
+}