void FileBrowser::addRootFolder(generic_string rootFolderPath) { // make sure there's no '\' at the end if (rootFolderPath[rootFolderPath.length() - 1] == '\\') { rootFolderPath = rootFolderPath.substr(0, rootFolderPath.length() - 1); } size_t nbFolderUpdaters = _folderUpdaters.size(); for (size_t i = 0; i < nbFolderUpdaters; ++i) { if (_folderUpdaters[i]->_rootFolder._rootPath == rootFolderPath) return; else { size_t pos = rootFolderPath.find(_folderUpdaters[i]->_rootFolder._rootPath); if (pos == 0) { //do nothing, go down to select the dir generic_string rootPath = _folderUpdaters[i]->_rootFolder._rootPath; generic_string pathSuffix = rootFolderPath.substr(rootPath.size() + 1, rootFolderPath.size() - rootPath.size()); vector<generic_string> linarPathArray = split(pathSuffix, '\\'); HTREEITEM foundItem = findInTree(rootPath, nullptr, linarPathArray); if (foundItem) _treeView.selectItem(foundItem); return; } pos = _folderUpdaters[i]->_rootFolder._rootPath.find(rootFolderPath); if (pos == 0) { ::MessageBox(_hParent, TEXT("A sub-folder of the folder you want to open exists.\rPlease remove it from the panel before you add this one."), rootFolderPath.c_str(), MB_OK); return; } } } std::vector<generic_string> patterns2Match; patterns2Match.push_back(TEXT("*.*")); TCHAR *label = ::PathFindFileName(rootFolderPath.c_str()); TCHAR rootLabel[MAX_PATH]; lstrcpy(rootLabel, label); size_t len = lstrlen(rootLabel); if (rootLabel[len - 1] == '\\') rootLabel[len - 1] = '\0'; FolderInfo directoryStructure(rootLabel, nullptr); getDirectoryStructure(rootFolderPath.c_str(), patterns2Match, directoryStructure, true, false); HTREEITEM hRootItem = createFolderItemsFromDirStruct(nullptr, directoryStructure); _treeView.expand(hRootItem); _folderUpdaters.push_back(new FolderUpdater(directoryStructure, this)); _folderUpdaters[_folderUpdaters.size() - 1]->startWatcher(); }
std::vector<generic_string> stringSplit(const generic_string& input, const generic_string& delimiter) { auto start = 0U; auto end = input.find(delimiter); std::vector<generic_string> output; const size_t delimiterLength = delimiter.length(); while (end != std::string::npos) { output.push_back(input.substr(start, end - start)); start = end + delimiterLength; end = input.find(delimiter, start); } output.push_back(input.substr(start, end)); return output; }
static generic_string removeTrailingSlash(generic_string path) { if (path.length() >= 1 && path[path.length() - 1] == '\\') return path.substr(0, path.length() - 1); else return path; }
generic_string stringTakeWhileAdmissable(const generic_string& input, const generic_string& admissable) { // Find first non-admissable character in "input", and remove everything after it. size_t idx = input.find_first_not_of(admissable); if (idx == std::string::npos) { return input; } else { return input.substr(0, idx); } }
void FileBrowser::addRootFolder(generic_string rootFolderPath) { // make sure there's no '\' at the end if (rootFolderPath[rootFolderPath.length() - 1] == '\\') { rootFolderPath = rootFolderPath.substr(0, rootFolderPath.length() - 1); } size_t nbFolderUpdaters = _folderUpdaters.size(); for (size_t i = 0; i < nbFolderUpdaters; ++i) { if (_folderUpdaters[i]->_rootFolder._rootPath == rootFolderPath) return; else { size_t pos = rootFolderPath.find(_folderUpdaters[i]->_rootFolder._rootPath); if (pos == 0) { printStr(TEXT("do nothing, go down to select the dir.")); return; } pos = _folderUpdaters[i]->_rootFolder._rootPath.find(rootFolderPath); if (pos == 0) { printStr(TEXT("remove old, add this one")); return; } } } std::vector<generic_string> patterns2Match; patterns2Match.push_back(TEXT("*.*")); TCHAR *label = ::PathFindFileName(rootFolderPath.c_str()); TCHAR rootLabel[MAX_PATH]; lstrcpy(rootLabel, label); size_t len = lstrlen(rootLabel); if (rootLabel[len - 1] == '\\') rootLabel[len - 1] = '\0'; FolderInfo directoryStructure(rootLabel, nullptr); getDirectoryStructure(rootFolderPath.c_str(), patterns2Match, directoryStructure, true, false); HTREEITEM hRootItem = createFolderItemsFromDirStruct(nullptr, directoryStructure); _treeView.expand(hRootItem); _folderUpdaters.push_back(new FolderUpdater(directoryStructure, this)); _folderUpdaters[_folderUpdaters.size() - 1]->startWatcher(); }
vector<generic_string> split(const generic_string & string2split, TCHAR sep) { vector<generic_string> splitedStrings; size_t len = string2split.length(); size_t beginPos = 0; for (size_t i = 0; i < len + 1; ++i) { if (string2split[i] == sep || string2split[i] == '\0') { splitedStrings.push_back(string2split.substr(beginPos, i - beginPos)); beginPos = i + 1; } } return splitedStrings; };
std::vector<generic_string> tokenizeString(const generic_string & tokenString, const char delim) { //Vector is created on stack and copied on return std::vector<generic_string> tokens; // Skip delimiters at beginning. generic_string::size_type lastPos = tokenString.find_first_not_of(delim, 0); // Find first "non-delimiter". generic_string::size_type pos = tokenString.find_first_of(delim, lastPos); while (pos != std::string::npos || lastPos != std::string::npos) { // Found a token, add it to the vector. tokens.push_back(tokenString.substr(lastPos, pos - lastPos)); // Skip delimiters. Note the "not_of" lastPos = tokenString.find_first_not_of(delim, pos); // Find next "non-delimiter" pos = tokenString.find_first_of(delim, lastPos); } return tokens; }
static bool getRawPath(generic_string input, generic_string &rawPath_out) { // Try to find a path in the given input. // Algorithm: look for a colon. The colon must be preceded by an alphabetic character. // The alphabetic character must, in turn, be preceded by nothing, or by whitespace, or by // a quotation mark. locale loc; size_t lastOccurrence = input.rfind(L":"); if (lastOccurrence == std::string::npos) // No match. return false; else if (lastOccurrence == 0) return false; else if (!std::isalpha(input[lastOccurrence - 1], loc)) return false; else if (lastOccurrence >= 2 && !isAllowedBeforeDriveLetter(input[lastOccurrence - 2])) return false; rawPath_out = input.substr(lastOccurrence - 1); return true; }