efsw::WatchID MyFileWatcher::AddFileWatcher( const char* folder, bool recursive ) { String256 nativePath; Str::CopyS( nativePath, folder ); ConvertToNativePath( nativePath ); efsw::WatchID watchID = m_fileWatcher.addWatch( nativePath.c_str(), this, recursive ); if( watchID < 0 ) { ptERROR( "%s\n", efsw::Errors::Log::getLastErrorLog().c_str() ); return watchID; } ptPRINT("Started watching folder: '%s'\n", folder); m_watchedFolders.push_back( watchID ); return watchID; }
int32 ShowOpenDialog(bool allowMultipleSelection, bool chooseDirectory, ExtensionString title, ExtensionString initialDirectory, ExtensionString fileTypes, CefRefPtr<CefListValue>& selectedFiles) { wchar_t szFile[MAX_PATH]; szFile[0] = 0; // TODO (issue #64) - This method should be using IFileDialog instead of the /* outdated SHGetPathFromIDList and GetOpenFileName. Useful function to parse fileTypesStr: template<class T> int inline findAndReplaceString(T& source, const T& find, const T& replace) { int num=0; int fLen = find.size(); int rLen = replace.size(); for (int pos=0; (pos=source.find(find, pos))!=T::npos; pos+=rLen) { num++; source.replace(pos, fLen, replace); } return num; } */ // SHBrowseForFolder can handle Windows path only, not Unix path. // ofn.lpstrInitialDir also needs Windows path on XP and not Unix path. ConvertToNativePath(initialDirectory); if (chooseDirectory) { BROWSEINFO bi = {0}; bi.hwndOwner = GetActiveWindow(); bi.lpszTitle = title.c_str(); bi.ulFlags = BIF_NEWDIALOGSTYLE; bi.lpfn = SetInitialPathCallback; bi.lParam = (LPARAM)initialDirectory.c_str(); LPITEMIDLIST pidl = SHBrowseForFolder(&bi); if (pidl != 0) { if (SHGetPathFromIDList(pidl, szFile)) { // Add directory path to the result ExtensionString pathName(szFile); ConvertToUnixPath(pathName); selectedFiles->SetString(0, pathName); } IMalloc* pMalloc = NULL; SHGetMalloc(&pMalloc); if (pMalloc) { pMalloc->Free(pidl); pMalloc->Release(); } } } else { OPENFILENAME ofn; ZeroMemory(&ofn, sizeof(ofn)); ofn.hwndOwner = GetActiveWindow(); ofn.lStructSize = sizeof(ofn); ofn.lpstrFile = szFile; ofn.nMaxFile = MAX_PATH; // TODO (issue #65) - Use passed in file types. Note, when fileTypesStr is null, all files should be shown /* findAndReplaceString( fileTypesStr, std::string(" "), std::string(";*.")); LPCWSTR allFilesFilter = L"All Files\0*.*\0\0";*/ ofn.lpstrFilter = L"All Files\0*.*\0Web Files\0*.js;*.css;*.htm;*.html\0\0"; ofn.lpstrInitialDir = initialDirectory.c_str(); ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_NOCHANGEDIR | OFN_EXPLORER; if (allowMultipleSelection) ofn.Flags |= OFN_ALLOWMULTISELECT; if (GetOpenFileName(&ofn)) { if (allowMultipleSelection) { // Multiple selection encodes the files differently // If multiple files are selected, the first null terminator // signals end of directory that the files are all in std::wstring dir(szFile); // Check for two null terminators, which signal that only one file // was selected if (szFile[dir.length() + 1] == '\0') { ExtensionString filePath(dir); ConvertToUnixPath(filePath); selectedFiles->SetString(0, filePath); } else { // Multiple files are selected wchar_t fullPath[MAX_PATH]; for (int i = (dir.length() + 1), fileIndex = 0; ; fileIndex++) { // Get the next file name std::wstring file(&szFile[i]); // Two adjacent null characters signal the end of the files if (file.length() == 0) break; // The filename is relative to the directory that was specified as // the first string if (PathCombine(fullPath, dir.c_str(), file.c_str()) != NULL) { ExtensionString filePath(fullPath); ConvertToUnixPath(filePath); selectedFiles->SetString(fileIndex, filePath); } // Go to the start of the next file name i += file.length() + 1; } } } else { // If multiple files are not allowed, add the single file selectedFiles->SetString(0, szFile); } } } return NO_ERROR; }