| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844 |
- /*=========================================================================
- Program: Insight Segmentation & Registration Toolkit
- Module: $RCSfile$
- Language: C++
- Date: $Date$
- Version: $Revision$
- Copyright (c) 2002 Insight Consortium. All rights reserved.
- See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm 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.
- =========================================================================*/
- #include "CMakeSetupGUIImplementation.h"
- #include "FL/Fl_File_Chooser.H"
- #include "FL/filename.H"
- #include "FL/fl_ask.H"
- #include "../cmCacheManager.h"
- #include "../cmMakefile.h"
- #include <iostream>
- #include "FLTKPropertyList.h"
- #include "FLTKPropertyItemRow.h"
- #include "FL/fl_draw.H"
- #include "../cmake.h"
- void FLTKMessageCallback(const char* message, const char* title, bool& nomore, void*)
- {
- std::string msg = message;
- msg += "\nPress cancel to suppress any further messages.";
- int choice = fl_choice( msg.c_str(), "Cancel","Ok",0);
- if(choice==0)
- {
- nomore = true;
- }
- }
- /**
- * Constructor
- */
- CMakeSetupGUIImplementation
- ::CMakeSetupGUIImplementation():m_CacheEntriesList(this)
- {
- m_CMakeInstance = new cmake;
- cmSystemTools::SetErrorCallback(FLTKMessageCallback);
- m_BuildPathChanged = false;
- }
- /**
- * Destructor
- */
- CMakeSetupGUIImplementation
- ::~CMakeSetupGUIImplementation()
- {
- }
- /**
- * Show the graphic interface
- */
- void
- CMakeSetupGUIImplementation
- ::Show( void )
- {
- dialogWindow->show();
- }
- /**
- * Hide the graphic interface
- */
- void
- CMakeSetupGUIImplementation
- ::Close( void )
- {
- SaveRecentDirectories();
- dialogWindow->hide();
- }
- /**
- * Browse for the path to the sources
- */
- void
- CMakeSetupGUIImplementation
- ::BrowseForSourcePath( void )
- {
- const char * path =
- fl_dir_chooser(
- "Path to Sources",
- sourcePathTextInput->value() );
-
- if( !path )
- {
- return;
- }
-
- SetSourcePath( path );
- }
- /**
- * Browse for the path to the binaries
- */
- void
- CMakeSetupGUIImplementation
- ::BrowseForBinaryPath( void )
- {
- const char * path =
- fl_dir_chooser(
- "Path to Binaries",
- binaryPathTextInput->value() );
-
- if( !path )
- {
- return;
- }
- SetBinaryPath( path );
- }
- /**
- * Set path to executable. Used to get the path to CMake
- */
- void
- CMakeSetupGUIImplementation
- ::SetPathToExecutable( const char * path )
- {
- m_PathToExecutable = cmSystemTools::CollapseFullPath(path);
- m_PathToExecutable = cmSystemTools::GetProgramPath(m_PathToExecutable.c_str()).c_str();
- #ifdef _WIN32
- m_PathToExecutable += "/cmake.exe";
- #else
- m_PathToExecutable += "/cmake";
- #endif
- }
- /**
- * Set the source path
- */
- void
- CMakeSetupGUIImplementation
- ::SetSourcePath( const char * path )
- {
- if( !path || strlen(path)==0 )
- {
- fl_alert("Please select the path to the sources");
- return;
- }
- std::string expandedAbsolutePath = ExpandPathAndMakeItAbsolute( path );
-
- sourcePathTextInput->value( expandedAbsolutePath.c_str() );
-
- if( VerifySourcePath( expandedAbsolutePath ) )
- {
- m_WhereSource = expandedAbsolutePath;
- }
- }
- /**
- * Expand environment variables in the path and make it absolute
- */
- std::string
- CMakeSetupGUIImplementation
- ::ExpandPathAndMakeItAbsolute( const std::string & inputPath ) const
- {
- return cmSystemTools::CollapseFullPath(inputPath.c_str());
- }
- /**
- * Set the binary path
- */
- void
- CMakeSetupGUIImplementation
- ::SetBinaryPath( const char * path )
- {
- if( !path || strlen(path)==0 )
- {
- fl_alert("Please select the path to the binaries");
- return;
- }
- std::string expandedAbsolutePath = ExpandPathAndMakeItAbsolute( path );
-
- binaryPathTextInput->value( expandedAbsolutePath.c_str() );
- if( !VerifyBinaryPath( expandedAbsolutePath.c_str() ) )
- {
- return;
- }
- if( m_WhereBuild != expandedAbsolutePath )
- {
- m_BuildPathChanged = true;
- m_WhereBuild = expandedAbsolutePath;
- m_CacheEntriesList.RemoveAll(); // remove data from other project
- this->LoadCacheFromDiskToGUI();
- }
- else
- {
- m_BuildPathChanged = false;
- }
-
- }
- /**
- * Verify the path to binaries
- */
- bool
- CMakeSetupGUIImplementation
- ::VerifyBinaryPath( const std::string & path ) const
- {
- bool pathIsOK = false;
- if( cmSystemTools::FileIsDirectory( path.c_str() ) )
- {
- pathIsOK = true;
- }
- else
- {
- int userWantsToCreateDirectory =
- fl_ask("The directory \n %s \n Doesn't exist. Do you want to create it ?",
- path.c_str() );
-
- if( userWantsToCreateDirectory )
- {
- cmSystemTools::MakeDirectory( path.c_str() );
- pathIsOK = true;
- }
- else
- {
- pathIsOK = false;
- }
- }
-
- return pathIsOK;
- }
- /**
- * Verify the path to sources
- */
- bool
- CMakeSetupGUIImplementation
- ::VerifySourcePath( const std::string & path ) const
- {
- if( !cmSystemTools::FileIsDirectory(( path.c_str())))
- {
- fl_alert("The Source directory \n %s \n Doesn't exist or is not a directory", path.c_str() );
- return false;
- }
-
- return true;
- }
- /**
- * Build the project files
- */
- void
- CMakeSetupGUIImplementation
- ::RunCMake( bool generateProjectFiles )
- {
- if(!cmSystemTools::FileIsDirectory( m_WhereBuild.c_str() ))
- {
- std::string message =
- "Build directory does not exist, should I create it?\n\n"
- "Directory: ";
- message += m_WhereBuild;
- int userWantToCreateDirectory =
- fl_ask(message.c_str());
- if( userWantToCreateDirectory )
- {
- cmSystemTools::MakeDirectory( m_WhereBuild.c_str() );
- }
- else
- {
- fl_alert("Build Project aborted, nothing done.");
- return;
- }
- }
-
- // set the wait cursor
- fl_cursor(FL_CURSOR_WAIT,FL_BLACK,FL_WHITE);
- // save the current GUI values to the cache
- this->SaveCacheFromGUI();
- // Make sure we are working from the cache on disk
- this->LoadCacheFromDiskToGUI();
- UpdateListOfRecentDirectories();
- SaveRecentDirectories();
- if (generateProjectFiles)
- {
- if(m_CMakeInstance->Generate() != 0)
- {
- cmSystemTools::Error(
- "Error in generation process, project files may be invalid");
- }
- }
- else
- {
- m_CMakeInstance->SetHomeDirectory(m_WhereSource.c_str());
- m_CMakeInstance->SetStartDirectory(m_WhereSource.c_str());
- m_CMakeInstance->SetHomeOutputDirectory(m_WhereBuild.c_str());
- m_CMakeInstance->SetStartOutputDirectory(m_WhereBuild.c_str());
- const char* defaultGenerator = 0;
- #if defined(_WIN32)
- defaultGenerator = "NMake Makefiles";
- #else defined(_WIN32)
- defaultGenerator = "Unix Makefiles";
- #endif defined(_WIN32)
- m_CMakeInstance->SetGlobalGenerator(
- m_CMakeInstance->CreateGlobalGenerator(defaultGenerator));
- m_CMakeInstance->SetCMakeCommand(m_PathToExecutable.c_str());
- m_CMakeInstance->LoadCache();
- 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();
- }
- // path is up-to-date now
- m_BuildPathChanged = false;
- // put the cursor back
- fl_cursor(FL_CURSOR_DEFAULT,FL_BLACK,FL_WHITE);
- fl_message("Done !");
- }
- /**
- * Load Cache from disk to GUI
- */
- void
- CMakeSetupGUIImplementation
- ::LoadCacheFromDiskToGUI( void )
- {
-
-
- if( m_WhereBuild != "" )
- {
- cmCacheManager *cachem = this->m_CMakeInstance->GetCacheManager();
- cachem->LoadCache( m_WhereBuild.c_str() );
- this->FillCacheGUIFromCacheManager();
- }
- }
-
- /**
- * Save Cache from disk to GUI
- */
- void
- CMakeSetupGUIImplementation
- ::SaveCacheFromGUI( void )
- {
- cmCacheManager *cachem = this->m_CMakeInstance->GetCacheManager();
- this->FillCacheManagerFromCacheGUI();
- if(m_WhereBuild != "")
- {
- cachem->SaveCache(m_WhereBuild.c_str());
- }
- }
- /**
- * Fill Cache GUI from cache manager
- */
- void
- CMakeSetupGUIImplementation
- ::FillCacheGUIFromCacheManager( void )
- {
- cmCacheManager *cachem = this->m_CMakeInstance->GetCacheManager();
- cmCacheManager::CacheIterator it = cachem->NewIterator();
- size_t size = m_CacheEntriesList.GetItems().size();
- bool reverseOrder = false;
- // if there are already entries in the cache, then
- // put the new ones in the top, so they show up first
- if(size)
- {
- reverseOrder = true;
- }
- // all the current values are not new any more
- std::set<fltk::PropertyItem*> items = m_CacheEntriesList.GetItems();
- for(std::set<fltk::PropertyItem*>::iterator i = items.begin();
- i != items.end(); ++i)
- {
- fltk::PropertyItem* item = *i;
- item->m_NewValue = false;
- }
- // Prepare to add rows to the FLTK scroll/pack
- propertyListPack->clear();
- propertyListPack->begin();
- // const cmCacheManager::CacheEntryMap &cache =
- // cmCacheManager::GetInstance()->GetCacheMap();
- // if(cache.size() == 0)
- // {
- // m_OKButton->deactivate();
- // }
- // else
- // {
- // m_OKButton->activate();
- // }
- for(cmCacheManager::CacheIterator i = cachem->NewIterator();
- !i.IsAtEnd(); i.Next())
- {
- const char* key = i.GetName();
- std::string value = i.GetValue();
- 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"),
- fltk::PropertyList::CHECKBOX,"",
- reverseOrder);
- }
- else
- {
- m_CacheEntriesList.AddProperty(key,
- "OFF",
- i.GetProperty("HELPSTRING"),
- fltk::PropertyList::CHECKBOX,"",
- reverseOrder);
- }
- break;
- case cmCacheManager::PATH:
- m_CacheEntriesList.AddProperty(key,
- value.c_str(),
- i.GetProperty("HELPSTRING"),
- fltk::PropertyList::PATH,"",
- reverseOrder);
- break;
- case cmCacheManager::FILEPATH:
- m_CacheEntriesList.AddProperty(key,
- value.c_str(),
- i.GetProperty("HELPSTRING"),
- fltk::PropertyList::FILE,"",
- reverseOrder);
- break;
- case cmCacheManager::STRING:
- m_CacheEntriesList.AddProperty(key,
- value.c_str(),
- i.GetProperty("HELPSTRING"),
- fltk::PropertyList::EDIT,"",
- reverseOrder);
- break;
- case cmCacheManager::STATIC:
- case cmCacheManager::INTERNAL:
- m_CacheEntriesList.RemoveProperty(key);
- break;
- }
- }
- // Add the old entry to the end of the pack
- for(std::set<fltk::PropertyItem*>::iterator i = items.begin();
- i != items.end(); ++i)
- {
- fltk::PropertyItem* item = *i;
- if( !(item->m_NewValue) )
- {
- new fltk::PropertyItemRow( item ); // GUI of the old property row
- }
- }
- propertyListPack->end();
- propertyListPack->init_sizes();
- cacheValuesScroll->position( 0, 0 );
- propertyListPack->redraw();
- Fl::check();
- this->UpdateData(false);
- }
- /**
- * UpdateData
- */
- void
- CMakeSetupGUIImplementation
- ::UpdateData( bool option )
- {
- dialogWindow->redraw();
- Fl::check();
- }
- /**
- * Fill cache manager from Cache GUI
- */
- void
- CMakeSetupGUIImplementation
- ::FillCacheManagerFromCacheGUI( void )
- {
- cmCacheManager *cachem = this->m_CMakeInstance->GetCacheManager();
- cmCacheManager::CacheIterator it = cachem->NewIterator();
- std::set<fltk::PropertyItem*> items = m_CacheEntriesList.GetItems();
- for(std::set<fltk::PropertyItem*>::iterator i = items.begin();
- i != items.end(); ++i)
- {
- fltk::PropertyItem* item = *i;
- if ( it.Find((const char*)item->m_propName.c_str()) )
- {
- it.SetValue(item->m_curValue.c_str());
- }
- if( item->m_Dirty )
- {
- m_CacheEntriesList.SetDirty();
- }
- }
- }
- /**
- * Load Recent Directories
- */
- void
- CMakeSetupGUIImplementation
- ::LoadRecentDirectories( void )
- {
- std::string home = getenv("HOME");
- std::string filename = home + "/.cmakerc";
-
- std::ifstream input;
- input.open(filename.c_str());
-
- if( input.fail() )
- {
- // probably the file doesn't exist
- return;
- }
-
- m_RecentBinaryDirectories.clear();
- m_RecentSourceDirectories.clear();
- std::string key;
- std::string onedirectory;
- while( !input.eof() )
- {
- input >> key;
-
- if( input.eof() ) break;
- if( key == "MostRecentSource" )
- {
- input >> onedirectory;
- m_WhereSource = onedirectory;
- sourcePathTextInput->value( m_WhereSource.c_str() );
- } else
- if( key == "MostRecentBinary" )
- {
- input >> onedirectory;
- m_WhereBuild = onedirectory;
- binaryPathTextInput->value( m_WhereBuild.c_str() );
- LoadCacheFromDiskToGUI();
- } else
- if( key == "Binary" )
- {
- input >> onedirectory;
- // insert is only done if the directory doesn't exist
- m_RecentBinaryDirectories.insert( onedirectory );
- recentBinaryDirectoriesBrowser->add(
- (onedirectory.c_str()),
- (void*)(onedirectory.c_str()) );
- } else
- if( key == "Source" )
- {
- input >> onedirectory;
- // insert is only done if the directory doesn't exist
- m_RecentSourceDirectories.insert( onedirectory );
- recentSourceDirectoriesBrowser->add(
- (onedirectory.c_str()),
- (void*)(onedirectory.c_str()) );
- }
- }
- input.close();
- }
- /**
- * Save Recent Directories
- */
- void
- CMakeSetupGUIImplementation
- ::SaveRecentDirectories( void )
- {
- std::string home = getenv("HOME");
- if( home.empty() )
- {
- return;
- }
-
- std::string filename = home + "/.cmakerc";
-
- std::ofstream output;
- output.open(filename.c_str());
- output << "MostRecentBinary " << m_WhereBuild << std::endl;
- output << "MostRecentSource " << m_WhereSource << std::endl;
- // Save Recent binary directories
- std::set< std::string >::iterator bindir =
- m_RecentBinaryDirectories.begin();
- while( bindir != m_RecentBinaryDirectories.end() )
- {
- output << "Binary " << *bindir << std::endl;
- bindir++;
- }
- // Save Recent source directories
- std::set< std::string >::iterator srcdir =
- m_RecentSourceDirectories.begin();
- while( srcdir != m_RecentSourceDirectories.end() )
- {
- output << "Source " << *srcdir << std::endl;
- srcdir++;
- }
- }
- /**
- * Show Recent Binary Directories
- */
- void
- CMakeSetupGUIImplementation
- ::ShowRecentBinaryDirectories( void )
- {
- if( recentBinaryDirectoriesBrowser->size() )
- {
- recentBinaryDirectoriesBrowser->Fl_Widget::show();
- }
- }
- /**
- * Show Recent Source Directories
- */
- void
- CMakeSetupGUIImplementation
- ::ShowRecentSourceDirectories( void )
- {
- if( recentSourceDirectoriesBrowser->size() )
- {
- recentSourceDirectoriesBrowser->Fl_Widget::show();
- }
- }
- /**
- * Select one Recent Binary Directory
- */
- void
- CMakeSetupGUIImplementation
- ::SelectOneRecentBinaryDirectory( void )
- {
- const int selected = recentBinaryDirectoriesBrowser->value();
- if( selected == 0 )
- {
- return;
- }
-
- m_WhereBuild = static_cast<char *>(
- recentBinaryDirectoriesBrowser->data( selected ));
- binaryPathTextInput->value( m_WhereBuild.c_str() );
- recentBinaryDirectoriesBrowser->Fl_Widget::hide();
- m_CacheEntriesList.RemoveAll(); // remove data from other project
- LoadCacheFromDiskToGUI();
- }
- /**
- * Select one Recent Source Directory
- */
- void
- CMakeSetupGUIImplementation
- ::SelectOneRecentSourceDirectory( void )
- {
- const int selected = recentSourceDirectoriesBrowser->value();
- if( selected == 0 )
- {
- return;
- }
- m_WhereSource = static_cast< char * >(
- recentSourceDirectoriesBrowser->data( selected ));
- sourcePathTextInput->value( m_WhereSource.c_str() );
- recentSourceDirectoriesBrowser->Fl_Widget::hide();
- }
- /**
- * Update List of Recent Directories
- */
- void
- CMakeSetupGUIImplementation
- ::UpdateListOfRecentDirectories( void )
- {
- // Update Recent binary directories
- // insert is only done if the directory doesn't exist
- m_RecentBinaryDirectories.insert( m_WhereBuild );
-
- // Update Recent source directories
- // insert is only done if the directory doesn't exist
- m_RecentSourceDirectories.insert( m_WhereSource );
- }
- /**
- * Clicked on Configure Button
- */
- void
- CMakeSetupGUIImplementation
- ::ClickOnConfigure( void )
- {
- this->RunCMake(false);
- }
- /**
- * Clicked on OK Button
- */
- void
- CMakeSetupGUIImplementation
- ::ClickOnOK( void )
- {
- m_CacheEntriesList.ClearDirty();
- this->RunCMake(true);
- this->Close();
- }
- /**
- * Clicked on Cancel Button
- */
- void
- CMakeSetupGUIImplementation
- ::ClickOnCancel( void )
- {
- if(m_CacheEntriesList.IsDirty())
- {
- int userWantsExitEvenThoughOptionsHaveChanged =
- fl_ask("You have changed options but not rebuilt, \n"
- "are you sure you want to exit?");
- if( userWantsExitEvenThoughOptionsHaveChanged )
- {
- this->Close();
- }
- }
- else
- {
- this->Close();
- }
- }
|