| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550 | // pcbuilderdialogDlg.cpp : implementation file//#include "stdafx.h"#include "shellapi.h"// a fun undef for DOT NET#undef DEBUG#include "CMakeSetup.h"#include "MakeHelp.h"#include "cmVersion.h"#include "PathDialog.h"#include "CMakeSetupDialog.h"#include "CMakeCommandLineInfo.h"#include "../cmExternalMakefileProjectGenerator.h"#include "../cmListFileCache.h"#include "../cmCacheManager.h"#include "../cmake.h"#include "../cmGlobalGenerator.h"#include "../cmDynamicLoader.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif/////////////////////////////////////////////////////////////////////////////// CAboutDlg dialog used for App Aboutclass CAboutDlg : public CDialog{public:  CAboutDlg();  // Dialog Data  //{{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// Implementationprotected:  //{{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();void MFCMessageCallback(const char* m, const char* title, bool& nomore, void*){   std::string message = m;  message += "\n\n(Press  Cancel to suppress any further messages.)";  if(::MessageBox(0, message.c_str(), title,                   MB_OKCANCEL|MB_TASKMODAL) == IDCANCEL)    {    nomore = true;    }}/////////////////////////////////////////////////////////////////////////////// CMakeSetupDialog dialogvoid updateProgress(const char *msg, float prog, void *cd){  char* tmp = new char[strlen(msg) + 40];  if (prog >= 0)    {    sprintf(tmp,"%s %i%%",msg,(int)(100*prog));    }  else    {    sprintf(tmp,"%s",msg);        }  CMakeSetupDialog *self = (CMakeSetupDialog *)cd;  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;      }    }  delete [] tmp;}// 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 itstd::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.  // 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);  std::string s = cmSystemTools::ConvertToOutputPath(path);  // now restore the force unix path to its previous value  cmSystemTools::SetForceUnixPaths(saveForce);  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;}CMakeSetupDialog::CMakeSetupDialog(const CMakeCommandLineInfo& cmdInfo,                                   CWnd* pParent /*=NULL*/)  : CDialog(CMakeSetupDialog::IDD, pParent){   m_GeneratorPicked = false;  m_Cursor = LoadCursor(NULL, IDC_ARROW);  m_RunningConfigure = false;  cmSystemTools::SetRunCommandHideConsole(true);  cmSystemTools::SetErrorCallback(MFCMessageCallback);  m_RegistryKey  = "Software\\Kitware\\CMakeSetup\\Settings\\StartPath";  m_CacheEntriesList.m_CMakeSetupDialog = this;  m_CMakeInstance = new cmake;  m_CMakeInstance->SetCMakeEditCommand("CMakeSetup");  m_CMakeInstance->SetProgressCallback(updateProgress, (void *)this);  //{{AFX_DATA_INIT(CMakeSetupDialog)        //}}AFX_DATA_INIT  // 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;    this->m_GeneratorDialog.m_GeneratorChoiceString =       cmdInfo.m_GeneratorChoiceString;    this->m_AdvancedValues = cmdInfo.m_AdvancedValues;    }  else    {    this->m_WhereSource = _T("");    this->m_WhereBuild = _T("");    this->m_AdvancedValues = FALSE;    this->m_GeneratorDialog.m_GeneratorChoiceString =       cmdInfo.m_GeneratorChoiceString;    this->ChangeDirectoriesFromFile((LPCTSTR)cmdInfo.m_LastUnknownParameter);    }  // Note that LoadIcon does not require a subsequent DestroyIcon in Win32  m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);  m_BuildPathChanged = false;  // 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";  m_oldCX = -1;  m_deltaXRemainder = 0;}CMakeSetupDialog::~CMakeSetupDialog(){  delete m_CMakeInstance;  // clean up globals   cmDynamicLoader::FlushCache();}void CMakeSetupDialog::DoDataExchange(CDataExchange* pDX){  CDialog::DoDataExchange(pDX);  //{{AFX_DATA_MAP(CMakeSetupDialog)        DDX_Control(pDX, IDC_AdvancedValues, m_AdvancedValuesControl);        DDX_Control(pDX, IDC_SUPPRESS_DEV_WARNINGS, m_SuppressDevWarningsControl);        DDX_Check(pDX, IDC_SUPPRESS_DEV_WARNINGS, m_SuppressDevValue);        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}BEGIN_MESSAGE_MAP(CMakeSetupDialog, CDialog)  //{{AFX_MSG_MAP(CMakeSetupDialog)  ON_WM_SYSCOMMAND()  ON_WM_PAINT()  ON_WM_QUERYDRAGICON()  ON_BN_CLICKED(IDC_BUTTON2, OnBrowseWhereSource)  ON_BN_CLICKED(IDC_BuildProjects, OnConfigure)  ON_BN_CLICKED(IDC_BUTTON3, OnBrowseWhereBuild)  ON_CBN_EDITCHANGE(IDC_WhereBuild, OnChangeWhereBuild)  ON_CBN_SELCHANGE(IDC_WhereBuild, OnSelendokWhereBuild)  ON_CBN_EDITCHANGE(IDC_WhereSource, OnChangeWhereSource)  ON_CBN_SELENDOK(IDC_WhereSource, OnSelendokWhereSource)  ON_WM_SIZE()  ON_WM_GETMINMAXINFO()  ON_BN_CLICKED(IDC_OK, OnOk)  ON_BN_CLICKED(IDC_DELETE_BUTTON, OnDeleteButton)  ON_BN_CLICKED(IDC_HELP_BUTTON, OnHelpButton)  ON_BN_CLICKED(IDC_AdvancedValues, OnAdvancedValues)  ON_BN_CLICKED(IDC_SUPPRESS_DEV_WARNINGS, OnSuppressDevValue)  ON_BN_DOUBLECLICKED(IDC_SUPPRESS_DEV_WARNINGS, OnDoubleclickedSuppressDevValue)  ON_BN_DOUBLECLICKED(IDC_AdvancedValues, OnDoubleclickedAdvancedValues)  ON_WM_DROPFILES()  ON_BN_CLICKED(IDCANCEL, OnCancel)        ON_WM_SETCURSOR()        //}}AFX_MSG_MAPEND_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// CMakeSetupDialog message handlersBOOL CMakeSetupDialog::OnInitDialog(){  CDialog::OnInitDialog();  this->DragAcceptFiles(true);  // 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);  // 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)    {    CString strCreateShortcutMenu;    strCreateShortcutMenu.LoadString(IDS_CREATESHORTCUT);    if (!strCreateShortcutMenu.IsEmpty())      {      pSysMenu->AppendMenu(MF_SEPARATOR);      pSysMenu->AppendMenu(MF_STRING,                            IDM_CREATESHORTCUT,                            strCreateShortcutMenu);      }    CString strAboutMenu;    strAboutMenu.LoadString(IDS_ABOUTBOX);    if (!strAboutMenu.IsEmpty())      {      pSysMenu->AppendMenu(MF_SEPARATOR);      pSysMenu->AppendMenu(MF_STRING,                            IDM_ABOUTBOX,                            strAboutMenu);      }    }  // Set the icon for this dialog.  The framework does this automatically  //  when the application's main window is not a dialog  SetIcon(m_hIcon, TRUE);                        // Set big icon  SetIcon(m_hIcon, FALSE);                // Set small icon  // Load source and build dirs from registry  this->LoadFromRegistry();  // try to load the cmake cache from disk  this->LoadCacheFromDiskToGUI();  m_WhereBuildControl.LimitText(2048);  m_WhereSourceControl.LimitText(2048);      // Set the version number  char tmp[1024];  sprintf(tmp,"CMake %s", cmVersion::GetCMakeVersion());  SetDlgItemText(IDC_PROGRESS, "");  this->SetWindowText(tmp);  this->UpdateData(FALSE);  return TRUE;  // return TRUE  unless you set the focus to a control}// About dialog invokevoid CMakeSetupDialog::OnSysCommand(UINT nID, LPARAM lParam){  if ((nID & 0xFFF0) == IDM_ABOUTBOX)    {    CAboutDlg dlgAbout;    dlgAbout.DoModal();    }  else if ((nID & 0xFFF0) == IDM_CREATESHORTCUT)    {    CreateShortcut();    }  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;}// Browse buttonbool CMakeSetupDialog::Browse(CString &result, const char *title){  CString initialDir = result;  initialDir.Replace("/", "\\");  CPathDialog dlg("Select Path", title, initialDir);   if(dlg.DoModal()==IDOK)    {    result =  dlg.GetPathName();    return true;    }  else    {    return false;    }}void CMakeSetupDialog::SaveToRegistry(){   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)     {    return;    }  else    {    // save some values    CString regvalue;    // write the size of the dialog    CRect size;    this->GetWindowRect(&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);    this->ReadRegistryValue(hKey, &(regvalue),"WhereSource1","C:\\");    int shiftEnd = 9;    if(m_WhereSource != regvalue)      {      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,                     (CONST BYTE *)(const char *)m_WhereSource,                     m_WhereSource.GetLength());      }        this->ReadRegistryValue(hKey, &(regvalue),"WhereBuild1","C:\\");    if(m_WhereBuild != regvalue)      {      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,                     (CONST BYTE *)(const char *)m_WhereBuild,                     m_WhereBuild.GetLength());      }    }  RegCloseKey(hKey);}void CMakeSetupDialog::ReadRegistryValue(HKEY hKey,                                         CString *val,                                         const char *key,                                         const char *adefault){  DWORD dwType, dwSize;  char *pb;  dwType = REG_SZ;  pb = val->GetBuffer(MAX_PATH);  dwSize = MAX_PATH;  if(RegQueryValueEx(hKey,_T(key), NULL, &dwType,                      (BYTE *)pb, &dwSize) != ERROR_SUCCESS)    {    val->ReleaseBuffer();    *val = _T(adefault);    }  else    {    val->ReleaseBuffer();    }}void CMakeSetupDialog::LoadFromRegistry(){   HKEY hKey;  if(RegOpenKeyEx(HKEY_CURRENT_USER,                   m_RegistryKey,                   0, KEY_READ, &hKey) != ERROR_SUCCESS)    {    return;    }  else    {    // load some values    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);      }    if (m_WhereSource.IsEmpty())       {      this->ReadRegistryValue(hKey, &(m_WhereSource),"WhereSource1","C:\\");      }    if (m_WhereBuild.IsEmpty())       {      this->ReadRegistryValue(hKey, &(m_WhereBuild),"WhereBuild1","C:\\");      }    m_WhereSourceControl.AddString(m_WhereSource);    m_WhereBuildControl.AddString(m_WhereBuild);    char keyname[1024];    CString regvalue;    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);        }      }    }  RegCloseKey(hKey);}// Callback for browse source buttonvoid CMakeSetupDialog::OnBrowseWhereSource() {  this->UpdateData();  Browse(m_WhereSource, "Enter Path to Source");  this->UpdateData(false);  this->OnChangeWhereSource();}// Callback for browser build buttonvoid CMakeSetupDialog::OnBrowseWhereBuild() {  this->UpdateData();  Browse(m_WhereBuild, "Enter Path to Build");  this->UpdateData(false);  this->OnChangeWhereBuild();}void CMakeSetupDialog::RunCMake(bool generateProjectFiles){  if(!cmSystemTools::FileExists(m_WhereBuild))    {    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;      }    }  // set the wait cursor  m_Cursor = LoadCursor(NULL, IDC_WAIT);  ::SetCursor(m_Cursor);  m_RunningConfigure = true;    // get all the info from the dialog  this->UpdateData();  // always save the current gui values to disk  this->SaveCacheFromGUI();  // Make sure we are working from the cache on disk  this->LoadCacheFromDiskToGUI();   m_OKButton.EnableWindow(false);  // setup the cmake instance  if (generateProjectFiles)    {    if(m_CMakeInstance->Generate() != 0)      {      cmSystemTools::Error(        "Error in generation process, project files may be invalid");      }    }  else    {    m_CMakeInstance->SetHomeDirectory(m_WhereSource);    m_CMakeInstance->SetStartDirectory(m_WhereSource);    m_CMakeInstance->SetHomeOutputDirectory(m_WhereBuild);    m_CMakeInstance->SetStartOutputDirectory(m_WhereBuild);    m_CMakeInstance->SetGlobalGenerator(      m_CMakeInstance->CreateGlobalGenerator(m_GeneratorDialog.m_GeneratorChoiceString));    m_CMakeInstance->SetCMakeCommand(m_PathToExecutable);    m_CMakeInstance->LoadCache();    if(m_SuppressDevValue)      {      m_CMakeInstance->SetSuppressDevWarnings(true);      }    else      {      m_CMakeInstance->SetSuppressDevWarnings(false);      }    if(m_CMakeInstance->Configure() != 0)      {      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();    }  // save source and build paths to registry  this->SaveToRegistry();  // path is up-to-date now  m_BuildPathChanged = false;  // put the cursor back   m_Cursor = LoadCursor(NULL, IDC_ARROW);  ::SetCursor(m_Cursor);  m_RunningConfigure = false;  cmSystemTools::ResetErrorOccuredFlag();}// Callback for build projects buttonvoid CMakeSetupDialog::OnConfigure() {  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());      }    }    // enable error messages each time configure is pressed  cmSystemTools::EnableMessages();  this->RunCMake(false);}// callback for combo box menu where build selectionvoid CMakeSetupDialog::OnSelendokWhereBuild() {  m_WhereBuildControl.GetLBText(m_WhereBuildControl.GetCurSel(),                                 m_WhereBuild);  m_WhereBuildControl.SetWindowText( m_WhereBuild);  this->UpdateData(FALSE);  this->OnChangeWhereBuild();}// callback for combo box menu where source selectionvoid CMakeSetupDialog::OnSelendokWhereSource() {  m_WhereSourceControl.GetLBText(m_WhereSourceControl.GetCurSel(),                                  m_WhereSource);  this->UpdateData(FALSE);  this->OnChangeWhereSource();}// callback for chaing source directoryvoid CMakeSetupDialog::OnChangeWhereSource() {}// callback for changing the build directoryvoid CMakeSetupDialog::OnChangeWhereBuild() {  this->UpdateData();  // 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);  // adjust the cmake instance  m_CMakeInstance->SetHomeOutputDirectory(m_WhereBuild);  m_CMakeInstance->SetStartOutputDirectory(m_WhereBuild);  std::string cache_file = path;  cache_file += "/CMakeCache.txt";  cmCacheManager *cachem = this->m_CMakeInstance->GetCacheManager();  cmCacheManager::CacheIterator it = cachem->NewIterator();  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()))    {    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;      }    }    m_CacheEntriesList.RemoveAll();  m_CacheEntriesList.ShowWindow(SW_SHOW);  this->LoadCacheFromDiskToGUI();  m_BuildPathChanged = true;}// copy from the cache manager to the cache edit list boxvoid CMakeSetupDialog::FillCacheGUIFromCacheManager(){   cmCacheManager *cachem = this->m_CMakeInstance->GetCacheManager();  cmCacheManager::CacheIterator it = cachem->NewIterator();  // if there are already entries in the cache, then  // put the new ones in the top, so they show up first  bool reverseOrder = false;  // 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)    {    // first check to see if it is still in the cache    CPropertyItem* item = *i;    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;      }    }  for(cmCacheManager::CacheIterator i = cachem->NewIterator();      !i.IsAtEnd(); i.Next())    {    const char* key = i.GetName();    // if value has trailing space or tab, enclose it in single quotes    // to enforce the fact that it has 'invisible' trailing stuff    std::string value = i.GetValue();    if (value.size() &&         (value[value.size() - 1] == ' ' ||          value[value.size() - 1] == '\t'))      {      value = '\'' + value +  '\'';      }    bool advanced = i.GetPropertyAsBool("ADVANCED");    switch(i.GetType() )      {      case cmCacheManager::BOOL:        if(cmSystemTools::IsOn(value.c_str()))          {          m_CacheEntriesList.AddProperty(key,                                         "ON",                                         i.GetProperty("HELPSTRING"),                                         CPropertyList::COMBO,"ON|OFF",                                         reverseOrder,                                         advanced            );          }        else          {          m_CacheEntriesList.AddProperty(key,                                         "OFF",                                         i.GetProperty("HELPSTRING"),                                         CPropertyList::COMBO,"ON|OFF",                                         reverseOrder, advanced            );          }        break;      case cmCacheManager::PATH:        m_CacheEntriesList.AddProperty(key,                                        value.c_str(),                                       i.GetProperty("HELPSTRING"),                                       CPropertyList::PATH,"",                                       reverseOrder, advanced          );        break;      case cmCacheManager::FILEPATH:        m_CacheEntriesList.AddProperty(key,                                        value.c_str(),                                       i.GetProperty("HELPSTRING"),                                       CPropertyList::FILE,"",                                       reverseOrder, advanced          );        break;      case cmCacheManager::STRING:        m_CacheEntriesList.AddProperty(key,                                       value.c_str(),                                       i.GetProperty("HELPSTRING"),                                       CPropertyList::EDIT,"",                                       reverseOrder, advanced          );        break;      case cmCacheManager::INTERNAL:        m_CacheEntriesList.RemoveProperty(key);        break;      }    }  if(m_CacheEntriesList.GetShowAdvanced())    {    m_CacheEntriesList.ShowAdvanced();    }  else    {    m_CacheEntriesList.HideAdvanced();    }    m_OKButton.EnableWindow(false);  if(cachem->GetSize() > 0 && !cmSystemTools::GetErrorOccuredFlag())    {    bool enable = true;    items = m_CacheEntriesList.GetItems();    for(std::set<CPropertyItem*>::iterator i = items.begin();        i != items.end(); ++i)      {      CPropertyItem* item = *i;      if(item->m_Advanced )        {        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;          }        }      }    if(enable)      {      m_OKButton.EnableWindow(true);      }    }  // redraw the list  m_CacheEntriesList.SetTopIndex(0);  m_CacheEntriesList.Invalidate();}// copy from the list box to the cache managervoid CMakeSetupDialog::FillCacheManagerFromCacheGUI(){   cmCacheManager *cachem = this->m_CMakeInstance->GetCacheManager();  std::set<CPropertyItem*> items = m_CacheEntriesList.GetItems();  cmCacheManager::CacheIterator it = cachem->NewIterator();  for(std::set<CPropertyItem*>::iterator i = items.begin();      i != items.end(); ++i)    {    CPropertyItem* item = *i;     if ( it.Find((const char*)item->m_propName) )      {      // 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] == '\'')         {        it.SetValue(item->m_curValue.Mid(          1, item->m_curValue.GetLength() - 2));        }      else        {        it.SetValue(item->m_curValue);        }      }    }}  //! Load cache file from m_WhereBuild and display in GUI editorvoid CMakeSetupDialog::LoadCacheFromDiskToGUI(){  cmCacheManager *cachem = this->m_CMakeInstance->GetCacheManager();  if(m_WhereBuild != "")    {    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;        }      }    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();    this->FillCacheGUIFromCacheManager();    cmCacheManager::CacheIterator it =       cachem->GetCacheIterator("CMAKE_GENERATOR");    if(!it.IsAtEnd())      {      m_GeneratorPicked = true;      const char* extraGen = cachem->GetCacheValue("CMAKE_EXTRA_GENERATOR");      std::string curGen = cmExternalMakefileProjectGenerator::                              CreateFullGeneratorName(it.GetValue(), extraGen);      if(m_GeneratorDialog.m_GeneratorChoiceString != curGen.c_str())        {        m_GeneratorDialog.m_GeneratorChoiceString = curGen.c_str();        this->UpdateData(FALSE);        }      }    }}//! Save GUI values to cmCacheManager and then save to disk.void CMakeSetupDialog::SaveCacheFromGUI(){  cmCacheManager *cachem = this->m_CMakeInstance->GetCacheManager();  this->FillCacheManagerFromCacheGUI();  if(m_WhereBuild != "")    {    cachem->SaveCache(m_WhereBuild);    }}void CMakeSetupDialog::OnSize(UINT nType, int cx, int cy) {  if (nType == SIZE_MINIMIZED)    {    CDialog::OnSize(nType, cx, cy);    return;    }    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;  CDialog::OnSize(nType, cx, cy);  if (deltax == 0 && deltay == 0)    {    return;    }    if(m_CacheEntriesList.m_hWnd)    {    // get the original sizes/positions    CRect cRect;    m_AdvancedValuesControl.GetWindowRect(&cRect);    this->ScreenToClient(&cRect);    m_AdvancedValuesControl.SetWindowPos(&wndTop, cRect.left + deltax,                                          cRect.top,                                          0, 0,                                         SWP_NOCOPYBITS |                                          SWP_NOSIZE | SWP_NOZORDER);    m_SuppressDevWarningsControl.GetWindowRect(&cRect);    this->ScreenToClient(&cRect);    m_SuppressDevWarningsControl.SetWindowPos(&wndTop, cRect.left + deltax,                                          cRect.top,                                          0, 0,                                         SWP_NOCOPYBITS |                                          SWP_NOSIZE | SWP_NOZORDER);    m_BrowseSource.GetWindowRect(&cRect);    this->ScreenToClient(&cRect);    m_BrowseSource.SetWindowPos(&wndTop, cRect.left + deltax,                                 cRect.top,                                 0, 0,                                SWP_NOCOPYBITS | SWP_NOSIZE | SWP_NOZORDER);    m_BrowseBuild.GetWindowRect(&cRect);    this->ScreenToClient(&cRect);    m_BrowseBuild.SetWindowPos(&wndTop, cRect.left + deltax,                                cRect.top,                                0, 0,                               SWP_NOCOPYBITS | SWP_NOSIZE | SWP_NOZORDER);        m_WhereSourceControl.GetWindowRect(&cRect);    m_WhereSourceControl.SetWindowPos(&wndTop, cRect.left, cRect.top,                                       cRect.Width() + deltax,                                       cRect.Height(),                                       SWP_NOCOPYBITS |                                       SWP_NOMOVE | SWP_NOZORDER);    m_WhereBuildControl.GetWindowRect(&cRect);    m_WhereBuildControl.SetWindowPos(&wndTop, cRect.left, cRect.top,                                      cRect.Width() + deltax,                                      cRect.Height(),                                      SWP_NOCOPYBITS |                                      SWP_NOMOVE | SWP_NOZORDER);    m_ListFrame.GetWindowRect(&cRect);    m_ListFrame.SetWindowPos(&wndTop, cRect.left, cRect.top,                              cRect.Width() + deltax,                              cRect.Height() + deltay,                              SWP_NOCOPYBITS | SWP_NOMOVE | SWP_NOZORDER);    m_CacheEntriesList.GetWindowRect(&cRect);    m_CacheEntriesList.SetWindowPos(&wndTop, cRect.left, cRect.top,                                     cRect.Width() + deltax,                                     cRect.Height() + deltay,                                     SWP_NOCOPYBITS | SWP_NOMOVE | SWP_NOZORDER);    m_StatusDisplay.GetWindowRect(&cRect);    this->ScreenToClient(&cRect);    m_StatusDisplay.SetWindowPos(&wndBottom, cRect.left,                                  cRect.top + deltay,                                  cRect.Width() + deltax,  cRect.Height(),                                 SWP_NOCOPYBITS);    m_MouseHelp.GetWindowRect(&cRect);    this->ScreenToClient(&cRect);    m_MouseHelp.SetWindowPos(&wndTop, cRect.left ,                              cRect.top + deltay,                              cRect.Width() +  deltax, cRect.Height(),                             SWP_NOCOPYBITS | SWP_NOZORDER);        deltax = int(deltax + m_deltaXRemainder);    m_deltaXRemainder = float(deltax%2);    m_Configure.GetWindowRect(&cRect);    this->ScreenToClient(&cRect);    m_Configure.SetWindowPos(&wndTop, cRect.left + deltax/2,                                  cRect.top + deltay,                                  0, 0,                                 SWP_NOCOPYBITS | SWP_NOSIZE);    m_CancelButton.GetWindowRect(&cRect);    this->ScreenToClient(&cRect);    m_CancelButton.SetWindowPos(&wndTop, cRect.left + deltax/2,                                 cRect.top + deltay,                                 0, 0,                                SWP_NOCOPYBITS | SWP_NOSIZE);    m_OKButton.GetWindowRect(&cRect);    this->ScreenToClient(&cRect);    m_OKButton.SetWindowPos(&wndTop, cRect.left + deltax/2,                             cRect.top + deltay,                             0, 0,                            SWP_NOCOPYBITS | SWP_NOSIZE);    m_DeleteButton.GetWindowRect(&cRect);    this->ScreenToClient(&cRect);    m_DeleteButton.SetWindowPos(&wndTop, cRect.left + deltax/2,                                 cRect.top + deltay,                                 0, 0,                                SWP_NOCOPYBITS | SWP_NOSIZE);    m_HelpButton.GetWindowRect(&cRect);    this->ScreenToClient(&cRect);    m_HelpButton.SetWindowPos(&wndTop, cRect.left + deltax/2,                               cRect.top + deltay,                               0, 0,                              SWP_NOCOPYBITS | SWP_NOSIZE);    }  }void CMakeSetupDialog::OnGetMinMaxInfo( MINMAXINFO FAR* lpMMI ){  lpMMI->ptMinTrackSize.x = 550;  lpMMI->ptMinTrackSize.y = 272;}void CMakeSetupDialog::OnCancel(){  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;    }  if(m_CacheEntriesList.IsDirty())    {    if(MessageBox("You have changed options but not rebuilt, "                  "are you sure you want to exit?", "Confirm Exit",                  MB_YESNO) == IDYES)      {      CDialog::OnOK();      }    }  else    {    CDialog::OnOK();    }}void CMakeSetupDialog::OnOk() {  // enable error messages each time configure is pressed  cmSystemTools::EnableMessages();  m_CacheEntriesList.ClearDirty();  this->RunCMake(true);  // save the size of the dialog    if (!(::GetKeyState(VK_SHIFT) & 0x1000))    {    CDialog::OnOK();    }}// 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",                   0, KEY_READ, &hKey) != ERROR_SUCCESS)    {    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.    CString args = " /H=\"" + m_WhereSource + "\" /B=\"" + m_WhereBuild + "\" /G=\"" + m_GeneratorDialog.m_GeneratorChoiceString + "\" /A=\"" + (m_AdvancedValues ? "TRUE" : "FALSE") + "\"";        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.    WORD wszAr[MAX_PATH];     LPWSTR wsz = (LPWSTR)wszAr;    MultiByteToWideChar(CP_ACP, 0, link_name, -1, (LPWSTR)(wsz), MAX_PATH);    // 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;}void CMakeSetupDialog::OnHelpButton() {  CMakeHelp dialog;  dialog.DoModal();}void CMakeSetupDialog::OnDeleteButton() {  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;  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);}void CMakeSetupDialog::ShowAdvancedValues(){  m_CacheEntriesList.ShowAdvanced();}void CMakeSetupDialog::RemoveAdvancedValues(){  m_CacheEntriesList.HideAdvanced();}void CMakeSetupDialog::OnSuppressDevValue() {}void CMakeSetupDialog::OnDoubleclickedSuppressDevValue() {  this->OnSuppressDevValue();}void CMakeSetupDialog::OnAdvancedValues() {  this->UpdateData();  if(m_AdvancedValues)    {    this->ShowAdvancedValues();    }  else    {    this->RemoveAdvancedValues();    }}void CMakeSetupDialog::OnDoubleclickedAdvancedValues() {  this->OnAdvancedValues();}// Handle param or single dropped file.void CMakeSetupDialog::ChangeDirectoriesFromFile(const char* arg){  // 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))    {    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;      }    }  else if(cmSystemTools::FileExists(arg))    {    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());      }    }    // If there is a CMakeCache.txt file, use its settings.  if(cachePath.length() > 0)    {    cmCacheManager* cachem = m_CMakeInstance->GetCacheManager();    cmCacheManager::CacheIterator it = cachem->NewIterator();    if(cachem->LoadCache(cachePath.c_str()) && it.Find("CMAKE_HOME_DIRECTORY"))      {      std::string path = ConvertToWindowsPath(cachePath.c_str());      m_WhereBuild = path.c_str();            path = ConvertToWindowsPath(it.GetValue());      m_WhereSource = path.c_str();            m_GeneratorDialog.m_GeneratorChoiceString = _T("");      return;      }    }    // If there is a CMakeLists.txt file, use it as the source tree.  if(listPath.length() > 0)    {    std::string path = ConvertToWindowsPath(listPath.c_str());    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();      path = ConvertToWindowsPath(cwd.c_str());      m_WhereBuild = path.c_str();      }    }}// 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);}BOOL CMakeSetupDialog::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) {  CDialog::OnSetCursor(pWnd, nHitTest, message);  if(m_Cursor == LoadCursor(NULL, IDC_WAIT))    {    ::SetCursor(m_Cursor);    }   return true;}
 |