summaryrefslogtreecommitdiff
path: root/utils/valvelib/cstm1dlg.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'utils/valvelib/cstm1dlg.cpp')
-rw-r--r--utils/valvelib/cstm1dlg.cpp396
1 files changed, 396 insertions, 0 deletions
diff --git a/utils/valvelib/cstm1dlg.cpp b/utils/valvelib/cstm1dlg.cpp
new file mode 100644
index 0000000..aecf9dd
--- /dev/null
+++ b/utils/valvelib/cstm1dlg.cpp
@@ -0,0 +1,396 @@
+//========= 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();
+}