mirror of
https://github.com/nillerusr/source-engine.git
synced 2024-12-22 14:16:50 +00:00
397 lines
9.4 KiB
C++
397 lines
9.4 KiB
C++
|
//========= Copyright Valve Corporation, All rights reserved. ============//
|
||
|
//
|
||
|
// Purpose:
|
||
|
//
|
||
|
// $NoKeywords: $
|
||
|
//
|
||
|
//=============================================================================//
|
||
|
// cstm1dlg.cpp : implementation file
|
||
|
//
|
||
|
|
||
|
#include "stdafx.h"
|
||
|
#include "valvelib.h"
|
||
|
#include "cstm1dlg.h"
|
||
|
#include "valvelibaw.h"
|
||
|
|
||
|
#ifdef _PSEUDO_DEBUG
|
||
|
#undef THIS_FILE
|
||
|
static char THIS_FILE[] = __FILE__;
|
||
|
#endif
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// CCustom1Dlg dialog
|
||
|
|
||
|
|
||
|
CCustom1Dlg::CCustom1Dlg()
|
||
|
: CAppWizStepDlg(CCustom1Dlg::IDD)
|
||
|
{
|
||
|
//{{AFX_DATA_INIT(CCustom1Dlg)
|
||
|
m_RootPath = _T("");
|
||
|
m_TargetPath = _T("");
|
||
|
m_ProjectType = -1;
|
||
|
m_ToolProject = FALSE;
|
||
|
m_ImplibPath = _T("");
|
||
|
m_PublicProject = FALSE;
|
||
|
m_ConsoleApp = FALSE;
|
||
|
m_PublishImportLib = FALSE;
|
||
|
m_SrcPath = _T("");
|
||
|
//}}AFX_DATA_INIT
|
||
|
|
||
|
m_ProjectType = 0;
|
||
|
m_PublicProject = TRUE;
|
||
|
m_SrcPath = "src";
|
||
|
}
|
||
|
|
||
|
|
||
|
void CCustom1Dlg::DoDataExchange(CDataExchange* pDX)
|
||
|
{
|
||
|
if (pDX->m_bSaveAndValidate == 0)
|
||
|
{
|
||
|
// Refresh the paths based on project information...
|
||
|
if (m_RootPath.GetLength() == 0)
|
||
|
{
|
||
|
if (!Valvelibaw.m_Dictionary.Lookup("FULL_DIR_PATH", m_RootPath))
|
||
|
m_RootPath = "u:\\hl2\\";
|
||
|
|
||
|
m_RootPath.MakeLower();
|
||
|
|
||
|
m_ToolProject = (m_RootPath.Find( "util" ) >= 0);
|
||
|
|
||
|
int idx = m_RootPath.Find( m_SrcPath ); // look for src tree
|
||
|
if (idx >= 0)
|
||
|
{
|
||
|
m_RootPath = m_RootPath.Left( idx );
|
||
|
}
|
||
|
|
||
|
m_TargetPath = m_RootPath;
|
||
|
m_TargetPath += m_SrcPath;
|
||
|
m_TargetPath += "\\lib\\public\\";
|
||
|
|
||
|
m_ImplibPath = "unused";
|
||
|
EnableCheckboxes();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
CAppWizStepDlg::DoDataExchange(pDX);
|
||
|
//{{AFX_DATA_MAP(CCustom1Dlg)
|
||
|
DDX_Text(pDX, IDC_EDIT_ROOT_PATH, m_RootPath);
|
||
|
DDX_Text(pDX, IDC_EDIT_TARGET_PATH, m_TargetPath);
|
||
|
DDX_CBIndex(pDX, IDC_SELECT_PROJECT_TYPE, m_ProjectType);
|
||
|
DDX_Check(pDX, IDC_CHECK_TOOL, m_ToolProject);
|
||
|
DDX_Text(pDX, IDC_EDIT_IMPLIB_PATH, m_ImplibPath);
|
||
|
DDX_Check(pDX, IDC_CHECK_PUBLIC, m_PublicProject);
|
||
|
DDX_Check(pDX, IDC_CHECK_CONSOLE_APP, m_ConsoleApp);
|
||
|
DDX_Check(pDX, IDC_CHECK_PUBLISH_IMPORT, m_PublishImportLib);
|
||
|
DDX_Text(pDX, IDC_EDIT_SRC_PATH, m_SrcPath);
|
||
|
//}}AFX_DATA_MAP
|
||
|
}
|
||
|
|
||
|
static void FixupPath( CString& path )
|
||
|
{
|
||
|
int idx;
|
||
|
idx = path.Find("/");
|
||
|
while (idx >= 0)
|
||
|
{
|
||
|
path.SetAt(idx, '\\' );
|
||
|
idx = path.Find("/");
|
||
|
}
|
||
|
|
||
|
bool hasTerminatingSlash = ( path.Right(1).Find("\\") >= 0 );
|
||
|
if (!hasTerminatingSlash)
|
||
|
path += '\\';
|
||
|
|
||
|
path.MakeLower();
|
||
|
}
|
||
|
|
||
|
static int CountSlashes( CString& path )
|
||
|
{
|
||
|
int count = 0;
|
||
|
|
||
|
int idx = path.Find("\\", 0);
|
||
|
while (idx >= 0)
|
||
|
{
|
||
|
++count;
|
||
|
idx = path.Find("\\", idx+1 );
|
||
|
}
|
||
|
|
||
|
return count;
|
||
|
}
|
||
|
|
||
|
bool CCustom1Dlg::ComputeRelativePath( )
|
||
|
{
|
||
|
if ( m_RootPath.GetAt(1) != ':' )
|
||
|
{
|
||
|
MessageBox( "Error! The root path must specify a drive!", "Bogus Root Path!", MB_ICONERROR | MB_OK );
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
if ( m_TargetPath.GetAt(1) != ':' )
|
||
|
{
|
||
|
MessageBox( "Error! The target path must specify a drive!", "Bogus Target Path!", MB_ICONERROR | MB_OK );
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
CString sourcePath;
|
||
|
if (!Valvelibaw.m_Dictionary.Lookup("FULL_DIR_PATH", sourcePath ))
|
||
|
{
|
||
|
MessageBox( "I can't seem to find the source path!??!", "Umm... Get Brian", MB_ICONERROR | MB_OK );
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
FixupPath( m_RootPath );
|
||
|
FixupPath( m_TargetPath );
|
||
|
FixupPath( sourcePath );
|
||
|
|
||
|
CString srcRootPath = m_RootPath;
|
||
|
srcRootPath += m_SrcPath;
|
||
|
srcRootPath += "\\";
|
||
|
FixupPath( srcRootPath );
|
||
|
|
||
|
if (sourcePath.Find( srcRootPath ) != 0)
|
||
|
{
|
||
|
MessageBox( "Error! The source path must lie under the root source path!", "Bogus Root Path!", MB_ICONERROR | MB_OK );
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
if (m_TargetPath.Find( m_RootPath ) != 0)
|
||
|
{
|
||
|
MessageBox( "Error! The target path must lie under the root path!", "Bogus Target Path!", MB_ICONERROR | MB_OK );
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
int rootLen = m_RootPath.GetLength();
|
||
|
int rootSrcLen = srcRootPath.GetLength();
|
||
|
int sourceLen = sourcePath.GetLength();
|
||
|
int targetLen = m_TargetPath.GetLength();
|
||
|
CString relativePath = m_TargetPath.Right( targetLen - rootLen );
|
||
|
|
||
|
// Now that we've got the relative source path,
|
||
|
// find out how many slashes are in it;
|
||
|
// that'll tell us how many paths to back up....
|
||
|
int i;
|
||
|
CString relativeSourcePath = sourcePath.Right( sourceLen - rootLen );
|
||
|
int numSlashes = CountSlashes(relativeSourcePath);
|
||
|
CString targetRelativePath;
|
||
|
for ( i = 0; i < numSlashes; ++i )
|
||
|
{
|
||
|
targetRelativePath += "..\\";
|
||
|
}
|
||
|
|
||
|
// Now that we've got the relative source path,
|
||
|
// find out how many slashes are in it;
|
||
|
// that'll tell us how many paths to back up....
|
||
|
CString rootSrcToProj = sourcePath.Right( sourceLen - rootSrcLen );
|
||
|
numSlashes = CountSlashes(rootSrcToProj);
|
||
|
CString projToRootSrc;
|
||
|
for ( i = 0; i < numSlashes; ++i )
|
||
|
{
|
||
|
projToRootSrc += "..\\";
|
||
|
}
|
||
|
|
||
|
Valvelibaw.m_Dictionary["VALVE_ROOT_RELATIVE_PATH"] = targetRelativePath;
|
||
|
Valvelibaw.m_Dictionary["VALVE_SRC_RELATIVE_PATH"] = projToRootSrc;
|
||
|
targetRelativePath += relativePath;
|
||
|
Valvelibaw.m_Dictionary["VALVE_ROOT_PATH"] = m_RootPath;
|
||
|
Valvelibaw.m_Dictionary["VALVE_ROOT_SRC_PATH"] = srcRootPath;
|
||
|
Valvelibaw.m_Dictionary["VALVE_TARGET_PATH"] = m_TargetPath;
|
||
|
Valvelibaw.m_Dictionary["VALVE_RELATIVE_PATH"] = targetRelativePath;
|
||
|
|
||
|
if (m_ToolProject)
|
||
|
Valvelibaw.m_Dictionary["VALVE_TOOL"] = "1";
|
||
|
if (m_PublicProject && (m_ProjectType != 2))
|
||
|
Valvelibaw.m_Dictionary["VALVE_PUBLIC_PROJECT"] = "1";
|
||
|
if (m_PublishImportLib && (m_ProjectType == 1))
|
||
|
Valvelibaw.m_Dictionary["VALVE_PUBLISH_IMPORT_LIB"] = "1";
|
||
|
|
||
|
// Import libraries
|
||
|
if (m_ProjectType == 1)
|
||
|
{
|
||
|
if ( m_ImplibPath.GetAt(1) != ':' )
|
||
|
{
|
||
|
MessageBox( "Error! The import library path must specify a drive!", "Bogus Import Library Path!", MB_ICONERROR | MB_OK );
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
if (m_ImplibPath.Find( srcRootPath ) != 0)
|
||
|
{
|
||
|
MessageBox( "Error! The import library path must lie under the root src path!", "Bogus Target Path!", MB_ICONERROR | MB_OK );
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
int implibLen = m_ImplibPath.GetLength();
|
||
|
relativePath = m_ImplibPath.Right( implibLen - rootSrcLen );
|
||
|
int numSlashes = CountSlashes(rootSrcToProj);
|
||
|
CString implibRelativePath;
|
||
|
for (int i = 0; i < numSlashes; ++i )
|
||
|
{
|
||
|
implibRelativePath += "..\\";
|
||
|
}
|
||
|
implibRelativePath += relativePath;
|
||
|
|
||
|
Valvelibaw.m_Dictionary["VALVE_IMPLIB_PATH"] = m_ImplibPath;
|
||
|
Valvelibaw.m_Dictionary["VALVE_IMPLIB_RELATIVE_PATH"] = implibRelativePath;
|
||
|
}
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
// This is called whenever the user presses Next, Back, or Finish with this step
|
||
|
// present. Do all validation & data exchange from the dialog in this function.
|
||
|
BOOL CCustom1Dlg::OnDismiss()
|
||
|
{
|
||
|
if (!UpdateData(TRUE))
|
||
|
return FALSE;
|
||
|
|
||
|
if (!ComputeRelativePath())
|
||
|
return FALSE;
|
||
|
|
||
|
switch( m_ProjectType )
|
||
|
{
|
||
|
case 0:
|
||
|
Valvelibaw.m_Dictionary["VALVE_TARGET_TYPE"] = "lib";
|
||
|
Valvelibaw.m_Dictionary["PROJTYPE_LIB"] = "1";
|
||
|
break;
|
||
|
|
||
|
case 1:
|
||
|
Valvelibaw.m_Dictionary["VALVE_TARGET_TYPE"] = "dll";
|
||
|
Valvelibaw.m_Dictionary["PROJTYPE_DLL"] = "1";
|
||
|
break;
|
||
|
|
||
|
case 2:
|
||
|
Valvelibaw.m_Dictionary["VALVE_TARGET_TYPE"] = "exe";
|
||
|
|
||
|
if (m_ConsoleApp)
|
||
|
{
|
||
|
Valvelibaw.m_Dictionary["PROJTYPE_CON"] = "1";
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
return TRUE; // return FALSE if the dialog shouldn't be dismissed
|
||
|
}
|
||
|
|
||
|
|
||
|
BEGIN_MESSAGE_MAP(CCustom1Dlg, CAppWizStepDlg)
|
||
|
//{{AFX_MSG_MAP(CCustom1Dlg)
|
||
|
ON_CBN_SELCHANGE(IDC_SELECT_PROJECT_TYPE, OnSelchangeSelectProjectType)
|
||
|
ON_EN_CHANGE(IDC_EDIT_ROOT_PATH, OnChangeEditRootPath)
|
||
|
ON_BN_CLICKED(IDC_CHECK_PUBLIC, OnCheckPublic)
|
||
|
ON_BN_CLICKED(IDC_CHECK_TOOL, OnCheckTool)
|
||
|
ON_BN_CLICKED(IDC_CHECK_PUBLISH_IMPORT, OnCheckPublishImport)
|
||
|
ON_EN_CHANGE(IDC_EDIT_SRC_PATH, OnChangeEditSrcPath)
|
||
|
//}}AFX_MSG_MAP
|
||
|
END_MESSAGE_MAP()
|
||
|
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// CCustom1Dlg message handlers
|
||
|
|
||
|
void CCustom1Dlg::RecomputeTargetPath()
|
||
|
{
|
||
|
bool hasTerminatingSlash = ( m_RootPath.Right(1).FindOneOf("\\/") >= 0 );
|
||
|
|
||
|
m_TargetPath = m_RootPath;
|
||
|
if (!hasTerminatingSlash)
|
||
|
m_TargetPath += '\\';
|
||
|
m_ImplibPath = m_TargetPath;
|
||
|
|
||
|
switch( m_ProjectType )
|
||
|
{
|
||
|
case 0:
|
||
|
// static library
|
||
|
m_TargetPath += m_SrcPath;
|
||
|
m_TargetPath += m_PublicProject ? "\\lib\\public\\" : "\\lib\\common\\";
|
||
|
m_ImplibPath = "unused";
|
||
|
break;
|
||
|
|
||
|
case 1:
|
||
|
m_TargetPath += "bin\\";
|
||
|
m_ImplibPath += m_SrcPath;
|
||
|
m_ImplibPath += m_PublicProject ? "\\lib\\public\\" : "\\lib\\common\\";
|
||
|
break;
|
||
|
|
||
|
case 2:
|
||
|
m_TargetPath += "bin\\";
|
||
|
m_ImplibPath = "unused";
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
UpdateData(FALSE);
|
||
|
}
|
||
|
|
||
|
void CCustom1Dlg::EnableCheckboxes()
|
||
|
{
|
||
|
CWnd* pConsoleApp = GetDlgItem(IDC_CHECK_CONSOLE_APP);
|
||
|
CWnd* pPublishImport = GetDlgItem(IDC_CHECK_PUBLISH_IMPORT);
|
||
|
CWnd* pImportLib = GetDlgItem(IDC_EDIT_IMPLIB_PATH);
|
||
|
switch (m_ProjectType)
|
||
|
{
|
||
|
case 0:
|
||
|
pConsoleApp->EnableWindow( false );
|
||
|
pPublishImport->EnableWindow( false );
|
||
|
pImportLib->EnableWindow( false );
|
||
|
break;
|
||
|
|
||
|
case 1:
|
||
|
pConsoleApp->EnableWindow( false );
|
||
|
pPublishImport->EnableWindow( true );
|
||
|
pImportLib->EnableWindow( m_PublishImportLib );
|
||
|
break;
|
||
|
|
||
|
case 2:
|
||
|
pConsoleApp->EnableWindow( true );
|
||
|
pPublishImport->EnableWindow( false );
|
||
|
pImportLib->EnableWindow( false );
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void CCustom1Dlg::OnSelchangeSelectProjectType()
|
||
|
{
|
||
|
if (!UpdateData(TRUE))
|
||
|
return;
|
||
|
|
||
|
RecomputeTargetPath();
|
||
|
EnableCheckboxes();
|
||
|
}
|
||
|
|
||
|
void CCustom1Dlg::OnChangeEditRootPath()
|
||
|
{
|
||
|
if (!UpdateData(TRUE))
|
||
|
return;
|
||
|
|
||
|
RecomputeTargetPath();
|
||
|
}
|
||
|
|
||
|
void CCustom1Dlg::OnCheckPublic()
|
||
|
{
|
||
|
if (!UpdateData(TRUE))
|
||
|
return;
|
||
|
|
||
|
RecomputeTargetPath();
|
||
|
}
|
||
|
|
||
|
void CCustom1Dlg::OnCheckTool()
|
||
|
{
|
||
|
if (!UpdateData(TRUE))
|
||
|
return;
|
||
|
|
||
|
RecomputeTargetPath();
|
||
|
}
|
||
|
|
||
|
void CCustom1Dlg::OnCheckPublishImport()
|
||
|
{
|
||
|
if (!UpdateData(TRUE))
|
||
|
return;
|
||
|
|
||
|
EnableCheckboxes();
|
||
|
}
|
||
|
|
||
|
void CCustom1Dlg::OnChangeEditSrcPath()
|
||
|
{
|
||
|
if (!UpdateData(TRUE))
|
||
|
return;
|
||
|
|
||
|
RecomputeTargetPath();
|
||
|
}
|