2000-08-29 23:26:29 +04:00
// pcbuilderdialogDlg.cpp : implementation file
//
# include "stdafx.h"
2002-07-21 23:56:08 +04:00
# include "shellapi.h"
2002-02-20 23:27:04 +03:00
// a fun undef for DOT NET
# undef DEBUG
2000-08-29 23:26:29 +04:00
# include "CMakeSetup.h"
2001-11-17 00:29:25 +03:00
# include "MakeHelp.h"
2006-11-29 23:59:16 +03:00
# include "cmVersion.h"
2001-06-06 01:26:48 +04:00
# include "PathDialog.h"
2000-08-29 23:26:29 +04:00
# include "CMakeSetupDialog.h"
2002-12-09 18:07:35 +03:00
# include "CMakeCommandLineInfo.h"
# include "../cmListFileCache.h"
2001-02-19 23:13:48 +03:00
# include "../cmCacheManager.h"
2001-05-30 23:28:55 +04:00
# include "../cmake.h"
2002-09-06 21:06:23 +04:00
# include "../cmGlobalGenerator.h"
2002-12-09 18:07:35 +03:00
# include "../cmDynamicLoader.h"
2000-08-29 23:26:29 +04:00
# ifdef _DEBUG
# define new DEBUG_NEW
# undef THIS_FILE
static char THIS_FILE [ ] = __FILE__ ;
# endif
2002-07-31 18:34:06 +04:00
2000-08-29 23:26:29 +04:00
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialog
{
public :
CAboutDlg ( ) ;
2002-09-06 21:06:23 +04:00
// Dialog Data
2000-08-29 23:26:29 +04:00
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX } ;
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAboutDlg)
protected :
virtual void DoDataExchange ( CDataExchange * pDX ) ; // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected :
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP ( )
} ;
CAboutDlg : : CAboutDlg ( ) : CDialog ( CAboutDlg : : IDD )
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
void CAboutDlg : : DoDataExchange ( CDataExchange * pDX )
{
CDialog : : DoDataExchange ( pDX ) ;
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP ( CAboutDlg , CDialog )
//{{AFX_MSG_MAP(CAboutDlg)
// No message handlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP ( ) ;
2002-09-18 22:30:54 +04:00
void MFCMessageCallback ( const char * m , const char * title , bool & nomore , void * )
2001-10-29 18:41:31 +03:00
{
std : : string message = m ;
message + = " \n \n (Press Cancel to suppress any further messages.) " ;
if ( : : MessageBox ( 0 , message . c_str ( ) , title ,
2002-01-10 01:22:54 +03:00
MB_OKCANCEL | MB_TASKMODAL ) = = IDCANCEL )
2001-10-29 18:41:31 +03:00
{
nomore = true ;
}
}
2000-08-29 23:26:29 +04:00
/////////////////////////////////////////////////////////////////////////////
// CMakeSetupDialog dialog
2002-09-26 23:14:20 +04:00
void updateProgress ( const char * msg , float prog , void * cd )
{
2006-06-20 21:13:13 +04:00
char * tmp = new char [ strlen ( msg ) + 40 ] ;
2002-09-26 23:14:20 +04:00
if ( prog > = 0 )
{
sprintf ( tmp , " %s %i%% " , msg , ( int ) ( 100 * prog ) ) ;
}
else
{
sprintf ( tmp , " %s " , msg ) ;
}
CMakeSetupDialog * self = ( CMakeSetupDialog * ) cd ;
2003-07-08 21:12:10 +04:00
self - > SetDlgItemText ( IDC_PROGRESS , tmp ) ;
CWnd * cancel = self - > GetDlgItem ( IDCANCEL ) ;
//
// Retrieve and dispatch any waiting messages.
//
MSG wmsg ;
while ( : : PeekMessage ( & wmsg , NULL , 0 , 0 , PM_REMOVE ) )
{
switch ( wmsg . message )
{
case WM_LBUTTONDOWN :
case WM_LBUTTONUP :
case WM_LBUTTONDBLCLK :
{
if ( wmsg . hwnd = = cancel - > m_hWnd )
{
: : DispatchMessage ( & wmsg ) ;
}
}
break ;
case WM_COMMAND :
case WM_SETCURSOR :
case WM_PAINT :
: : DispatchMessage ( & wmsg ) ;
break ;
}
}
2006-06-20 21:13:13 +04:00
delete [ ] tmp ;
2002-09-26 23:14:20 +04:00
}
2000-08-29 23:26:29 +04:00
2003-08-01 00:30:49 +04:00
// Convert to Win32 path (slashes). This calls the system tools one and then
// removes the spaces. It is not in system tools because we don't want any
// generators accidentally use it
std : : string ConvertToWindowsPath ( const char * path )
{
// Convert to output path.
// Remove the "" around it (if any) since it's an output path for
// the shell. If another shell-oriented feature is not designed
// for a GUI use, then we are in trouble.
2004-08-30 21:50:00 +04:00
// save the value of the force to unix path option
bool saveForce = cmSystemTools : : GetForceUnixPaths ( ) ;
// make sure we get windows paths no matter what for the GUI
cmSystemTools : : SetForceUnixPaths ( false ) ;
2003-08-01 00:30:49 +04:00
std : : string s = cmSystemTools : : ConvertToOutputPath ( path ) ;
2004-08-30 21:50:00 +04:00
// now restore the force unix path to its previous value
cmSystemTools : : SetForceUnixPaths ( saveForce ) ;
2003-08-01 00:30:49 +04:00
if ( s . size ( ) )
{
std : : string : : iterator i = s . begin ( ) ;
if ( * i = = ' \" ' )
{
s . erase ( i , i + 1 ) ;
}
i = s . begin ( ) + s . length ( ) - 1 ;
if ( * i = = ' \" ' )
{
s . erase ( i , i + 1 ) ;
}
}
return s ;
}
2001-08-22 01:41:12 +04:00
CMakeSetupDialog : : CMakeSetupDialog ( const CMakeCommandLineInfo & cmdInfo ,
CWnd * pParent /*=NULL*/ )
2000-08-29 23:26:29 +04:00
: CDialog ( CMakeSetupDialog : : IDD , pParent )
2003-07-08 21:12:10 +04:00
{
2005-02-11 22:36:57 +03:00
m_GeneratorPicked = false ;
2003-07-08 21:12:10 +04:00
m_Cursor = LoadCursor ( NULL , IDC_ARROW ) ;
m_RunningConfigure = false ;
2002-11-08 23:46:08 +03:00
cmSystemTools : : SetRunCommandHideConsole ( true ) ;
2002-07-21 23:56:08 +04:00
cmSystemTools : : SetErrorCallback ( MFCMessageCallback ) ;
2001-05-17 20:08:46 +04:00
m_RegistryKey = " Software \\ Kitware \\ CMakeSetup \\ Settings \\ StartPath " ;
2002-08-28 22:51:10 +04:00
m_CacheEntriesList . m_CMakeSetupDialog = this ;
2002-12-10 22:51:59 +03:00
m_CMakeInstance = new cmake ;
m_CMakeInstance - > SetProgressCallback ( updateProgress , ( void * ) this ) ;
2000-08-29 23:26:29 +04:00
//{{AFX_DATA_INIT(CMakeSetupDialog)
2004-05-20 23:08:18 +04:00
//}}AFX_DATA_INIT
2002-11-02 07:00:44 +03:00
2002-07-21 23:56:08 +04:00
// Get the parameters from the command line info
// If an unknown parameter is found, try to interpret it too, since it
// is likely to be a file dropped on the shortcut :)
if ( cmdInfo . m_LastUnknownParameter . IsEmpty ( ) )
{
this - > m_WhereSource = cmdInfo . m_WhereSource ;
this - > m_WhereBuild = cmdInfo . m_WhereBuild ;
2005-03-28 22:23:07 +04:00
this - > m_GeneratorDialog . m_GeneratorChoiceString =
cmdInfo . m_GeneratorChoiceString ;
2002-07-21 23:56:08 +04:00
this - > m_AdvancedValues = cmdInfo . m_AdvancedValues ;
}
else
{
this - > m_WhereSource = _T ( " " ) ;
this - > m_WhereBuild = _T ( " " ) ;
this - > m_AdvancedValues = FALSE ;
2005-03-28 22:23:07 +04:00
this - > m_GeneratorDialog . m_GeneratorChoiceString =
cmdInfo . m_GeneratorChoiceString ;
2002-07-21 23:56:08 +04:00
this - > ChangeDirectoriesFromFile ( ( LPCTSTR ) cmdInfo . m_LastUnknownParameter ) ;
}
2000-08-29 23:26:29 +04:00
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp ( ) - > LoadIcon ( IDR_MAINFRAME ) ;
2001-04-26 00:09:17 +04:00
m_BuildPathChanged = false ;
2001-05-30 23:28:55 +04:00
// Find the path to the cmake.exe executable
char fname [ 1024 ] ;
: : GetModuleFileName ( NULL , fname , 1023 ) ;
// extract just the path part
m_PathToExecutable = cmSystemTools : : GetProgramPath ( fname ) . c_str ( ) ;
// add the cmake.exe to the path
m_PathToExecutable + = " /cmake.exe " ;
2002-07-21 23:56:08 +04:00
2001-06-26 17:55:35 +04:00
m_oldCX = - 1 ;
m_deltaXRemainder = 0 ;
2000-08-29 23:26:29 +04:00
}
2002-12-09 18:07:35 +03:00
CMakeSetupDialog : : ~ CMakeSetupDialog ( )
{
delete m_CMakeInstance ;
// clean up globals
cmDynamicLoader : : FlushCache ( ) ;
}
2000-08-29 23:26:29 +04:00
void CMakeSetupDialog : : DoDataExchange ( CDataExchange * pDX )
{
CDialog : : DoDataExchange ( pDX ) ;
//{{AFX_DATA_MAP(CMakeSetupDialog)
2004-05-20 23:08:18 +04:00
DDX_Control ( pDX , IDC_AdvancedValues , m_AdvancedValuesControl ) ;
DDX_Control ( pDX , IDC_BROWSE_SOURCE , m_BrowseSource ) ;
DDX_Control ( pDX , IDC_BROWSE_BUILD , m_BrowseBuild ) ;
DDX_Control ( pDX , IDC_DELETE_BUTTON , m_DeleteButton ) ;
DDX_Control ( pDX , IDC_HELP_BUTTON , m_HelpButton ) ;
DDX_Control ( pDX , IDC_OK , m_OKButton ) ;
DDX_Control ( pDX , IDCANCEL , m_CancelButton ) ;
DDX_CBStringExact ( pDX , IDC_WhereSource , m_WhereSource ) ;
DDX_CBStringExact ( pDX , IDC_WhereBuild , m_WhereBuild ) ;
DDX_Control ( pDX , IDC_FRAME , m_ListFrame ) ;
DDX_Control ( pDX , IDC_WhereSource , m_WhereSourceControl ) ;
DDX_Control ( pDX , IDC_WhereBuild , m_WhereBuildControl ) ;
DDX_Control ( pDX , IDC_LIST2 , m_CacheEntriesList ) ;
DDX_Control ( pDX , IDC_MouseHelpCaption , m_MouseHelp ) ;
DDX_Control ( pDX , IDC_PROGRESS , m_StatusDisplay ) ;
DDX_Control ( pDX , IDC_BuildProjects , m_Configure ) ;
DDX_Check ( pDX , IDC_AdvancedValues , m_AdvancedValues ) ;
//}}AFX_DATA_MAP
2000-08-29 23:26:29 +04:00
}
BEGIN_MESSAGE_MAP ( CMakeSetupDialog , CDialog )
//{{AFX_MSG_MAP(CMakeSetupDialog)
ON_WM_SYSCOMMAND ( )
ON_WM_PAINT ( )
ON_WM_QUERYDRAGICON ( )
2001-06-19 22:32:37 +04:00
ON_BN_CLICKED ( IDC_BUTTON2 , OnBrowseWhereSource )
2001-07-26 02:30:27 +04:00
ON_BN_CLICKED ( IDC_BuildProjects , OnConfigure )
2001-06-19 22:32:37 +04:00
ON_BN_CLICKED ( IDC_BUTTON3 , OnBrowseWhereBuild )
2001-07-26 02:30:27 +04:00
ON_CBN_EDITCHANGE ( IDC_WhereBuild , OnChangeWhereBuild )
ON_CBN_SELCHANGE ( IDC_WhereBuild , OnSelendokWhereBuild )
ON_CBN_EDITCHANGE ( IDC_WhereSource , OnChangeWhereSource )
2001-05-21 18:47:00 +04:00
ON_CBN_SELENDOK ( IDC_WhereSource , OnSelendokWhereSource )
2002-09-06 21:06:23 +04:00
ON_WM_SIZE ( )
2001-06-19 22:32:37 +04:00
ON_WM_GETMINMAXINFO ( )
2002-09-06 21:06:23 +04:00
ON_BN_CLICKED ( IDC_OK , OnOk )
2004-05-20 23:08:18 +04:00
ON_BN_CLICKED ( IDC_DELETE_BUTTON , OnDeleteButton )
2002-09-06 21:06:23 +04:00
ON_BN_CLICKED ( IDC_HELP_BUTTON , OnHelpButton )
ON_BN_CLICKED ( IDC_AdvancedValues , OnAdvancedValues )
ON_BN_DOUBLECLICKED ( IDC_AdvancedValues , OnDoubleclickedAdvancedValues )
2003-07-08 21:12:10 +04:00
ON_WM_DROPFILES ( )
ON_BN_CLICKED ( IDCANCEL , OnCancel )
2004-05-20 23:08:18 +04:00
ON_WM_SETCURSOR ( )
//}}AFX_MSG_MAP
2001-05-21 18:47:00 +04:00
END_MESSAGE_MAP ( )
2000-08-29 23:26:29 +04:00
/////////////////////////////////////////////////////////////////////////////
// CMakeSetupDialog message handlers
2001-05-21 18:47:00 +04:00
BOOL CMakeSetupDialog : : OnInitDialog ( )
2000-08-29 23:26:29 +04:00
{
CDialog : : OnInitDialog ( ) ;
2002-07-21 23:56:08 +04:00
this - > DragAcceptFiles ( true ) ;
2000-08-29 23:26:29 +04:00
2001-11-14 22:39:26 +03:00
// Add "Create shortcut" menu item to system menu.
// IDM_CREATESHORTCUT must be in the system command range.
ASSERT ( ( IDM_CREATESHORTCUT & 0xFFF0 ) = = IDM_CREATESHORTCUT ) ;
ASSERT ( IDM_CREATESHORTCUT < 0xF000 ) ;
2000-08-29 23:26:29 +04:00
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT ( ( IDM_ABOUTBOX & 0xFFF0 ) = = IDM_ABOUTBOX ) ;
ASSERT ( IDM_ABOUTBOX < 0xF000 ) ;
CMenu * pSysMenu = GetSystemMenu ( FALSE ) ;
if ( pSysMenu ! = NULL )
{
2001-11-14 22:39:26 +03:00
CString strCreateShortcutMenu ;
strCreateShortcutMenu . LoadString ( IDS_CREATESHORTCUT ) ;
if ( ! strCreateShortcutMenu . IsEmpty ( ) )
{
pSysMenu - > AppendMenu ( MF_SEPARATOR ) ;
pSysMenu - > AppendMenu ( MF_STRING ,
IDM_CREATESHORTCUT ,
strCreateShortcutMenu ) ;
}
2000-08-29 23:26:29 +04:00
CString strAboutMenu ;
strAboutMenu . LoadString ( IDS_ABOUTBOX ) ;
if ( ! strAboutMenu . IsEmpty ( ) )
{
pSysMenu - > AppendMenu ( MF_SEPARATOR ) ;
2001-11-14 22:39:26 +03:00
pSysMenu - > AppendMenu ( MF_STRING ,
IDM_ABOUTBOX ,
strAboutMenu ) ;
2000-08-29 23:26:29 +04:00
}
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
2004-05-20 23:08:18 +04:00
SetIcon ( m_hIcon , TRUE ) ; // Set big icon
SetIcon ( m_hIcon , FALSE ) ; // Set small icon
2001-05-21 18:47:00 +04:00
// Load source and build dirs from registry
this - > LoadFromRegistry ( ) ;
2001-09-07 01:28:24 +04:00
2001-05-21 18:47:00 +04:00
// try to load the cmake cache from disk
2001-04-26 00:09:17 +04:00
this - > LoadCacheFromDiskToGUI ( ) ;
2001-05-24 20:57:33 +04:00
m_WhereBuildControl . LimitText ( 2048 ) ;
m_WhereSourceControl . LimitText ( 2048 ) ;
2001-09-07 01:28:24 +04:00
2001-05-24 19:47:21 +04:00
// Set the version number
char tmp [ 1024 ] ;
2006-11-29 23:59:16 +03:00
sprintf ( tmp , " CMake %d.%d - %s " , cmVersion : : GetMajorVersion ( ) ,
cmVersion : : GetMinorVersion ( ) ,
cmVersion : : GetReleaseVersion ( ) . c_str ( ) ) ;
2002-09-26 23:14:20 +04:00
SetDlgItemText ( IDC_PROGRESS , " " ) ;
2002-12-07 00:03:30 +03:00
this - > SetWindowText ( tmp ) ;
2001-05-31 23:48:35 +04:00
this - > UpdateData ( FALSE ) ;
2000-08-29 23:26:29 +04:00
return TRUE ; // return TRUE unless you set the focus to a control
}
2001-05-21 18:47:00 +04:00
// About dialog invoke
2000-08-29 23:26:29 +04:00
void CMakeSetupDialog : : OnSysCommand ( UINT nID , LPARAM lParam )
{
if ( ( nID & 0xFFF0 ) = = IDM_ABOUTBOX )
{
CAboutDlg dlgAbout ;
dlgAbout . DoModal ( ) ;
}
2001-11-14 22:39:26 +03:00
else if ( ( nID & 0xFFF0 ) = = IDM_CREATESHORTCUT )
{
CreateShortcut ( ) ;
}
2000-08-29 23:26:29 +04:00
else
{
CDialog : : OnSysCommand ( nID , lParam ) ;
}
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CMakeSetupDialog : : OnPaint ( )
{
if ( IsIconic ( ) )
{
CPaintDC dc ( this ) ; // device context for painting
SendMessage ( WM_ICONERASEBKGND , ( WPARAM ) dc . GetSafeHdc ( ) , 0 ) ;
// Center icon in client rectangle
int cxIcon = GetSystemMetrics ( SM_CXICON ) ;
int cyIcon = GetSystemMetrics ( SM_CYICON ) ;
CRect rect ;
GetClientRect ( & rect ) ;
int x = ( rect . Width ( ) - cxIcon + 1 ) / 2 ;
int y = ( rect . Height ( ) - cyIcon + 1 ) / 2 ;
// Draw the icon
dc . DrawIcon ( x , y , m_hIcon ) ;
}
else
{
CDialog : : OnPaint ( ) ;
}
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CMakeSetupDialog : : OnQueryDragIcon ( )
{
return ( HCURSOR ) m_hIcon ;
}
2001-05-21 18:47:00 +04:00
// Browse button
2000-08-29 23:26:29 +04:00
bool CMakeSetupDialog : : Browse ( CString & result , const char * title )
{
2004-07-15 00:09:15 +04:00
CString initialDir = result ;
initialDir . Replace ( " / " , " \\ " ) ;
CPathDialog dlg ( " Select Path " , title , initialDir ) ;
2001-06-06 01:26:48 +04:00
if ( dlg . DoModal ( ) = = IDOK )
{
result = dlg . GetPathName ( ) ;
return true ;
}
else
2000-08-29 23:26:29 +04:00
{
2001-06-06 01:26:48 +04:00
return false ;
2000-08-29 23:26:29 +04:00
}
}
2001-05-21 18:47:00 +04:00
2000-08-29 23:26:29 +04:00
void CMakeSetupDialog : : SaveToRegistry ( )
{
HKEY hKey ;
DWORD dwDummy ;
if ( RegCreateKeyEx ( HKEY_CURRENT_USER ,
2004-05-20 23:08:18 +04:00
m_RegistryKey ,
0 , " " , REG_OPTION_NON_VOLATILE , KEY_READ | KEY_WRITE ,
NULL , & hKey , & dwDummy ) ! = ERROR_SUCCESS )
2000-08-29 23:26:29 +04:00
{
return ;
}
else
{
2001-09-25 22:39:32 +04:00
// save some values
2001-05-21 18:47:00 +04:00
CString regvalue ;
2007-02-05 19:13:18 +03:00
// write the size of the dialog
CRect size ;
this - > GetClientRect ( & size ) ;
unsigned long width = size . Width ( ) ;
unsigned long height = size . Height ( ) ;
RegSetValueEx ( hKey , _T ( " Width " ) , 0 , REG_DWORD ,
( CONST BYTE * ) ( & width ) , 4 ) ;
RegSetValueEx ( hKey , _T ( " Height " ) , 0 , REG_DWORD ,
( CONST BYTE * ) ( & height ) , 4 ) ;
2001-09-25 22:39:32 +04:00
this - > ReadRegistryValue ( hKey , & ( regvalue ) , " WhereSource1 " , " C: \\ " ) ;
int shiftEnd = 9 ;
2001-05-21 18:47:00 +04:00
if ( m_WhereSource ! = regvalue )
{
2001-09-25 22:39:32 +04:00
char keyName [ 1024 ] ;
char keyName2 [ 1024 ] ;
int i ;
for ( i = 2 ; i < 10 ; + + i )
{
regvalue = " " ;
sprintf ( keyName , " WhereSource%i " , i ) ;
this - > ReadRegistryValue ( hKey , & ( regvalue ) , keyName , " " ) ;
// check for short circuit, if the new value is already in
// the list then we stop
if ( m_WhereSource = = regvalue )
{
shiftEnd = i - 1 ;
}
}
for ( i = shiftEnd ; i ; - - i )
{
regvalue = " " ;
sprintf ( keyName , " WhereSource%i " , i ) ;
sprintf ( keyName2 , " WhereSource%i " , i + 1 ) ;
this - > ReadRegistryValue ( hKey , & ( regvalue ) , keyName , " " ) ;
if ( strlen ( regvalue ) )
{
RegSetValueEx ( hKey , _T ( keyName2 ) , 0 , REG_SZ ,
( CONST BYTE * ) ( const char * ) regvalue ,
regvalue . GetLength ( ) ) ;
}
}
RegSetValueEx ( hKey , _T ( " WhereSource1 " ) , 0 , REG_SZ ,
2001-05-21 18:47:00 +04:00
( CONST BYTE * ) ( const char * ) m_WhereSource ,
m_WhereSource . GetLength ( ) ) ;
}
2001-09-25 22:39:32 +04:00
this - > ReadRegistryValue ( hKey , & ( regvalue ) , " WhereBuild1 " , " C: \\ " ) ;
2001-05-21 18:47:00 +04:00
if ( m_WhereBuild ! = regvalue )
{
2001-09-25 22:39:32 +04:00
int i ;
char keyName [ 1024 ] ;
char keyName2 [ 1024 ] ;
for ( i = 2 ; i < 10 ; + + i )
{
regvalue = " " ;
sprintf ( keyName , " WhereBuild%i " , i ) ;
this - > ReadRegistryValue ( hKey , & ( regvalue ) , keyName , " " ) ;
// check for short circuit, if the new value is already in
// the list then we stop
if ( m_WhereBuild = = regvalue )
{
shiftEnd = i - 1 ;
}
}
for ( i = shiftEnd ; i ; - - i )
{
regvalue = " " ;
sprintf ( keyName , " WhereBuild%i " , i ) ;
sprintf ( keyName2 , " WhereBuild%i " , i + 1 ) ;
this - > ReadRegistryValue ( hKey , & ( regvalue ) , keyName , " " ) ;
if ( strlen ( regvalue ) )
{
RegSetValueEx ( hKey , _T ( keyName2 ) , 0 , REG_SZ ,
( CONST BYTE * ) ( const char * ) regvalue ,
regvalue . GetLength ( ) ) ;
}
}
RegSetValueEx ( hKey , _T ( " WhereBuild1 " ) , 0 , REG_SZ ,
2001-05-21 18:47:00 +04:00
( CONST BYTE * ) ( const char * ) m_WhereBuild ,
m_WhereBuild . GetLength ( ) ) ;
}
2000-08-29 23:26:29 +04:00
}
RegCloseKey ( hKey ) ;
}
void CMakeSetupDialog : : ReadRegistryValue ( HKEY hKey ,
2000-11-04 00:37:53 +03:00
CString * val ,
const char * key ,
const char * adefault )
2000-08-29 23:26:29 +04:00
{
DWORD dwType , dwSize ;
char * pb ;
dwType = REG_SZ ;
pb = val - > GetBuffer ( MAX_PATH ) ;
dwSize = MAX_PATH ;
if ( RegQueryValueEx ( hKey , _T ( key ) , NULL , & dwType ,
2004-05-20 23:08:18 +04:00
( BYTE * ) pb , & dwSize ) ! = ERROR_SUCCESS )
2000-08-29 23:26:29 +04:00
{
val - > ReleaseBuffer ( ) ;
* val = _T ( adefault ) ;
}
else
{
val - > ReleaseBuffer ( ) ;
}
}
void CMakeSetupDialog : : LoadFromRegistry ( )
{
HKEY hKey ;
if ( RegOpenKeyEx ( HKEY_CURRENT_USER ,
2004-05-20 23:08:18 +04:00
m_RegistryKey ,
0 , KEY_READ , & hKey ) ! = ERROR_SUCCESS )
2000-08-29 23:26:29 +04:00
{
return ;
}
else
{
2001-05-21 18:47:00 +04:00
// load some values
2007-02-05 19:13:18 +03:00
DWORD dwSize = 4 ;
DWORD width , height ;
if ( RegQueryValueEx ( hKey , _T ( " Width " ) , NULL , NULL ,
( BYTE * ) & width , & dwSize ) = = ERROR_SUCCESS & &
RegQueryValueEx ( hKey , _T ( " Height " ) , NULL , NULL ,
( BYTE * ) & height , & dwSize ) = = ERROR_SUCCESS )
{
this - > SetWindowPos ( 0 , 0 , 0 , width , height , SWP_NOZORDER | SWP_NOMOVE ) ;
}
2001-08-22 01:41:12 +04:00
if ( m_WhereSource . IsEmpty ( ) )
{
2001-09-25 22:39:32 +04:00
this - > ReadRegistryValue ( hKey , & ( m_WhereSource ) , " WhereSource1 " , " C: \\ " ) ;
2001-08-22 01:41:12 +04:00
}
if ( m_WhereBuild . IsEmpty ( ) )
{
2001-09-25 22:39:32 +04:00
this - > ReadRegistryValue ( hKey , & ( m_WhereBuild ) , " WhereBuild1 " , " C: \\ " ) ;
2001-08-22 01:41:12 +04:00
}
2001-05-21 18:47:00 +04:00
m_WhereSourceControl . AddString ( m_WhereSource ) ;
m_WhereBuildControl . AddString ( m_WhereBuild ) ;
2001-09-25 22:39:32 +04:00
char keyname [ 1024 ] ;
2001-05-21 18:47:00 +04:00
CString regvalue ;
2001-09-25 22:39:32 +04:00
int i ;
for ( i = 2 ; i < = 10 ; + + i )
{
sprintf ( keyname , " WhereSource%i " , i ) ;
regvalue = " " ;
this - > ReadRegistryValue ( hKey , & ( regvalue ) , keyname , " C: \\ " ) ;
if ( strcmp ( " C: \\ " , regvalue ) )
{
m_WhereSourceControl . AddString ( regvalue ) ;
}
sprintf ( keyname , " WhereBuild%i " , i ) ;
regvalue = " " ;
this - > ReadRegistryValue ( hKey , & ( regvalue ) , keyname , " C: \\ " ) ;
if ( strcmp ( " C: \\ " , regvalue ) )
{
m_WhereBuildControl . AddString ( regvalue ) ;
}
}
2000-08-29 23:26:29 +04:00
}
RegCloseKey ( hKey ) ;
}
2001-04-24 00:40:29 +04:00
2001-05-21 18:47:00 +04:00
// Callback for browse source button
void CMakeSetupDialog : : OnBrowseWhereSource ( )
{
this - > UpdateData ( ) ;
Browse ( m_WhereSource , " Enter Path to Source " ) ;
this - > UpdateData ( false ) ;
this - > OnChangeWhereSource ( ) ;
}
// Callback for browser build button
void CMakeSetupDialog : : OnBrowseWhereBuild ( )
{
this - > UpdateData ( ) ;
Browse ( m_WhereBuild , " Enter Path to Build " ) ;
this - > UpdateData ( false ) ;
this - > OnChangeWhereBuild ( ) ;
}
2001-07-26 02:30:27 +04:00
void CMakeSetupDialog : : RunCMake ( bool generateProjectFiles )
2001-04-24 00:40:29 +04:00
{
2001-08-27 23:48:37 +04:00
if ( ! cmSystemTools : : FileExists ( m_WhereBuild ) )
2001-04-26 02:53:33 +04:00
{
std : : string message =
" Build directory does not exist, should I create it? \n \n "
" Directory: " ;
message + = ( const char * ) m_WhereBuild ;
if ( MessageBox ( message . c_str ( ) , " Create Directory " , MB_OKCANCEL ) = = IDOK )
{
cmSystemTools : : MakeDirectory ( m_WhereBuild ) ;
}
else
{
MessageBox ( " Build Project aborted, nothing done. " ) ;
return ;
}
}
2001-05-30 23:28:55 +04:00
// set the wait cursor
2003-07-08 21:12:10 +04:00
m_Cursor = LoadCursor ( NULL , IDC_WAIT ) ;
: : SetCursor ( m_Cursor ) ;
m_RunningConfigure = true ;
2001-05-30 23:28:55 +04:00
// get all the info from the dialog
2001-04-24 20:40:37 +04:00
this - > UpdateData ( ) ;
2001-08-27 23:48:37 +04:00
// always save the current gui values to disk
this - > SaveCacheFromGUI ( ) ;
2001-05-02 00:34:53 +04:00
// Make sure we are working from the cache on disk
2001-11-20 01:52:08 +03:00
this - > LoadCacheFromDiskToGUI ( ) ;
m_OKButton . EnableWindow ( false ) ;
2002-09-06 21:06:23 +04:00
// setup the cmake instance
if ( generateProjectFiles )
2001-05-30 23:28:55 +04:00
{
2002-09-06 21:06:23 +04:00
if ( m_CMakeInstance - > Generate ( ) ! = 0 )
{
cmSystemTools : : Error (
" Error in generation process, project files may be invalid " ) ;
}
2001-05-30 23:28:55 +04:00
}
2002-09-06 21:06:23 +04:00
else
{
m_CMakeInstance - > SetHomeDirectory ( m_WhereSource ) ;
m_CMakeInstance - > SetStartDirectory ( m_WhereSource ) ;
m_CMakeInstance - > SetHomeOutputDirectory ( m_WhereBuild ) ;
m_CMakeInstance - > SetStartOutputDirectory ( m_WhereBuild ) ;
m_CMakeInstance - > SetGlobalGenerator (
2005-03-28 22:23:07 +04:00
m_CMakeInstance - > CreateGlobalGenerator ( m_GeneratorDialog . m_GeneratorChoiceString ) ) ;
2002-09-17 21:59:58 +04:00
m_CMakeInstance - > SetCMakeCommand ( m_PathToExecutable ) ;
m_CMakeInstance - > LoadCache ( ) ;
if ( m_CMakeInstance - > Configure ( ) ! = 0 )
2002-09-06 21:06:23 +04:00
{
cmSystemTools : : Error (
" Error in configuration process, project files may be invalid " ) ;
}
// update the GUI with any new values in the caused by the
// generation process
this - > LoadCacheFromDiskToGUI ( ) ;
}
2001-04-26 00:09:17 +04:00
// save source and build paths to registry
2001-04-24 00:40:29 +04:00
this - > SaveToRegistry ( ) ;
2001-05-30 23:28:55 +04:00
// path is up-to-date now
2001-04-26 00:09:17 +04:00
m_BuildPathChanged = false ;
2003-07-08 21:12:10 +04:00
// put the cursor back
m_Cursor = LoadCursor ( NULL , IDC_ARROW ) ;
: : SetCursor ( m_Cursor ) ;
m_RunningConfigure = false ;
2001-11-20 01:52:08 +03:00
cmSystemTools : : ResetErrorOccuredFlag ( ) ;
2001-07-26 02:30:27 +04:00
}
// Callback for build projects button
void CMakeSetupDialog : : OnConfigure ( )
{
2005-03-28 22:23:07 +04:00
if ( ! m_GeneratorPicked )
{
m_GeneratorDialog . m_CMakeInstance = this - > m_CMakeInstance ;
if ( m_GeneratorDialog . DoModal ( ) ! = IDOK )
{
return ;
}
// save the generator choice in the registry
HKEY hKey ;
DWORD dwDummy ;
if ( RegCreateKeyEx ( HKEY_CURRENT_USER ,
m_RegistryKey ,
0 , " " , REG_OPTION_NON_VOLATILE , KEY_READ | KEY_WRITE ,
NULL , & hKey , & dwDummy ) = = ERROR_SUCCESS )
{
// save some values
RegSetValueEx ( hKey , _T ( " LastGenerator " ) , 0 , REG_SZ ,
( CONST BYTE * ) ( const char * ) m_GeneratorDialog . m_GeneratorChoiceString ,
m_GeneratorDialog . m_GeneratorChoiceString . GetLength ( ) ) ;
}
}
2005-02-11 22:36:57 +03:00
2001-11-20 01:52:08 +03:00
// enable error messages each time configure is pressed
cmSystemTools : : EnableMessages ( ) ;
2001-07-26 02:30:27 +04:00
this - > RunCMake ( false ) ;
2001-04-24 00:40:29 +04:00
}
2001-05-21 18:47:00 +04:00
// callback for combo box menu where build selection
void CMakeSetupDialog : : OnSelendokWhereBuild ( )
{
2001-05-30 23:28:55 +04:00
m_WhereBuildControl . GetLBText ( m_WhereBuildControl . GetCurSel ( ) ,
m_WhereBuild ) ;
2001-06-26 17:55:35 +04:00
m_WhereBuildControl . SetWindowText ( m_WhereBuild ) ;
2001-05-21 18:47:00 +04:00
this - > UpdateData ( FALSE ) ;
this - > OnChangeWhereBuild ( ) ;
}
// callback for combo box menu where source selection
void CMakeSetupDialog : : OnSelendokWhereSource ( )
{
2001-05-30 23:28:55 +04:00
m_WhereSourceControl . GetLBText ( m_WhereSourceControl . GetCurSel ( ) ,
m_WhereSource ) ;
2001-05-21 18:47:00 +04:00
this - > UpdateData ( FALSE ) ;
this - > OnChangeWhereSource ( ) ;
}
// callback for chaing source directory
void CMakeSetupDialog : : OnChangeWhereSource ( )
{
}
// callback for changing the build directory
void CMakeSetupDialog : : OnChangeWhereBuild ( )
{
2002-08-02 00:23:07 +04:00
this - > UpdateData ( ) ;
2002-07-22 18:57:16 +04:00
// The build dir has changed, check if there is a cache, and
// grab the source dir from it
std : : string path = this - > m_WhereBuild ;
cmSystemTools : : ConvertToUnixSlashes ( path ) ;
2002-09-06 21:06:23 +04:00
// adjust the cmake instance
m_CMakeInstance - > SetHomeOutputDirectory ( m_WhereBuild ) ;
m_CMakeInstance - > SetStartOutputDirectory ( m_WhereBuild ) ;
2002-07-22 18:57:16 +04:00
std : : string cache_file = path ;
cache_file + = " /CMakeCache.txt " ;
2002-08-28 22:51:10 +04:00
cmCacheManager * cachem = this - > m_CMakeInstance - > GetCacheManager ( ) ;
2002-09-11 22:38:45 +04:00
cmCacheManager : : CacheIterator it = cachem - > NewIterator ( ) ;
2005-08-11 21:20:23 +04:00
m_GeneratorPicked = false ;
// make sure we have a normal cache file, specifically if one exists make
// sure it can be read
if ( cmSystemTools : : FileExists ( cache_file . c_str ( ) ) )
2005-02-11 22:36:57 +03:00
{
2005-08-11 21:20:23 +04:00
if ( cachem - > LoadCache ( path . c_str ( ) ) )
{
if ( it . Find ( " CMAKE_HOME_DIRECTORY " ) )
{
path = ConvertToWindowsPath ( it . GetValue ( ) ) ;
this - > m_WhereSource = path . c_str ( ) ;
this - > m_WhereSourceControl . SetWindowText ( this - > m_WhereSource ) ;
this - > OnChangeWhereSource ( ) ;
m_GeneratorPicked = true ;
}
}
else
{
//file exists but cqnnot be read
cmSystemTools : : Error ( " There is a CMakeCache.txt file for the current binary tree but cmake does not have permission to read it. Please check the permissions of the directory you are trying to run CMake on. " ) ;
return ;
}
2005-02-11 22:36:57 +03:00
}
2001-05-21 18:47:00 +04:00
m_CacheEntriesList . RemoveAll ( ) ;
2001-07-16 18:15:17 +04:00
m_CacheEntriesList . ShowWindow ( SW_SHOW ) ;
this - > LoadCacheFromDiskToGUI ( ) ;
m_BuildPathChanged = true ;
2001-05-21 18:47:00 +04:00
}
// copy from the cache manager to the cache edit list box
2001-04-26 00:09:17 +04:00
void CMakeSetupDialog : : FillCacheGUIFromCacheManager ( )
2001-07-26 02:30:27 +04:00
{
2002-08-28 22:51:10 +04:00
cmCacheManager * cachem = this - > m_CMakeInstance - > GetCacheManager ( ) ;
2004-05-20 23:08:18 +04:00
cmCacheManager : : CacheIterator it = cachem - > NewIterator ( ) ;
2002-03-13 23:29:26 +03:00
size_t size = m_CacheEntriesList . GetItems ( ) . size ( ) ;
2001-07-26 02:30:27 +04:00
// if there are already entries in the cache, then
// put the new ones in the top, so they show up first
2004-01-03 01:24:19 +03:00
bool reverseOrder = false ;
2001-07-26 02:30:27 +04:00
// all the current values are not new any more
std : : set < CPropertyItem * > items = m_CacheEntriesList . GetItems ( ) ;
for ( std : : set < CPropertyItem * > : : iterator i = items . begin ( ) ;
i ! = items . end ( ) ; + + i )
{
2004-05-20 23:08:18 +04:00
// first check to see if it is still in the cache
2001-07-26 02:30:27 +04:00
CPropertyItem * item = * i ;
2004-05-20 23:08:18 +04:00
if ( ! it . Find ( ( const char * ) item - > m_propName ) )
{
m_CacheEntriesList . RemoveProperty ( ( const char * ) item - > m_propName ) ;
}
else
{
// if it is still in the cache then it is no longer new
item - > m_NewValue = false ;
}
2001-07-26 02:30:27 +04:00
}
2002-08-28 22:51:10 +04:00
for ( cmCacheManager : : CacheIterator i = cachem - > NewIterator ( ) ;
2002-08-21 20:02:32 +04:00
! i . IsAtEnd ( ) ; i . Next ( ) )
2001-04-24 00:40:29 +04:00
{
2002-08-21 20:02:32 +04:00
const char * key = i . GetName ( ) ;
2001-12-05 23:29:36 +03:00
// if value has trailing space or tab, enclose it in single quotes
// to enforce the fact that it has 'invisible' trailing stuff
2002-09-11 22:38:45 +04:00
std : : string value = i . GetValue ( ) ;
if ( value . size ( ) & &
( value [ value . size ( ) - 1 ] = = ' ' | |
value [ value . size ( ) - 1 ] = = ' \t ' ) )
2001-12-05 23:29:36 +03:00
{
2002-09-11 22:38:45 +04:00
value = ' \' ' + value + ' \' ' ;
2001-12-05 23:29:36 +03:00
}
2004-01-03 01:24:19 +03:00
bool advanced = i . GetPropertyAsBool ( " ADVANCED " ) ;
2002-09-11 22:38:45 +04:00
switch ( i . GetType ( ) )
2001-04-24 00:40:29 +04:00
{
case cmCacheManager : : BOOL :
2002-09-11 22:38:45 +04:00
if ( cmSystemTools : : IsOn ( value . c_str ( ) ) )
2001-04-24 20:40:37 +04:00
{
m_CacheEntriesList . AddProperty ( key ,
" ON " ,
2002-09-11 22:38:45 +04:00
i . GetProperty ( " HELPSTRING " ) ,
2001-10-01 18:14:39 +04:00
CPropertyList : : COMBO , " ON|OFF " ,
2004-01-03 01:24:19 +03:00
reverseOrder ,
advanced
2001-07-26 02:30:27 +04:00
) ;
2001-04-24 20:40:37 +04:00
}
else
{
m_CacheEntriesList . AddProperty ( key ,
" OFF " ,
2002-09-11 22:38:45 +04:00
i . GetProperty ( " HELPSTRING " ) ,
2001-10-01 18:14:39 +04:00
CPropertyList : : COMBO , " ON|OFF " ,
2004-01-03 01:24:19 +03:00
reverseOrder , advanced
2001-07-26 02:30:27 +04:00
) ;
2001-04-24 20:40:37 +04:00
}
2001-04-24 00:40:29 +04:00
break ;
case cmCacheManager : : PATH :
2001-04-26 22:53:44 +04:00
m_CacheEntriesList . AddProperty ( key ,
2002-09-11 22:38:45 +04:00
value . c_str ( ) ,
i . GetProperty ( " HELPSTRING " ) ,
2001-07-26 02:30:27 +04:00
CPropertyList : : PATH , " " ,
2004-01-03 01:24:19 +03:00
reverseOrder , advanced
2001-07-26 02:30:27 +04:00
) ;
2001-04-24 00:40:29 +04:00
break ;
case cmCacheManager : : FILEPATH :
2001-04-26 22:53:44 +04:00
m_CacheEntriesList . AddProperty ( key ,
2002-09-11 22:38:45 +04:00
value . c_str ( ) ,
i . GetProperty ( " HELPSTRING " ) ,
2001-07-26 02:30:27 +04:00
CPropertyList : : FILE , " " ,
2004-01-03 01:24:19 +03:00
reverseOrder , advanced
2001-07-26 02:30:27 +04:00
) ;
2001-04-24 00:40:29 +04:00
break ;
case cmCacheManager : : STRING :
2001-04-26 22:53:44 +04:00
m_CacheEntriesList . AddProperty ( key ,
2002-09-11 22:38:45 +04:00
value . c_str ( ) ,
i . GetProperty ( " HELPSTRING " ) ,
2001-07-26 02:30:27 +04:00
CPropertyList : : EDIT , " " ,
2004-01-03 01:24:19 +03:00
reverseOrder , advanced
2001-07-26 02:30:27 +04:00
) ;
2001-04-24 00:40:29 +04:00
break ;
case cmCacheManager : : INTERNAL :
2004-05-20 23:08:18 +04:00
m_CacheEntriesList . RemoveProperty ( key ) ;
2001-04-24 00:40:29 +04:00
break ;
}
}
2004-01-03 01:24:19 +03:00
if ( m_CacheEntriesList . GetShowAdvanced ( ) )
{
m_CacheEntriesList . ShowAdvanced ( ) ;
}
else
{
m_CacheEntriesList . HideAdvanced ( ) ;
}
2001-11-17 00:29:25 +03:00
m_OKButton . EnableWindow ( false ) ;
2002-08-28 22:51:10 +04:00
if ( cachem - > GetSize ( ) > 0 & & ! cmSystemTools : : GetErrorOccuredFlag ( ) )
2001-11-17 00:29:25 +03:00
{
bool enable = true ;
items = m_CacheEntriesList . GetItems ( ) ;
for ( std : : set < CPropertyItem * > : : iterator i = items . begin ( ) ;
i ! = items . end ( ) ; + + i )
{
CPropertyItem * item = * i ;
2004-01-03 01:24:19 +03:00
if ( item - > m_Advanced )
2001-11-17 00:29:25 +03:00
{
2004-01-03 01:24:19 +03:00
if ( item - > m_NewValue & & m_CacheEntriesList . GetShowAdvanced ( ) )
{
enable = false ;
break ;
}
}
else
{
if ( item - > m_NewValue )
{
// if one new value then disable to OK button
enable = false ;
break ;
}
2001-11-17 00:29:25 +03:00
}
}
if ( enable )
{
m_OKButton . EnableWindow ( true ) ;
}
}
2001-07-26 02:30:27 +04:00
// redraw the list
m_CacheEntriesList . SetTopIndex ( 0 ) ;
m_CacheEntriesList . Invalidate ( ) ;
2001-04-24 00:40:29 +04:00
}
2001-05-21 18:47:00 +04:00
// copy from the list box to the cache manager
2001-04-26 00:09:17 +04:00
void CMakeSetupDialog : : FillCacheManagerFromCacheGUI ( )
2001-04-24 00:40:29 +04:00
{
2002-08-28 22:51:10 +04:00
cmCacheManager * cachem = this - > m_CMakeInstance - > GetCacheManager ( ) ;
2001-04-24 22:19:13 +04:00
std : : set < CPropertyItem * > items = m_CacheEntriesList . GetItems ( ) ;
2002-09-11 22:38:45 +04:00
cmCacheManager : : CacheIterator it = cachem - > NewIterator ( ) ;
2001-04-24 22:19:13 +04:00
for ( std : : set < CPropertyItem * > : : iterator i = items . begin ( ) ;
2001-04-24 00:40:29 +04:00
i ! = items . end ( ) ; + + i )
{
2001-04-24 21:32:31 +04:00
CPropertyItem * item = * i ;
2002-09-11 22:38:45 +04:00
if ( it . Find ( ( const char * ) item - > m_propName ) )
2001-05-11 01:23:00 +04:00
{
2001-12-05 23:29:36 +03:00
// if value is enclosed in single quotes ('foo') then remove them
// they were used to enforce the fact that it had 'invisible'
// trailing stuff
if ( item - > m_curValue . GetLength ( ) > = 2 & &
item - > m_curValue [ 0 ] = = ' \' ' & &
item - > m_curValue [ item - > m_curValue . GetLength ( ) - 1 ] = = ' \' ' )
{
2002-09-11 22:38:45 +04:00
it . SetValue ( item - > m_curValue . Mid (
2004-05-20 23:08:18 +04:00
1 , item - > m_curValue . GetLength ( ) - 2 ) ) ;
2001-12-05 23:29:36 +03:00
}
else
{
2002-09-11 22:38:45 +04:00
it . SetValue ( item - > m_curValue ) ;
2001-12-05 23:29:36 +03:00
}
2001-04-24 00:40:29 +04:00
}
}
}
2001-04-26 00:09:17 +04:00
//! Load cache file from m_WhereBuild and display in GUI editor
void CMakeSetupDialog : : LoadCacheFromDiskToGUI ( )
{
2002-08-28 22:51:10 +04:00
cmCacheManager * cachem = this - > m_CMakeInstance - > GetCacheManager ( ) ;
2001-04-26 00:09:17 +04:00
if ( m_WhereBuild ! = " " )
{
2005-08-11 21:20:23 +04:00
if ( ! cachem - > LoadCache ( m_WhereBuild ) )
{
// if it does exist, but isn;t readable then warn the user
std : : string cacheFile = m_WhereBuild ;
cacheFile + = " /CMakeCache.txt " ;
if ( cmSystemTools : : FileExists ( cacheFile . c_str ( ) ) )
{
cmSystemTools : : Error ( " There is a CMakeCache.txt file for the current binary tree but cmake does not have permission to read it. Please check the permissions of the directory you are trying to run CMake on. " ) ;
return ;
}
}
2004-08-23 22:33:22 +04:00
cmCacheManager : : CacheIterator itm = cachem - > NewIterator ( ) ;
if ( itm . Find ( " CMAKE_HOME_DIRECTORY " ) )
{
std : : string path = ConvertToWindowsPath ( itm . GetValue ( ) ) ;
this - > m_WhereSource = path . c_str ( ) ;
this - > m_WhereSourceControl . SetWindowText ( this - > m_WhereSource ) ;
this - > OnChangeWhereSource ( ) ;
}
m_CMakeInstance - > SetHomeDirectory ( m_WhereSource ) ;
m_CMakeInstance - > SetStartDirectory ( m_WhereSource ) ;
m_CMakeInstance - > SetHomeOutputDirectory ( m_WhereBuild ) ;
m_CMakeInstance - > SetStartOutputDirectory ( m_WhereBuild ) ;
m_CMakeInstance - > PreLoadCMakeFiles ( ) ;
2001-04-26 00:09:17 +04:00
this - > FillCacheGUIFromCacheManager ( ) ;
2002-09-11 22:38:45 +04:00
cmCacheManager : : CacheIterator it =
cachem - > GetCacheIterator ( " CMAKE_GENERATOR " ) ;
if ( ! it . IsAtEnd ( ) )
2001-09-07 01:28:24 +04:00
{
2005-02-11 22:36:57 +03:00
m_GeneratorPicked = true ;
2002-09-11 22:38:45 +04:00
std : : string curGen = it . GetValue ( ) ;
2005-03-28 22:23:07 +04:00
if ( m_GeneratorDialog . m_GeneratorChoiceString ! = curGen . c_str ( ) )
2001-09-07 01:28:24 +04:00
{
2005-03-28 22:23:07 +04:00
m_GeneratorDialog . m_GeneratorChoiceString = curGen . c_str ( ) ;
2001-09-07 01:28:24 +04:00
this - > UpdateData ( FALSE ) ;
}
}
2001-04-26 00:09:17 +04:00
}
}
//! Save GUI values to cmCacheManager and then save to disk.
void CMakeSetupDialog : : SaveCacheFromGUI ( )
{
2002-08-28 22:51:10 +04:00
cmCacheManager * cachem = this - > m_CMakeInstance - > GetCacheManager ( ) ;
2001-04-26 00:09:17 +04:00
this - > FillCacheManagerFromCacheGUI ( ) ;
if ( m_WhereBuild ! = " " )
{
2002-08-28 22:51:10 +04:00
cachem - > SaveCache ( m_WhereBuild ) ;
2001-04-26 00:09:17 +04:00
}
}
2001-05-21 18:47:00 +04:00
2001-06-19 22:32:37 +04:00
void CMakeSetupDialog : : OnSize ( UINT nType , int cx , int cy )
{
2001-07-11 21:06:41 +04:00
if ( nType = = SIZE_MINIMIZED )
{
CDialog : : OnSize ( nType , cx , cy ) ;
return ;
}
2001-06-26 17:55:35 +04:00
if ( m_oldCX = = - 1 )
{
m_oldCX = cx ;
m_oldCY = cy ;
}
int deltax = cx - m_oldCX ;
int deltay = cy - m_oldCY ;
m_oldCX = cx ;
m_oldCY = cy ;
2001-06-19 22:32:37 +04:00
CDialog : : OnSize ( nType , cx , cy ) ;
2001-06-26 17:55:35 +04:00
if ( deltax = = 0 & & deltay = = 0 )
{
return ;
}
2001-06-19 23:33:37 +04:00
2001-06-19 22:32:37 +04:00
if ( m_CacheEntriesList . m_hWnd )
{
2001-06-26 17:55:35 +04:00
// get the original sizes/positions
CRect cRect ;
2002-11-02 07:00:44 +03:00
m_AdvancedValuesControl . GetWindowRect ( & cRect ) ;
this - > ScreenToClient ( & cRect ) ;
m_AdvancedValuesControl . SetWindowPos ( & wndTop , cRect . left + deltax ,
2002-12-03 22:09:56 +03:00
cRect . top ,
0 , 0 ,
SWP_NOCOPYBITS |
SWP_NOSIZE | SWP_NOZORDER ) ;
2002-11-02 07:00:44 +03:00
m_BrowseSource . GetWindowRect ( & cRect ) ;
this - > ScreenToClient ( & cRect ) ;
m_BrowseSource . SetWindowPos ( & wndTop , cRect . left + deltax ,
cRect . top ,
0 , 0 ,
2002-12-03 22:09:56 +03:00
SWP_NOCOPYBITS | SWP_NOSIZE | SWP_NOZORDER ) ;
2002-11-02 07:00:44 +03:00
m_BrowseBuild . GetWindowRect ( & cRect ) ;
this - > ScreenToClient ( & cRect ) ;
m_BrowseBuild . SetWindowPos ( & wndTop , cRect . left + deltax ,
2002-12-03 22:09:56 +03:00
cRect . top ,
0 , 0 ,
SWP_NOCOPYBITS | SWP_NOSIZE | SWP_NOZORDER ) ;
2002-11-02 07:00:44 +03:00
m_WhereSourceControl . GetWindowRect ( & cRect ) ;
m_WhereSourceControl . SetWindowPos ( & wndTop , cRect . left , cRect . top ,
cRect . Width ( ) + deltax ,
2002-12-03 22:32:46 +03:00
cRect . Height ( ) ,
2002-12-03 22:09:56 +03:00
SWP_NOCOPYBITS |
2002-11-02 07:00:44 +03:00
SWP_NOMOVE | SWP_NOZORDER ) ;
m_WhereBuildControl . GetWindowRect ( & cRect ) ;
m_WhereBuildControl . SetWindowPos ( & wndTop , cRect . left , cRect . top ,
2002-12-03 22:09:56 +03:00
cRect . Width ( ) + deltax ,
2002-12-03 22:32:46 +03:00
cRect . Height ( ) ,
2002-12-03 22:09:56 +03:00
SWP_NOCOPYBITS |
SWP_NOMOVE | SWP_NOZORDER ) ;
2001-06-26 17:55:35 +04:00
m_ListFrame . GetWindowRect ( & cRect ) ;
m_ListFrame . SetWindowPos ( & wndTop , cRect . left , cRect . top ,
cRect . Width ( ) + deltax ,
cRect . Height ( ) + deltay ,
2002-12-03 22:09:56 +03:00
SWP_NOCOPYBITS | SWP_NOMOVE | SWP_NOZORDER ) ;
2001-06-26 17:55:35 +04:00
m_CacheEntriesList . GetWindowRect ( & cRect ) ;
m_CacheEntriesList . SetWindowPos ( & wndTop , cRect . left , cRect . top ,
2002-12-03 22:09:56 +03:00
cRect . Width ( ) + deltax ,
cRect . Height ( ) + deltay ,
SWP_NOCOPYBITS | SWP_NOMOVE | SWP_NOZORDER ) ;
2002-12-05 23:48:03 +03:00
m_StatusDisplay . GetWindowRect ( & cRect ) ;
this - > ScreenToClient ( & cRect ) ;
m_StatusDisplay . SetWindowPos ( & wndBottom , cRect . left ,
cRect . top + deltay ,
cRect . Width ( ) + deltax , cRect . Height ( ) ,
SWP_NOCOPYBITS ) ;
2001-06-26 17:55:35 +04:00
m_MouseHelp . GetWindowRect ( & cRect ) ;
this - > ScreenToClient ( & cRect ) ;
2002-12-05 23:48:03 +03:00
m_MouseHelp . SetWindowPos ( & wndTop , cRect . left ,
2001-06-26 17:55:35 +04:00
cRect . top + deltay ,
2002-12-05 23:48:03 +03:00
cRect . Width ( ) + deltax , cRect . Height ( ) ,
SWP_NOCOPYBITS | SWP_NOZORDER ) ;
deltax = int ( deltax + m_deltaXRemainder ) ;
m_deltaXRemainder = float ( deltax % 2 ) ;
2002-12-03 22:09:56 +03:00
2001-06-26 17:55:35 +04:00
2001-07-26 02:30:27 +04:00
m_Configure . GetWindowRect ( & cRect ) ;
2001-06-26 17:55:35 +04:00
this - > ScreenToClient ( & cRect ) ;
2001-07-26 02:30:27 +04:00
m_Configure . SetWindowPos ( & wndTop , cRect . left + deltax / 2 ,
2001-06-26 17:55:35 +04:00
cRect . top + deltay ,
0 , 0 ,
2002-12-03 22:09:56 +03:00
SWP_NOCOPYBITS | SWP_NOSIZE ) ;
2001-06-26 17:55:35 +04:00
m_CancelButton . GetWindowRect ( & cRect ) ;
this - > ScreenToClient ( & cRect ) ;
m_CancelButton . SetWindowPos ( & wndTop , cRect . left + deltax / 2 ,
cRect . top + deltay ,
0 , 0 ,
2002-12-03 22:09:56 +03:00
SWP_NOCOPYBITS | SWP_NOSIZE ) ;
2001-07-26 02:30:27 +04:00
m_OKButton . GetWindowRect ( & cRect ) ;
this - > ScreenToClient ( & cRect ) ;
m_OKButton . SetWindowPos ( & wndTop , cRect . left + deltax / 2 ,
cRect . top + deltay ,
0 , 0 ,
2002-12-03 22:09:56 +03:00
SWP_NOCOPYBITS | SWP_NOSIZE ) ;
2004-05-20 23:08:18 +04:00
m_DeleteButton . GetWindowRect ( & cRect ) ;
this - > ScreenToClient ( & cRect ) ;
m_DeleteButton . SetWindowPos ( & wndTop , cRect . left + deltax / 2 ,
cRect . top + deltay ,
0 , 0 ,
SWP_NOCOPYBITS | SWP_NOSIZE ) ;
2001-11-17 00:29:25 +03:00
m_HelpButton . GetWindowRect ( & cRect ) ;
this - > ScreenToClient ( & cRect ) ;
m_HelpButton . SetWindowPos ( & wndTop , cRect . left + deltax / 2 ,
cRect . top + deltay ,
0 , 0 ,
2002-12-03 22:09:56 +03:00
SWP_NOCOPYBITS | SWP_NOSIZE ) ;
2001-06-19 22:32:37 +04:00
}
}
void CMakeSetupDialog : : OnGetMinMaxInfo ( MINMAXINFO FAR * lpMMI )
{
lpMMI - > ptMinTrackSize . x = 550 ;
lpMMI - > ptMinTrackSize . y = 272 ;
}
2001-07-26 02:30:27 +04:00
void CMakeSetupDialog : : OnCancel ( )
2001-07-13 03:48:41 +04:00
{
2003-07-08 21:12:10 +04:00
if ( m_RunningConfigure )
{
if ( MessageBox ( " You are in the middle of a Configure. \n "
" If you Cancel now the configure information will be lost. \n "
" Are you sure you want to Cancel? " , " Confirm Exit " ,
MB_YESNO ) = = IDYES )
{
cmSystemTools : : SetFatalErrorOccured ( ) ;
}
return ;
}
2001-07-26 18:18:26 +04:00
if ( m_CacheEntriesList . IsDirty ( ) )
2001-07-13 03:48:41 +04:00
{
if ( MessageBox ( " You have changed options but not rebuilt, "
2004-05-20 23:08:18 +04:00
" are you sure you want to exit? " , " Confirm Exit " ,
MB_YESNO ) = = IDYES )
2001-07-13 03:48:41 +04:00
{
CDialog : : OnOK ( ) ;
}
}
else
{
CDialog : : OnOK ( ) ;
}
}
2001-07-26 02:30:27 +04:00
void CMakeSetupDialog : : OnOk ( )
{
2001-11-20 01:52:08 +03:00
// enable error messages each time configure is pressed
cmSystemTools : : EnableMessages ( ) ;
2001-07-26 02:30:27 +04:00
m_CacheEntriesList . ClearDirty ( ) ;
this - > RunCMake ( true ) ;
2007-02-05 19:13:18 +03:00
// save the size of the dialog
2001-12-06 00:05:26 +03:00
if ( ! ( : : GetKeyState ( VK_SHIFT ) & 0x1000 ) )
{
CDialog : : OnOK ( ) ;
}
2001-07-26 02:30:27 +04:00
}
2001-09-07 01:28:24 +04:00
2001-11-14 22:39:26 +03:00
// Create a shortcut on the desktop with the current Source/Build dir.
int CMakeSetupDialog : : CreateShortcut ( )
{
// Find the desktop folder and create the link name
HKEY hKey ;
if ( RegOpenKeyEx ( HKEY_CURRENT_USER ,
" Software \\ Microsoft \\ Windows \\ CurrentVersion \\ Explorer \\ Shell Folders " ,
2004-05-20 23:08:18 +04:00
0 , KEY_READ , & hKey ) ! = ERROR_SUCCESS )
2001-11-14 22:39:26 +03:00
{
AfxMessageBox ( " Create shortcut: unable to find 'Shell Folders' key in registry! " ) ;
return 1 ;
}
DWORD dwType , dwSize ;
# define MAXPATH 1024
char link_name [ MAXPATH ] ;
dwSize = MAXPATH ;
if ( RegQueryValueEx ( hKey ,
( LPCTSTR ) " Desktop " ,
NULL ,
& dwType ,
( BYTE * ) link_name ,
& dwSize ) ! = ERROR_SUCCESS )
{
AfxMessageBox ( " Create shortcut: unable to find 'Desktop' registry value in 'Shell Folders' key! " ) ;
return 1 ;
}
if ( dwType ! = REG_SZ )
{
AfxMessageBox ( " Create shortcut: 'Desktop' registry value in 'Shell Folders' key has wrong type! " ) ;
return 1 ;
}
strcat ( link_name , " \\ CMake - " ) ;
std : : string current_dir = cmSystemTools : : GetFilenameName ( ( LPCTSTR ) m_WhereSource ) ;
strcat ( link_name , current_dir . c_str ( ) ) ;
strcat ( link_name , " .lnk " ) ;
// Find the path to the current executable
char path_to_current_exe [ MAXPATH ] ;
: : GetModuleFileName ( NULL , path_to_current_exe , MAXPATH ) ;
// Create the shortcut
HRESULT hres ;
IShellLink * psl ;
// Initialize the COM library
hres = CoInitialize ( NULL ) ;
if ( ! SUCCEEDED ( hres ) )
{
AfxMessageBox ( " Create shortcut: unable to initialize the COM library! " ) ;
return 1 ;
}
// Create an IShellLink object and get a pointer to the IShellLink
// interface (returned from CoCreateInstance).
hres = CoCreateInstance ( CLSID_ShellLink ,
NULL ,
CLSCTX_INPROC_SERVER ,
IID_IShellLink ,
( void * * ) & psl ) ;
if ( ! SUCCEEDED ( hres ) )
{
AfxMessageBox ( " Create shortcut: unable to create IShellLink instance! " ) ;
return 1 ;
}
IPersistFile * ppf ;
// Query IShellLink for the IPersistFile interface for
// saving the shortcut in persistent storage.
hres = psl - > QueryInterface ( IID_IPersistFile , ( void * * ) & ppf ) ;
if ( SUCCEEDED ( hres ) )
{
// Set the path to the shortcut target.
hres = psl - > SetPath ( path_to_current_exe ) ;
if ( ! SUCCEEDED ( hres ) )
{
AfxMessageBox ( " Create shortcut: SetPath failed! " ) ;
}
// Set the arguments of the shortcut.
2005-03-28 22:23:07 +04:00
CString args = " /H= \" " + m_WhereSource + " \" /B= \" " + m_WhereBuild + " \" /G= \" " + m_GeneratorDialog . m_GeneratorChoiceString + " \" /A= \" " + ( m_AdvancedValues ? " TRUE " : " FALSE " ) + " \" " ;
2001-12-03 23:59:17 +03:00
2001-11-14 22:39:26 +03:00
hres = psl - > SetArguments ( args ) ;
if ( ! SUCCEEDED ( hres ) )
{
AfxMessageBox ( " Create shortcut: SetArguments failed! " ) ;
}
// Set the description of the shortcut.
hres = psl - > SetDescription ( " Shortcut to CMakeSetup " ) ;
if ( ! SUCCEEDED ( hres ) )
{
AfxMessageBox ( " Create shortcut: SetDescription failed! " ) ;
}
// Ensure that the string consists of ANSI characters.
2005-05-27 01:30:13 +04:00
WORD wszAr [ MAX_PATH ] ;
LPWSTR wsz = ( LPWSTR ) wszAr ;
MultiByteToWideChar ( CP_ACP , 0 , link_name , - 1 , ( LPWSTR ) ( wsz ) , MAX_PATH ) ;
2001-11-14 22:39:26 +03:00
// Save the shortcut via the IPersistFile::Save member function.
hres = ppf - > Save ( wsz , TRUE ) ;
if ( ! SUCCEEDED ( hres ) )
{
AfxMessageBox ( " Create shortcut: Save failed! " ) ;
}
// Release the pointer to IPersistFile.
ppf - > Release ( ) ;
}
// Release the pointer to IShellLink.
psl - > Release ( ) ;
return 0 ;
}
2001-11-17 00:29:25 +03:00
void CMakeSetupDialog : : OnHelpButton ( )
{
CMakeHelp dialog ;
dialog . DoModal ( ) ;
}
2001-11-27 02:28:27 +03:00
2004-05-20 23:08:18 +04:00
void CMakeSetupDialog : : OnDeleteButton ( )
{
2005-02-11 22:36:57 +03:00
std : : string message = " Are you sure you want to delete the CMakeCache.txt file for: \n " ;
message + = m_WhereBuild ;
if ( : : MessageBox ( 0 , message . c_str ( ) , " Delete Cache? " ,
MB_YESNO | MB_TASKMODAL ) = = IDNO )
{
return ;
}
m_GeneratorPicked = false ;
2004-05-20 23:08:18 +04:00
if ( m_WhereBuild ! = " " & & this - > m_CMakeInstance )
{
this - > m_CMakeInstance - > GetCacheManager ( ) - > DeleteCache ( m_WhereBuild ) ;
}
// Make sure we are working from the cache on disk
this - > LoadCacheFromDiskToGUI ( ) ;
m_OKButton . EnableWindow ( false ) ;
}
2001-11-27 02:28:27 +03:00
void CMakeSetupDialog : : ShowAdvancedValues ( )
{
2004-01-03 01:24:19 +03:00
m_CacheEntriesList . ShowAdvanced ( ) ;
2001-11-27 02:28:27 +03:00
}
void CMakeSetupDialog : : RemoveAdvancedValues ( )
{
2004-01-03 01:24:19 +03:00
m_CacheEntriesList . HideAdvanced ( ) ;
2001-11-27 02:28:27 +03:00
}
2004-01-03 01:24:19 +03:00
2001-11-27 02:28:27 +03:00
void CMakeSetupDialog : : OnAdvancedValues ( )
{
this - > UpdateData ( ) ;
if ( m_AdvancedValues )
{
this - > ShowAdvancedValues ( ) ;
}
else
{
this - > RemoveAdvancedValues ( ) ;
}
}
void CMakeSetupDialog : : OnDoubleclickedAdvancedValues ( )
{
this - > OnAdvancedValues ( ) ;
}
2002-07-21 23:56:08 +04:00
// Handle param or single dropped file.
2003-07-24 01:28:44 +04:00
void CMakeSetupDialog : : ChangeDirectoriesFromFile ( const char * arg )
2002-07-21 23:56:08 +04:00
{
2003-07-24 01:28:44 +04:00
// Check if the argument refers to a CMakeCache.txt or
// CMakeLists.txt file.
std : : string listPath ;
std : : string cachePath ;
bool argIsFile = false ;
if ( cmSystemTools : : FileIsDirectory ( arg ) )
2002-07-21 23:56:08 +04:00
{
2003-07-24 01:28:44 +04:00
std : : string path = cmSystemTools : : CollapseFullPath ( arg ) ;
cmSystemTools : : ConvertToUnixSlashes ( path ) ;
std : : string cacheFile = path ;
cacheFile + = " /CMakeCache.txt " ;
std : : string listFile = path ;
listFile + = " /CMakeLists.txt " ;
if ( cmSystemTools : : FileExists ( cacheFile . c_str ( ) ) )
{
cachePath = path ;
}
if ( cmSystemTools : : FileExists ( listFile . c_str ( ) ) )
{
listPath = path ;
}
2002-07-21 23:56:08 +04:00
}
2003-07-24 01:28:44 +04:00
else if ( cmSystemTools : : FileExists ( arg ) )
2002-07-21 23:56:08 +04:00
{
2003-07-24 01:28:44 +04:00
argIsFile = true ;
std : : string fullPath = cmSystemTools : : CollapseFullPath ( arg ) ;
std : : string name = cmSystemTools : : GetFilenameName ( fullPath . c_str ( ) ) ;
name = cmSystemTools : : LowerCase ( name ) ;
if ( name = = " cmakecache.txt " )
{
cachePath = cmSystemTools : : GetFilenamePath ( fullPath . c_str ( ) ) ;
}
else if ( name = = " cmakelists.txt " )
{
listPath = cmSystemTools : : GetFilenamePath ( fullPath . c_str ( ) ) ;
}
2002-07-22 18:57:16 +04:00
}
2003-07-24 01:28:44 +04:00
// If there is a CMakeCache.txt file, use its settings.
if ( cachePath . length ( ) > 0 )
2002-07-22 18:57:16 +04:00
{
2003-07-24 01:28:44 +04:00
cmCacheManager * cachem = m_CMakeInstance - > GetCacheManager ( ) ;
cmCacheManager : : CacheIterator it = cachem - > NewIterator ( ) ;
if ( cachem - > LoadCache ( cachePath . c_str ( ) ) & & it . Find ( " CMAKE_HOME_DIRECTORY " ) )
{
2003-08-01 16:47:26 +04:00
std : : string path = ConvertToWindowsPath ( cachePath . c_str ( ) ) ;
2003-07-24 01:28:44 +04:00
m_WhereBuild = path . c_str ( ) ;
2003-08-01 16:47:26 +04:00
path = ConvertToWindowsPath ( it . GetValue ( ) ) ;
2003-07-24 01:28:44 +04:00
m_WhereSource = path . c_str ( ) ;
2003-08-06 21:48:51 +04:00
2005-03-28 22:23:07 +04:00
m_GeneratorDialog . m_GeneratorChoiceString = _T ( " " ) ;
2003-07-24 01:28:44 +04:00
return ;
}
2002-07-21 23:56:08 +04:00
}
2003-07-24 01:28:44 +04:00
// If there is a CMakeLists.txt file, use it as the source tree.
if ( listPath . length ( ) > 0 )
2002-07-22 18:57:16 +04:00
{
2003-08-01 00:30:49 +04:00
std : : string path = ConvertToWindowsPath ( listPath . c_str ( ) ) ;
2003-07-24 01:28:44 +04:00
m_WhereSource = path . c_str ( ) ;
if ( argIsFile )
{
// Source CMakeLists.txt file given. It was probably dropped
// onto the window or executable. Default to an in-source
// build.
m_WhereBuild = path . c_str ( ) ;
}
else
{
// Source directory given on command line. Use current working
// directory as build tree.
std : : string cwd = cmSystemTools : : GetCurrentWorkingDirectory ( ) ;
2003-08-01 00:30:49 +04:00
path = ConvertToWindowsPath ( cwd . c_str ( ) ) ;
2003-07-24 01:28:44 +04:00
m_WhereBuild = path . c_str ( ) ;
}
2002-07-22 18:57:16 +04:00
}
2002-07-21 23:56:08 +04:00
}
2003-07-24 01:28:44 +04:00
2002-07-21 23:56:08 +04:00
// The framework calls this member function when the user releases the
// left mouse button over a window that has registered itself as the
// recipient of dropped files.
void CMakeSetupDialog : : OnDropFiles ( HDROP hDropInfo )
{
UINT nb_files = DragQueryFile ( hDropInfo , 0xFFFFFFFF , NULL , 0 ) ;
if ( nb_files > 0 )
{
UINT buffer_size = DragQueryFile ( hDropInfo , 0 , NULL , 0 ) ;
char * buffer = new char [ buffer_size + 1 ] ;
DragQueryFile ( hDropInfo , 0 , buffer , buffer_size + 1 ) ;
this - > ChangeDirectoriesFromFile ( buffer ) ;
delete [ ] buffer ;
this - > m_WhereSourceControl . SetWindowText ( this - > m_WhereSource ) ;
this - > m_WhereBuildControl . SetWindowText ( this - > m_WhereBuild ) ;
this - > UpdateData ( FALSE ) ;
this - > OnChangeWhereSource ( ) ;
this - > OnChangeWhereBuild ( ) ;
}
DragFinish ( hDropInfo ) ;
}
2003-07-08 21:12:10 +04:00
BOOL CMakeSetupDialog : : OnSetCursor ( CWnd * pWnd , UINT nHitTest , UINT message )
{
2004-05-21 00:39:05 +04:00
CDialog : : OnSetCursor ( pWnd , nHitTest , message ) ;
if ( m_Cursor = = LoadCursor ( NULL , IDC_WAIT ) )
{
: : SetCursor ( m_Cursor ) ;
}
2003-07-08 21:12:10 +04:00
return true ;
}