From: guigues Date: Tue, 27 Jan 2009 14:22:44 +0000 (+0000) Subject: are now generated in user's .bbtk dir X-Git-Tag: v0.9.1~6 X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=commitdiff_plain;h=8822f9075c66dcf742b9edae47271bb46af6a9b7;p=bbtk.git are now generated in user's .bbtk dir * bug fixes in doc/boxes lists regeneration * bbStudio : -splash screen -doc automatically generated on first time --- diff --git a/kernel/appli/bbRegenerateBoxesLists/bbRegenerateBoxesLists.cpp b/kernel/appli/bbRegenerateBoxesLists/bbRegenerateBoxesLists.cpp index b981604..e9b2535 100644 --- a/kernel/appli/bbRegenerateBoxesLists/bbRegenerateBoxesLists.cpp +++ b/kernel/appli/bbRegenerateBoxesLists/bbRegenerateBoxesLists.cpp @@ -30,7 +30,7 @@ int main(int argc, char **argv) doc_path += "bbdoc"; doc_path += bbtk::ConfigurationFile::GetInstance().Get_file_separator(); - I->InterpretLine( "exec freeze"); + I->InterpretLine( "exec freeze_no_error"); I->InterpretLine( "include *"); I->GetExecuter()->GetFactory()->CreateHtmlIndex(bbtk::Factory::Initials,doc_path + "index-alpha.html"); I->GetExecuter()->GetFactory()->CreateHtmlIndex(bbtk::Factory::Packages,doc_path + "index-package.html"); diff --git a/kernel/appli/bbRegeneratePackageDoc/bbRegeneratePackageDoc.cpp b/kernel/appli/bbRegeneratePackageDoc/bbRegeneratePackageDoc.cpp index 9faa7d5..1f8249a 100644 --- a/kernel/appli/bbRegeneratePackageDoc/bbRegeneratePackageDoc.cpp +++ b/kernel/appli/bbRegeneratePackageDoc/bbRegeneratePackageDoc.cpp @@ -73,7 +73,7 @@ int main(int argc, char **argv) bbtk::Interpreter::Pointer I = bbtk::Interpreter::New(); I->SetCommandLine(true); I->SetThrow(false); - I->InterpretLine( "exec freeze"); + I->InterpretLine( "exec freeze_no_error"); if (pack != "-a") { I->InterpretLine( "include "+pack); diff --git a/kernel/data/icons/CMakeLists.txt b/kernel/data/icons/CMakeLists.txt index 26a4309..cc8438b 100644 --- a/kernel/data/icons/CMakeLists.txt +++ b/kernel/data/icons/CMakeLists.txt @@ -5,3 +5,8 @@ INSTALL( FILES ${IMAGES} DESTINATION ${BBTK_DATA_INSTALL_PATH}/kernel/icons ) + +CONFIGURE_FILE( ${CMAKE_CURRENT_SOURCE_DIR}/bbStudioSplashScreen.png + ${BBTK_DATA_BUILD_PATH}/kernel/icons/bbStudioSplashScreen.png + COPYONLY +) diff --git a/kernel/data/icons/bbStudioSplashScreen.png b/kernel/data/icons/bbStudioSplashScreen.png new file mode 100644 index 0000000..bddb6cb Binary files /dev/null and b/kernel/data/icons/bbStudioSplashScreen.png differ diff --git a/kernel/src/bbtkConfigurationFile.cxx b/kernel/src/bbtkConfigurationFile.cxx index 4d59d57..f7b9002 100644 --- a/kernel/src/bbtkConfigurationFile.cxx +++ b/kernel/src/bbtkConfigurationFile.cxx @@ -2,8 +2,8 @@ Program: bbtk Module: $RCSfile: bbtkConfigurationFile.cxx,v $ Language: C++ - Date: $Date: 2008/12/12 10:20:48 $ - Version: $Revision: 1.25 $ + Date: $Date: 2009/01/27 14:22:56 $ + Version: $Revision: 1.26 $ =========================================================================*/ /* --------------------------------------------------------------------- @@ -65,21 +65,29 @@ namespace bbtk ConfigurationFile::ConfigurationFile() { - mFile_separator = VALID_FILE_SEPARATOR; + mFile_separator = VALID_FILE_SEPARATOR; // ==> Set system paths - mBin_path = GetExecutablePath(); - + mBin_path = Utilities::GetExecutablePath(); + #ifdef MACOSX mInstall_path = mBin_path + "/../../../.."; #else mInstall_path = mBin_path + "/.."; #endif - + + // The relative path to the doc folder (=BBTK_DOC_REL_PATH) - mDoc_rel_path = BBTK_STRINGIFY_SYMBOL(BBTK_DOC_REL_PATH); + // mDoc_rel_path = BBTK_STRINGIFY_SYMBOL(BBTK_DOC_REL_PATH); // The path to the doc folder (=mInstall_path+"/"+mDoc_rel_path) - mDoc_path = mInstall_path + "/" + mDoc_rel_path; + // mDoc_path = mInstall_path + "/" + mDoc_rel_path; + // Have to create bbtk user's dirs if needed + + // LG 27/01/09 : doc is now user dependent + // and located in user's .bbtk dir /doc + // All dirs under .bbtk user's dir are set and created by: + InitializeDotBbtkStructure(); + // The relative path to the doc folder (=BBTK_BBS_REL_PATH) mBbs_rel_path = BBTK_STRINGIFY_SYMBOL(BBTK_BBS_REL_PATH); // The path to the bbs folder (=mInstall_path+"/"+mBbs_rel_path) @@ -93,12 +101,6 @@ namespace bbtk Utilities::replace( mInstall_path, INVALID_FILE_SEPARATOR, VALID_FILE_SEPARATOR); - Utilities::replace( mDoc_rel_path, - INVALID_FILE_SEPARATOR, - VALID_FILE_SEPARATOR); - Utilities::replace( mDoc_path, - INVALID_FILE_SEPARATOR, - VALID_FILE_SEPARATOR); Utilities::replace( mBbs_path, INVALID_FILE_SEPARATOR, VALID_FILE_SEPARATOR); @@ -211,8 +213,75 @@ namespace bbtk } //========================================================================= + //========================================================================= + void ConfigurationFile::InitializeDotBbtkStructure() + { + mDot_bbtk_path = Utilities::GetUserSettingsDir(); + mDot_bbtk_is_new = false; + if (!Utilities::FileExists(mDot_bbtk_path)) mDot_bbtk_is_new = true; + Utilities::CreateDirectoryIfNeeded(mDot_bbtk_path); + + mDoc_path = Utilities::MakeUserSettingsFullFileName("doc"); + Utilities::CreateDirectoryIfNeeded(mDoc_path); + + std::string bbdoc_path = + Utilities::MakeUserSettingsFullFileName("doc/bbdoc"); + Utilities::CreateDirectoryIfNeeded(bbdoc_path); + + // Create help_contents.html if does not exist + std::string filename = Utilities::MakeUserSettingsFullFileName("doc/help_contents.html"); + if (!Utilities::FileExists(filename)) + { + bbtkDebugMessage("Config",1, + "* Creating [" << filename << "]" << std::endl); + // The path to the doc folder (=mInstall_path+"/"+mDoc_rel_path) + std::string doc_path = mInstall_path + "/" + + BBTK_STRINGIFY_SYMBOL(BBTK_DOC_REL_PATH) + "/"; + Utilities::MakeValidFileName(doc_path); + std::ofstream f; + f.open(filename.c_str(), std::ios::out ); + f << "" + << "Help Contents - bbtk " + << GetVersion() << "" + << "

Help Contents

" + << "Demos
" + << "Examples" + << "

Guides

" + << "User's Guide
" + << "Package Developer's Guide
" + << "bbtk library doxygen doc
" + << "

Boxes

" + << "" + << "Alphabetical list
" + << "" + << "List by package
" + << "" + << "List by category
" + << "" + << "List of adaptors
" + << "" + << ""; + } + mTemp_path = Utilities::MakeUserSettingsFullFileName("tmp"); + Utilities::CreateDirectoryIfNeeded(mTemp_path); + + } + //========================================================================= //========================================================================= void ConfigurationFile::CreateConfigXML( char *rootDirectory ) @@ -226,7 +295,6 @@ namespace bbtk fprintf(fp, "\n"); fprintf(fp, " \n"); fprintf(fp, " \n"); - fprintf(fp, " $ \n"); fprintf(fp, "\n"); fclose(fp); } @@ -234,192 +302,6 @@ namespace bbtk - //========================================================================= - // From http://www.fltk.org/newsgroups.php?gfltk.general+v:22083 - // - int get_app_path (char *pname, size_t pathsize) - { -#ifdef LINUX - /* Oddly, the readlink(2) man page says no NULL is appended. */ - /* So you have to do it yourself, based on the return value: */ - pathsize --; /* Preserve a space to add the trailing NULL */ - long result = readlink("/proc/self/exe", pname, pathsize); - if (result > 0) - { - pname[result] = 0; /* add the #@!%ing NULL */ - - if ((access(pname, 0) == 0)) - return 0; /* file exists, return OK */ - /*else name doesn't seem to exist, return FAIL (falls - through) */ - } -#endif /* LINUX */ - -#ifdef WIN32 - long result = GetModuleFileName(NULL, pname, pathsize); - if (result > 0) - { - /* fix up the dir slashes... */ - int len = strlen(pname); - int idx; - for (idx = 0; idx < len; idx++) - { - if (pname[idx] == '\\') pname[idx] = '/'; - } - - for (idx = len-1; idx >=0 ; idx--) - { - if (pname[idx] == '/') - { - pname[idx+1] = '\0'; - idx = -1; - } - } - - if ((access(pname, 0) == 0)) - return 0; /* file exists, return OK */ - /*else name doesn't seem to exist, return FAIL (falls - through) */ - } -#endif /* WIN32 */ - -#ifdef SOLARIS - char *p = getexecname(); - if (p) - { - /* According to the Sun manpages, getexecname will - "normally" return an */ - /* absolute path - BUT might not... AND that IF it is not, - pre-pending */ - /* getcwd() will "usually" be the correct thing... Urgh! - */ - - /* check pathname is absolute (begins with a / ???) */ - if (p[0] == '/') /* assume this means we have an - absolute path */ - { - strncpy(pname, p, pathsize); - if ((access(pname, 0) == 0)) - return 0; /* file exists, return OK */ - } - else /* if not, prepend getcwd() then check if file - exists */ - { - getcwd(pname, pathsize); - long result = strlen(pname); - strncat(pname, "/", (pathsize - result)); - result ++; - strncat(pname, p, (pathsize - result)); - - if ((access(pname, 0) == 0)) - return 0; /* file exists, return OK */ - /*else name doesn't seem to exist, return FAIL - (falls through) */ - } - } -#endif /* SOLARIS */ - -#ifdef MACOSX /* assume this is OSX */ - /* - from http://www.hmug.org/man/3/NSModule.html - - extern int _NSGetExecutablePath(char *buf, unsigned long - *bufsize); - - _NSGetExecutablePath copies the path of the executable - into the buffer and returns 0 if the path was successfully - copied in the provided buffer. If the buffer is not large - enough, -1 is returned and the expected buffer size is - copied in *bufsize. Note that _NSGetExecutablePath will - return "a path" to the executable not a "real path" to the - executable. That is the path may be a symbolic link and - not the real file. And with deep directories the total - bufsize needed could be more than MAXPATHLEN. - */ - int status = -1; - char *given_path = (char*)malloc(MAXPATHLEN * 2); - if (!given_path) return status; - - uint32_t npathsize = MAXPATHLEN * 2; - long result = _NSGetExecutablePath(given_path, &npathsize); - if (result == 0) - { /* OK, we got something - now try and resolve the real path... - */ - if (realpath(given_path, pname) != NULL) - { - if ((access(pname, 0) == 0)) - status = 0; /* file exists, return OK */ - } - } - free (given_path); - return status; -#endif /* MACOSX */ - - return -1; /* Path Lookup Failed */ - } - - - - //========================================================================= - std::string ConfigurationFile::GetExecutablePath() - { - char name[PATH_MAX]; - int err = get_app_path(name, PATH_MAX); - if (err) - { - bbtkError("Could not determine current executable path ?"); - } - - // remove the exe name - char *slash; - slash = strrchr(name, VALID_FILE_SEPARATOR_CHAR); - if (slash) - { - *slash = 0; - } - return name; - } - -/* - /// \todo : Think to delete it! - char *buf = (char *)malloc(512); - if (!buf) - { - bbtkError("Could not allocate 512 bytes !"); - } - char *slash; - -#if defined(WIN32) - GetModuleFileName(NULL, buf, 511); - slash = strrchr(buf, '\\'); - if (slash) - { - *slash = 0; - } -#endif - - -#if defined(__GNUC__) - int res; - res = readlink("/proc/self/exe", buf, 512); - if (res == -1) - { - free(buf); - - } - buf[res] = 0; - slash = strrchr(buf, '/'); - if (slash) - { - *slash = 0; - } -#endif - std::string ret(buf); - free(buf); - return ret; - } - //========================================================================= -*/ //========================================================================= void ConfigurationFile::InstallPath () @@ -458,10 +340,6 @@ namespace bbtk char configPath[200]; sprintf(configPath, "%s/bbtk_config.xml",rootDirectory); - // makeDir - char makeDir[250]; - sprintf( makeDir, "mkdir \"%s\" ", rootDirectory); - // configXmlTmp char configXmlTmp[250]; sprintf(configXmlTmp, "%s/bbtk_config.xml.tmp", bbtk_path); @@ -471,23 +349,12 @@ namespace bbtk if (!Utilities::FileExists(configXmlTmp)) // bbtk_config.xml.tmp not found (not installed) { - if (!Utilities::FileExists(rootDirectory)) // .bbtk not found - { - system(makeDir); // create .bbtk - } - // if "bbtk_path/bbtk_config.xml.tmp" doesn't exist, hard-create a minimum version in .bbtk CreateConfigXML( rootDirectory );// create .bbtk } else { sprintf(copyFile,"cp %s %s/bbtk_config.xml ",configXmlTmp,rootDirectory ); - if (!Utilities::FileExists(rootDirectory)) - { - //std::cout << "makeDir[" << makeDir << "]" << std::endl; - system(makeDir); - } - if (!Utilities::FileExists(configPath)) { system(copyFile); @@ -527,11 +394,6 @@ namespace bbtk if (!Utilities::FileExists(configXmlTmp)) // bbtk_config.xml.tmp not found { - if (!Utilities::FileExists(rootDirectory)) // .bbtk not found - { - system(makeDir); // create .bbtk - } - // if "bbtk_path/bbtk_config.xml.tmp" doesn't exist, hard-create a minimum version in .bbtk CreateConfigXML( rootDirectory );// create .bbtk return; @@ -634,6 +496,7 @@ namespace bbtk } // default_temp_dir + /* if( BB.nChildNode((XMLCSTR)"default_temp_dir") ) GetTextOrClear(BB.getChildNode((XMLCSTR)"default_temp_dir"),mDefault_temp_dir); @@ -642,6 +505,7 @@ namespace bbtk size_t pos = mConfig_xml_full_path.find("bbtk_config.xml"); mDefault_temp_dir = mConfig_xml_full_path.substr (0,pos); } + */ GetHelp(2); } diff --git a/kernel/src/bbtkConfigurationFile.h b/kernel/src/bbtkConfigurationFile.h index aa5daf3..e6dd488 100644 --- a/kernel/src/bbtkConfigurationFile.h +++ b/kernel/src/bbtkConfigurationFile.h @@ -2,8 +2,8 @@ Program: bbtk Module: $RCSfile: bbtkConfigurationFile.h,v $ Language: C++ - Date: $Date: 2008/10/17 08:18:13 $ - Version: $Revision: 1.10 $ + Date: $Date: 2009/01/27 14:22:56 $ + Version: $Revision: 1.11 $ =========================================================================*/ /* --------------------------------------------------------------------- @@ -82,31 +82,28 @@ namespace bbtk ~ConfigurationFile(); - private: - ConfigurationFile(); - void InstallPath (); - - public: void GetHelp(int level) const; + /// Returns true iff the directory .bbtk has been created on construction + inline bool DotBbtkIsNew() { return mDot_bbtk_is_new; } + inline const std::string& Get_description() const { return mDescription;} - // inline const std::string& Get_url() const - // { return mUrl;} + inline const std::string& Get_data_path() const { return mData_path;} inline const std::string& Get_file_separator() const { return mFile_separator;} + inline const std::string& Get_dot_bbtk_path() const + { return mDot_bbtk_path;} inline const std::string& Get_bin_path() const { return mBin_path;} inline const std::string& Get_install_path() const { return mInstall_path;} inline const std::string& Get_doc_path() const { return mDoc_path;} - inline const std::string& Get_rsc_path() const - { return mRsc_path;} - + inline const std::string& Get_root_bbs_path() const { return mBbs_path;} inline const std::vector& Get_bbs_paths() const @@ -116,15 +113,16 @@ namespace bbtk inline const std::string& Get_config_xml_full_path() const { return mConfig_xml_full_path;} inline const std::string& Get_default_temp_dir() const - { return mDefault_temp_dir;} + { return mTemp_path;} bool AddPackagePathsAndWrite( const std::string& package_root_path ); private: + ConfigurationFile(); + void InstallPath (); void Read(const std::string& fileName); - std::string GetExecutablePath(); - void CreateConfigXML( char *rootDirectory ); - + void CreateConfigXML( char *rootDirectory ); + void InitializeDotBbtkStructure(); // Attributes : private : std::string mDescription; @@ -134,20 +132,18 @@ namespace bbtk /// Set automatically : /// The path to the executable (usually bbi) std::string mBin_path; + /// The path to the .bbtk user's dir (e.g. /home/username/.bbtk) + std::string mDot_bbtk_path; /// The path to the install prefix (=mBinPath+"/..") std::string mInstall_path; - /// The relative path to the doc folder (=BBTK_DOC_REL_PATH) - std::string mDoc_rel_path; - /// The path to the doc folder (=mInstall_path+"/"+mDoc_rel_path) + /// The path to the doc folder (=mDot_bbtk_path+"/doc") std::string mDoc_path; + /// Temp directory for generated data (=mDot_bbtk_path+"/tmp") + std::string mTemp_path; /// The relative path to the doc folder (=BBTK_BBS_REL_PATH) std::string mBbs_rel_path; /// The path to the bbs folder (=mInstall_path+"/"+mBbs_rel_path) std::string mBbs_path; - /// The relative path to the rsc folder (=BBTK_RSC_REL_PATH) - std::string mRsc_rel_path; - /// The path to the rsc folder (=mInstall_path+"/"+mRsc_rel_path) - std::string mRsc_path; /// The path to the bbtk data folder /// Initialized to mInstall_path+"/"+BBTK_DATA_REL_PATH /// But can be overriden by value read from bbtk_config.xml @@ -165,9 +161,12 @@ namespace bbtk std::vector mPackage_paths; /// If Packages link against extern dlls std::vector mExt_dll_paths; - /// Temp directory for generated data - std::string mDefault_temp_dir; - }; + + + /// Set to true by InitializeDotBbtkStructure() if .bbtk has been newly + /// created + bool mDot_bbtk_is_new; + }; }// namespace bbtk diff --git a/kernel/src/bbtkExecuter.cxx b/kernel/src/bbtkExecuter.cxx index 45d6473..84273c0 100644 --- a/kernel/src/bbtkExecuter.cxx +++ b/kernel/src/bbtkExecuter.cxx @@ -2,8 +2,8 @@ Program: bbtk Module: $RCSfile: bbtkExecuter.cxx,v $ Language: C++ - Date: $Date: 2009/01/13 08:45:27 $ - Version: $Revision: 1.26 $ + Date: $Date: 2009/01/27 14:22:56 $ + Version: $Revision: 1.27 $ =========================================================================*/ /* --------------------------------------------------------------------- @@ -64,7 +64,8 @@ namespace bbtk mRootPackage(), mRootCBB(), mNoExecMode(false), - mDialogMode(NoDialog) + mDialogMode(NoDialog), + mNoErrorMode(false) { bbtkDebugMessageInc("Kernel",9,"Executer::Executer()" <GetNoErrorMode()) + { + bbtkWarning("ERROR :"<GetNoErrorMode()) + { + std::string file("?"); + int line = 0; + if (mFileName.size()) { + file = mFileName.back(); + line = mLine.back(); + } + bbtkWarning("ERROR '"<GetNoErrorMode()) + { + std::string file("?"); + int line = 0; + if (mFileName.size()) { + file = mFileName.back(); + line = mLine.back(); + } + bbtkWarning("ERROR '"<GetNoErrorMode()) + { + std::string file("?"); + int line = 0; + if (mFileName.size()) { + file = mFileName.back(); + line = mLine.back(); + } + bbtkWarning("UNDEFINED ERROR " + <<"("<SetNoExecMode(true); mThrow = false; } - else if (words[1]=="freeze_no_error ") + else if (words[1]=="freeze_no_error") { mVirtualExecuter->SetNoExecMode(true); mVirtualExecuter->SetNoErrorMode(true); diff --git a/kernel/src/bbtkUtilities.cxx b/kernel/src/bbtkUtilities.cxx index 778b45e..21fa947 100644 --- a/kernel/src/bbtkUtilities.cxx +++ b/kernel/src/bbtkUtilities.cxx @@ -2,8 +2,8 @@ Program: bbtk Module: $RCSfile: bbtkUtilities.cxx,v $ Language: C++ - Date: $Date: 2008/12/12 10:20:48 $ - Version: $Revision: 1.10 $ + Date: $Date: 2009/01/27 14:22:57 $ + Version: $Revision: 1.11 $ =========================================================================*/ /* --------------------------------------------------------------------- @@ -300,6 +300,22 @@ namespace bbtk } return libname; } + // ======================================================================= + + // ======================================================================= + /// Returns the user settings dir, e.g. /home/username/.bbtk + std::string Utilities::GetUserSettingsDir() + { +#if defined(__GNUC__) + std::string str_home(getenv("HOME")); +#elif defined(_WIN32) + std::string str_home(getenv("USERPROFILE")); +#endif + std::string fullname = str_home + "/.bbtk"; + MakeValidFileName(fullname); + return fullname; + } + // ======================================================================= /// Builds the complete path to the file 'name' located @@ -312,116 +328,128 @@ namespace bbtk std::string str_home(getenv("USERPROFILE")); #endif std::string fullname = str_home + "/.bbtk/" + name; - Utilities::replace( fullname, - INVALID_FILE_SEPARATOR , - VALID_FILE_SEPARATOR); + MakeValidFileName(fullname); return fullname; } + // ======================================================================= + // ======================================================================= + void Utilities::CreateDirectoryIfNeeded( std::string const &dirName) + { + if (FileExists(dirName)) return; + std::string cmd("mkdir \""); + cmd += dirName; + cmd += "\""; + system(cmd.c_str()); + } + // ======================================================================= + + + //======================================================================== + bool Utilities::IsAtRoot(std::string cwd) + { + if ( cwd == "/" // hope it gets / (for Linux) + || (cwd.size() <= 3 && cwd[1] == ':') ) // hope it gets C: D: (for Windows) + return (true); + else + return(false); + } + // ====================================================================== - //======================================================================== - - bool Utilities::IsAtRoot(std::string cwd) - { - if ( cwd == "/" // hope it gets / (for Linux) - || (cwd.size() <= 3 && cwd[1] == ':') ) // hope it gets C: D: (for Windows) - return (true); - else - return(false); - } - - // ====================================================================== + // ====================================================================== + bool Utilities::IsDirectory(std::string const &dirName) + { + struct stat fs; - bool Utilities::IsDirectory(std::string const &dirName) - { - struct stat fs; - - if ( stat(dirName.c_str(), &fs) == 0 ) - { + if ( stat(dirName.c_str(), &fs) == 0 ) + { #if _WIN32 - return ((fs.st_mode & _S_IFDIR) != 0); + return ((fs.st_mode & _S_IFDIR) != 0); #else - return S_ISDIR(fs.st_mode); + return S_ISDIR(fs.st_mode); #endif - } - else - { - return false; - } - } - - // =================================================================================== - - void Utilities::SplitAroundFirstDot( const std::string& in, - std::string& left, - std::string& right) - { - std::string delimiter = "."; - std::string::size_type pos = in.find_first_of(delimiter); - if (std::string::npos != pos) - { - left = in.substr(0,pos); - right = in.substr(pos+1,in.size()); - - } - else - { - left =""; - right = ""; - bbtkGlobalError("Token '"<& tokens) - { - // Skip delimiters at beginning. - std::string::size_type lastPos = str.find_first_not_of(delimiters, 0); - // Find first delimiter. - std::string::size_type pos = str.find_first_of(delimiters, lastPos); - - while (std::string::npos != pos || std::string::npos != lastPos) - { - // Found a token, add it to the vector. - tokens.push_back(str.substr(lastPos, pos - lastPos)); - // Skip delimiters. Note the "not_of" - lastPos = str.find_first_not_of(delimiters, pos); - // Find next delimiter - pos = str.find_first_of(delimiters, lastPos); - } - - } - //======================================================================= - + } + else + { + return false; + } + } + // ======================================================================= - // =================================================================================== + // ======================================================================= + void Utilities::SplitAroundFirstDot( const std::string& in, + std::string& left, + std::string& right) + { + std::string delimiter = "."; + std::string::size_type pos = in.find_first_of(delimiter); + if (std::string::npos != pos) + { + left = in.substr(0,pos); + right = in.substr(pos+1,in.size()); + + } + else + { + left =""; + right = ""; + bbtkGlobalError("Token '"<& tokens) + { + // Skip delimiters at beginning. + std::string::size_type lastPos = str.find_first_not_of(delimiters, 0); + // Find first delimiter. + std::string::size_type pos = str.find_first_of(delimiters, lastPos); - std::string Utilities::get_file_name(const std::string& s) - { - std::string::size_type slash_position = s.find_last_of("/\\"); - if (slash_position != std::string::npos) - { - return s.substr(slash_position+1,std::string::npos); - } - else - { - return s; - } - } + while (std::string::npos != pos || std::string::npos != lastPos) + { + // Found a token, add it to the vector. + tokens.push_back(str.substr(lastPos, pos - lastPos)); + // Skip delimiters. Note the "not_of" + lastPos = str.find_first_not_of(delimiters, pos); + // Find next delimiter + pos = str.find_first_of(delimiters, lastPos); + } - // =================================================================================== - /** - * \brief Explore a directory with possibility of recursion - * return number of files read - * @param dirpath directory to explore - * @param recursive whether we want recursion or not - */ - int Utilities::Explore(std::string const &dirpath, bool recursive, std::vector &Filenames) - { - int numberOfFiles = 0; - std::string fileName; + } + //======================================================================= + + + // ====================================================================== + std::string Utilities::get_file_name(const std::string& s) + { + std::string::size_type slash_position = s.find_last_of("/\\"); + if (slash_position != std::string::npos) + { + return s.substr(slash_position+1,std::string::npos); + } + else + { + return s; + } + } + //======================================================================= + + + // ======================================================================== + /** + * \brief Explore a directory with possibility of recursion + * return number of files read + * @param dirpath directory to explore + * @param recursive whether we want recursion or not + */ + int Utilities::Explore(std::string const &dirpath, bool recursive, std::vector &Filenames) + { + int numberOfFiles = 0; + std::string fileName; std::string dirName = dirpath; @@ -518,7 +546,8 @@ namespace bbtk return numberOfFiles; } - + //======================================================================= + //======================================================================= // Replaces substrings "\\n" by a real carriage return "\n" @@ -537,30 +566,180 @@ namespace bbtk //======================================================================= + //======================================================================= -bool Utilities::loosematch(std::string stdLine,std::string stdOptions) -{ - bool result=false; - std::vector tokens; - SplitString ( stdOptions,"|", tokens); - int i,size=tokens.size(); - for (i=0; i tokens; + SplitString ( stdOptions,"|", tokens); + int i,size=tokens.size(); + for (i=0; i 0) + { + pname[result] = 0; /* add the #@!%ing NULL */ + + if ((access(pname, 0) == 0)) + return 0; /* file exists, return OK */ + /*else name doesn't seem to exist, return FAIL (falls + through) */ + } +#endif /* LINUX */ + +#ifdef WIN32 + long result = GetModuleFileName(NULL, pname, pathsize); + if (result > 0) + { + /* fix up the dir slashes... */ + int len = strlen(pname); + int idx; + for (idx = 0; idx < len; idx++) + { + if (pname[idx] == '\\') pname[idx] = '/'; } - return result; -} + + for (idx = len-1; idx >=0 ; idx--) + { + if (pname[idx] == '/') + { + pname[idx+1] = '\0'; + idx = -1; + } + } + + if ((access(pname, 0) == 0)) + return 0; /* file exists, return OK */ + /*else name doesn't seem to exist, return FAIL (falls + through) */ + } +#endif /* WIN32 */ + +#ifdef SOLARIS + char *p = getexecname(); + if (p) + { + /* According to the Sun manpages, getexecname will + "normally" return an */ + /* absolute path - BUT might not... AND that IF it is not, + pre-pending */ + /* getcwd() will "usually" be the correct thing... Urgh! + */ + + /* check pathname is absolute (begins with a / ???) */ + if (p[0] == '/') /* assume this means we have an + absolute path */ + { + strncpy(pname, p, pathsize); + if ((access(pname, 0) == 0)) + return 0; /* file exists, return OK */ + } + else /* if not, prepend getcwd() then check if file + exists */ + { + getcwd(pname, pathsize); + long result = strlen(pname); + strncat(pname, "/", (pathsize - result)); + result ++; + strncat(pname, p, (pathsize - result)); + + if ((access(pname, 0) == 0)) + return 0; /* file exists, return OK */ + /*else name doesn't seem to exist, return FAIL + (falls through) */ + } + } +#endif /* SOLARIS */ + +#ifdef MACOSX /* assume this is OSX */ + /* + from http://www.hmug.org/man/3/NSModule.html + + extern int _NSGetExecutablePath(char *buf, unsigned long + *bufsize); + + _NSGetExecutablePath copies the path of the executable + into the buffer and returns 0 if the path was successfully + copied in the provided buffer. If the buffer is not large + enough, -1 is returned and the expected buffer size is + copied in *bufsize. Note that _NSGetExecutablePath will + return "a path" to the executable not a "real path" to the + executable. That is the path may be a symbolic link and + not the real file. And with deep directories the total + bufsize needed could be more than MAXPATHLEN. + */ + int status = -1; + char *given_path = (char*)malloc(MAXPATHLEN * 2); + if (!given_path) return status; + + uint32_t npathsize = MAXPATHLEN * 2; + long result = _NSGetExecutablePath(given_path, &npathsize); + if (result == 0) + { /* OK, we got something - now try and resolve the real path... + */ + if (realpath(given_path, pname) != NULL) + { + if ((access(pname, 0) == 0)) + status = 0; /* file exists, return OK */ + } + } + free (given_path); + return status; +#endif /* MACOSX */ + + return -1; /* Path Lookup Failed */ + } + //========================================================================= + + + + //========================================================================= + std::string Utilities::GetExecutablePath() + { + char name[PATH_MAX]; + int err = get_app_path(name, PATH_MAX); + if (err) + { + bbtkGlobalError("Could not determine current executable path ?"); + } + + // remove the exe name + char *slash; + slash = strrchr(name, VALID_FILE_SEPARATOR_CHAR); + if (slash) + { + *slash = 0; + } + return name; + } + //========================================================================= diff --git a/kernel/src/bbtkUtilities.h b/kernel/src/bbtkUtilities.h index 34d17eb..6d0c2cf 100644 --- a/kernel/src/bbtkUtilities.h +++ b/kernel/src/bbtkUtilities.h @@ -2,8 +2,8 @@ Program: bbtk Module: $RCSfile: bbtkUtilities.h,v $ Language: C++ - Date: $Date: 2008/10/22 09:16:16 $ - Version: $Revision: 1.18 $ + Date: $Date: 2009/01/27 14:22:57 $ + Version: $Revision: 1.19 $ =========================================================================*/ /* --------------------------------------------------------------------- @@ -72,61 +72,77 @@ namespace bbtk /// Holds various usefull methods struct BBTK_EXPORT Utilities { - + // ====================================================================== + static std::string GetExecutablePath(); + // ====================================================================== // See : http://www.techbytes.ca/techbyte103.html for more O.S. static bool FileExists(std::string strFilename); // ===================================================================== - static std::string ExtractPackageName(const std::string &name, std::string& path); - + //===================================================================== static std::string ExtractScriptName(const std::string &name, std::string& path); - + // ======================================================================== - static std::string ExpandLibName(const std::string &name, bool verbose); - -// =================================================================================== - - static std::string MakeLibnameFromPath(std::string path, std::string pkgname); - -// =================================================================================== - - static std::string MakePkgnameFromPath(std::string path, std::string pkgname, bool addExt); + + // ======================================================================= + static std::string MakeLibnameFromPath(std::string path, std::string pkgname); + + // ===================================================================== + static std::string MakePkgnameFromPath(std::string path, + std::string pkgname, bool addExt); //======================================================================== + // ======================================================================= - /// Builds the complete path to the file 'name' located - /// in user settings dir, e.g. /home/username/.bbtk/ - static std::string MakeUserSettingsFullFileName(const std::string& name); + /// Makes a valid filename with string (replaces invalid file seps + /// by valid ones) + static inline void MakeValidFileName(std::string& name) + { + replace( name, + INVALID_FILE_SEPARATOR , + VALID_FILE_SEPARATOR); + } + // ======================================================================= + /// Returns the user settings dir, e.g. /home/username/.bbtk + static std::string GetUserSettingsDir(); + // ======================================================================= + /// Builds the complete path to the file 'name' located + /// in user settings dir, e.g. /home/username/.bbtk/ + static std::string MakeUserSettingsFullFileName(const std::string& name); + + static bool IsAtRoot(std::string cwd); // ====================================================================== static bool IsDirectory(std::string const &dirName); - // =================================================================================== + + static void CreateDirectoryIfNeeded( std::string const &dirName); + // ======================================================================= static void SplitAroundFirstDot( const std::string& in, - std::string& left, + std::string& left, std::string& right); - //======================================================================= + //====================================================================== static void SplitString ( const std::string& str, const std::string& delimiters, std::vector& tokens); - //======================================================================= + //==================================================================== - // =================================================================================== + // ==================================================================== static std::string get_file_name(const std::string& s) ; - - // =================================================================================== + + // ==================================================================== /** * \brief Explore a directory with possibility of recursion * return number of files read @@ -134,8 +150,8 @@ namespace bbtk * @param recursive whether we want recursion or not */ static int Explore(std::string const &dirpath, bool recursive, std::vector &Filenames); - - + + //======================================================================= // Replaces substrings "\\n" by a real carriage return "\n" static void SubsBackslashN ( std::string& s ); diff --git a/kernel/src/bbtkWx.cxx b/kernel/src/bbtkWx.cxx index 29567ff..c8026e4 100644 --- a/kernel/src/bbtkWx.cxx +++ b/kernel/src/bbtkWx.cxx @@ -2,8 +2,8 @@ Program: bbtk Module: $RCSfile: bbtkWx.cxx,v $ Language: C++ - Date: $Date: 2008/10/21 13:55:49 $ - Version: $Revision: 1.11 $ + Date: $Date: 2009/01/27 14:22:57 $ + Version: $Revision: 1.12 $ =========================================================================*/ /* --------------------------------------------------------------------- @@ -302,17 +302,22 @@ namespace bbtk Wx::BusyCursor::BusyCursor() { mCursor = 0; - if (TopWindowExists()) + if (wxApp::GetInstance()!=0) { bbtkDebugMessage("wx",2, - "Wx::BusyCursor::BusyCursor()"< +#include //#include "icons/cc_run.xpm" @@ -88,7 +89,6 @@ namespace bbtk : wxFrame((wxFrame *)parent, -1, _T("bbStudio"), wxDefaultPosition, wxSize(1200,800) ) { - // m_mgr = new wxAuiManager(this); m_mgr.SetManagedWindow(this); mInterpreter = bbtk::Interpreter::New(); @@ -262,11 +262,38 @@ namespace bbtk // LoadPerspective(); mBreaked = false; + + wxBitmap bitmap; + wxSplashScreen* splash; + long style = wxSPLASH_CENTRE_ON_SCREEN | wxSPLASH_TIMEOUT; + if (ConfigurationFile::GetInstance().DotBbtkIsNew()) + style = wxSPLASH_CENTRE_ON_SCREEN | wxSPLASH_NO_TIMEOUT; + std::string splash_file = ConfigurationFile::GetInstance().Get_data_path(); + splash_file += "/kernel/icons/bbStudioSplashScreen.png"; + + if (bitmap.LoadFile(std2wx(splash_file),wxBITMAP_TYPE_PNG)) + splash = + new wxSplashScreen(bitmap, + style, + 1000, 0, -1, wxDefaultPosition, wxDefaultSize, + wxSIMPLE_BORDER|wxSTAY_ON_TOP); + - wxTipWindow* tip = new wxTipWindow(this, - _T("\n Welcome to bbStudio !\n\n To run a demo or example:\n 1. click on the 'Demos' or 'Examples' link\n 2. select a demo or example\n 3. click on the '[source]' link : the source file is loaded in bbStudio\n 4. click on the 'Run' button (the arrow at the bottom right of the source file) \n"),1000); - tip->CenterOnParent(); - tip->Show(); + if (ConfigurationFile::GetInstance().DotBbtkIsNew()) + { + + DoRegeneratePackageDoc("-a"); + DoRegenerateBoxesLists(); + + /* + wxTipWindow* tip = new wxTipWindow(this, + _T("\n Welcome to bbStudio !\n\n To run a demo or example:\n 1. click on the 'Demos' or 'Examples' link\n 2. select a demo or example\n 3. click on the '[source]' link : the source file is loaded in bbStudio\n 4. click on the 'Run' button (the arrow at the bottom right of the source file) \n"),1000); + tip->CenterOnParent(); + tip->Show(); + */ + if (splash) splash->Destroy(); + } + } //================================================================ @@ -507,11 +534,22 @@ namespace bbtk void WxGUIScriptingInterface::DoRegeneratePackageDoc( const std::string& pack ) { - std::string command; + std::string mess("Regenerating doc for package '"); + if (pack!="-a") + mess += pack + "'"; + else + mess = "Regenerating doc for all packages"; + mess += " ... please wait"; + + SetStatusText( std2wx(mess) ); + + BBTK_BUSY_CURSOR; + + std::string command; #if defined(WIN32) - command = "\""; + command = "\""; #endif - command += ConfigurationFile::GetInstance().Get_bin_path(); + command += ConfigurationFile::GetInstance().Get_bin_path(); command += ConfigurationFile::GetInstance().Get_file_separator(); command += "bbRegeneratePackageDoc"; #if defined(WIN32) @@ -523,15 +561,23 @@ namespace bbtk if ( ! system ( command.c_str() ) ) { - wxMessageBox(_T("Done !"),_T("Regenerate package '")+std2wx(pack)+_T("' doc"), + SetStatusText( _T("Done !")); + /* + wxMessageBox(_T("Done !"),_T("Regenerate package '") + +std2wx(pack)+_T("' doc"), wxOK | wxICON_INFORMATION); + */ } else { + SetStatusText( _T("Done !")); wxString err(_T("An error occured while running '")); err += bbtk::std2wx(command) + _T("'"); wxMessageBox(err,_T("Regenerate package doc"),wxOK | wxICON_ERROR); } + + + } @@ -549,8 +595,12 @@ namespace bbtk //================================================================ + //================================================================ void WxGUIScriptingInterface::DoRegenerateBoxesLists() { + SetStatusText( _T("Regenerating boxes lists ... please wait") ); + BBTK_BUSY_CURSOR ; + std::string command; #if defined(WIN32) command = "\""; @@ -564,18 +614,26 @@ namespace bbtk command += " -q"; bbtkMessage("debug",1,"Executing system command '"<