From 8822f9075c66dcf742b9edae47271bb46af6a9b7 Mon Sep 17 00:00:00 2001 From: guigues Date: Tue, 27 Jan 2009 14:22:44 +0000 Subject: [PATCH] are now generated in user's .bbtk dir * bug fixes in doc/boxes lists regeneration * bbStudio : -splash screen -doc automatically generated on first time --- .../bbRegenerateBoxesLists.cpp | 2 +- .../bbRegeneratePackageDoc.cpp | 2 +- kernel/data/icons/CMakeLists.txt | 5 + kernel/data/icons/bbStudioSplashScreen.png | Bin 0 -> 58488 bytes kernel/src/bbtkConfigurationFile.cxx | 306 ++++--------- kernel/src/bbtkConfigurationFile.h | 51 ++- kernel/src/bbtkExecuter.cxx | 7 +- kernel/src/bbtkInterpreter.cxx | 52 ++- kernel/src/bbtkUtilities.cxx | 419 +++++++++++++----- kernel/src/bbtkUtilities.h | 70 +-- kernel/src/bbtkWx.cxx | 19 +- kernel/src/bbtkWxGUIScriptingInterface.cxx | 102 ++++- 12 files changed, 604 insertions(+), 431 deletions(-) create mode 100644 kernel/data/icons/bbStudioSplashScreen.png 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 0000000000000000000000000000000000000000..bddb6cb5890c5211897536dd4ebc4580b946caef GIT binary patch literal 58488 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 vjviwFFmdCo?3I=Nrw9E1gWE}bq(GuAQQ_d 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 '"<