/** * @brief Show contributors list. * Opens Contributors.txt into notepad. */ void CAboutDlg::OnBnClickedOpenContributors() { String defPath = GetModulePath(); // Don't add quotation marks yet, CFile doesn't like them String docPath = defPath + ContributorsPath; HINSTANCE ret = 0; if (paths_DoesPathExist(docPath.c_str()) == IS_EXISTING_FILE) { // Now, add quotation marks so ShellExecute() doesn't fail if path // includes spaces docPath.insert(0, _T("\"")); docPath.insert(docPath.length(), _T("\"")); ret = ShellExecute(m_hWnd, NULL, _T("notepad"), docPath.c_str(), defPath.c_str(), SW_SHOWNORMAL); // values < 32 are errors (ref to MSDN) if ((int)ret < 32) { // Try to open with associated application (.txt) ret = ShellExecute(m_hWnd, _T("open"), docPath.c_str(), NULL, NULL, SW_SHOWNORMAL); if ((int)ret < 32) ResMsgBox1(IDS_ERROR_EXECUTE_FILE, _T("Notepad.exe"), MB_ICONSTOP); } } else ResMsgBox1(IDS_ERROR_FILE_NOT_FOUND, docPath.c_str(), MB_ICONSTOP); }
void COpenView::OnButton(int index) { String s; String sfolder; UpdateData(TRUE); PATH_EXISTENCE existence = paths_DoesPathExist(m_strPath[index], IsArchiveFile); switch (existence) { case IS_EXISTING_DIR: sfolder = m_strPath[index]; break; case IS_EXISTING_FILE: sfolder = paths_GetPathOnly(m_strPath[index]); break; case DOES_NOT_EXIST: // Do nothing, empty foldername will be passed to dialog break; default: _RPTF0(_CRT_ERROR, "Invalid return value from paths_DoesPathExist()"); break; } if (SelectFileOrFolder(GetSafeHwnd(), s, sfolder.c_str())) { m_strPath[index] = s; m_strBrowsePath[index] = s; UpdateData(FALSE); UpdateButtonStates(); } }
/** * @brief Install new filter. * This function is called when user selects "Install" button from GUI. * Function allows easy installation of new filters for user. For example * when user has downloaded filter file from net. First we ask user to * select filter to install. Then we copy selected filter to private * filters folder. */ void FileFiltersDlg::OnBnClickedFilterfileInstall() { CString s; String path; String userPath = theApp.m_globalFileFilter.GetUserFilterPathWithCreate(); if (SelectFile(GetSafeHwnd(), s, path.c_str(), IDS_FILEFILTER_INSTALL, IDS_FILEFILTER_FILEMASK, TRUE)) { String sfile, sext; SplitFilename(s, NULL, &sfile, &sext); String filename = sfile; filename += _T("."); filename += sext; userPath = paths_ConcatPath(userPath, filename); if (!CopyFile(s, userPath.c_str(), TRUE)) { // If file already exists, ask from user // If user wants to, overwrite existing filter if (paths_DoesPathExist(userPath.c_str()) == IS_EXISTING_FILE) { int res = LangMessageBox(IDS_FILEFILTER_OVERWRITE, MB_YESNO | MB_ICONWARNING); if (res == IDYES) { if (!CopyFile(s, userPath.c_str(), FALSE)) { LangMessageBox(IDS_FILEFILTER_INSTALLFAIL, MB_ICONSTOP); } } } else { LangMessageBox(IDS_FILEFILTER_INSTALLFAIL, MB_ICONSTOP); } } else { FileFilterMgr *pMgr = theApp.m_globalFileFilter.GetManager(); pMgr->AddFilter(userPath.c_str()); // Remove all from filterslist and re-add so we can update UI CString selected; m_Filters->RemoveAll(); theApp.m_globalFileFilter.GetFileFilters(m_Filters, selected); UpdateFiltersList(); } } }
/** * @brief Called when user presses "New..." button. * * Asks filename for new filter from user (using standard * file picker dialog) and copies template file to that * name. Opens new filterfile for editing. * @todo (At least) Warn if user puts filter to outside * filter directories? * @todo Can global filter path be empty (I think not - Kimmo). */ void FileFiltersDlg::OnBnClickedFilterfileNewbutton() { String globalPath = theApp.m_globalFileFilter.GetGlobalFilterPathWithCreate(); String userPath = theApp.m_globalFileFilter.GetUserFilterPathWithCreate(); if (globalPath.empty() && userPath.empty()) { LangMessageBox(IDS_FILEFILTER_NO_USERFOLDER, MB_ICONSTOP); return; } // Format path to template file String templatePath(globalPath); if (templatePath[templatePath.length() - 1] != '\\') templatePath += '\\'; templatePath += FILE_FILTER_TEMPLATE; if (paths_DoesPathExist(templatePath.c_str()) != IS_EXISTING_FILE) { CString msg; LangFormatString2(msg, IDS_FILEFILTER_TMPL_MISSING, FILE_FILTER_TEMPLATE, templatePath.c_str()); AfxMessageBox(msg, MB_ICONERROR); return; } String path = globalPath.empty() ? userPath : globalPath; if (!globalPath.empty() && !userPath.empty()) { path = CSharedFilterDlg::PromptForNewFilter(this, globalPath, userPath); if (path.empty()) return; } if (path.length() && path[path.length() - 1] != '\\') path += '\\'; CString s; if (SelectFile(GetSafeHwnd(), s, path.c_str(), IDS_FILEFILTER_SAVENEW, IDS_FILEFILTER_FILEMASK, FALSE)) { // Fix file extension TCHAR file[_MAX_FNAME] = {0}; TCHAR ext[_MAX_EXT] = {0}; TCHAR dir[_MAX_DIR] = {0}; TCHAR drive[_MAX_DRIVE] = {0}; _tsplitpath(s, drive, dir, file, ext); if (_tcslen(ext) == 0) { s += FileFilterExt; } else if (_tcsicmp(ext, FileFilterExt) != 0) { s = drive; s += dir; s += file; s += FileFilterExt; } // Open-dialog asks about overwriting, so we can overwrite filter file // user has already allowed it. if (!CopyFile(templatePath.c_str(), s, FALSE)) { ResMsgBox1(IDS_FILEFILTER_TMPL_COPY, templatePath.c_str(), MB_ICONERROR); return; } EditFileFilter(s); FileFilterMgr *pMgr = theApp.m_globalFileFilter.GetManager(); int retval = pMgr->AddFilter(s); if (retval == FILTER_OK) { // Remove all from filterslist and re-add so we can update UI CString selected; m_Filters->RemoveAll(); theApp.m_globalFileFilter.LoadAllFileFilters(); theApp.m_globalFileFilter.GetFileFilters(m_Filters, selected); UpdateFiltersList(); } } }
/** * @brief Helper function for selecting folder or file. * This function shows standard Windows file selection dialog for selecting * file or folder to open or file to save. The last parameter @p is_open selects * between open or save modes. Biggest difference is that in save-mode Windows * asks if user wants to override existing file. * @param [in] parent Handle to parent window. Can be a NULL, but then * CMainFrame is used which can cause modality problems. * @param [out] path Selected path is returned in this string * @param [in] initialPath Initial path (and file) shown when dialog is opened * @param [in] titleid Resource string ID for dialog title. * @param [in] filterid 0 or STRING ID for filter string * - 0 means "All files (*.*)". Note the string formatting! * @param [in] is_open Selects Open/Save -dialog (mode). * @note Be careful when setting @p parent to NULL as there are potential * modality problems with this. Dialog can be lost behind other windows! * @param [in] defaultExtension Extension to append if user doesn't provide one */ BOOL SelectFile(HWND parent, CString& path, LPCTSTR initialPath /*=NULL*/, UINT titleid /*=0*/, UINT filterid /*=0*/, BOOL is_open /*=TRUE*/, LPCTSTR defaultExtension /*=NULL*/) { path.Empty(); // Clear output param // This will tell common file dialog what to show // and also this will hold its return value CString sSelectedFile; // check if specified path is a file if (initialPath && initialPath[0]) { // If initial path info includes a file // we put the bare filename into sSelectedFile // so the common file dialog will start up with that file selected if (paths_DoesPathExist(initialPath) == IS_EXISTING_FILE) { String temp; SplitFilename(initialPath, 0, &temp, 0); sSelectedFile = temp.c_str(); } } if (parent == NULL) parent = AfxGetMainWnd()->GetSafeHwnd(); if (!filterid) filterid = IDS_ALLFILES; String title = theApp.LoadString(titleid); String filters = theApp.LoadString(filterid); // Convert extension mask from MFC style separators ('|') // to Win32 style separators ('\0') LPTSTR filtersStr = &*filters.begin(); ConvertFilter(filtersStr); OPENFILENAME_NT4 ofn; memset(&ofn, 0, sizeof(ofn)); ofn.lStructSize = sizeof(ofn); ofn.hwndOwner = parent; ofn.lpstrFilter = filtersStr; ofn.lpstrCustomFilter = NULL; ofn.nFilterIndex = 1; ofn.lpstrFile = sSelectedFile.GetBuffer(MAX_PATH); ofn.nMaxFile = MAX_PATH; ofn.lpstrInitialDir = initialPath; ofn.lpstrTitle = title.c_str(); ofn.lpstrFileTitle = NULL; if (defaultExtension) ofn.lpstrDefExt = defaultExtension; ofn.Flags = OFN_OVERWRITEPROMPT | OFN_HIDEREADONLY | OFN_PATHMUSTEXIST; BOOL bRetVal = FALSE; if (is_open) bRetVal = GetOpenFileName((OPENFILENAME *)&ofn); else bRetVal = GetSaveFileName((OPENFILENAME *)&ofn); // common file dialog populated sSelectedFile variable's buffer sSelectedFile.ReleaseBuffer(); SetCurrentDirectory(env_GetWindowsDirectory().c_str()); // Free handle held by GetOpenFileName if (bRetVal) path = sSelectedFile; return bRetVal; }
/** * @brief Shows file/folder selection dialog. * * We need this custom function so we can select files and folders with the * same dialog. * - If existing filename is selected return it * - If filename in (CFileDialog) editbox and current folder doesn't form * a valid path to file, return current folder. * @param [in] parent Handle to parent window. Can be a NULL, but then * CMainFrame is used which can cause modality problems. * @param [out] path Selected folder/filename * @param [in] initialPath Initial file or folder shown/selected. * @return TRUE if user choosed a file/folder, FALSE if user canceled dialog. */ BOOL SelectFileOrFolder(HWND parent, CString& path, LPCTSTR initialPath /*=NULL*/) { String title = theApp.LoadString(IDS_OPEN_TITLE); // This will tell common file dialog what to show // and also this will hold its return value CString sSelectedFile; // check if specified path is a file if (initialPath && initialPath[0]) { // If initial path info includes a file // we put the bare filename into sSelectedFile // so the common file dialog will start up with that file selected if (paths_DoesPathExist(initialPath) == IS_EXISTING_FILE) { String temp; SplitFilename(initialPath, 0, &temp, 0); sSelectedFile = temp.c_str(); } } if (parent == NULL) parent = AfxGetMainWnd()->GetSafeHwnd(); int filterid = IDS_ALLFILES; if (!filterid) filterid = IDS_ALLFILES; String filters = theApp.LoadString(filterid); // Convert extension mask from MFC style separators ('|') // to Win32 style separators ('\0') LPTSTR filtersStr = &*filters.begin(); ConvertFilter(filtersStr); String dirSelTag = theApp.LoadString(IDS_DIRSEL_TAG); // Set initial filename to folder selection tag dirSelTag += _T("."); // Treat it as filename sSelectedFile = dirSelTag.c_str(); // What is assignment above good for? OPENFILENAME_NT4 ofn; memset(&ofn, 0, sizeof(ofn)); ofn.lStructSize = sizeof(ofn); ofn.hwndOwner = parent; ofn.lpstrFilter = filtersStr; ofn.lpstrCustomFilter = NULL; ofn.nFilterIndex = 1; ofn.lpstrFile = sSelectedFile.GetBuffer(MAX_PATH); ofn.nMaxFile = MAX_PATH; ofn.lpstrInitialDir = initialPath; ofn.lpstrTitle = title.c_str(); ofn.lpstrFileTitle = NULL; ofn.Flags = OFN_HIDEREADONLY | OFN_PATHMUSTEXIST | OFN_NOTESTFILECREATE; BOOL bRetVal = GetOpenFileName((OPENFILENAME *)&ofn); // common file dialog populated sSelectedFile variable's buffer sSelectedFile.ReleaseBuffer(); SetCurrentDirectory(env_GetWindowsDirectory().c_str()); // Free handle held by GetOpenFileName if (bRetVal) { path = sSelectedFile; struct _stati64 statBuffer; int nRetVal = _tstati64(path, &statBuffer); if (nRetVal == -1) { // We have a valid folder name, but propably garbage as a filename. // Return folder name String folder = GetPathOnly(sSelectedFile); path.Format(_T("%s\\"), folder.c_str()); } } return bRetVal; }
static UINT UpdateButtonStatesThread(LPVOID lpParam) { MSG msg; BOOL bRet; CoInitialize(NULL); CAssureScriptsForThread scriptsForRescan; while( (bRet = GetMessage( &msg, NULL, 0, 0 )) != 0) { if (bRet == -1) break; if (msg.message != WM_USER + 2) continue; BOOL bButtonEnabled = TRUE; BOOL bInvalid[3] = {FALSE, FALSE, FALSE}; int iStatusMsgId = 0; int iUnpackerStatusMsgId = 0; UpdateButtonStatesThreadParams *pParams = reinterpret_cast<UpdateButtonStatesThreadParams *>(msg.wParam); PathContext paths = pParams->m_paths; HWND hWnd = pParams->m_hWnd; delete pParams; // Check if we have project file as left side path BOOL bProject = FALSE; String ext; paths_SplitFilename(paths[0], NULL, NULL, &ext); if (paths[1].empty() && string_compare_nocase(ext, ProjectFile::PROJECTFILE_EXT) == 0) bProject = TRUE; if (!bProject) { if (paths_DoesPathExist(paths[0], IsArchiveFile) == DOES_NOT_EXIST) bInvalid[0] = TRUE; if (paths_DoesPathExist(paths[1], IsArchiveFile) == DOES_NOT_EXIST) bInvalid[1] = TRUE; if (paths.GetSize() > 2 && paths_DoesPathExist(paths[2], IsArchiveFile) == DOES_NOT_EXIST) bInvalid[2] = TRUE; } // Enable buttons as appropriate if (GetOptionsMgr()->GetBool(OPT_VERIFY_OPEN_PATHS)) { PATH_EXISTENCE pathsType = DOES_NOT_EXIST; if (paths.GetSize() <= 2) { if (bInvalid[0] && bInvalid[1]) iStatusMsgId = IDS_OPEN_BOTHINVALID; else if (bInvalid[0]) iStatusMsgId = IDS_OPEN_LEFTINVALID; else if (bInvalid[1]) iStatusMsgId = IDS_OPEN_RIGHTINVALID; else if (!bInvalid[0] && !bInvalid[1]) { pathsType = GetPairComparability(paths, IsArchiveFile); if (pathsType == DOES_NOT_EXIST) iStatusMsgId = IDS_OPEN_MISMATCH; else iStatusMsgId = IDS_OPEN_FILESDIRS; } } else { if (bInvalid[0] && bInvalid[1] && bInvalid[2]) iStatusMsgId = IDS_OPEN_ALLINVALID; else if (!bInvalid[0] && bInvalid[1] && bInvalid[2]) iStatusMsgId = IDS_OPEN_MIDDLERIGHTINVALID; else if (bInvalid[0] && !bInvalid[1] && bInvalid[2]) iStatusMsgId = IDS_OPEN_LEFTRIGHTINVALID; else if (!bInvalid[0] && !bInvalid[1] && bInvalid[2]) iStatusMsgId = IDS_OPEN_RIGHTINVALID; else if (bInvalid[0] && bInvalid[1] && !bInvalid[2]) iStatusMsgId = IDS_OPEN_LEFTMIDDLEINVALID; else if (!bInvalid[0] && bInvalid[1] && !bInvalid[2]) iStatusMsgId = IDS_OPEN_MIDDLEINVALID; else if (bInvalid[0] && !bInvalid[1] && !bInvalid[2]) iStatusMsgId = IDS_OPEN_LEFTINVALID; else if (!bInvalid[0] && !bInvalid[1] && !bInvalid[2]) { pathsType = GetPairComparability(paths, IsArchiveFile); if (pathsType == DOES_NOT_EXIST) iStatusMsgId = IDS_OPEN_MISMATCH; else iStatusMsgId = IDS_OPEN_FILESDIRS; } } if (pathsType == IS_EXISTING_FILE || bProject) iUnpackerStatusMsgId = 0; //Empty field else iUnpackerStatusMsgId = IDS_OPEN_UNPACKERDISABLED; if (bProject) bButtonEnabled = TRUE; else bButtonEnabled = (pathsType != DOES_NOT_EXIST); } PostMessage(hWnd, WM_USER + 1, bButtonEnabled, MAKELPARAM(iStatusMsgId, iUnpackerStatusMsgId)); } CoUninitialize(); return 0; }
/** * @brief Called when dialog is closed with "OK". * * Checks that paths are valid and sets filters. */ void COpenView::OnOK() { int pathsType; // enum from PATH_EXISTENCE in paths.h const String filterPrefix = _("[F] "); UpdateData(TRUE); TrimPaths(); int index; int nFiles = 0; for (index = 0; index < countof(m_strPath); index++) { if (index == 2 && m_strPath[index].empty()) break; m_files.SetSize(nFiles + 1); m_files[nFiles] = m_strPath[index]; m_dwFlags[nFiles] &= ~FFILEOPEN_READONLY; m_dwFlags[nFiles] |= m_bReadOnly[index] ? FFILEOPEN_READONLY : 0; nFiles++; } // If left path is a project-file, load it String ext; paths_SplitFilename(m_strPath[0], NULL, NULL, &ext); if (m_strPath[1].empty() && string_compare_nocase(ext, ProjectFile::PROJECTFILE_EXT) == 0) LoadProjectFile(m_strPath[0]); pathsType = GetPairComparability(m_files, IsArchiveFile); if (pathsType == DOES_NOT_EXIST) { LangMessageBox(IDS_ERROR_INCOMPARABLE, MB_ICONSTOP); return; } for (index = 0; index < nFiles; index++) { // If user has edited path by hand, expand environment variables bool bExpand = false; if (string_compare_nocase(m_strBrowsePath[index], m_files[index]) != 0) bExpand = true; if (!paths_IsURLorCLSID(m_files[index])) { m_files[index] = paths_GetLongPath(m_files[index], bExpand); // Add trailing '\' for directories if its missing if (paths_DoesPathExist(m_files[index]) == IS_EXISTING_DIR) m_files[index] = paths_AddTrailingSlash(m_files[index]); m_strPath[index] = m_files[index]; } } UpdateData(FALSE); KillTimer(IDT_CHECKFILES); String filter(string_trim_ws(m_strExt)); // If prefix found from start.. if (filter.find(filterPrefix, 0) == 0) { // Remove prefix + space filter.erase(0, filterPrefix.length()); if (!theApp.m_pGlobalFileFilter->SetFilter(filter)) { // If filtername is not found use default *.* mask theApp.m_pGlobalFileFilter->SetFilter(_T("*.*")); filter = _T("*.*"); } GetOptionsMgr()->SaveOption(OPT_FILEFILTER_CURRENT, filter); } else { BOOL bFilterSet = theApp.m_pGlobalFileFilter->SetFilter(filter); if (!bFilterSet) m_strExt = theApp.m_pGlobalFileFilter->GetFilterNameOrMask(); GetOptionsMgr()->SaveOption(OPT_FILEFILTER_CURRENT, filter); } SaveComboboxStates(); GetOptionsMgr()->SaveOption(OPT_CMP_INCLUDE_SUBDIRS, m_bRecurse); LoadComboboxStates(); m_constraint.Persist(true, false); COpenDoc *pDoc = GetDocument(); pDoc->m_files = m_files; pDoc->m_bRecurse = m_bRecurse; pDoc->m_strExt = m_strExt; pDoc->m_strUnpacker = m_strUnpacker; pDoc->m_infoHandler = m_infoHandler; pDoc->m_dwFlags[0] = m_dwFlags[0]; pDoc->m_dwFlags[1] = m_dwFlags[1]; pDoc->m_dwFlags[2] = m_dwFlags[2]; if (GetOptionsMgr()->GetBool(OPT_CLOSE_WITH_OK)) GetParentFrame()->PostMessage(WM_CLOSE); GetMainFrame()->DoFileOpen( &PathContext(pDoc->m_files), &std::vector<DWORD>(pDoc->m_dwFlags, pDoc->m_dwFlags + 3)[0], NULL, _T(""), !!pDoc->m_bRecurse, NULL, _T(""), &PackingInfo(pDoc->m_infoHandler)); }