| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775 |
- /*=========================================================================
- Program: WXDialog - wxWidgets X-platform GUI Front-End for CMake
- Module: $RCSfile$
- Language: C++
- Date: $Date$
- Version: $Revision$
- Author: Jorgen Bodde
- Copyright (c) 2002 Kitware, Inc., Insight Consortium. All rights reserved.
- See Copyright.txt or http://www.cmake.org/HTML/Copyright.html for details.
- This software is distributed WITHOUT ANY WARRANTY; without even
- the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
- PURPOSE. See the above copyright notices for more information.
- =========================================================================*/
- #if defined(__GNUG__) && !defined(__APPLE__)
- #pragma implementation "CMakeSetupFrame.h"
- #endif
- // For compilers that support precompilation, includes "wx/wx.h".
- #include "wx/wxprec.h"
- #ifdef __BORLANDC__
- #pragma hdrstop
- #endif
- #ifndef WX_PRECOMP
- #include "wx/wx.h"
- #endif
- ////@begin includes
- ////@end includes
- #include <wx/dirdlg.h>
- #include <wx/msgdlg.h>
- #include <wx/filename.h>
- #include "CMakeSetupFrame.h"
- #include "PropertyList.h"
- #include "app_resources.h"
- #include "CMakeIcon.xpm"
- #include "aboutdlg.h"
- // cmake includes
- #include "../cmListFileCache.h"
- #include "../cmCacheManager.h"
- #include "../cmGlobalGenerator.h"
- #include "../cmDynamicLoader.h"
- ////@begin XPM images
- ////@end XPM images
- /*!
- * CMakeSetupFrm type definition
- */
- IMPLEMENT_CLASS( CMakeSetupFrm, wxFrame )
- /*!
- * CMakeSetupFrm event table definition
- */
- BEGIN_EVENT_TABLE( CMakeSetupFrm, wxFrame )
- ////@begin CMakeSetupFrm event table entries
- EVT_CLOSE( CMakeSetupFrm::OnCloseWindow )
- EVT_SPLITTER_SASH_POS_CHANGING( ID_SPLITTERWINDOW, CMakeSetupFrm::OnSplitterPosChanging )
- EVT_SPLITTER_DCLICK( ID_SPLITTERWINDOW, CMakeSetupFrm::OnSplitterwindowSashDClick )
- EVT_BUTTON( ID_BROWSE_PROJECT, CMakeSetupFrm::OnButtonBrowseProject )
- EVT_TEXT( ID_SOURCE_BUILD_PATH, CMakeSetupFrm::OnSourceBuildPathUpdated )
- EVT_TEXT_ENTER( ID_SOURCE_BUILD_PATH, CMakeSetupFrm::OnSourceBuildPathEnter )
- EVT_BUTTON( ID_BROWSE_BUILD, CMakeSetupFrm::OnButtonBrowseBuild )
- EVT_COMBOBOX( ID_SEARCHQUERY, CMakeSetupFrm::OnSearchquerySelected )
- EVT_TEXT( ID_SEARCHQUERY, CMakeSetupFrm::OnSearchqueryUpdated )
- EVT_CHECKBOX( ID_SHOW_ADVANCED, CMakeSetupFrm::OnShowAdvancedValues )
- EVT_GRID_CELL_CHANGE( CMakeSetupFrm::OnCellChange )
- EVT_GRID_SELECT_CELL( CMakeSetupFrm::OnGridSelectCell )
- EVT_MOTION( CMakeSetupFrm::OnPropertyMotion )
- EVT_BUTTON( ID_DO_CONFIGURE, CMakeSetupFrm::OnButtonConfigure )
- EVT_BUTTON( ID_DO_OK, CMakeSetupFrm::OnButtonOk )
- EVT_BUTTON( ID_DO_CANCEL, CMakeSetupFrm::OnButtonCancel )
- EVT_BUTTON( ID_DO_DELETE_CACHE, CMakeSetupFrm::OnButtonDeleteCache )
- EVT_BUTTON( ID_CLEAR_LOG, CMakeSetupFrm::OnClearLogClick )
- EVT_BUTTON( ID_BROWSE_GRID, CMakeSetupFrm::OnBrowseGridClick )
- EVT_MENU( ID_MENU_RELOAD_CACHE, CMakeSetupFrm::OnMenuReloadCacheClick )
- EVT_MENU( ID_MENU_DELETE_CACHE, CMakeSetupFrm::OnMenuDeleteCacheClick )
- EVT_MENU( ID_MENU_QUIT, CMakeSetupFrm::OnMenuQuitClick )
- EVT_MENU( ID_MENU_CONFIGURE, CMakeSetupFrm::OnMenuConfigureClick )
- EVT_MENU( ID_MENU_EXITGENERATE, CMakeSetupFrm::OnMenuGenerateClick )
- EVT_MENU( ID_MENU_TOGGLE_ADVANCED, CMakeSetupFrm::OnMenuToggleAdvancedClick )
- EVT_MENU( ID_CMAKE_OPTIONS, CMakeSetupFrm::OnOptionsClick )
- EVT_MENU( ID_ABOUTDLG, CMakeSetupFrm::OnAboutClick )
- ////@end CMakeSetupFrm event table entries
- EVT_MENU_RANGE(CM_RECENT_BUILD_ITEM, CM_RECENT_BUILD_ITEM + CM_MAX_RECENT_PATHS, CMakeSetupFrm::OnRecentFileMenu)
- EVT_TEXT_ENTER(ID_SEARCHQUERY, CMakeSetupFrm::OnAddQuery )
- END_EVENT_TABLE()
- /** Callback function for CMake generator, to tell user how
- far the generation actually is */
- void updateProgress(const char *msg, float prog, void *cd)
- {
- // TODO: Make some kind of progress counter
-
- CMakeSetupFrm *fm = (CMakeSetupFrm *)cd;
- if(fm)
- {
- if(prog < 0)
- fm->LogMessage(0, msg);
- else
- {
- fm->UpdateProgress(prog);
- fm->IssueUpdate();
- }
- }
- }
- /** Callback function for CMake generator, to tell user about stuff. This should be
- logged in the m_log window */
- void MFCMessageCallback(const char* m, const char* title, bool& nomore, void *clientdata)
- {
- CMakeSetupFrm *fm = (CMakeSetupFrm *)clientdata;
- if(fm)
- {
- wxString what = m, msg;
- if(what.StartsWith("CMake Error: "))
- fm->LogMessage(-1, m);
- else
- fm->LogMessage(1, m);
- }
- }
- // 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.
- // 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;
- }
- bool DnDFile::OnDropFiles(wxCoord, wxCoord, const wxArrayString& filenames)
- {
- size_t nFiles = filenames.GetCount();
- // only one item allowed
- if(nFiles > 1)
- return false;
- if(nFiles == 1)
- {
- // only one dir allowed
- if(!wxDirExists(filenames[0]))
- return false;
- // strip the seperator
- wxFileName name;
- name.AssignDir(filenames[0]);
-
- // issue a 'drop' by changing text ctrl
- m_pOwner->SetValue(name.GetFullPath());
- return true;
- }
- return false;
- }
- /*!
- * CMakeSetupFrm constructors
- */
- CMakeSetupFrm::CMakeSetupFrm( )
- : m_cmake(0)
- {
- }
- CMakeSetupFrm::CMakeSetupFrm( wxWindow* parent, wxWindowID id, const wxString& caption, const wxPoint& pos, const wxSize& size, long style )
- : m_cmake(0)
- {
- Create( parent, id, caption, pos, size, style );
- }
- /*!
- * CMakeSetupFrm creator
- */
- bool CMakeSetupFrm::Create( wxWindow* parent, wxWindowID id, const wxString& caption, const wxPoint& pos, const wxSize& size, long style )
- {
- ////@begin CMakeSetupFrm member initialisation
- m_splitter = NULL;
- m_cmProjectPath = NULL;
- m_BrowseProjectPathButton = NULL;
- m_cmBuildPath = NULL;
- m_BrowseSourcePathButton = NULL;
- m_cmGeneratorChoice = NULL;
- m_cmSearchQuery = NULL;
- m_cmShowAdvanced = NULL;
- m_cmOptions = NULL;
- m_cmLog = NULL;
- m_cmDescription = NULL;
- m_ConfigureButton = NULL;
- m_OkButton = NULL;
- m_CancelButton = NULL;
- m_DeleteCacheButton = NULL;
- m_ClearLogButton = NULL;
- m_cmBrowseCell = NULL;
- ////@end CMakeSetupFrm member initialisation
- wxFrame::Create( parent, id, caption, pos, size, style );
- // make sure the developer does not assign more then 100
- // would be rediculous but also overlap other id's
- wxASSERT(CM_MAX_RECENT_PATHS < 100);
- m_ExitTimer = 0;
- m_progressDlg = 0;
- m_noRefresh = false;
- m_quitAfterGenerating = false;
- m_config = new wxConfig("CMakeSetup");
- wxIcon icon(CMakeIcon_xpm);
- SetIcon(icon);
- CreateControls();
-
- //SetIcon(GetIconResource(wxT("cmake_icon.xpm")));
- //SetIcon(wxIcon("NGDialog.ico", wxBITMAP_TYPE_ICO_RESOURCE));
- Centre();
- // is it needed to hide console?
- m_RunningConfigure = false;
- cmSystemTools::SetRunCommandHideConsole(true);
- cmSystemTools::SetErrorCallback(MFCMessageCallback, (void *)this);
- // create our cmake instance
- m_cmake = new cmake;
- m_cmake->SetProgressCallback(updateProgress, (void *)this);
- return TRUE;
- }
- CMakeSetupFrm::~CMakeSetupFrm()
- {
- wxString str;
- // write configs back to disk
- m_config->Write(CM_LASTPROJECT_PATH, m_cmProjectPath->GetValue());
- m_config->Write(CM_LASTBUILD_PATH, m_cmBuildPath->GetValue());
- // clear the config first
- for(size_t i = 0 ; i < CM_MAX_RECENT_PATHS; i++)
- {
- str.Printf("%s%i", _(CM_RECENT_BUILD_PATH), i);
- m_config->Write(str, _(""));
- }
- // write the last CM_MAX_RECENT_PATHS items back to config
- int i = (m_recentPaths.Count() >= CM_MAX_RECENT_PATHS ? CM_MAX_RECENT_PATHS : m_recentPaths.Count());
- while(i > 0)
- {
- str.Printf("%s%i", _(CM_RECENT_BUILD_PATH), i);
- m_config->Write(str, m_recentPaths[i - 1]);
- i--;
- }
-
- // write recent query list to config
- for(int j = 0; j < m_cmSearchQuery->GetCount(); j++)
- {
- // allow max to be written
- if(j < CM_MAX_SEARCH_QUERIES)
- {
- str.Printf("%s%i", _(CM_SEARCH_QUERY), j);
- m_config->Write(str, m_cmSearchQuery->GetString(j));
- }
- else
- break;
- }
- // set window pos + size in settings
- if(!IsIconized() && !IsMaximized())
- {
- int xsize, ysize;
- GetSize(&xsize, &ysize);
- if(xsize > 0 && ysize > 0)
- {
- m_config->Write(CM_XSIZE, (long)xsize);
- m_config->Write(CM_YSIZE, (long)ysize);
- }
- if(m_splitter->GetSashPosition() > 0)
- m_config->Write(CM_SPLITTERPOS, (long)m_splitter->GetSashPosition());
- GetPosition(&xsize, &ysize);
- if(xsize != 0 && ysize != 0)
- {
- m_config->Write(CM_XPOS, (long)xsize);
- m_config->Write(CM_YPOS, (long)ysize);
- }
- }
- // write changes (will be done before deletion)
- delete m_config;
-
- // delete timer
- if(m_ExitTimer)
- delete m_ExitTimer;
- // delete our cmake instance again
- if(m_cmake)
- delete m_cmake;
- }
- void CMakeSetupFrm::UpdateWindowState()
- {
- bool dogenerate = !m_RunningConfigure && !m_cmOptions->IsCacheDirty() &&
- (m_cmOptions->GetCount() != 0);
-
- // when configure is running, disable a lot of stuff
- m_cmProjectPath->Enable(!m_RunningConfigure);
- m_BrowseProjectPathButton->Enable(!m_RunningConfigure);
- m_cmBuildPath->Enable(!m_RunningConfigure);
- m_BrowseSourcePathButton->Enable(!m_RunningConfigure);
- m_cmGeneratorChoice->Enable(!m_RunningConfigure);
- m_cmShowAdvanced->Enable(!m_RunningConfigure);
- m_cmOptions->Enable(!m_RunningConfigure);
- m_ConfigureButton->Enable(!m_RunningConfigure);
- m_OkButton->Enable(dogenerate);
- m_CancelButton->Enable(m_RunningConfigure);
- m_DeleteCacheButton->Enable(!m_RunningConfigure);
- m_ClearLogButton->Enable(!m_RunningConfigure);
- if(m_RunningConfigure)
- m_cmBrowseCell->Enable(false);
- // when cache loaded (items available show other control)
- m_cmGeneratorChoice->Enable(m_cmOptions->GetCount() == 0 && !m_RunningConfigure);
- m_cmSearchQuery->Enable(!m_RunningConfigure);
- m_cmBrowseCell->Enable(!m_RunningConfigure && m_cmOptions->IsSelectedItemBrowsable());
- // disable the menus when configuring
- if(GetMenuBar())
- {
- // disable configure button when there is nothing, and generate and exit
- // only when it is allowed to generate
- GetMenuBar()->Enable(ID_MENU_EXITGENERATE, dogenerate);
- GetMenuBar()->Enable(ID_MENU_CONFIGURE, !m_RunningConfigure);
- for(size_t i = 0; i < GetMenuBar()->GetMenuCount(); i++)
- GetMenuBar()->EnableTop(i, !m_RunningConfigure);
- }
- }
- void CMakeSetupFrm::LogMessage(int logkind, const char *msg)
- {
- // put CR first but prevent a CR at the end
- #ifndef __LINUX__
- if(m_cmLog->IsModified())
- (*m_cmLog) << wxT("\n");
- #else
- // Linux requires a different approach
- if(!m_cmLog->GetValue().IsEmpty())
- (*m_cmLog) << wxT("\n");
- #endif
- // log error, warning, or message
- wxTextAttr defattr = m_cmLog->GetDefaultStyle();
-
- switch(logkind)
- {
- // user message
- case 1:
- {
- wxTextAttr colattr(*wxBLUE);
- m_cmLog->SetDefaultStyle(colattr);
- (*m_cmLog) << msg;
- m_cmLog->SetDefaultStyle(defattr);
- }
- break;
- // progress
- case 0:
- (*m_cmLog) << msg;
- break;
- // error
- case -1:
- {
- wxTextAttr colattr(*wxRED);
- m_cmLog->SetDefaultStyle(colattr);
- (*m_cmLog) << msg;
- m_cmLog->SetDefaultStyle(defattr);
- }
- break;
- }
-
- IssueUpdate();
- }
- void CMakeSetupFrm::IssueUpdate()
- {
- //::wxSafeYield(m_CancelButton, true);
- ::wxYield();
- // when we pressed cancel on the progress dialog
- // stop all activities
- if(m_progressDlg)
- {
- if(m_progressDlg->CancelPressed() && !m_progressDlg->IsCancelling())
- {
- m_progressDlg->CancelAcknowledged();
- // send a button event to cancel the progress
- wxCommandEvent event( wxEVT_COMMAND_BUTTON_CLICKED, ID_DO_CANCEL);
- wxPostEvent(this, event);
- }
- }
- }
- /*!
- * Control creation for CMakeSetupFrm
- */
- void CMakeSetupFrm::CreateControls()
- {
- ////@begin CMakeSetupFrm content construction
- CMakeSetupFrm* itemFrame1 = this;
- wxMenuBar* menuBar = new wxMenuBar;
- wxMenu* itemMenu37 = new wxMenu;
- itemMenu37->Append(ID_MENU_RELOAD_CACHE, _("&Reload Cache\tCtrl+R"), _("Reload the cache from disk"), wxITEM_NORMAL);
- itemMenu37->Append(ID_MENU_DELETE_CACHE, _("&Delete Cache\tCtrl+D"), _("Delete the cache on disk of the current path"), wxITEM_NORMAL);
- itemMenu37->AppendSeparator();
- itemMenu37->Append(ID_MENU_QUIT, _("E&xit\tAlt+F4"), _("Quit CMake Setup"), wxITEM_NORMAL);
- menuBar->Append(itemMenu37, _("&File"));
- wxMenu* itemMenu42 = new wxMenu;
- itemMenu42->Append(ID_MENU_CONFIGURE, _("&Configure\tCtrl+N"), _T(""), wxITEM_NORMAL);
- itemMenu42->Append(ID_MENU_EXITGENERATE, _("&Generate and Exit\tCtrl+G"), _T(""), wxITEM_NORMAL);
- itemMenu42->Append(ID_MENU_TOGGLE_ADVANCED, _("Toggle &Advanced\tCtrl+A"), _T(""), wxITEM_NORMAL);
- itemMenu42->AppendSeparator();
- itemMenu42->Append(ID_CMAKE_OPTIONS, _("&Options\tCtrl+O"), _T(""), wxITEM_NORMAL);
- menuBar->Append(itemMenu42, _("&Tools"));
- wxMenu* itemMenu48 = new wxMenu;
- itemMenu48->Append(ID_ABOUTDLG, _("&About ..."), _("Shows the about dialog ..."), wxITEM_NORMAL);
- menuBar->Append(itemMenu48, _("&Help"));
- itemFrame1->SetMenuBar(menuBar);
- m_splitter = new wxSplitterWindow( itemFrame1, ID_SPLITTERWINDOW, wxDefaultPosition, wxSize(100, 100), wxSP_3DBORDER|wxSP_3DSASH|wxNO_BORDER );
- wxPanel* itemPanel3 = new wxPanel( m_splitter, ID_MAINPANEL, wxDefaultPosition, wxSize(600, 400), wxNO_BORDER|wxTAB_TRAVERSAL );
- itemPanel3->SetExtraStyle(itemPanel3->GetExtraStyle()|wxWS_EX_VALIDATE_RECURSIVELY);
- wxBoxSizer* itemBoxSizer4 = new wxBoxSizer(wxVERTICAL);
- itemPanel3->SetSizer(itemBoxSizer4);
- wxBoxSizer* itemBoxSizer5 = new wxBoxSizer(wxHORIZONTAL);
- itemBoxSizer4->Add(itemBoxSizer5, 0, wxGROW|wxTOP|wxBOTTOM, 5);
- wxFlexGridSizer* itemFlexGridSizer6 = new wxFlexGridSizer(2, 3, 0, 0);
- itemFlexGridSizer6->AddGrowableRow(1);
- itemFlexGridSizer6->AddGrowableCol(1);
- itemBoxSizer5->Add(itemFlexGridSizer6, 1, wxALIGN_TOP|wxLEFT, 5);
- wxStaticText* itemStaticText7 = new wxStaticText( itemPanel3, wxID_STATIC, _("CMake project path"), wxDefaultPosition, wxDefaultSize, 0 );
- itemFlexGridSizer6->Add(itemStaticText7, 0, wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT|wxADJUST_MINSIZE, 5);
- m_cmProjectPath = new wxTextCtrl( itemPanel3, ID_PROJECT_PATH, _T(""), wxDefaultPosition, wxSize(50, -1), 0 );
- itemFlexGridSizer6->Add(m_cmProjectPath, 1, wxGROW|wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM, 5);
- m_BrowseProjectPathButton = new wxButton( itemPanel3, ID_BROWSE_PROJECT, _("Browse"), wxDefaultPosition, wxSize(55, -1), 0 );
- itemFlexGridSizer6->Add(m_BrowseProjectPathButton, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 5);
- wxStaticText* itemStaticText10 = new wxStaticText( itemPanel3, wxID_STATIC, _("Project build path"), wxDefaultPosition, wxDefaultSize, 0 );
- itemFlexGridSizer6->Add(itemStaticText10, 0, wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT|wxADJUST_MINSIZE, 5);
- m_cmBuildPath = new wxTextCtrl( itemPanel3, ID_SOURCE_BUILD_PATH, _T(""), wxDefaultPosition, wxSize(50, -1), 0 );
- itemFlexGridSizer6->Add(m_cmBuildPath, 1, wxGROW|wxALIGN_TOP|wxTOP|wxBOTTOM, 5);
- m_BrowseSourcePathButton = new wxButton( itemPanel3, ID_BROWSE_BUILD, _("Browse"), wxDefaultPosition, wxSize(55, -1), 0 );
- itemFlexGridSizer6->Add(m_BrowseSourcePathButton, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 5);
- wxBoxSizer* itemBoxSizer13 = new wxBoxSizer(wxVERTICAL);
- itemBoxSizer5->Add(itemBoxSizer13, 0, wxGROW|wxLEFT|wxRIGHT, 5);
- wxFlexGridSizer* itemFlexGridSizer14 = new wxFlexGridSizer(2, 2, 0, 0);
- itemBoxSizer13->Add(itemFlexGridSizer14, 0, wxALIGN_CENTER_HORIZONTAL|wxLEFT|wxRIGHT, 5);
- wxStaticText* itemStaticText15 = new wxStaticText( itemPanel3, wxID_STATIC, _("Generate"), wxDefaultPosition, wxDefaultSize, 0 );
- itemFlexGridSizer14->Add(itemStaticText15, 0, wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL|wxRIGHT|wxADJUST_MINSIZE, 5);
- wxString* m_cmGeneratorChoiceStrings = NULL;
- m_cmGeneratorChoice = new wxComboBox( itemPanel3, ID_CHOOSE_GENERATOR, _T(""), wxDefaultPosition, wxSize(170, -1), 0, m_cmGeneratorChoiceStrings, wxCB_READONLY );
- itemFlexGridSizer14->Add(m_cmGeneratorChoice, 1, wxALIGN_CENTER_HORIZONTAL|wxGROW|wxTOP|wxBOTTOM, 5);
- wxStaticText* itemStaticText17 = new wxStaticText( itemPanel3, wxID_STATIC, _("Search"), wxDefaultPosition, wxDefaultSize, 0 );
- itemFlexGridSizer14->Add(itemStaticText17, 0, wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL|wxRIGHT|wxADJUST_MINSIZE, 5);
- wxString* m_cmSearchQueryStrings = NULL;
- m_cmSearchQuery = new wxComboBox( itemPanel3, ID_SEARCHQUERY, _T(""), wxDefaultPosition, wxSize(170, -1), 0, m_cmSearchQueryStrings, wxWANTS_CHARS );
- itemFlexGridSizer14->Add(m_cmSearchQuery, 1, wxALIGN_CENTER_HORIZONTAL|wxGROW|wxTOP|wxBOTTOM, 5);
- m_cmShowAdvanced = new wxCheckBox( itemPanel3, ID_SHOW_ADVANCED, _("Show advanced values"), wxDefaultPosition, wxDefaultSize, wxCHK_2STATE );
- m_cmShowAdvanced->SetValue(FALSE);
- itemBoxSizer13->Add(m_cmShowAdvanced, 0, wxALIGN_RIGHT|wxLEFT|wxRIGHT, 5);
- m_cmOptions = new wxPropertyList( itemPanel3, ID_OPTIONS, wxDefaultPosition, wxSize(200, 150), wxSTATIC_BORDER|wxWANTS_CHARS|wxVSCROLL );
- m_cmOptions->SetDefaultColSize(250);
- m_cmOptions->SetDefaultRowSize(25);
- m_cmOptions->SetColLabelSize(20);
- m_cmOptions->SetRowLabelSize(0);
- m_cmOptions->CreateGrid(10, 2, wxGrid::wxGridSelectRows);
- itemBoxSizer4->Add(m_cmOptions, 1, wxGROW|wxALL, 5);
- wxPanel* itemPanel21 = new wxPanel( m_splitter, ID_LOGPANEL, wxDefaultPosition, wxSize(-1, 100), wxNO_BORDER|wxTAB_TRAVERSAL );
- wxBoxSizer* itemBoxSizer22 = new wxBoxSizer(wxVERTICAL);
- itemPanel21->SetSizer(itemBoxSizer22);
- wxBoxSizer* itemBoxSizer23 = new wxBoxSizer(wxHORIZONTAL);
- itemBoxSizer22->Add(itemBoxSizer23, 1, wxGROW|wxLEFT|wxRIGHT|wxTOP, 5);
- m_cmLog = new wxTextCtrl( itemPanel21, ID_LOG_AREA, _("Select your project path (where CMakeLists.txt is) and then select the build path (where the projects should be saved), or select a previous build path.\n\nRight click on a cache value for additional options (delete and ignore). Press configure to update and display new values in red, press OK to generate the projects and exit."), wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE|wxTE_READONLY|wxTE_RICH2|wxSTATIC_BORDER );
- itemBoxSizer23->Add(m_cmLog, 1, wxGROW|wxRIGHT, 5);
- m_cmDescription = new wxTextCtrl( itemPanel21, ID_DESCRIPTION, _T(""), wxDefaultPosition, wxSize(200, -1), wxTE_MULTILINE|wxTE_READONLY|wxTE_RICH2|wxSTATIC_BORDER );
- itemBoxSizer23->Add(m_cmDescription, 0, wxGROW|wxLEFT, 5);
- wxBoxSizer* itemBoxSizer26 = new wxBoxSizer(wxHORIZONTAL);
- itemBoxSizer22->Add(itemBoxSizer26, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5);
- m_ConfigureButton = new wxButton( itemPanel21, ID_DO_CONFIGURE, _("Co&nfigure"), wxDefaultPosition, wxDefaultSize, 0 );
- m_ConfigureButton->SetDefault();
- itemBoxSizer26->Add(m_ConfigureButton, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5);
- m_OkButton = new wxButton( itemPanel21, ID_DO_OK, _("&Generate!"), wxDefaultPosition, wxDefaultSize, 0 );
- itemBoxSizer26->Add(m_OkButton, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5);
- m_CancelButton = new wxButton( itemPanel21, ID_DO_CANCEL, _("C&ancel"), wxDefaultPosition, wxDefaultSize, 0 );
- itemBoxSizer26->Add(m_CancelButton, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5);
- #if defined(__WXMSW__)
- wxStaticLine* itemStaticLine30 = new wxStaticLine( itemPanel21, wxID_STATIC, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
- itemBoxSizer26->Add(itemStaticLine30, 0, wxGROW|wxALL, 5);
- #endif
- m_DeleteCacheButton = new wxButton( itemPanel21, ID_DO_DELETE_CACHE, _("&Delete Cache"), wxDefaultPosition, wxDefaultSize, 0 );
- itemBoxSizer26->Add(m_DeleteCacheButton, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5);
- m_ClearLogButton = new wxButton( itemPanel21, ID_CLEAR_LOG, _("Clear &Log"), wxDefaultPosition, wxDefaultSize, 0 );
- itemBoxSizer26->Add(m_ClearLogButton, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5);
- #if defined(__WXMSW__)
- wxStaticLine* itemStaticLine33 = new wxStaticLine( itemPanel21, wxID_STATIC, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
- itemBoxSizer26->Add(itemStaticLine33, 0, wxGROW|wxALL, 5);
- #endif
- m_cmBrowseCell = new wxButton( itemPanel21, ID_BROWSE_GRID, _("&Browse"), wxDefaultPosition, wxDefaultSize, 0 );
- itemBoxSizer26->Add(m_cmBrowseCell, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5);
- m_splitter->SplitHorizontally(itemPanel3, itemPanel21, 300);
- wxStatusBar* itemStatusBar35 = new wxStatusBar( itemFrame1, ID_STATUSBAR, wxST_SIZEGRIP|wxNO_BORDER );
- itemStatusBar35->SetFieldsCount(2);
- itemFrame1->SetStatusBar(itemStatusBar35);
- ////@end CMakeSetupFrm content construction
- }
- void CMakeSetupFrm::DoInitFrame(cmCommandLineInfo &cm, const wxString &fn)
- {
- // path to where cmake.exe is
- // m_PathToExecutable = cm.GetPathToExecutable().c_str();
- m_PathToExecutable = fn;
- // adjust size of last bar, to display % progress
- wxStatusBar *bar = GetStatusBar();
- if(bar)
- {
- wxASSERT(bar->GetFieldsCount() > 1);
-
- // fill all with -1. Why this way? because the count of the status bars
- // can change. All of the widths must be accounted for and initialised
- int *widths = new int[bar->GetFieldsCount()];
- for(int i = 0; i < bar->GetFieldsCount(); i++)
- widths[i] = -1;
- // the % field
- widths[1] = 75;
- bar->SetStatusWidths(bar->GetFieldsCount(), widths);
- delete widths;
- }
- wxString name, generator;
- std::vector<std::string> names;
-
- m_RunningConfigure = false;
- // set grid labels
- m_cmOptions->SetColLabelValue(0, wxT("Cache Name"));
- m_cmOptions->SetColLabelValue(1, wxT("Cache Value"));
- m_cmOptions->SetProjectGenerated(false);
- // set drop target
- m_cmOptions->SetDropTarget(new DnDFile(m_cmBuildPath));
- m_cmake->GetRegisteredGenerators(names);
- for(std::vector<std::string>::iterator i = names.begin(); i != names.end(); ++i)
- {
- name = i->c_str();
- m_cmGeneratorChoice->Append(name);
- }
-
- // sync advanced option with grid
- m_cmOptions->SetShowAdvanced(m_cmShowAdvanced->GetValue());
- // if we have a command line query that a generator
- // needs to be chosen instead of the default, take it
- bool foundGivenGenerator = false;
- if(!cm.m_GeneratorChoiceString.IsEmpty())
- {
- // set proper discovered generator
- foundGivenGenerator = m_cmGeneratorChoice->SetStringSelection(cm.m_GeneratorChoiceString);
- }
- // if none selected, we will see if VS8, VS7 or VS6 is present
- if(!foundGivenGenerator || m_cmGeneratorChoice->GetValue().IsEmpty())
- {
- std::string mp;
- mp = "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\VisualStudio\\8.0\\Setup;Dbghelp_path]";
- cmSystemTools::ExpandRegistryValues(mp);
- if(mp != "/registry")
- generator = wxT("Visual Studio 8 2005");
- else
- {
- mp = "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\VisualStudio\\7.1;InstallDir]";
- cmSystemTools::ExpandRegistryValues(mp);
- if (mp != "/registry")
- generator = wxT("Visual Studio 7 .NET 2003");
- else
- {
- mp = "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\VisualStudio\\7.0;InstallDir]";
- cmSystemTools::ExpandRegistryValues(mp);
- if (mp != "/registry")
- generator = wxT("Visual Studio 7");
- else
- generator = wxT("Visual Studio 6");
- }
- }
- }
- // set proper discovered generator
- m_cmGeneratorChoice->SetStringSelection(generator);
-
- wxString str;
- //str.Printf("CMake %d.%d - %s", cmake::GetMajorVersion(), cmake::GetMinorVersion(), cmake::GetReleaseVersion());
- str.Printf("CMakeSetup v%i.%i%s", CMAKEGUI_MAJORVER, CMAKEGUI_MINORVER, CMAKEGUI_ADDVER);
- SetTitle(str);
- wxString path;
-
- // get last 5 used projects
- for(size_t i = 0; i < CM_MAX_RECENT_PATHS; i++)
- {
- path.Printf("%s%i", _(CM_RECENT_BUILD_PATH), i);
- if(m_config->Read(path, &str))
- AppendPathToRecentList(str);
- }
- // get query items
- for(size_t i = 0; i < CM_MAX_SEARCH_QUERIES; i++)
- {
- path.Printf("%s%i", _(CM_SEARCH_QUERY), i);
- if(m_config->Read(path, &str))
- m_cmSearchQuery->Append(str);
- }
- // make sure the call to update grid is not executed
- m_noRefresh = true;
- m_cmSearchQuery->SetValue(_(""));
- m_noRefresh = false;
- // 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 :)
- bool sourceDirLoaded = false,
- buildDirLoaded = false;
-
- if(cm.m_LastUnknownParameter.empty())
- {
- if(cm.m_WhereSource.size() > 0 )
- {
- m_cmProjectPath->SetValue(cm.m_WhereSource.c_str());
- sourceDirLoaded = true;
- }
-
- if (cm.m_WhereBuild.size() > 0 )
- {
- m_cmBuildPath->SetValue(cm.m_WhereBuild.c_str());
- buildDirLoaded = true;
- }
-
- m_cmShowAdvanced->SetValue(cm.m_AdvancedValues);
- }
- else
- {
- m_cmShowAdvanced->SetValue(false);
-
- // TODO: Interpret directory from dropped shortcut
- //this->ChangeDirectoriesFromFile(cmdInfo->m_LastUnknownParameter.c_str());
- }
- if (cm.m_ExitAfterLoad)
- {
- int id = GetId();
- m_ExitTimer = new wxTimer(this, id);
- m_ExitTimer->Start(3000);
- Connect( id, wxEVT_TIMER,(wxObjectEventFunction) &CMakeSetupFrm::OnExitTimer );
- }
- // retrieve settings, this needs to be done here
- // because writing to the m_cmBuildPath triggers a cache reload
- if(!sourceDirLoaded && m_config->Read(CM_LASTPROJECT_PATH, &str))
- m_cmProjectPath->SetValue(str);
- if(!buildDirLoaded)
- {
- m_cmOptions->RemoveAll();
- if(m_config->Read(CM_LASTBUILD_PATH, &str))
- m_cmBuildPath->SetValue(str);
- }
- // set window size from settings
- long xsize, ysize, splitpos;
- if(m_config->Read(CM_XSIZE, &xsize) && m_config->Read(CM_YSIZE, &ysize) &&
- m_config->Read(CM_SPLITTERPOS, &splitpos))
- {
- SetSize(xsize, ysize);
- m_splitter->SetSashPosition(splitpos);
- }
- if(m_config->Read(CM_XPOS, &xsize) && m_config->Read(CM_YPOS, &ysize))
- SetSize(xsize, ysize, -1, -1, wxSIZE_USE_EXISTING);
- UpdateWindowState();
- }
- void CMakeSetupFrm::LoadCacheFromDiskToGUI()
- {
- wxString builddir = m_cmBuildPath->GetValue();
-
- cmCacheManager *cachem = m_cmake->GetCacheManager();
- if(cachem && !builddir.Trim().IsEmpty())
- {
- if(cachem->LoadCache(builddir.c_str()))
- AppendPathToRecentList(builddir);
- // represent this cache in the grid, but not before we
- // wiped all of the old items
- FillCacheGUIFromCacheManager();
-
- // set the generator string to the one used in the cache
- cmCacheManager::CacheIterator it = cachem->GetCacheIterator("CMAKE_GENERATOR");
- if(!it.IsAtEnd())
- {
- wxString curGen = it.GetValue();
- m_cmGeneratorChoice->SetStringSelection(curGen);
- }
- }
- }
- void CMakeSetupFrm::AppendPathToRecentList(const wxString &p)
- {
- wxFileName path;
- wxString str;
- if(p.IsEmpty())
- return;
-
- // cheap way to get rid of trailing seperators
- path.AssignDir(p);
- str = path.GetPath();
- // append the item, or add it to end to make sure
- // it is remembered between sessions
- for(size_t i = 0; i < m_recentPaths.Count(); i++)
- {
- if(m_recentPaths[i].IsSameAs(str, false))
- {
- m_recentPaths.RemoveAt(i);
-
- // only re-add when item is still valid
- if(::wxDirExists(str))
- m_recentPaths.Add(str);
- else
- return; // no add when the item is not existing
- return;
- }
- }
-
- if(GetMenuBar())
- {
- // get file menu
- int lastUsedID = 0;
- wxMenu *mnu = GetMenuBar()->GetMenu(0);
- wxASSERT(mnu != 0);
-
- if(::wxDirExists(str))
- {
- // add to array
- if(m_recentPaths.Count() == 0)
- mnu->AppendSeparator();
- lastUsedID = CM_RECENT_BUILD_ITEM + m_recentPaths.Count();
- m_recentPaths.Add(str);
- // when we have more in list then we can display, prune and
- // remove some menu items until we have room (and available ID's again)
- if(m_recentPaths.Count() > CM_MAX_RECENT_PATHS)
- {
- // prune the list
- while(m_recentPaths.Count() > CM_MAX_RECENT_PATHS)
- m_recentPaths.RemoveAt(0);
- // now determine count, and remove until we have room
- int index = mnu->GetMenuItemCount() - 1;
- int count = 0;
- wxASSERT(index > 0);
-
- wxMenuItem *item;
- do
- {
- item = mnu->FindItemByPosition(index);
- if(item)
- {
- if(item->IsSeparator())
- {
- // next index is valid item
- index ++;
- break;
- }
- else
- count ++;
- }
- index --;
- }
- while(index >= 0 && item);
- // ok, if count > CM_MAX_RECENT_PATHS then we are going to
- // delete some items on the index position
- if(count >= CM_MAX_RECENT_PATHS)
- {
- // delete items that are exceeding
- while(count >= CM_MAX_RECENT_PATHS)
- {
- lastUsedID = mnu->FindItemByPosition(index)->GetId();
- mnu->Delete(lastUsedID);
- count --;
- }
- }
- }
- // append item
- mnu->Append(lastUsedID, str);
- }
- }
- }
- bool CMakeSetupFrm::PerformCacheRun()
- {
- bool enable = false;
- cmCacheManager *cachem = m_cmake->GetCacheManager();
- cmCacheManager::CacheIterator it = cachem->NewIterator();
- // remove all items that are no longer present
- size_t j = 0;
- while(j < m_cmOptions->GetCount())
- {
- // check to see if it is still in the CMake cache
- // if it is still in the cache then it is no longer new
- wxPropertyItem *item = m_cmOptions->GetItem(j);
- if ( !it.Find((const char*)item->GetPropName().c_str()) )
- m_cmOptions->RemoveProperty(item);
- else
- {
- // ok we found it, mark as old
- item->SetNewValue(false);
- int row = m_cmOptions->FindProperty(item);
- if(row != -1)
- m_cmOptions->UpdatePropertyItem(item, row);
- j++;
- }
- }
- if(cachem->GetSize() > 0 && !cmSystemTools::GetErrorOccuredFlag())
- {
- bool enable = true;
- for(size_t i = 0; i < m_cmOptions->GetCount(); i++)
- {
- wxPropertyItem* item = m_cmOptions->GetItem(i);
- if(item->GetAdvanced())
- {
- if(item->GetNewValue() && m_cmOptions->GetShowAdvanced())
- {
- // if one new value then disable to OK button
- enable = false;
- break;
- }
- }
- else
- {
- if(item->GetNewValue())
- {
- // if one new value then disable to OK button
- enable = false;
- break;
- }
- }
- }
- }
- return enable;
- }
- void CMakeSetupFrm::FillCacheGUIFromCacheManager()
- {
- cmCacheManager *cachem = m_cmake->GetCacheManager();
- cmCacheManager::CacheIterator it = cachem->NewIterator();
-
- // remove all items that are no longer present
- size_t j = 0;
- while(j < m_cmOptions->GetCount())
- {
- // check to see if it is still in the CMake cache
- // if it is still in the cache then it is no longer new
- wxPropertyItem *item = m_cmOptions->GetItem(j);
- if ( !it.Find((const char*)item->GetPropName().c_str()) )
- m_cmOptions->RemoveProperty(item);
- else
- j++;
- }
- // if there are already entries in the cache, then
- // put the new ones in the top, so they show up first
- bool reverseOrder = 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:
- {
- wxString OnOff;
-
- if(cmSystemTools::IsOn(value.c_str()))
- OnOff = wxT("ON");
- else
- OnOff = wxT("OFF");
- m_cmOptions->AddProperty(key,
- OnOff.c_str(),
- i.GetProperty("HELPSTRING"),
- wxPropertyList::CHECKBOX, "ON|OFF",
- reverseOrder,
- advanced );
- }
- break;
- case cmCacheManager::PATH:
- m_cmOptions->AddProperty(key,
- value.c_str(),
- i.GetProperty("HELPSTRING"),
- wxPropertyList::PATH,"",
- reverseOrder, advanced);
- break;
-
- case cmCacheManager::FILEPATH:
- m_cmOptions->AddProperty(key,
- value.c_str(),
- i.GetProperty("HELPSTRING"),
- wxPropertyList::FILE,"",
- reverseOrder, advanced);
- break;
-
- case cmCacheManager::STRING:
- m_cmOptions->AddProperty(key,
- value.c_str(),
- i.GetProperty("HELPSTRING"),
- wxPropertyList::EDIT,"",
- reverseOrder, advanced);
- break;
-
- case cmCacheManager::INTERNAL:
- {
- wxPropertyItem *pItem = m_cmOptions->FindPropertyByName(key);
- if(pItem)
- m_cmOptions->RemoveProperty(pItem);
- }
- break;
- }
- }
- }
- void CMakeSetupFrm::OnExitTimer(wxTimerEvent &event)
- {
- Close();
- }
- /*!
- * wxEVT_COMMAND_BUTTON_CLICKED event handler for ID_BROWSE_PROJECT
- */
- void CMakeSetupFrm::OnButtonBrowseProject( wxCommandEvent& event )
- {
- const wxString& dir = wxDirSelector("Select project directory", m_cmProjectPath->GetValue());
- if(!dir.IsEmpty())
- m_cmProjectPath->SetValue(dir);
- }
- /*!
- * wxEVT_COMMAND_BUTTON_CLICKED event handler for ID_BROWSE_BUILD
- */
- void CMakeSetupFrm::OnButtonBrowseBuild( wxCommandEvent& event )
- {
- const wxString& dir = wxDirSelector("Select build directory", m_cmBuildPath->GetValue());
- if(!dir.IsEmpty())
- m_cmBuildPath->SetValue(dir);
- }
- /*!
- * wxEVT_COMMAND_CHECKBOX_CLICKED event handler for ID_SHOW_ADVANCED
- */
- void CMakeSetupFrm::OnShowAdvancedValues( wxCommandEvent& event )
- {
- if(m_cmShowAdvanced->GetValue())
- m_cmOptions->ShowAdvanced();
- else
- m_cmOptions->HideAdvanced();
- }
- /*!
- * wxEVT_COMMAND_BUTTON_CLICKED event handler for ID_DO_CONFIGURE
- */
- void CMakeSetupFrm::OnButtonConfigure( wxCommandEvent& event )
- {
- DoConfigure();
- }
- void CMakeSetupFrm::DoConfigure()
- {
- // enable error messages each time configure is pressed
- cmSystemTools::EnableMessages();
- m_cmOptions->HideControls();
- cmSystemTools::ResetErrorOccuredFlag();
-
- // instantiate a dialog for the progress meter
- PerformCacheRun();
- RunCMake(false);
- }
- int CMakeSetupFrm::RunCMake(bool generateProjectFiles)
- {
- int value = -1;
-
- // clear log
- m_cmLog->Clear();
- m_cmLog->DiscardEdits();
- wxString builddir = m_cmBuildPath->GetValue(),
- sourcedir = m_cmProjectPath->GetValue(),
- err = wxT("Error in configuration process, project files may be invalid");
- // sanity check for people pressing OK on empty dirs
- if(builddir.Trim().IsEmpty() || sourcedir.Trim().IsEmpty())
- {
- wxMessageBox(wxT("Please enter a valid source directory and build directory"), wxT("Error"), wxOK | wxICON_ERROR, this);
- return -1;
- }
- // check if the directory exists, if not, create it
- if(!cmSystemTools::FileExists(builddir.c_str()))
- {
- wxString str;
- str << wxT("Build directory does not exist, should I create it?\n\nDirectory: ") << builddir;
-
- int answer = wxMessageBox(str, wxT("Create directory"), wxYES_NO, this);
- if (answer == wxYES)
- {
- if(!cmSystemTools::MakeDirectory(builddir.c_str()))
- {
- // could not create, tell and abort
- wxMessageBox(wxT("Could not create directory"), wxT("Error"), wxOK | wxICON_ERROR, this);
- return -1;
- }
- }
- else
- {
- // we abort because the user did not want to make the directory
- wxMessageBox(wxT("Build Project aborted, nothing done."), wxT("Aborted"),
- wxOK | wxICON_EXCLAMATION, this);
- return -1;
- }
- }
- /** show progress dialog that informs the user with a progress bar */
- if(m_progressDlg)
- m_progressDlg->Destroy();
- m_progressDlg = new CMProgressDialog(this);
- m_progressDlg->Show();
- // set the wait cursor
- m_RunningConfigure = true;
- UpdateWindowState();
- // always save the current gui values to disk
- SaveCacheFromGUI();
-
- // Make sure we are working from the cache on disk
- LoadCacheFromDiskToGUI();
- // setup the cmake instance
- if (generateProjectFiles)
- {
- if(m_cmake->Generate() != 0)
- {
- wxMessageBox(err, wxT("Error"), wxOK | wxICON_ERROR, this);
- cmSystemTools::Error(err.c_str());
- value = -1;
- }
- else
- {
- value = 0;
- m_cmOptions->SetProjectGenerated(true); // clear cache dirty when generated
- }
- }
- else
- {
- // set paths
- m_cmake->SetHomeDirectory(m_cmProjectPath->GetValue().c_str());
- m_cmake->SetStartDirectory(m_cmProjectPath->GetValue().c_str());
- m_cmake->SetHomeOutputDirectory(m_cmBuildPath->GetValue().c_str());
- m_cmake->SetStartOutputDirectory(m_cmBuildPath->GetValue().c_str());
-
- m_cmake->SetGlobalGenerator(m_cmake->CreateGlobalGenerator(m_cmGeneratorChoice->GetValue().c_str()));
- m_cmake->SetCMakeCommand(m_PathToExecutable.c_str());
- m_cmake->LoadCache();
- if(m_cmake->Configure() != 0)
- {
- wxMessageBox(err, wxT("Error"), wxOK | wxICON_ERROR, this);
- cmSystemTools::Error(err.c_str());
- }
-
- // update the GUI with any new values in the caused by the
- // generation process
- LoadCacheFromDiskToGUI();
- }
- m_RunningConfigure = false;
-
- if(!value)
- cmSystemTools::ResetErrorOccuredFlag();
- m_progressDlg->Destroy();
- m_progressDlg = 0;
- // reset the statusbar progress
- wxStatusBar *bar = GetStatusBar();
- if(bar)
- bar->SetStatusText(wxEmptyString, 1);
- UpdateWindowState();
- return value;
- }
- //! Save GUI values to cmCacheManager and then save to disk.
- void CMakeSetupFrm::SaveCacheFromGUI()
- {
- cmCacheManager *cachem = m_cmake->GetCacheManager();
- FillCacheManagerFromCacheGUI();
-
- // write the cache to disk
- if(!m_cmBuildPath->GetValue().Trim().IsEmpty())
- cachem->SaveCache(m_cmBuildPath->GetValue().c_str());
- }
- void CMakeSetupFrm::FillCacheManagerFromCacheGUI()
- {
- cmCacheManager *cachem = m_cmake->GetCacheManager();
-
- cmCacheManager::CacheIterator it = cachem->NewIterator();
- for(size_t i = 0; i < m_cmOptions->GetCount(); i++)
- {
- wxPropertyItem* item = m_cmOptions->GetItem(i);
- if ( it.Find((const char*)item->GetPropName().c_str()) )
- {
- // 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->GetCurValue().Len() >= 2 &&
- item->GetCurValue().GetChar(0) == '\'' &&
- item->GetCurValue().GetChar(item->GetCurValue().Len() - 1) == '\'')
- {
- it.SetValue(item->GetCurValue().Mid(1, item->GetCurValue().Len() - 2).c_str());
- }
- else
- it.SetValue(item->GetCurValue().c_str());
- }
- }
- }
- /*!
- * wxEVT_COMMAND_BUTTON_CLICKED event handler for ID_DO_OK
- */
- void CMakeSetupFrm::OnButtonOk( wxCommandEvent& event )
- {
- DoGenerate();
- }
- void CMakeSetupFrm::DoGenerate()
- {
- cmSystemTools::EnableMessages();
-
- cmSystemTools::ResetErrorOccuredFlag();
-
- m_cmOptions->HideControls();
- PerformCacheRun();
-
- if(!RunCMake(true))
- {
- // issue a close when this is done (this is issued by menu "Generate and Exit"
- if(m_quitAfterGenerating)
- Close();
- else if(!wxGetKeyState(WXK_SHIFT))
- {
- bool close;
- m_config->Read(CM_CLOSEAFTERGEN, &close, CM_CLOSEAFTERGEN_DEF);
-
- if(!close)
- wxMessageBox(wxT("Building of project files succesful!"), wxT("Success!"), wxOK|wxICON_INFORMATION);
- else
- Close();
- }
- }
- }
- /*!
- * wxEVT_COMMAND_BUTTON_CLICKED event handler for ID_DO_CANCEL
- */
- void CMakeSetupFrm::OnButtonCancel( wxCommandEvent& event )
- {
- DoCancelButton();
- }
- void CMakeSetupFrm::DoCancelButton()
- {
- if(m_RunningConfigure)
- {
- int result = wxMessageBox(wxT("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?"), wxT("Warning"), wxYES_NO|wxICON_WARNING);
- if(result == wxYES)
- cmSystemTools::SetFatalErrorOccured();
- else
- if(m_progressDlg)
- m_progressDlg->ResetCancel();
- }
- }
- /*!
- * wxEVT_COMMAND_BUTTON_CLICKED event handler for ID_DO_DELETE_CACHE
- */
- void CMakeSetupFrm::OnButtonDeleteCache( wxCommandEvent& event )
- {
- DoDeleteCache();
- }
- void CMakeSetupFrm::DoDeleteCache()
- {
- bool deletecache = true;
- if(m_cmOptions->IsCacheDirty() || (m_cmOptions->GetCount() > 0 && !m_cmOptions->IsGenerated()))
- {
- int result = ::wxMessageBox(_("You have changed options, are you sure you want to delete all items?\n"),
- _("Warning"), wxYES_NO|wxICON_QUESTION);
-
- // when user wants to wait, wait.. else quit
- if(result == wxNO)
- deletecache = false;
-
- }
- if(deletecache)
- {
- // indicate that we haven't generated a project yet
- m_cmOptions->SetProjectGenerated(false);
-
- if(!m_cmBuildPath->GetValue().Trim().IsEmpty() && m_cmake != 0)
- m_cmake->GetCacheManager()->DeleteCache(m_cmBuildPath->GetValue().Trim());
-
- LoadCacheFromDiskToGUI();
- UpdateWindowState();
- }
- }
- /*!
- * Should we show tooltips?
- */
- bool CMakeSetupFrm::ShowToolTips()
- {
- return TRUE;
- }
- /*!
- * Get bitmap resources
- */
- wxBitmap CMakeSetupFrm::GetBitmapResource( const wxString& name )
- {
- // Bitmap retrieval
- ////@begin CMakeSetupFrm bitmap retrieval
- return wxNullBitmap;
- ////@end CMakeSetupFrm bitmap retrieval
- }
- /*!
- * Get icon resources
- */
- wxIcon CMakeSetupFrm::GetIconResource( const wxString& name )
- {
- // Icon retrieval
- ////@begin CMakeSetupFrm icon retrieval
- if (name == wxT("cmake_icon.xpm"))
- {
- wxIcon icon(_T("cmake_icon.xpm"), wxBITMAP_TYPE_XPM);
- return icon;
- }
- return wxNullIcon;
- ////@end CMakeSetupFrm icon retrieval
- }
- /*!
- * wxEVT_COMMAND_SPLITTER_SASH_POS_CHANGING event handler for ID_SPLITTERWINDOW
- */
- void CMakeSetupFrm::OnSplitterPosChanging( wxSplitterEvent& event )
- {
- int width, height;
- GetSize(&width, &height);
- if((height > 100))
- {
- if(event.GetSashPosition() < 170)
- event.SetSashPosition(170);
- else
- {
- if(event.GetSashPosition() > (height - 180))
- event.SetSashPosition(height - 180);
- }
- }
- else
- event.Veto();
- }
- /*!
- * wxEVT_COMMAND_BUTTON_CLICKED event handler for ID_CLEAR_LOG
- */
- void CMakeSetupFrm::OnClearLogClick( wxCommandEvent& event )
- {
- // delete the log text
- m_cmLog->Clear();
- m_cmLog->DiscardEdits();
- }
- /*!
- * wxEVT_COMMAND_TEXT_UPDATED event handler for ID_SOURCE_BUILD_PATH
- */
- void CMakeSetupFrm::OnSourceBuildPathUpdated( wxCommandEvent& event )
- {
- DoReloadCache();
- }
- void CMakeSetupFrm::DoReloadCache()
- {
- wxString buildpath = m_cmBuildPath->GetValue();
- // The build dir has changed, check if there is a cache, and
- // grab the source dir from it
- // make sure the call to update grid is not executed
- m_noRefresh = true;
- m_cmSearchQuery->SetValue(_(""));
- m_noRefresh = false;
- std::string path = buildpath.c_str();
- cmSystemTools::ConvertToUnixSlashes(path);
- // adjust the cmake instance
- m_cmake->SetHomeOutputDirectory(buildpath.c_str());
- m_cmake->SetStartOutputDirectory(buildpath.c_str());
- std::string cache_file = path;
- cache_file += "/CMakeCache.txt";
- // fill in the project path where the source is located, this is
- // read from the CMake cache
- cmCacheManager *cachem = m_cmake->GetCacheManager();
- cmCacheManager::CacheIterator it = cachem->NewIterator();
- if (cmSystemTools::FileExists(cache_file.c_str()) && cachem->LoadCache(path.c_str()) &&
- it.Find("CMAKE_HOME_DIRECTORY"))
- {
- path = ConvertToWindowsPath(it.GetValue());
- m_cmProjectPath->SetValue(path.c_str());
- }
- m_cmOptions->RemoveAll();
- LoadCacheFromDiskToGUI();
- UpdateWindowState();
- }
- /*!
- * wxEVT_COMMAND_TEXT_ENTER event handler for ID_SOURCE_BUILD_PATH
- */
- void CMakeSetupFrm::OnSourceBuildPathEnter( wxCommandEvent& event )
- {
- OnSourceBuildPathUpdated(event);
- }
- /*!
- * wxEVT_MOTION event handler for ID_OPTIONS
- */
- void CMakeSetupFrm::OnPropertyMotion( wxMouseEvent& event )
- {
- ShowPropertyDescription(m_cmOptions->YToRow(event.GetY()));
- event.Skip();
- }
- /*!
- * wxEVT_GRID_SELECT_CELL event handler for ID_OPTIONS
- */
- void CMakeSetupFrm::OnGridSelectCell( wxGridEvent& event )
- {
- // show description
- ShowPropertyDescription(event.GetRow());
-
- // enable or disable the browse button
- m_cmBrowseCell->Enable(m_cmOptions->IsSelectedItemBrowsable(event.GetRow()));
- event.Skip();
- }
- void CMakeSetupFrm::ShowPropertyDescription(int row)
- {
- if(row == wxNOT_FOUND || row < 0)
- m_cmDescription->SetValue(wxEmptyString);
- else
- {
- wxPropertyItem *pItem = m_cmOptions->GetPropertyItemFromRow(row);
- if(pItem)
- m_cmDescription->SetValue(pItem->GetHelpString());
- else
- m_cmDescription->SetValue(wxEmptyString);
- }
- }
- /*!
- * wxEVT_GRID_CELL_CHANGE event handler for ID_OPTIONS
- */
- void CMakeSetupFrm::OnCellChange( wxGridEvent& event )
- {
- // update the button state when the cache is invalidated
- UpdateWindowState();
- }
- void CMakeSetupFrm::OnRecentFileMenu( wxCommandEvent &event )
- {
- if(GetMenuBar())
- {
- // get file menu
- wxMenu *mnu = GetMenuBar()->GetMenu(0);
- wxASSERT(mnu != 0);
- wxMenuItem *item = mnu->FindItem(event.GetId());
- if(item)
- m_cmBuildPath->SetValue(item->GetLabel());
- }
- }
- /*!
- * wxEVT_COMMAND_COMBOBOX_SELECTED event handler for ID_COMBOBOX
- */
- void CMakeSetupFrm::OnSearchquerySelected( wxCommandEvent& event )
- {
- m_cmOptions->SetQuery(m_cmSearchQuery->GetValue());
- }
- void CMakeSetupFrm::OnAddQuery ( wxCommandEvent &event )
- {
- // add current text if not yet present
- if(m_cmSearchQuery->FindString(m_cmSearchQuery->GetValue()) == wxNOT_FOUND)
- {
- m_cmSearchQuery->Append(m_cmSearchQuery->GetValue());
-
- // if too many items are present, prune
- while(m_cmSearchQuery->GetCount() > CM_MAX_SEARCH_QUERIES)
- m_cmSearchQuery->Delete(0);
- }
- }
- /*!
- * wxEVT_COMMAND_TEXT_UPDATED event handler for ID_SEARCHQUERY
- */
- void CMakeSetupFrm::OnSearchqueryUpdated( wxCommandEvent& event )
- {
- // only refresh when this event was caused by user
- if(!m_noRefresh)
- m_cmOptions->SetQuery(m_cmSearchQuery->GetValue());
- }
- /*!
- * wxEVT_COMMAND_BUTTON_CLICKED event handler for ID_BROWSE_GRID
- */
- void CMakeSetupFrm::OnBrowseGridClick( wxCommandEvent& event )
- {
- m_cmOptions->BrowseSelectedItem();
- }
- /*!
- * wxEVT_COMMAND_MENU_SELECTED event handler for ID_MENU_RELOAD_CACHE
- */
- void CMakeSetupFrm::OnMenuReloadCacheClick( wxCommandEvent& event )
- {
- bool reload = true;
- if(m_cmOptions->IsCacheDirty() || (m_cmOptions->GetCount() > 0 && !m_cmOptions->IsGenerated()))
- {
- int result = ::wxMessageBox(_("You have changed options, are you sure you want to reload?\n"),
- _("Warning"), wxYES_NO|wxICON_QUESTION);
-
- // when user wants to wait, wait.. else quit
- if(result == wxNO)
- reload = false;
-
- }
- if(reload)
- DoReloadCache();
- }
- /*!
- * wxEVT_COMMAND_MENU_SELECTED event handler for ID_MENU_DELETE_CACHE
- */
- void CMakeSetupFrm::OnMenuDeleteCacheClick( wxCommandEvent& event )
- {
- DoDeleteCache();
- }
- /*!
- * wxEVT_COMMAND_MENU_SELECTED event handler for ID_MENU_QUIT
- */
- void CMakeSetupFrm::OnMenuQuitClick( wxCommandEvent& event )
- {
- // the close event will veto if the user
- // did not want to quit due to unsaved changes
- Close();
- }
- /*!
- * wxEVT_CLOSE_WINDOW event handler for ID_FRAME
- */
- void CMakeSetupFrm::OnCloseWindow( wxCloseEvent& event )
- {
- // ask quit if:
- // - The cache is dirty
- // - Or the cache is OK and has some items, and no project was generated recently (configure -> generate)
- if(m_cmOptions->IsCacheDirty() || (m_cmOptions->GetCount() > 0 && !m_cmOptions->IsGenerated()))
- {
- int result = ::wxMessageBox(_("You have changed options, but not yet generated the projects\n"
- "are you sure you want to quit?"), _("Warning"), wxYES_NO|wxICON_QUESTION);
-
- // when user wants to wait, wait.. else quit
- if(result == wxNO)
- event.Veto();
- else
- event.Skip();
- }
- else
- event.Skip();
- }
- /*!
- * wxEVT_COMMAND_MENU_SELECTED event handler for ID_ABOUTDLG
- */
- void CMakeSetupFrm::OnAboutClick( wxCommandEvent& event )
- {
- CMAboutDlg *dlg = new CMAboutDlg(this);
-
- wxArrayString generators;
- std::vector<std::string> names;
- m_cmake->GetRegisteredGenerators(names);
- for(std::vector<std::string>::iterator i = names.begin(); i != names.end(); ++i)
- generators.Add(i->c_str());
- wxString cmversion, cmsversion;
- cmversion.Printf("v%i.%i %s", cmake::GetMajorVersion(), cmake::GetMinorVersion(), cmake::GetReleaseVersion());
- cmsversion.Printf("v%i.%i%s", CMAKEGUI_MAJORVER, CMAKEGUI_MINORVER, CMAKEGUI_ADDVER);
- dlg->SetAboutText(cmversion, cmsversion, generators);
- dlg->ShowModal();
- dlg->Destroy();
- }
- /*!
- * wxEVT_COMMAND_MENU_SELECTED event handler for ID_CMAKE_OPTIONS
- */
- void CMakeSetupFrm::OnOptionsClick( wxCommandEvent& event )
- {
- CMOptionsDlg *dlg = new CMOptionsDlg(this);
- dlg->SetConfig(m_config);
- if(dlg->ShowModal() == wxID_OK)
- {
- // store volatile settings
- dlg->GetConfig(m_config);
-
- // apply non volatile setting such as clear search query, recent menu, etc.
- SyncFormOptions(dlg);
- }
- dlg->Destroy();
- }
- void CMakeSetupFrm::SyncFormOptions(CMOptionsDlg *dlg)
- {
- // TODO: Clear search query etc.
- }
- /*!
- * wxEVT_COMMAND_SPLITTER_DOUBLECLICKED event handler for ID_SPLITTERWINDOW
- */
- void CMakeSetupFrm::OnSplitterwindowSashDClick( wxSplitterEvent& event )
- {
- event.Veto();
- }
- /*!
- * wxEVT_COMMAND_MENU_SELECTED event handler for ID_MENU_CONFIGURE
- */
- void CMakeSetupFrm::OnMenuConfigureClick( wxCommandEvent& event )
- {
- DoConfigure();
- }
- /*!
- * wxEVT_COMMAND_MENU_SELECTED event handler for ID_MENU_EXITGENERATE
- */
- void CMakeSetupFrm::OnMenuGenerateClick( wxCommandEvent& event )
- {
- // set flag so that a close command is issued
- // after generating the cmake cache to projects
- m_quitAfterGenerating = true;
- DoGenerate();
- m_quitAfterGenerating = false;
- }
- /*!
- * wxEVT_COMMAND_MENU_SELECTED event handler for ID_MENU_TOGGLE_ADVANCED
- */
- void CMakeSetupFrm::OnMenuToggleAdvancedClick( wxCommandEvent& event )
- {
- // toggle the check box
- m_cmShowAdvanced->SetValue(!m_cmShowAdvanced->GetValue());
- OnShowAdvancedValues(event);
- }
|