You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
396 lines
9.4 KiB
396 lines
9.4 KiB
//========= 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(); |
|
}
|
|
|