From 33811e9ecd9ff485b67c90df6357c84a60df28fe Mon Sep 17 00:00:00 2001 From: Rainer Kottenhoff Date: Sun, 12 Jul 2020 11:23:01 +0200 Subject: [PATCH 1/2] + fix: Ask before overriding read-only protected configuration file. --- language/common_res.h | 1 + language/np3_de_de/strings_de_de.rc | 2 + language/np3_en_gb/strings_en_gb.rc | 2 + language/np3_en_us/strings_en_us.rc | 2 + src/Config/Config.cpp | 64 +++++++++++++++++++++++++++++ src/Config/Config.h | 3 +- src/Notepad3.c | 40 ++---------------- 7 files changed, 76 insertions(+), 38 deletions(-) diff --git a/language/common_res.h b/language/common_res.h index 83ecc1171..587065b16 100644 --- a/language/common_res.h +++ b/language/common_res.h @@ -110,6 +110,7 @@ #define IDS_MUI_DROP_NO_FILE 14018 #define IDS_MUI_SELMULTI 14019 #define IDS_MUI_SELRECTORMULTI 14020 +#define IDS_MUI_INIFILE_READONLY 14021 #define IDS_MUI_ASK_SAVE 15000 #define IDS_MUI_ASK_REVERT 15001 diff --git a/language/np3_de_de/strings_de_de.rc b/language/np3_de_de/strings_de_de.rc index 4c0c10c0e..c87462861 100644 --- a/language/np3_de_de/strings_de_de.rc +++ b/language/np3_de_de/strings_de_de.rc @@ -180,6 +180,8 @@ BEGIN IDS_MUI_SAVEDSETTINGS "Die aktuellen Notepad3 Einstellungen wurden gespeichert." IDS_MUI_CREATEINI_FAIL "Fehler bei der Erzeugung einer Konfigurationsdatei." IDS_MUI_WRITEINI_FAIL "Fehler beim schreiben der Einstellungen in die Konfigurationsdatei." + IDS_MUI_INIFILE_READONLY + "Die Konfigurationsdatei ist schreibgeschützt - ignorieren und Konfiguration überschreiben?" IDS_MUI_SETTINGSNOTSAVED "Es wurde keine Konfigurationsdatei gefunden.\nUm die Veränderungen der Stilanpassungen zu behalten, sollten die Einstellungen gespeichert werden (F7) oder über die Schematakonfiguration (Ctrl+F12) exportiert werden." END diff --git a/language/np3_en_gb/strings_en_gb.rc b/language/np3_en_gb/strings_en_gb.rc index 48083f502..02b72b6a3 100644 --- a/language/np3_en_gb/strings_en_gb.rc +++ b/language/np3_en_gb/strings_en_gb.rc @@ -180,6 +180,8 @@ BEGIN IDS_MUI_SAVEDSETTINGS "The current program settings have been saved." IDS_MUI_CREATEINI_FAIL "Error creating configuration file." IDS_MUI_WRITEINI_FAIL "Error writing settings to configuration file." + IDS_MUI_INIFILE_READONLY + "Configuration file is readonly - ignore and override settings?" IDS_MUI_SETTINGSNOTSAVED "No existing configuration file was found.\nTo keep your style modifications, save settings now (F7) or go back to scheme configuration (Ctrl+F12) and export your styles." END diff --git a/language/np3_en_us/strings_en_us.rc b/language/np3_en_us/strings_en_us.rc index 21a7c117c..3f79c2d54 100644 --- a/language/np3_en_us/strings_en_us.rc +++ b/language/np3_en_us/strings_en_us.rc @@ -180,6 +180,8 @@ BEGIN IDS_MUI_SAVEDSETTINGS "The current program settings have been saved." IDS_MUI_CREATEINI_FAIL "Error creating configuration file." IDS_MUI_WRITEINI_FAIL "Error writing settings to configuration file." + IDS_MUI_INIFILE_READONLY + "Configuration file is readonly - ignore and override settings?" IDS_MUI_SETTINGSNOTSAVED "No existing configuration file was found.\nTo keep your style modifications, save settings now (F7) or go back to scheme configuration (Ctrl+F12) and export your styles." END diff --git a/src/Config/Config.cpp b/src/Config/Config.cpp index 8e6da9202..30afeb5de 100644 --- a/src/Config/Config.cpp +++ b/src/Config/Config.cpp @@ -2099,6 +2099,70 @@ __try { } + +//============================================================================= +// +// CmdSaveSettingsNow() +// +void CmdSaveSettingsNow() +{ + bool bCreateFailure = false; + if (StrIsEmpty(Globals.IniFile)) { + if (StrIsNotEmpty(Globals.IniFileDefault)) { + StringCchCopy(Globals.IniFile, COUNTOF(Globals.IniFile), Globals.IniFileDefault); + DWORD dwFileSize = 0UL; + Globals.bCanSaveIniFile = CreateIniFile(Globals.IniFile, &dwFileSize); + if (Globals.bCanSaveIniFile) { + Globals.bIniFileFromScratch = (dwFileSize == 0UL); + StringCchCopy(Globals.IniFileDefault, COUNTOF(Globals.IniFileDefault), L""); + } + else { + StringCchCopy(Globals.IniFile, COUNTOF(Globals.IniFile), L""); + Globals.bCanSaveIniFile = false; + bCreateFailure = true; + } + } + else { + return; + } + } + if (bCreateFailure) { + InfoBoxLng(MB_ICONWARNING, NULL, IDS_MUI_CREATEINI_FAIL); + return; + } + DWORD dwFileAttributes = 0; + if (!Globals.bCanSaveIniFile) { + dwFileAttributes = GetFileAttributes(Globals.IniFile); + if (dwFileAttributes == INVALID_FILE_ATTRIBUTES) { + InfoBoxLng(MB_ICONWARNING, NULL, IDS_MUI_CREATEINI_FAIL); + return; + } + if (dwFileAttributes & FILE_ATTRIBUTE_READONLY) { + INT_PTR const answer = InfoBoxLng(MB_YESNO | MB_ICONWARNING, NULL, IDS_MUI_INIFILE_READONLY); + if ((IDOK == answer) || (IDYES == answer)) { + SetFileAttributes(Globals.IniFile, FILE_ATTRIBUTE_NORMAL); // override read-only attrib + Globals.bCanSaveIniFile = CanAccessPath(Globals.IniFile, GENERIC_WRITE); + } + } + else { + dwFileAttributes = 0; // no need to change the file attributes + } + } + if (Globals.bCanSaveIniFile && SaveAllSettings(true)) { + InfoBoxLng(MB_ICONINFORMATION, L"MsgSaveSettingsInfo", IDS_MUI_SAVEDSETTINGS); + if (dwFileAttributes != 0) { + SetFileAttributes(Globals.IniFile, dwFileAttributes); // reset + Globals.bCanSaveIniFile = CanAccessPath(Globals.IniFile, GENERIC_WRITE); + } + } + else { + Globals.dwLastError = GetLastError(); + InfoBoxLng(MB_ICONWARNING, NULL, IDS_MUI_WRITEINI_FAIL); + return; + } +} + + //============================================================================= //============================================================================= diff --git a/src/Config/Config.h b/src/Config/Config.h index d71e449bc..0f07857cf 100644 --- a/src/Config/Config.h +++ b/src/Config/Config.h @@ -33,8 +33,9 @@ bool CreateIniFile(LPCWSTR pszIniFilePath, DWORD* pdwFileSize_out); void LoadSettings(); bool SaveWindowPositionSettings(bool bClearSettings); bool SaveAllSettings(bool bForceSaveSettings); +void CmdSaveSettingsNow(); -bool OpenSettingsFile(bool* keepCached); + bool OpenSettingsFile(bool* keepCached); bool CloseSettingsFile(bool bSaveChanges, bool keepCached); // ---------------------------------------------------------------------------- diff --git a/src/Notepad3.c b/src/Notepad3.c index 9ae9cddda..954723ea3 100644 --- a/src/Notepad3.c +++ b/src/Notepad3.c @@ -5542,43 +5542,9 @@ LRESULT MsgCommand(HWND hwnd, UINT umsg, WPARAM wParam, LPARAM lParam) case IDM_VIEW_SAVESETTINGSNOW: - if (IsCmdEnabled(hwnd, IDM_VIEW_SAVESETTINGSNOW)) { - - bool bCreateFailure = false; - if (StrIsEmpty(Globals.IniFile)) { - if (StrIsNotEmpty(Globals.IniFileDefault)) { - StringCchCopy(Globals.IniFile, COUNTOF(Globals.IniFile), Globals.IniFileDefault); - DWORD dwFileSize = 0UL; - Globals.bCanSaveIniFile = CreateIniFile(Globals.IniFile, &dwFileSize); - if (Globals.bCanSaveIniFile) { - Globals.bIniFileFromScratch = (dwFileSize == 0UL); - StringCchCopy(Globals.IniFileDefault, COUNTOF(Globals.IniFileDefault), L""); - } - else { - StringCchCopy(Globals.IniFile, COUNTOF(Globals.IniFile), L""); - Globals.bCanSaveIniFile = false; - bCreateFailure = true; - } - } - else - break; - } - - if (!bCreateFailure) - { - SetFileAttributes(Globals.IniFile, FILE_ATTRIBUTE_NORMAL); // override read-only attrib - - if (SaveAllSettings(true)) { - InfoBoxLng(MB_ICONINFORMATION, L"MsgSaveSettingsInfo", IDS_MUI_SAVEDSETTINGS); - } - else { - Globals.dwLastError = GetLastError(); - InfoBoxLng(MB_ICONWARNING, NULL, IDS_MUI_WRITEINI_FAIL); - } - } - else { - InfoBoxLng(MB_ICONWARNING, NULL, IDS_MUI_CREATEINI_FAIL); - } + if (IsCmdEnabled(hwnd, IDM_VIEW_SAVESETTINGSNOW)) + { + CmdSaveSettingsNow(); } break; From 90a98d11c6f6936c7b7cad0c656fbc4a8a12b2ef Mon Sep 17 00:00:00 2001 From: Rainer Kottenhoff Date: Sun, 12 Jul 2020 15:46:14 +0200 Subject: [PATCH 2/2] + upd: grepWin/NP3) current (2020-07-12) version --- .../sktoolslib_mod/AnimationManager.cpp | 4 +- grepWinNP3/sktoolslib_mod/AnimationManager.h | 3 +- grepWinNP3/sktoolslib_mod/TextFile.cpp | 5 +- grepWinNP3/sktoolslib_mod/TextFile.h | 8 + grepWinNP3/src/AboutDlg.cpp | 6 +- grepWinNP3/src/Bookmarks.cpp | 84 +++--- grepWinNP3/src/Bookmarks.h | 4 +- grepWinNP3/src/BookmarksDlg.cpp | 39 +-- grepWinNP3/src/BookmarksDlg.h | 4 + grepWinNP3/src/InfoDlg.cpp | 4 +- grepWinNP3/src/NameDlg.cpp | 6 +- grepWinNP3/src/NameDlg.h | 2 + grepWinNP3/src/RegexTestDlg.cpp | 2 +- grepWinNP3/src/Resources/grepWin.rc | 51 ++-- grepWinNP3/src/Resources/grepWin_orig.rc | Bin 38158 -> 0 bytes grepWinNP3/src/Resources/infodlg.htm | 6 +- grepWinNP3/src/SearchDlg.cpp | 285 +++++++++++------- grepWinNP3/src/SearchDlg.h | 9 +- grepWinNP3/src/Settings.cpp | 16 +- grepWinNP3/src/ShellContextMenu.cpp | 14 +- grepWinNP3/src/grepWin.cpp | 98 +++--- grepWinNP3/src/last/version.h | 12 +- grepWinNP3/src/resource.h | 44 +-- 23 files changed, 422 insertions(+), 284 deletions(-) delete mode 100644 grepWinNP3/src/Resources/grepWin_orig.rc diff --git a/grepWinNP3/sktoolslib_mod/AnimationManager.cpp b/grepWinNP3/sktoolslib_mod/AnimationManager.cpp index 471f472e1..0e7b5dccb 100644 --- a/grepWinNP3/sktoolslib_mod/AnimationManager.cpp +++ b/grepWinNP3/sktoolslib_mod/AnimationManager.cpp @@ -1,6 +1,6 @@ // sktoolslib - common files for SK tools -// Copyright (C) 2017 - Stefan Kueng +// Copyright (C) 2017, 2020 - Stefan Kueng // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License @@ -21,6 +21,8 @@ #include "AnimationManager.h" #include #include +#include +#include /// Object to handle the timer callback. class CTimerEventHandler : public IUIAnimationTimerEventHandler diff --git a/grepWinNP3/sktoolslib_mod/AnimationManager.h b/grepWinNP3/sktoolslib_mod/AnimationManager.h index ca02505bf..344181fda 100644 --- a/grepWinNP3/sktoolslib_mod/AnimationManager.h +++ b/grepWinNP3/sktoolslib_mod/AnimationManager.h @@ -1,6 +1,6 @@ // sktoolslib - common files for SK tools -// Copyright (C) 2017 - Stefan Kueng +// Copyright (C) 2017, 2020 - Stefan Kueng // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License @@ -60,6 +60,7 @@ #include #include #include +#include #include #include diff --git a/grepWinNP3/sktoolslib_mod/TextFile.cpp b/grepWinNP3/sktoolslib_mod/TextFile.cpp index 2229fbfb4..1b2bd0921 100644 --- a/grepWinNP3/sktoolslib_mod/TextFile.cpp +++ b/grepWinNP3/sktoolslib_mod/TextFile.cpp @@ -38,6 +38,7 @@ CTextFile::CTextFile(void) , filelen(0) , hasBOM(false) , encoding(AUTOTYPE) + , m_NullByteCount(2) { } @@ -430,7 +431,7 @@ CTextFile::UnicodeType CTextFile::CheckUnicodeType(BYTE *pBuffer, int cb) if (0x00 == *pVal8++) ++nNull; } - if (nDblNull > 2) // arbitrary value: allow two double null chars to account for 'broken' text files + if (nDblNull > m_NullByteCount) // configured value: allow double null chars to account for 'broken' text files return BINARY; pVal16 = (UINT16 *)pBuffer; pVal8 = (UINT8 *)(pVal16 + 1); @@ -438,7 +439,7 @@ CTextFile::UnicodeType CTextFile::CheckUnicodeType(BYTE *pBuffer, int cb) return UNICODE_LE; if (*pVal16 == 0xFFFE) return UNICODE_BE; - if ((nNull > 3) && ((cb % 2) == 0)) // arbitrary value: allow three null chars to account for 'broken' text files + if ((nNull > 3) && ((cb % 2) == 0)) // arbitrary value: allow three null chars to account for 'broken' ANSI/UTF8 text files, otherwise consider the file UTF16-LE return UNICODE_LE; if (cb < 3) return ANSI; diff --git a/grepWinNP3/sktoolslib_mod/TextFile.h b/grepWinNP3/sktoolslib_mod/TextFile.h index 0b51cc896..c8063c35b 100644 --- a/grepWinNP3/sktoolslib_mod/TextFile.h +++ b/grepWinNP3/sktoolslib_mod/TextFile.h @@ -115,6 +115,13 @@ public: bool HasBOM() const { return hasBOM; } + /** + * Sets the number of null bytes that are allowed for + * a file to still be considered text instead of binary + * in the encoding detection. Default is 2. + */ + void SetNullbyteCountForBinary(int count) { m_NullByteCount = count; } + protected: /** * Tries to find out the encoding of the file (utf8, utf16, ansi) @@ -134,4 +141,5 @@ private: UnicodeType encoding; std::wstring filename; bool hasBOM; + int m_NullByteCount; }; diff --git a/grepWinNP3/src/AboutDlg.cpp b/grepWinNP3/src/AboutDlg.cpp index 2f5116d30..5e9af7826 100644 --- a/grepWinNP3/src/AboutDlg.cpp +++ b/grepWinNP3/src/AboutDlg.cpp @@ -44,14 +44,14 @@ LRESULT CAboutDlg::DlgFunc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam [this]() { CTheme::Instance().SetThemeForDialog(*this, CTheme::Instance().IsDarkTheme()); }); + m_link.ConvertStaticToHyperlink(hwndDlg, IDC_WEBLINK, L"http://tools.stefankueng.com"); CTheme::Instance().SetThemeForDialog(*this, CTheme::Instance().IsDarkTheme()); InitDialog(hwndDlg, IDI_GREPWIN); CLanguage::Instance().TranslateWindow(*this); TCHAR buf[MAX_PATH] = {0}; - _stprintf_s(buf, _countof(buf), _T("grepWinNP3 version %ld.%ld.%ld.%ld"), GREPWIN_VERMAJOR, GREPWIN_VERMINOR, GREPWIN_VERMICRO, GREPWIN_VERBUILD); + _stprintf_s(buf, _countof(buf), L"grepWinNP3 version %ld.%ld.%ld.%ld", GREPWIN_VERMAJOR, GREPWIN_VERMINOR, GREPWIN_VERMICRO, GREPWIN_VERBUILD); SetDlgItemText(*this, IDC_VERSIONINFO, buf); - SetDlgItemText(*this, IDC_DATE, _T(GREPWIN_VERDATE)); - m_link.ConvertStaticToHyperlink(hwndDlg, IDC_WEBLINK, _T("http://tools.stefankueng.com")); + SetDlgItemText(*this, IDC_DATE, TEXT(GREPWIN_VERDATE)); } return TRUE; case WM_COMMAND: diff --git a/grepWinNP3/src/Bookmarks.cpp b/grepWinNP3/src/Bookmarks.cpp index 4d68041c0..e0a7c69ba 100644 --- a/grepWinNP3/src/Bookmarks.cpp +++ b/grepWinNP3/src/Bookmarks.cpp @@ -47,10 +47,10 @@ void CBookmarks::Load() { SHGetFolderPath(NULL, CSIDL_APPDATA, NULL, SHGFP_TYPE_CURRENT, path.get()); m_iniPath = path.get(); - m_iniPath += _T("\\grepWinNP3"); + m_iniPath += L"\\grepWinNP3"; } CreateDirectory(m_iniPath.c_str(), NULL); - m_iniPath += _T("\\bookmarks"); + m_iniPath += L"\\bookmarks"; SetUnicode(); SetMultiLine(); SetSpaces(false); @@ -70,62 +70,63 @@ void CBookmarks::Save() { SHGetFolderPath(NULL, CSIDL_APPDATA, NULL, SHGFP_TYPE_CURRENT, path.get()); m_iniPath = path.get(); - m_iniPath += _T("\\grepWinNP3"); + m_iniPath += L"\\grepWinNP3"; } CreateDirectory(m_iniPath.c_str(), NULL); - m_iniPath += _T("\\bookmarks"); + m_iniPath += L"\\bookmarks"; SaveFile(m_iniPath.c_str(), true); } void CBookmarks::AddBookmark(const Bookmark& bm) { - std::wstring val = _T("\""); + std::wstring val = L"\""; val += bm.Search; - val += _T("\""); - SetValue(bm.Name.c_str(), _T("searchString"), val.c_str()); + val += L"\""; + SetValue(bm.Name.c_str(), L"searchString", val.c_str()); - val = _T("\""); + val = L"\""; val += bm.Replace; - val += _T("\""); - SetValue(bm.Name.c_str(), _T("replaceString"), val.c_str()); - SetValue(bm.Name.c_str(), _T("useregex"), bm.UseRegex ? _T("true") : _T("false")); - SetValue(bm.Name.c_str(), _T("casesensitive"), bm.CaseSensitive ? _T("true") : _T("false")); - SetValue(bm.Name.c_str(), _T("dotmatchesnewline"), bm.DotMatchesNewline ? _T("true") : _T("false")); - SetValue(bm.Name.c_str(), _T("backup"), bm.Backup ? _T("true") : _T("false")); - SetValue(bm.Name.c_str(), _T("utf8"), bm.Utf8 ? _T("true") : _T("false")); - SetValue(bm.Name.c_str(), _T("includesystem"), bm.IncludeSystem ? _T("true") : _T("false")); - SetValue(bm.Name.c_str(), _T("includefolder"), bm.IncludeFolder ? _T("true") : _T("false")); - SetValue(bm.Name.c_str(), _T("includehidden"), bm.IncludeHidden ? _T("true") : _T("false")); - SetValue(bm.Name.c_str(), _T("includebinary"), bm.IncludeBinary ? _T("true") : _T("false")); - val = _T("\""); + val += L"\""; + SetValue(bm.Name.c_str(), L"replaceString", val.c_str()); + SetValue(bm.Name.c_str(), L"useregex", bm.UseRegex ? L"true" : L"false"); + SetValue(bm.Name.c_str(), L"casesensitive", bm.CaseSensitive ? L"true" : L"false"); + SetValue(bm.Name.c_str(), L"dotmatchesnewline", bm.DotMatchesNewline ? L"true" : L"false"); + SetValue(bm.Name.c_str(), L"backup", bm.Backup ? L"true" : L"false"); + SetValue(bm.Name.c_str(), L"utf8", bm.Utf8 ? L"true" : L"false"); + SetValue(bm.Name.c_str(), L"includesystem", bm.IncludeSystem ? L"true" : L"false"); + SetValue(bm.Name.c_str(), L"includefolder", bm.IncludeFolder ? L"true" : L"false"); + SetValue(bm.Name.c_str(), L"includehidden", bm.IncludeHidden ? L"true" : L"false"); + SetValue(bm.Name.c_str(), L"includebinary", bm.IncludeBinary ? L"true" : L"false"); + val = L"\""; val += bm.ExcludeDirs; - val += _T("\""); - SetValue(bm.Name.c_str(), _T("excludedirs"), val.c_str()); - val = _T("\""); + val += L"\""; + SetValue(bm.Name.c_str(), L"excludedirs", val.c_str()); + val = L"\""; val += bm.FileMatch; - val += _T("\""); - SetValue(bm.Name.c_str(), _T("filematch"), val.c_str()); - SetValue(bm.Name.c_str(), _T("filematchregex"), bm.FileMatchRegex ? _T("true") : _T("false")); - + val += L"\""; + SetValue(bm.Name.c_str(), L"filematch", val.c_str()); + SetValue(bm.Name.c_str(), L"filematchregex", bm.FileMatchRegex ? L"true" : L"false"); + SetValue(bm.Name.c_str(), L"searchpath", bm.Path.c_str()); } void CBookmarks::RemoveBookmark(const std::wstring& name) { - Delete(name.c_str(), _T("searchString"), true); - Delete(name.c_str(), _T("replaceString"), true); - Delete(name.c_str(), _T("useregex"), true); - Delete(name.c_str(), _T("casesensitive"), true); - Delete(name.c_str(), _T("dotmatchesnewline"), true); - Delete(name.c_str(), _T("backup"), true); - Delete(name.c_str(), _T("utf8"), true); - Delete(name.c_str(), _T("includesystem"), true); - Delete(name.c_str(), _T("includefolder"), true); - Delete(name.c_str(), _T("includehidden"), true); - Delete(name.c_str(), _T("includebinary"), true); - Delete(name.c_str(), _T("excludedirs"), true); - Delete(name.c_str(), _T("filematch"), true); - Delete(name.c_str(), _T("filematchregex"), true); + Delete(name.c_str(), L"searchString", true); + Delete(name.c_str(), L"replaceString", true); + Delete(name.c_str(), L"useregex", true); + Delete(name.c_str(), L"casesensitive", true); + Delete(name.c_str(), L"dotmatchesnewline", true); + Delete(name.c_str(), L"backup", true); + Delete(name.c_str(), L"utf8", true); + Delete(name.c_str(), L"includesystem", true); + Delete(name.c_str(), L"includefolder", true); + Delete(name.c_str(), L"includehidden", true); + Delete(name.c_str(), L"includebinary", true); + Delete(name.c_str(), L"excludedirs", true); + Delete(name.c_str(), L"filematch", true); + Delete(name.c_str(), L"filematchregex", true); + Delete(name.c_str(), L"searchpath", true); } Bookmark CBookmarks::GetBookmark( const std::wstring& name ) @@ -148,6 +149,7 @@ Bookmark CBookmarks::GetBookmark( const std::wstring& name ) bk.ExcludeDirs = GetValue(name.c_str(), L"excludedirs", L""); bk.FileMatch = GetValue(name.c_str(), L"filematch", L""); bk.FileMatchRegex = wcscmp(GetValue(name.c_str(), L"filematchregex", L"false"), L"true") == 0; + bk.Path = GetValue(name.c_str(), L"searchpath", L""); } return bk; diff --git a/grepWinNP3/src/Bookmarks.h b/grepWinNP3/src/Bookmarks.h index b378fd297..0992a984e 100644 --- a/grepWinNP3/src/Bookmarks.h +++ b/grepWinNP3/src/Bookmarks.h @@ -1,6 +1,6 @@ // grepWin - regex search and replace for Windows -// Copyright (C) 2007-2008, 2012-2013 - Stefan Kueng +// Copyright (C) 2007-2008, 2012-2013, 2020 - Stefan Kueng // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License @@ -42,11 +42,13 @@ public: std::wstring Name; std::wstring Search; std::wstring Replace; + std::wstring Path; bool UseRegex; bool CaseSensitive; bool DotMatchesNewline; bool Backup; bool Utf8; + bool Binary; bool IncludeSystem; bool IncludeFolder; bool IncludeHidden; diff --git a/grepWinNP3/src/BookmarksDlg.cpp b/grepWinNP3/src/BookmarksDlg.cpp index b0743def6..1f4a3fff1 100644 --- a/grepWinNP3/src/BookmarksDlg.cpp +++ b/grepWinNP3/src/BookmarksDlg.cpp @@ -37,6 +37,7 @@ CBookmarksDlg::CBookmarksDlg(HWND hParent) , m_bDotMatchesNewline(false) , m_bBackup(false) , m_bUtf8(false) + , m_bForceBinary(false) , m_bIncludeSystem(false) , m_bIncludeFolder(false) , m_bIncludeHidden(false) @@ -98,7 +99,7 @@ LRESULT CBookmarksDlg::DlgFunc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lP } else { - if (SHGetValue(HKEY_CURRENT_USER, _T("Software\\grepWinNP3"), _T("windowposBookmarks"), REG_NONE, &wpl, &size) == ERROR_SUCCESS) + if (SHGetValue(HKEY_CURRENT_USER, L"Software\\grepWinNP3", L"windowposBookmarks", REG_NONE, &wpl, &size) == ERROR_SUCCESS) SetWindowPlacement(*this, &wpl); else ShowWindow(*this, SW_SHOW); @@ -197,7 +198,7 @@ LRESULT CBookmarksDlg::DoCommand(int id, int /*msg*/) } else { - SHSetValue(HKEY_CURRENT_USER, _T("Software\\grepWinNP3"), _T("windowposBookmarks"), REG_NONE, &wpl, sizeof(wpl)); + SHSetValue(HKEY_CURRENT_USER, L"Software\\grepWinNP3", L"windowposBookmarks", REG_NONE, &wpl, sizeof(wpl)); } if ((id == IDOK) && (ListView_GetNextItem(GetDlgItem(*this, IDC_BOOKMARKS), -1, LVNI_SELECTED) >= 0)) SendMessage(m_hParent, WM_BOOKMARK, 0, 0); @@ -288,8 +289,8 @@ void CBookmarksDlg::InitBookmarks() m_bookmarks.GetAllSections(sections); for (const auto & section : sections) { - std::wstring searchString = m_bookmarks.GetValue(section.pItem, _T("searchString"), _T("")); - std::wstring replaceString = m_bookmarks.GetValue(section.pItem, _T("replaceString"), _T("")); + std::wstring searchString = m_bookmarks.GetValue(section.pItem, L"searchString", _T("")); + std::wstring replaceString = m_bookmarks.GetValue(section.pItem, L"replaceString", _T("")); RemoveQuotes(searchString); RemoveQuotes(replaceString); @@ -351,23 +352,25 @@ void CBookmarksDlg::PrepareSelected() lv.pszText = buf.get(); lv.cchTextMax = MAX_PATH_NEW; ListView_GetItem(GetDlgItem(*this, IDC_BOOKMARKS), &lv); - m_searchString = m_bookmarks.GetValue(buf.get(), _T("searchString"), _T("")); - m_replaceString = m_bookmarks.GetValue(buf.get(), _T("replaceString"), _T("")); - m_sExcludeDirs = m_bookmarks.GetValue(buf.get(), _T("excludedirs"), _T("")); - m_sFileMatch = m_bookmarks.GetValue(buf.get(), _T("filematch"), _T("")); + m_searchString = m_bookmarks.GetValue(buf.get(), L"searchString", _T("")); + m_path = m_bookmarks.GetValue(buf.get(), L"searchpath", L""); + m_replaceString = m_bookmarks.GetValue(buf.get(), L"replaceString", _T("")); + m_sExcludeDirs = m_bookmarks.GetValue(buf.get(), L"excludedirs", _T("")); + m_sFileMatch = m_bookmarks.GetValue(buf.get(), L"filematch", _T("")); RemoveQuotes(m_searchString); RemoveQuotes(m_replaceString); RemoveQuotes(m_sExcludeDirs); RemoveQuotes(m_sFileMatch); - m_bUseRegex = _tcscmp(m_bookmarks.GetValue(buf.get(), _T("useregex"), _T("false")), _T("true")) == 0; - m_bCaseSensitive = _tcscmp(m_bookmarks.GetValue(buf.get(), _T("casesensitive"), _T("false")), _T("true")) == 0; - m_bDotMatchesNewline = _tcscmp(m_bookmarks.GetValue(buf.get(), _T("dotmatchesnewline"), _T("false")), _T("true")) == 0; - m_bBackup = _tcscmp(m_bookmarks.GetValue(buf.get(), _T("backup"), _T("false")), _T("true")) == 0; - m_bUtf8 = _tcscmp(m_bookmarks.GetValue(buf.get(), _T("utf8"), _T("false")), _T("true")) == 0; - m_bIncludeSystem = _tcscmp(m_bookmarks.GetValue(buf.get(), _T("includesystem"), _T("false")), _T("true")) == 0; - m_bIncludeFolder = _tcscmp(m_bookmarks.GetValue(buf.get(), _T("includefolder"), _T("false")), _T("true")) == 0; - m_bIncludeHidden = _tcscmp(m_bookmarks.GetValue(buf.get(), _T("includehidden"), _T("false")), _T("true")) == 0; - m_bIncludeBinary = _tcscmp(m_bookmarks.GetValue(buf.get(), _T("includebinary"), _T("false")), _T("true")) == 0; - m_bFileMatchRegex = _tcscmp(m_bookmarks.GetValue(buf.get(), _T("filematchregex"), _T("false")), _T("true")) == 0; + m_bUseRegex = _tcscmp(m_bookmarks.GetValue(buf.get(), L"useregex", L"false"), L"true") == 0; + m_bCaseSensitive = _tcscmp(m_bookmarks.GetValue(buf.get(), L"casesensitive", L"false"), L"true") == 0; + m_bDotMatchesNewline = _tcscmp(m_bookmarks.GetValue(buf.get(), L"dotmatchesnewline", L"false"), L"true") == 0; + m_bBackup = _tcscmp(m_bookmarks.GetValue(buf.get(), L"backup", L"false"), L"true") == 0; + m_bUtf8 = _tcscmp(m_bookmarks.GetValue(buf.get(), L"utf8", L"false"), L"true") == 0; + m_bForceBinary = _tcscmp(m_bookmarks.GetValue(buf.get(), L"binary", L"false"), L"true") == 0; + m_bIncludeSystem = _tcscmp(m_bookmarks.GetValue(buf.get(), L"includesystem", L"false"), L"true") == 0; + m_bIncludeFolder = _tcscmp(m_bookmarks.GetValue(buf.get(), L"includefolder", L"false"), L"true") == 0; + m_bIncludeHidden = _tcscmp(m_bookmarks.GetValue(buf.get(), L"includehidden", L"false"), L"true") == 0; + m_bIncludeBinary = _tcscmp(m_bookmarks.GetValue(buf.get(), L"includebinary", L"false"), L"true") == 0; + m_bFileMatchRegex = _tcscmp(m_bookmarks.GetValue(buf.get(), L"filematchregex", L"false"), L"true") == 0; } } diff --git a/grepWinNP3/src/BookmarksDlg.h b/grepWinNP3/src/BookmarksDlg.h index 65b296640..b55d82ae9 100644 --- a/grepWinNP3/src/BookmarksDlg.h +++ b/grepWinNP3/src/BookmarksDlg.h @@ -37,11 +37,13 @@ public: std::wstring GetName() { return m_name; } std::wstring GetSelectedSearchString() const { return m_searchString; } std::wstring GetSelectedReplaceString() const { return m_replaceString; } + std::wstring GetPath() const { return m_path; } bool GetSelectedUseRegex() const { return m_bUseRegex; } bool GetSelectedSearchCase() const { return m_bCaseSensitive; } bool GetSelectedDotMatchNewline() const { return m_bDotMatchesNewline; } bool GetSelectedBackup() const { return m_bBackup; } bool GetSelectedTreatAsUtf8() const { return m_bUtf8; } + bool GetSelectedTreatAsBinary() const { return m_bForceBinary; } bool GetSelectedIncludeSystem() const { return m_bIncludeSystem; } bool GetSelectedIncludeFolder() const { return m_bIncludeFolder; } bool GetSelectedIncludeHidden() const { return m_bIncludeHidden; } @@ -63,11 +65,13 @@ private: std::wstring m_searchString; std::wstring m_replaceString; + std::wstring m_path; bool m_bUseRegex; bool m_bCaseSensitive; bool m_bDotMatchesNewline; bool m_bBackup; bool m_bUtf8; + bool m_bForceBinary; bool m_bIncludeSystem; bool m_bIncludeFolder; bool m_bIncludeHidden; diff --git a/grepWinNP3/src/InfoDlg.cpp b/grepWinNP3/src/InfoDlg.cpp index bc24eddc1..d3a885863 100644 --- a/grepWinNP3/src/InfoDlg.cpp +++ b/grepWinNP3/src/InfoDlg.cpp @@ -1,6 +1,6 @@ // grepWin - regex search and replace for Windows -// Copyright (C) 2007-2009, 2011-2014 - Stefan Kueng +// Copyright (C) 2007-2009, 2011-2014, 2020 - Stefan Kueng // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License @@ -55,7 +55,7 @@ BOOL CInfoDlg::ShowDialog(UINT idAboutHTMLID, HINSTANCE hInstance) { //Add the IE Res protocol std::unique_ptr strResourceURL(new TCHAR[MAX_PATH_NEW]); - _stprintf_s(strResourceURL.get(), MAX_PATH_NEW, _T("res://%s/%u"), lpszModule.get(), idAboutHTMLID); + _stprintf_s(strResourceURL.get(), MAX_PATH_NEW, L"res://%s/%u", lpszModule.get(), idAboutHTMLID); int iLength = (int)_tcslen(strResourceURL.get()); std::unique_ptr lpWideCharStr(new wchar_t[iLength+1]); //Attempt to Create the URL Moniker to the specified in the URL String diff --git a/grepWinNP3/src/NameDlg.cpp b/grepWinNP3/src/NameDlg.cpp index 9884fde93..a6e783490 100644 --- a/grepWinNP3/src/NameDlg.cpp +++ b/grepWinNP3/src/NameDlg.cpp @@ -30,6 +30,7 @@ CNameDlg::CNameDlg(HWND hParent) : m_hParent(hParent) , m_themeCallbackId(0) + , m_bIncludePath(false) { } @@ -91,8 +92,9 @@ LRESULT CNameDlg::DoCommand(int id, int /*msg*/) { case IDOK: { - auto buf = GetDlgItemText(IDC_NAME); - m_name = buf.get(); + auto buf = GetDlgItemText(IDC_NAME); + m_name = buf.get(); + m_bIncludePath = IsDlgButtonChecked(*this, IDC_INCLUDEPATH); } // fall through case IDCANCEL: diff --git a/grepWinNP3/src/NameDlg.h b/grepWinNP3/src/NameDlg.h index 9c1815e0f..1dde9ae9a 100644 --- a/grepWinNP3/src/NameDlg.h +++ b/grepWinNP3/src/NameDlg.h @@ -32,6 +32,7 @@ public: std::wstring GetName() const { return m_name; } void SetName(const std::wstring& n) { m_name = n; } + bool IncludePath() const { return m_bIncludePath; } protected: LRESULT CALLBACK DlgFunc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); @@ -40,6 +41,7 @@ protected: private: HWND m_hParent; std::wstring m_name; + bool m_bIncludePath; int m_themeCallbackId; CDlgResizer m_resizer; }; diff --git a/grepWinNP3/src/RegexTestDlg.cpp b/grepWinNP3/src/RegexTestDlg.cpp index 03fd8eecb..d29a0d5ae 100644 --- a/grepWinNP3/src/RegexTestDlg.cpp +++ b/grepWinNP3/src/RegexTestDlg.cpp @@ -222,7 +222,7 @@ void CRegexTestDlg::DoRegex() while (boost::regex_search(start, end, whatc, expression, flags)) { if (!searchresult.empty()) - searchresult = searchresult + _T("\r\n----------------------------\r\n"); + searchresult = searchresult + L"\r\n----------------------------\r\n"; std::wstring c(whatc[0].first, whatc[0].second); searchresult = searchresult + c; // update search position: diff --git a/grepWinNP3/src/Resources/grepWin.rc b/grepWinNP3/src/Resources/grepWin.rc index 9369734c6..a7ab3f0a3 100644 --- a/grepWinNP3/src/Resources/grepWin.rc +++ b/grepWinNP3/src/Resources/grepWin.rc @@ -58,10 +58,11 @@ BEGIN LTEXT "Replace with:",IDC_REPLACEWITHLABEL,14,83,64,8 EDITTEXT IDC_REPLACETEXT,83,81,484,12,ES_AUTOHSCROLL PUSHBUTTON "/",IDC_EDITMULTILINE2,572,81,13,12 - CONTROL "Search case-sensitive",IDC_CASE_SENSITIVE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,97,89,10 - CONTROL "Dot matches newline",IDC_DOTMATCHNEWLINE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,118,97,131,10 - CONTROL "Create backup files",IDC_CREATEBACKUP,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,285,97,109,10 - CONTROL "Treat files as UTF-8",IDC_UTF8,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,458,97,118,10 + CONTROL "Search case-sensitive",IDC_CASE_SENSITIVE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,97,90,10 + CONTROL "Dot matches newline",IDC_DOTMATCHNEWLINE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,118,97,100,10 + CONTROL "Create backup files",IDC_CREATEBACKUP,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,225,97,100,10 + CONTROL "Treat files as UTF-8",IDC_UTF8,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,340,97,100,10 + CONTROL "Treat files as binary",IDC_BINARY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,450,97,82,10 PUSHBUTTON "Test regex",IDC_TESTREGEX,14,109,69,14 PUSHBUTTON "Add to Presets",IDC_ADDTOBOOKMARKS,117,109,76,14 PUSHBUTTON "Presets",IDC_BOOKMARKS,195,109,50,14 @@ -122,15 +123,16 @@ BEGIN PUSHBUTTON "Cancel",IDCANCEL,317,295,77,14 END -IDD_NAME DIALOGEX 0, 0, 186, 65 -STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU +IDD_NAME DIALOGEX 0, 0, 186, 85 +STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Preset name" FONT 9, "Segoe UI", 400, 0, 0x1 BEGIN LTEXT "Enter a name for the regex:",IDC_INFOLABEL,7,7,172,8 EDITTEXT IDC_NAME,7,20,172,14,ES_AUTOHSCROLL - DEFPUSHBUTTON "OK",IDOK,37,44,68,14 - PUSHBUTTON "Cancel",IDCANCEL,111,44,68,14 + CONTROL "Include search path",IDC_INCLUDEPATH,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,38,172,10 + DEFPUSHBUTTON "OK",IDOK,37,64,68,14 + PUSHBUTTON "Cancel",IDCANCEL,111,64,68,14 END IDD_BOOKMARKS DIALOGEX 0, 0, 240, 129 @@ -167,7 +169,7 @@ BEGIN CONTROL "",IDC_TEXTCONTENT,"RichEdit20W",WS_VSCROLL | WS_TABSTOP | 0x1084,7,7,303,96 END -IDD_SETTINGS DIALOGEX 0, 0, 317, 209 +IDD_SETTINGS DIALOGEX 0, 0, 317, 239 STYLE DS_SETFONT | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME CAPTION "grepWinNP3 Settings" FONT 9, "Segoe UI", 400, 0, 0x1 @@ -181,20 +183,22 @@ BEGIN LTEXT "This adds a new entry to the context menu named 'Open with Editor'",IDC_STATIC3,13,66,288,16 LTEXT "Language:",IDC_STATIC4,16,92,119,8 COMBOBOX IDC_LANGUAGE,151,90,159,30,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP - CONTROL "Escape key closes grepWinNP3",IDC_ESCKEY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,106,252,10 + LTEXT "Number of NULL bytes per MB allowed for a file to still be considered text instead of binary",IDC_STATIC5,16,108,221,17 + EDITTEXT IDC_NUMNULL,261,108,40,14,ES_RIGHT | ES_AUTOHSCROLL | ES_NUMBER + CONTROL "Escape key closes grepWinNP3",IDC_ESCKEY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,128,252,10 CONTROL "Create backup files in a separate folder",IDC_BACKUPINFOLDER, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,119,249,10 + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,141,249,10 CONTROL "Don't warn when replacing without creating backups",IDC_NOWARNINGIFNOBACKUP, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,131,250,10 - DEFPUSHBUTTON "OK",IDOK,204,180,50,13 - PUSHBUTTON "Cancel",IDCANCEL,260,180,50,13 - CONTROL "Only one instance",IDC_ONLYONE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,143,150,10 - CONTROL "Check for updates",IDC_DOUPDATECHECKS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP | WS_DISABLED,7,155,150,10 - CONTROL "Dark mode",IDC_DARKMODE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,167,157,10 - LTEXT "",IDC_DARKMODEINFO,17,182,180,23,WS_DISABLED - RTEXT "Max # of concurrent worker",IDC_TEXT_NUMOFWORKER,156,156,107,9,0,WS_EX_RIGHT - EDITTEXT IDC_MAXNUMWORKER,271,154,31,13,ES_RIGHT | ES_NUMBER | WS_GROUP,WS_EX_RIGHT - CONTROL "",IDC_SPIN_MAXWORKER,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNLEFT | UDS_AUTOBUDDY | UDS_ARROWKEYS | WS_GROUP,271,154,10,13 + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,153,250,10 + CONTROL "Only one instance",IDC_ONLYONE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,165,150,10 + CONTROL "Check for updates",IDC_DOUPDATECHECKS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP | WS_DISABLED,7,177,150,10 + CONTROL "Dark mode",IDC_DARKMODE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,189,157,10 + LTEXT "",IDC_DARKMODEINFO,17,204,180,23,WS_DISABLED + RTEXT "Max # of concurrent worker",IDC_TEXT_NUMOFWORKER,156,182,107,9,0,WS_EX_RIGHT + EDITTEXT IDC_MAXNUMWORKER,271,180,31,13,ES_RIGHT | ES_NUMBER | WS_GROUP,WS_EX_RIGHT + CONTROL "",IDC_SPIN_MAXWORKER,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNLEFT | UDS_AUTOBUDDY | UDS_ARROWKEYS | WS_GROUP,271,180,10,13 + DEFPUSHBUTTON "OK",IDOK,204,220,50,13 + PUSHBUTTON "Cancel",IDCANCEL,260,220,50,13 END @@ -238,7 +242,7 @@ BEGIN LEFTMARGIN, 7 RIGHTMARGIN, 179 TOPMARGIN, 7 - BOTTOMMARGIN, 58 + BOTTOMMARGIN, 78 END IDD_BOOKMARKS, DIALOG @@ -273,7 +277,7 @@ BEGIN VERTGUIDE, 13 VERTGUIDE, 301 TOPMARGIN, 7 - BOTTOMMARGIN, 201 + BOTTOMMARGIN, 231 END END #endif // APSTUDIO_INVOKED @@ -432,6 +436,7 @@ BEGIN IDS_EXPORTMATCHLINENUMBER "include match line numbers" IDS_EXPORTMATCHLINECONTENT "include match line text" IDS_UPDATEAVAILABLE "grepWinNP3 %s is available" + IDS_CAPTURESEARCH "Capture search" END #endif // Neutral resources diff --git a/grepWinNP3/src/Resources/grepWin_orig.rc b/grepWinNP3/src/Resources/grepWin_orig.rc deleted file mode 100644 index 2b62f2ec0a3247d27c64344f902b20ced6465a4f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38158 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 U(K^TYJKHen=aulO=H;3H2g?V&k^lez diff --git a/grepWinNP3/src/Resources/infodlg.htm b/grepWinNP3/src/Resources/infodlg.htm index 12e454775..b7b8b83cb 100644 --- a/grepWinNP3/src/Resources/infodlg.htm +++ b/grepWinNP3/src/Resources/infodlg.htm @@ -117,7 +117,11 @@ \x{FFFF} - Matches the unicode character FFFF + Matches the unicode character 0xFFFF. Note: this only works for text files! + + + \xFF + Matches the character 0xFF $1..$9 diff --git a/grepWinNP3/src/SearchDlg.cpp b/grepWinNP3/src/SearchDlg.cpp index e7a2ef11c..aa91b8998 100644 --- a/grepWinNP3/src/SearchDlg.cpp +++ b/grepWinNP3/src/SearchDlg.cpp @@ -78,7 +78,7 @@ DWORD WINAPI SearchThreadEntry(LPVOID lpParam); DWORD WINAPI EvaluationThreadEntry(LPVOID lpParam); -UINT CSearchDlg::GREPWIN_STARTUPMSG = RegisterWindowMessage(_T("grepWinNP3_StartupMessage")); +UINT CSearchDlg::GREPWIN_STARTUPMSG = RegisterWindowMessage(L"grepWinNP3_StartupMessage"); std::map linepositions; extern ULONGLONG g_startTime; @@ -127,10 +127,13 @@ CSearchDlg::CSearchDlg(HWND hParent) , m_bConfirmationOnReplace(true) , m_bUTF8(false) , m_bUTF8C(false) + , m_bForceBinary(false) , m_bCaseSensitive(false) , m_bCaseSensitiveC(false) , m_bDotMatchesNewline(false) , m_bDotMatchesNewlineC(false) + , m_bNOTSearch(false) + , m_bCaptureSearch(false) , m_bSizeC(false) , m_bAllSize(false) , m_bReplace(false) @@ -141,23 +144,23 @@ CSearchDlg::CSearchDlg(HWND hParent) , m_Date1({0}) , m_Date2({0}) , m_bDateLimitC(false) - , m_regUseRegex(_T("Software\\grepWinNP3\\UseRegex"), 1) - , m_regAllSize(_T("Software\\grepWinNP3\\AllSize")) - , m_regSize(_T("Software\\grepWinNP3\\Size"), L"2000") - , m_regSizeCombo(_T("Software\\grepWinNP3\\SizeCombo"), 0) - , m_regIncludeSystem(_T("Software\\grepWinNP3\\IncludeSystem")) - , m_regIncludeHidden(_T("Software\\grepWinNP3\\IncludeHidden")) - , m_regIncludeSubfolders(_T("Software\\grepWinNP3\\IncludeSubfolders"), 1) - , m_regIncludeBinary(_T("Software\\grepWinNP3\\IncludeBinary"), 1) - , m_regCreateBackup(_T("Software\\grepWinNP3\\CreateBackup")) - , m_regUTF8(_T("Software\\grepWinNP3\\UTF8")) - , m_regCaseSensitive(_T("Software\\grepWinNP3\\CaseSensitive")) - , m_regDotMatchesNewline(_T("Software\\grepWinNP3\\DotMatchesNewline")) - , m_regUseRegexForPaths(_T("Software\\grepWinNP3\\UseFileMatchRegex")) - , m_regPattern(_T("Software\\grepWinNP3\\pattern")) - , m_regExcludeDirsPattern(_T("Software\\grepWinNP3\\ExcludeDirsPattern")) - , m_regSearchPath(_T("Software\\grepWinNP3\\searchpath")) - , m_regEditorCmd(_T("Software\\grepWinNP3\\editorcmd")) + , m_regUseRegex(L"Software\\grepWinNP3\\UseRegex", 1) + , m_regAllSize(L"Software\\grepWinNP3\\AllSize") + , m_regSize(L"Software\\grepWinNP3\\Size", L"2000") + , m_regSizeCombo(L"Software\\grepWinNP3\\SizeCombo", 0) + , m_regIncludeSystem(L"Software\\grepWinNP3\\IncludeSystem") + , m_regIncludeHidden(L"Software\\grepWinNP3\\IncludeHidden") + , m_regIncludeSubfolders(L"Software\\grepWinNP3\\IncludeSubfolders", 1) + , m_regIncludeBinary(L"Software\\grepWinNP3\\IncludeBinary", 1) + , m_regCreateBackup(L"Software\\grepWinNP3\\CreateBackup") + , m_regUTF8(L"Software\\grepWinNP3\\UTF8") + , m_regCaseSensitive(L"Software\\grepWinNP3\\CaseSensitive") + , m_regDotMatchesNewline(L"Software\\grepWinNP3\\DotMatchesNewline") + , m_regUseRegexForPaths(L"Software\\grepWinNP3\\UseFileMatchRegex") + , m_regPattern(L"Software\\grepWinNP3\\pattern") + , m_regExcludeDirsPattern(L"Software\\grepWinNP3\\ExcludeDirsPattern") + , m_regSearchPath(L"Software\\grepWinNP3\\searchpath") + , m_regEditorCmd(L"Software\\grepWinNP3\\editorcmd") , m_regBackupInFolder(L"Software\\grepWinNP3\\backupinfolder", FALSE) , m_regDateLimit(L"Software\\grepWinNP3\\DateLimit", 0) , m_regDate1Low(L"Software\\grepWinNP3\\Date1Low", 0) @@ -206,17 +209,19 @@ LRESULT CSearchDlg::DlgFunc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPara { SHAutoComplete(GetDlgItem(*this, IDC_SEARCHPATH), SHACF_FILESYSTEM|SHACF_AUTOSUGGEST_FORCE_ON); - m_AutoCompleteFilePatterns.Load(_T("Software\\grepWinNP3\\History"), _T("FilePattern")); + m_AutoCompleteFilePatterns.Load(L"Software\\grepWinNP3\\History", L"FilePattern"); m_AutoCompleteFilePatterns.Init(GetDlgItem(hwndDlg, IDC_PATTERN)); - m_AutoCompleteExcludeDirsPatterns.Load(_T("Software\\grepWinNP3\\History"), _T("ExcludeDirsPattern")); + m_AutoCompleteExcludeDirsPatterns.Load(L"Software\\grepWinNP3\\History", L"ExcludeDirsPattern"); m_AutoCompleteExcludeDirsPatterns.Init(GetDlgItem(hwndDlg, IDC_EXCLUDEDIRSPATTERN)); - m_AutoCompleteSearchPatterns.Load(_T("Software\\grepWinNP3\\History"), _T("SearchPattern")); + m_AutoCompleteSearchPatterns.Load(L"Software\\grepWinNP3\\History", L"SearchPattern"); m_AutoCompleteSearchPatterns.Init(GetDlgItem(hwndDlg, IDC_SEARCHTEXT)); - m_AutoCompleteReplacePatterns.Load(_T("Software\\grepWinNP3\\History"), _T("ReplacePattern")); + m_AutoCompleteReplacePatterns.Load(L"Software\\grepWinNP3\\History", L"ReplacePattern"); m_AutoCompleteReplacePatterns.Init(GetDlgItem(hwndDlg, IDC_REPLACETEXT)); - m_AutoCompleteSearchPaths.Load(_T("Software\\grepWinNP3\\History"), _T("SearchPaths")); + m_AutoCompleteSearchPaths.Load(L"Software\\grepWinNP3\\History", L"SearchPaths"); m_AutoCompleteSearchPaths.Init(GetDlgItem(hwndDlg, IDC_SEARCHPATH)); + m_link.ConvertStaticToHyperlink(hwndDlg, IDC_ABOUTLINK, L""); + m_themeCallbackId = CTheme::Instance().RegisterThemeChangeCallback( [this]() { auto bDark = CTheme::Instance().IsDarkTheme(); @@ -363,8 +368,10 @@ LRESULT CSearchDlg::DlgFunc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPara m_bCreateBackup = bPortable ? g_iniFile.GetBoolValue(L"global", L"CreateBackup", false) : !!DWORD(m_regCreateBackup); if (!m_bCreateBackupInFoldersC) m_bCreateBackupInFolders = bPortable ? g_iniFile.GetBoolValue(L"settings", L"backupinfolder", false) : !!DWORD(m_regBackupInFolder); - if (!m_bUTF8C) + if (!m_bUTF8C) { m_bUTF8 = bPortable ? g_iniFile.GetBoolValue(L"global", L"UTF8", false) : !!DWORD(m_regUTF8); + m_bForceBinary = bPortable ? !!g_iniFile.GetBoolValue(L"global", L"Binary", false) : !!DWORD(m_regBinary); + } if (!m_bDotMatchesNewlineC) m_bDotMatchesNewline = bPortable ? g_iniFile.GetBoolValue(L"global", L"DotMatchesNewline", false) : !!DWORD(m_regDotMatchesNewline); if (!m_bSizeC) @@ -388,6 +395,7 @@ LRESULT CSearchDlg::DlgFunc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPara SendDlgItemMessage(hwndDlg, IDC_INCLUDESUBFOLDERS, BM_SETCHECK, m_bIncludeSubfolders ? BST_CHECKED : BST_UNCHECKED, 0); SendDlgItemMessage(hwndDlg, IDC_CREATEBACKUP, BM_SETCHECK, m_bCreateBackup ? BST_CHECKED : BST_UNCHECKED, 0); SendDlgItemMessage(hwndDlg, IDC_UTF8, BM_SETCHECK, m_bUTF8 ? BST_CHECKED : BST_UNCHECKED, 0); + SendDlgItemMessage(hwndDlg, IDC_BINARY, BM_SETCHECK, m_bForceBinary ? BST_CHECKED : BST_UNCHECKED, 0); SendDlgItemMessage(hwndDlg, IDC_INCLUDESYSTEM, BM_SETCHECK, m_bIncludeSystem ? BST_CHECKED : BST_UNCHECKED, 0); SendDlgItemMessage(hwndDlg, IDC_INCLUDEHIDDEN, BM_SETCHECK, m_bIncludeHidden ? BST_CHECKED : BST_UNCHECKED, 0); SendDlgItemMessage(hwndDlg, IDC_INCLUDEBINARY, BM_SETCHECK, m_bIncludeBinary ? BST_CHECKED : BST_UNCHECKED, 0); @@ -432,8 +440,6 @@ LRESULT CSearchDlg::DlgFunc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPara SetFocus(GetDlgItem(hwndDlg, IDC_SEARCHTEXT)); - m_link.ConvertStaticToHyperlink(hwndDlg, IDC_ABOUTLINK, _T("")); - m_resizer.Init(hwndDlg); m_resizer.UseSizeGrip(!CTheme::Instance().IsDarkTheme()); m_resizer.AddControl(hwndDlg, IDC_HELPLABEL, RESIZER_TOPLEFT); @@ -455,7 +461,8 @@ LRESULT CSearchDlg::DlgFunc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPara m_resizer.AddControl(hwndDlg, IDC_DOTMATCHNEWLINE, RESIZER_TOPLEFT); m_resizer.AddControl(hwndDlg, IDC_REGEXOKLABEL, RESIZER_TOPRIGHT); m_resizer.AddControl(hwndDlg, IDC_CREATEBACKUP, RESIZER_TOPLEFT); - m_resizer.AddControl(hwndDlg, IDC_UTF8, RESIZER_TOPLEFTRIGHT); + m_resizer.AddControl(hwndDlg, IDC_UTF8, RESIZER_TOPLEFT); + m_resizer.AddControl(hwndDlg, IDC_BINARY, RESIZER_TOPLEFTRIGHT); m_resizer.AddControl(hwndDlg, IDC_TESTREGEX, RESIZER_TOPLEFT); m_resizer.AddControl(hwndDlg, IDC_ADDTOBOOKMARKS, RESIZER_TOPLEFT); m_resizer.AddControl(hwndDlg, IDC_BOOKMARKS, RESIZER_TOPLEFT); @@ -528,7 +535,7 @@ LRESULT CSearchDlg::DlgFunc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPara } else { - if (SHGetValue(HKEY_CURRENT_USER, _T("Software\\grepWinNP3"), _T("windowpos"), REG_NONE, &wpl, &size) == ERROR_SUCCESS) + if (SHGetValue(HKEY_CURRENT_USER, L"Software\\grepWinNP3", L"windowpos", REG_NONE, &wpl, &size) == ERROR_SUCCESS) SetWindowPlacement(*this, &wpl); else ShowWindow(*this, SW_SHOW); @@ -628,8 +635,10 @@ LRESULT CSearchDlg::DlgFunc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPara { auto sInverseSearch = TranslatedString(hResource, IDS_INVERSESEARCH); auto sSearchInFoundFiles = TranslatedString(hResource, IDS_SEARCHINFOUNDFILES); + auto sCaptureSearch = TranslatedString(hResource, IDS_CAPTURESEARCH); AppendMenu(hSplitMenu, MF_STRING, IDC_INVERSESEARCH, sInverseSearch.c_str()); - AppendMenu(hSplitMenu, MF_STRING, IDC_SEARCHINFOUNDFILES, sSearchInFoundFiles.c_str()); + AppendMenu(hSplitMenu, m_items.empty() ? MF_STRING | MF_DISABLED : MF_STRING, IDC_SEARCHINFOUNDFILES, sSearchInFoundFiles.c_str()); + AppendMenu(hSplitMenu, GetDlgItemTextLength(IDC_REPLACETEXT) ? MF_STRING : MF_STRING | MF_DISABLED, IDC_CAPTURESEARCH, sCaptureSearch.c_str()); } // Display the menu. TrackPopupMenu(hSplitMenu, TPM_LEFTALIGN | TPM_TOPALIGN, pt.x, pt.y, 0, *this, nullptr); @@ -840,44 +849,52 @@ LRESULT CSearchDlg::DlgFunc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPara EndDialog(m_hwnd, IDOK); } break; - case WM_BOOKMARK: - { - if (m_pBookmarksDlg) + case WM_BOOKMARK: { - m_searchString = m_pBookmarksDlg->GetSelectedSearchString(); - m_replaceString = m_pBookmarksDlg->GetSelectedReplaceString(); - m_bUseRegex = m_pBookmarksDlg->GetSelectedUseRegex(); - m_bCaseSensitive = m_pBookmarksDlg->GetSelectedSearchCase(); - m_bDotMatchesNewline = m_pBookmarksDlg->GetSelectedDotMatchNewline(); - m_bCreateBackup = m_pBookmarksDlg->GetSelectedBackup(); - m_bUTF8 = m_pBookmarksDlg->GetSelectedTreatAsUtf8(); - m_bIncludeSystem = m_pBookmarksDlg->GetSelectedIncludeSystem(); - m_bIncludeSubfolders = m_pBookmarksDlg->GetSelectedIncludeFolder(); - m_bIncludeHidden = m_pBookmarksDlg->GetSelectedIncludeHidden(); - m_bIncludeBinary = m_pBookmarksDlg->GetSelectedIncludeBinary(); - m_excludedirspatternregex = m_pBookmarksDlg->GetSelectedExcludeDirs(); - m_patternregex = m_pBookmarksDlg->GetSelectedFileMatch(); - m_bUseRegexForPaths = m_pBookmarksDlg->GetSelectedFileMatchRegex(); + if (m_pBookmarksDlg) + { + m_searchString = m_pBookmarksDlg->GetSelectedSearchString(); + m_replaceString = m_pBookmarksDlg->GetSelectedReplaceString(); + m_bUseRegex = m_pBookmarksDlg->GetSelectedUseRegex(); - SetDlgItemText(*this, IDC_SEARCHTEXT, m_searchString.c_str()); - SetDlgItemText(*this, IDC_REPLACETEXT, m_replaceString.c_str()); - CheckRadioButton(*this, IDC_REGEXRADIO, IDC_TEXTRADIO, m_bUseRegex ? IDC_REGEXRADIO : IDC_TEXTRADIO); - DialogEnableWindow(IDC_TESTREGEX, !IsDlgButtonChecked(*this, IDC_TEXTRADIO)); + m_bCaseSensitive = m_pBookmarksDlg->GetSelectedSearchCase(); + m_bDotMatchesNewline = m_pBookmarksDlg->GetSelectedDotMatchNewline(); + m_bCreateBackup = m_pBookmarksDlg->GetSelectedBackup(); + m_bUTF8 = m_pBookmarksDlg->GetSelectedTreatAsUtf8(); + m_bForceBinary = m_pBookmarksDlg->GetSelectedTreatAsBinary(); + m_bIncludeSystem = m_pBookmarksDlg->GetSelectedIncludeSystem(); + m_bIncludeSubfolders = m_pBookmarksDlg->GetSelectedIncludeFolder(); + m_bIncludeHidden = m_pBookmarksDlg->GetSelectedIncludeHidden(); + m_bIncludeBinary = m_pBookmarksDlg->GetSelectedIncludeBinary(); + m_excludedirspatternregex = m_pBookmarksDlg->GetSelectedExcludeDirs(); + m_patternregex = m_pBookmarksDlg->GetSelectedFileMatch(); + m_bUseRegexForPaths = m_pBookmarksDlg->GetSelectedFileMatchRegex(); + if (!m_pBookmarksDlg->GetPath().empty()) + { + m_searchpath = m_pBookmarksDlg->GetPath(); + SetDlgItemText(*this, IDC_SEARCHPATH, m_searchpath.c_str()); + } - SendDlgItemMessage(*this, IDC_INCLUDESUBFOLDERS, BM_SETCHECK, m_bIncludeSubfolders ? BST_CHECKED : BST_UNCHECKED, 0); - SendDlgItemMessage(*this, IDC_CREATEBACKUP, BM_SETCHECK, m_bCreateBackup ? BST_CHECKED : BST_UNCHECKED, 0); - SendDlgItemMessage(*this, IDC_UTF8, BM_SETCHECK, m_bUTF8 ? BST_CHECKED : BST_UNCHECKED, 0); - SendDlgItemMessage(*this, IDC_INCLUDESYSTEM, BM_SETCHECK, m_bIncludeSystem ? BST_CHECKED : BST_UNCHECKED, 0); - SendDlgItemMessage(*this, IDC_INCLUDEHIDDEN, BM_SETCHECK, m_bIncludeHidden ? BST_CHECKED : BST_UNCHECKED, 0); - SendDlgItemMessage(*this, IDC_INCLUDEBINARY, BM_SETCHECK, m_bIncludeBinary ? BST_CHECKED : BST_UNCHECKED, 0); - SendDlgItemMessage(*this, IDC_CASE_SENSITIVE, BM_SETCHECK, m_bCaseSensitive ? BST_CHECKED : BST_UNCHECKED, 0); - SendDlgItemMessage(*this, IDC_DOTMATCHNEWLINE, BM_SETCHECK, m_bDotMatchesNewline ? BST_CHECKED : BST_UNCHECKED, 0); + SetDlgItemText(*this, IDC_SEARCHTEXT, m_searchString.c_str()); + SetDlgItemText(*this, IDC_REPLACETEXT, m_replaceString.c_str()); + CheckRadioButton(*this, IDC_REGEXRADIO, IDC_TEXTRADIO, m_bUseRegex ? IDC_REGEXRADIO : IDC_TEXTRADIO); + DialogEnableWindow(IDC_TESTREGEX, !IsDlgButtonChecked(*this, IDC_TEXTRADIO)); - CheckRadioButton(*this, IDC_FILEPATTERNREGEX, IDC_FILEPATTERNTEXT, m_bUseRegexForPaths ? IDC_FILEPATTERNREGEX : IDC_FILEPATTERNTEXT); - SetDlgItemText(*this, IDC_EXCLUDEDIRSPATTERN, m_excludedirspatternregex.c_str()); - SetDlgItemText(*this, IDC_PATTERN, m_patternregex.c_str()); + SendDlgItemMessage(*this, IDC_INCLUDESUBFOLDERS, BM_SETCHECK, m_bIncludeSubfolders ? BST_CHECKED : BST_UNCHECKED, 0); + SendDlgItemMessage(*this, IDC_CREATEBACKUP, BM_SETCHECK, m_bCreateBackup ? BST_CHECKED : BST_UNCHECKED, 0); + SendDlgItemMessage(*this, IDC_UTF8, BM_SETCHECK, m_bUTF8 ? BST_CHECKED : BST_UNCHECKED, 0); + SendDlgItemMessage(*this, IDC_BINARY, BM_SETCHECK, m_bForceBinary ? BST_CHECKED : BST_UNCHECKED, 0); + SendDlgItemMessage(*this, IDC_INCLUDESYSTEM, BM_SETCHECK, m_bIncludeSystem ? BST_CHECKED : BST_UNCHECKED, 0); + SendDlgItemMessage(*this, IDC_INCLUDEHIDDEN, BM_SETCHECK, m_bIncludeHidden ? BST_CHECKED : BST_UNCHECKED, 0); + SendDlgItemMessage(*this, IDC_INCLUDEBINARY, BM_SETCHECK, m_bIncludeBinary ? BST_CHECKED : BST_UNCHECKED, 0); + SendDlgItemMessage(*this, IDC_CASE_SENSITIVE, BM_SETCHECK, m_bCaseSensitive ? BST_CHECKED : BST_UNCHECKED, 0); + SendDlgItemMessage(*this, IDC_DOTMATCHNEWLINE, BM_SETCHECK, m_bDotMatchesNewline ? BST_CHECKED : BST_UNCHECKED, 0); + + CheckRadioButton(*this, IDC_FILEPATTERNREGEX, IDC_FILEPATTERNTEXT, m_bUseRegexForPaths ? IDC_FILEPATTERNREGEX : IDC_FILEPATTERNTEXT); + SetDlgItemText(*this, IDC_EXCLUDEDIRSPATTERN, m_excludedirspatternregex.c_str()); + SetDlgItemText(*this, IDC_PATTERN, m_patternregex.c_str()); + } } - } break; default: return FALSE; @@ -893,6 +910,7 @@ LRESULT CSearchDlg::DoCommand(int id, int msg) case IDOK: case IDC_INVERSESEARCH: case IDC_SEARCHINFOUNDFILES: + case IDC_CAPTURESEARCH: { if (IsSearchThreadRunning()) { @@ -974,7 +992,7 @@ LRESULT CSearchDlg::DoCommand(int id, int msg) auto msgtext = CStringUtils::Format((LPCWSTR)TranslatedString(hResource, IDS_REPLACECONFIRM).c_str(), m_searchString.c_str(), m_replaceString.empty() ? (LPCWSTR)TranslatedString(hResource, IDS_ANEMPTYSTRING).c_str() : m_replaceString.c_str()); - if (::MessageBox(*this, msgtext.c_str(), _T("grepWinNP3"), MB_ICONQUESTION | MB_YESNO) != IDYES) + if (::MessageBox(*this, msgtext.c_str(), L"grepWinNP3", MB_ICONQUESTION | MB_YESNO) != IDYES) { break; } @@ -987,6 +1005,14 @@ LRESULT CSearchDlg::DoCommand(int id, int msg) else InterlockedExchange(&s_NOTSearch, ((GetKeyState(VK_SHIFT) & 0x8000) != 0) ? TRUE : FALSE); + m_bNOTSearch = true; + if (id == IDC_CAPTURESEARCH) + { + m_bCaptureSearch = true; + m_bNOTSearch = false; + m_bReplace = false; + } + SetDlgItemText(*this, IDOK, TranslatedString(hResource, IDS_STOP).c_str()); ShowWindow(GetDlgItem(*this, IDC_PROGRESS), SW_SHOW); @@ -1163,7 +1189,7 @@ LRESULT CSearchDlg::DoCommand(int id, int msg) TCHAR compactPath[100] = {0}; PathCompactPathEx(compactPath, buf.get(), 40, 0); TCHAR titleBuf[MAX_PATH] = {0}; - _stprintf_s(titleBuf, _countof(titleBuf), _T("grepWinNP3 : %s"), compactPath); + _stprintf_s(titleBuf, _countof(titleBuf), L"grepWinNP3 : %s", compactPath); SetWindowText(*this, titleBuf); } } @@ -1246,11 +1272,12 @@ LRESULT CSearchDlg::DoCommand(int id, int msg) // add the bookmark CBookmarks bks; Bookmark bk; - bk.Name = nameDlg.GetName(); - bk.Search = m_searchString; - bk.Replace = m_replaceString; - bk.UseRegex = m_bUseRegex; - bk.CaseSensitive = (IsDlgButtonChecked(*this, IDC_CASE_SENSITIVE) == BST_CHECKED); + bk.Path = nameDlg.IncludePath() ? m_searchpath : L""; + bk.Name = nameDlg.GetName(); + bk.Search = m_searchString; + bk.Replace = m_replaceString; + bk.UseRegex = m_bUseRegex; + bk.CaseSensitive = (IsDlgButtonChecked(*this, IDC_CASE_SENSITIVE) == BST_CHECKED); bk.DotMatchesNewline = (IsDlgButtonChecked(*this, IDC_DOTMATCHNEWLINE) == BST_CHECKED); bk.Backup = (IsDlgButtonChecked(*this, IDC_CREATEBACKUP) == BST_CHECKED); bk.Utf8 = (IsDlgButtonChecked(*this, IDC_UTF8) == BST_CHECKED); @@ -1542,6 +1569,18 @@ LRESULT CSearchDlg::DoCommand(int id, int msg) } } break; + case IDC_UTF8: + { + if (IsDlgButtonChecked(*this, IDC_UTF8)) + CheckDlgButton(*this, IDC_BINARY, BST_UNCHECKED); + } + break; + case IDC_BINARY: + { + if (IsDlgButtonChecked(*this, IDC_BINARY)) + CheckDlgButton(*this, IDC_UTF8, BST_UNCHECKED); + } + break; } return 1; } @@ -1562,7 +1601,7 @@ void CSearchDlg::SaveWndPosition() } else { - SHSetValue(HKEY_CURRENT_USER, _T("Software\\grepWinNP3"), _T("windowpos"), REG_NONE, &wpl, sizeof(wpl)); + SHSetValue(HKEY_CURRENT_USER, L"Software\\grepWinNP3", L"windowpos", REG_NONE, &wpl, sizeof(wpl)); } } @@ -2080,7 +2119,10 @@ void CSearchDlg::DoListNotify(LPNMITEMACTIVATE lpNMItemActivate) auto len = pInfo->filepath.size() - m_searchpath.size() - filepart.size(); if (len > 0) --len; - wcsncpy_s(pItem->pszText, pItem->cchTextMax, pInfo->filepath.substr(m_searchpath.size() + 1, len).c_str(), pItem->cchTextMax - 1); + if (m_searchpath.size() < pInfo->filepath.size()) + wcsncpy_s(pItem->pszText, pItem->cchTextMax, pInfo->filepath.substr(m_searchpath.size() + 1, len).c_str(), pItem->cchTextMax - 1); + else + wcsncpy_s(pItem->pszText, pItem->cchTextMax, pInfo->filepath.c_str(), pItem->cchTextMax - 1); } break; case 4: // extension of the file @@ -2340,8 +2382,8 @@ void CSearchDlg::OpenFileAtListIndex(int listIndex) application = cmdbuf.get(); // resolve parameters - if (application.find(_T("%1")) == std::wstring::npos) - application += _T(" %1"); + if (application.find(L"%1") == std::wstring::npos) + application += L" %1"; bool filelist = (IsDlgButtonChecked(*this, IDC_RESULTFILES) == BST_CHECKED); std::wstring linenumberparam_before; @@ -2372,27 +2414,27 @@ void CSearchDlg::OpenFileAtListIndex(int listIndex) // now find out if the application which opens the file is known to us // and if it has a 'linenumber' switch to jump directly to a specific // line number. - if (appname.find(_T("notepad++.exe")) != std::wstring::npos) + if (appname.find(L"notepad++.exe") != std::wstring::npos) { // notepad++ linenumberparam = CStringUtils::Format(L"-n%s", textlinebuf); } - else if (appname.find(_T("xemacs.exe")) != std::wstring::npos) + else if (appname.find(L"xemacs.exe") != std::wstring::npos) { // XEmacs linenumberparam = CStringUtils::Format(L"+%s", textlinebuf); } - else if (appname.find(_T("uedit32.exe")) != std::wstring::npos) + else if (appname.find(L"uedit32.exe") != std::wstring::npos) { // UltraEdit linenumberparam = CStringUtils::Format(L"-l%s", textlinebuf); } - else if (appname.find(_T("codewright.exe")) != std::wstring::npos) + else if (appname.find(L"codewright.exe") != std::wstring::npos) { // CodeWright linenumberparam = CStringUtils::Format(L"-G%s", textlinebuf); } - else if (appname.find(_T("notepad2.exe")) != std::wstring::npos) + else if (appname.find(L"notepad2.exe") != std::wstring::npos) { // Notepad2 auto escapedsearch = m_searchString; @@ -2420,7 +2462,7 @@ void CSearchDlg::OpenFileAtListIndex(int listIndex) // BowPad linenumberparam = CStringUtils::Format(L"/line:%s", textlinebuf); } - else if (appname.find(_T("code.exe")) != std::wstring::npos) + else if (appname.find(L"code.exe") != std::wstring::npos) { // Visual Studio Code linenumberparam_before = L"--goto"; @@ -2428,8 +2470,8 @@ void CSearchDlg::OpenFileAtListIndex(int listIndex) } // replace "%1" with %1 - std::wstring tag = _T("\"%1\""); - std::wstring repl = _T("%1"); + std::wstring tag = L"\"%1\""; + std::wstring repl = L"%1"; std::wstring::iterator it_begin = search(application.begin(), application.end(), tag.begin(), tag.end()); if (it_begin != application.end()) { @@ -2437,9 +2479,9 @@ void CSearchDlg::OpenFileAtListIndex(int listIndex) application.replace(it_begin, it_end, repl); } // replace %1 with "path/of/selected/file" - tag = _T("%1"); + tag = L"%1"; if (application.find(L"rundll32.exe") == std::wstring::npos) - repl = _T("\"") + inf.filepath + _T("\""); + repl = L"\"" + inf.filepath + L"\""; else repl = inf.filepath; if (!linenumberparam_before.empty()) @@ -2456,7 +2498,7 @@ void CSearchDlg::OpenFileAtListIndex(int listIndex) { if (!linenumberparam.starts_with(L":")) { - application += _T(" "); + application += L" "; } application += linenumberparam; } @@ -2512,7 +2554,7 @@ bool CSearchDlg::SaveSettings() m_patterns.clear(); do { - pos = _tcscspn(pBuf, _T("|")); + pos = _tcscspn(pBuf, L"|"); std::wstring s = std::wstring(pBuf, pos); if (!s.empty()) { @@ -2596,10 +2638,11 @@ bool CSearchDlg::SaveSettings() m_bIncludeSystem = (IsDlgButtonChecked(*this, IDC_INCLUDESYSTEM) == BST_CHECKED); m_bIncludeHidden = (IsDlgButtonChecked(*this, IDC_INCLUDEHIDDEN) == BST_CHECKED); m_bIncludeSubfolders = (IsDlgButtonChecked(*this, IDC_INCLUDESUBFOLDERS) == BST_CHECKED); - m_bIncludeBinary = (IsDlgButtonChecked(*this, IDC_INCLUDEBINARY) == BST_CHECKED); - m_bCreateBackup = (IsDlgButtonChecked(*this, IDC_CREATEBACKUP) == BST_CHECKED); - m_bUTF8 = (IsDlgButtonChecked(*this, IDC_UTF8) == BST_CHECKED); - m_bCaseSensitive = (IsDlgButtonChecked(*this, IDC_CASE_SENSITIVE) == BST_CHECKED); + m_bIncludeBinary = (IsDlgButtonChecked(*this, IDC_INCLUDEBINARY) == BST_CHECKED); + m_bCreateBackup = (IsDlgButtonChecked(*this, IDC_CREATEBACKUP) == BST_CHECKED); + m_bUTF8 = (IsDlgButtonChecked(*this, IDC_UTF8) == BST_CHECKED); + m_bForceBinary = (IsDlgButtonChecked(*this, IDC_BINARY) == BST_CHECKED); + m_bCaseSensitive = (IsDlgButtonChecked(*this, IDC_CASE_SENSITIVE) == BST_CHECKED); m_bDotMatchesNewline = (IsDlgButtonChecked(*this, IDC_DOTMATCHNEWLINE) == BST_CHECKED); m_DateLimit = 0; @@ -2628,6 +2671,7 @@ bool CSearchDlg::SaveSettings() g_iniFile.SetBoolValue(L"global", L"IncludeBinary", m_bIncludeBinary); g_iniFile.SetBoolValue(L"global", L"CreateBackup", m_bCreateBackup); g_iniFile.SetBoolValue(L"global", L"UTF8", m_bUTF8); + g_iniFile.SetBoolValue(L"global", L"Binary", m_bForceBinary); g_iniFile.SetBoolValue(L"global", L"CaseSensitive", m_bCaseSensitive); g_iniFile.SetBoolValue(L"global", L"DotMatchesNewline", m_bDotMatchesNewline); g_iniFile.SetValue(L"global", L"pattern", m_patternregex.c_str()); @@ -2648,6 +2692,7 @@ bool CSearchDlg::SaveSettings() m_regIncludeBinary = (DWORD)m_bIncludeBinary; m_regCreateBackup = (DWORD)m_bCreateBackup; m_regUTF8 = (DWORD)m_bUTF8; + m_regBinary = (DWORD)m_bForceBinary; m_regCaseSensitive = (DWORD)m_bCaseSensitive; m_regDotMatchesNewline = (DWORD)m_bDotMatchesNewline; m_regPattern = m_patternregex; @@ -2799,7 +2844,7 @@ DWORD CSearchDlg::SearchThread() std::vector pathvector; do { - pos = _tcscspn(pBufSearchPath, _T("|")); + pos = _tcscspn(pBufSearchPath, L"|"); std::wstring s = std::wstring(pBufSearchPath, pos); if (!s.empty()) { @@ -2960,13 +3005,15 @@ DWORD CSearchDlg::SearchThread() SearchFlags_t searchFlags = { bAlwaysSearch, m_bUTF8, + m_bForceBinary, m_bIncludeBinary, m_bUseRegex, m_bCaseSensitive, m_bDotMatchesNewline, m_bCreateBackup, m_bCreateBackupInFolders, - m_bReplace + m_bReplace, + m_bCaptureSearch }; if (nOfWorker > 1) @@ -3144,6 +3191,7 @@ void CSearchDlg::SetPreset(const std::wstring& preset) m_bDotMatchesNewline = bk.DotMatchesNewline; m_bCreateBackup = bk.Backup; m_bUTF8 = bk.Utf8; + m_bForceBinary = bk.Binary; m_bIncludeSystem = bk.IncludeSystem; m_bIncludeSubfolders = bk.IncludeFolder; m_bIncludeHidden = bk.IncludeHidden; @@ -3151,6 +3199,8 @@ void CSearchDlg::SetPreset(const std::wstring& preset) m_excludedirspatternregex = bk.ExcludeDirs; m_patternregex = bk.FileMatch; m_bUseRegexForPaths = bk.FileMatchRegex; + if (!bk.Path.empty()) + m_searchpath = bk.Path; m_bIncludeSystemC = true; m_bIncludeHiddenC = true; @@ -3231,7 +3281,7 @@ int CSearchDlg::SearchFile(std::shared_ptr sinfoPtr, const std::wst if (!searchFlags.bUseRegex) { SearchReplace(localSearchString, L"\\E", L"\\\\E"); - localSearchString = _T("\\Q") + localSearchString + _T("\\E"); + localSearchString = L"\\Q" + localSearchString + L"\\E"; } SearchReplace(localSearchString, L"${filepath}", sinfoPtr->filepath); @@ -3249,11 +3299,23 @@ int CSearchDlg::SearchFile(std::shared_ptr sinfoPtr, const std::wst } CTextFile textfile; - CTextFile::UnicodeType type = CTextFile::AUTOTYPE; - bool bLoadResult = false; + CTextFile::UnicodeType type = CTextFile::AUTOTYPE; + bool bLoadResult = false; + if (searchFlags.bForceBinary) + { + type = CTextFile::BINARY; + } + else { ProfileTimer profile((L"file load and parse: " + sinfoPtr->filepath).c_str()); - bLoadResult = textfile.Load(sinfoPtr->filepath.c_str(), type, searchFlags.bUTF8, &s_Cancelled); + auto nNullCount = bPortable ? _wtoi(g_iniFile.GetValue(L"settings", L"nullbytes", L"0")) : int(DWORD(CRegStdDWORD(L"Software\\grepWin\\nullbytes", 0))); + if (nNullCount > 0) + { + constexpr __int64 oneMB = 1024 * 1024; + auto megs = sinfoPtr->filesize / oneMB; + textfile.SetNullbyteCountForBinary(nNullCount * ((int)megs + 1)); + } + bLoadResult = textfile.Load(sinfoPtr->filepath.c_str(), type, searchFlags.bUTF8, nullptr); } sinfoPtr->encoding = type; if ((bLoadResult) && ((type != CTextFile::BINARY) || (searchFlags.bIncludeBinary) || searchFlags.bSearchAlways)) @@ -3289,7 +3351,13 @@ int CSearchDlg::SearchFile(std::shared_ptr sinfoPtr, const std::wst for (long l = linestart; l <= lineend; ++l) { auto sLine = textfile.GetLineString(l); - sinfoPtr->matchlines.push_back(sLine.substr(0, 1024)); + if (searchFlags.bCaptureSearch) + { + auto out = whatc.format(replaceString, flags); + sinfoPtr->matchlines.push_back(out); + } + else + sinfoPtr->matchlines.push_back(sLine.substr(0, 1024)); sinfoPtr->matchlinesnumbers.push_back(l); } } @@ -3322,13 +3390,22 @@ int CSearchDlg::SearchFile(std::shared_ptr sinfoPtr, const std::wst if (IsNOTSearch()) break; long linestart = textfile.LineFromPosition(long(whatc[0].first - textfile.GetFileString().begin())); - long lineend = textfile.LineFromPosition(long(whatc[0].second - textfile.GetFileString().begin())); - if ((linestart != prevlinestart) || (lineend != prevlineend)) + long lineend = textfile.LineFromPosition(long(whatc[0].second - textfile.GetFileString().begin())); + if (searchFlags.bCaptureSearch) { - for (long l = linestart; l <= lineend; ++l) + auto out = whatc.format(replaceString, flags); + sinfoPtr->matchlines.push_back(out); + sinfoPtr->matchlinesnumbers.push_back(linestart); + } + else + { + if ((linestart != prevlinestart) || (lineend != prevlineend)) { - sinfoPtr->matchlines.push_back(textfile.GetLineString(l)); - sinfoPtr->matchlinesnumbers.push_back(l); + for (long l = linestart; l <= lineend; ++l) + { + sinfoPtr->matchlines.push_back(textfile.GetLineString(l)); + sinfoPtr->matchlinesnumbers.push_back(l); + } } } ++sinfoPtr->matchcount; @@ -3658,7 +3735,7 @@ void CSearchDlg::formatDate(TCHAR date_native[], const FILETIME& filetime, bool GetDateFormat(locale, flags, &localsystime, nullptr, datebuf, GREPWIN_DATEBUFFER); GetTimeFormat(locale, 0, &localsystime, nullptr, timebuf, GREPWIN_DATEBUFFER); _tcsncat_s(date_native, GREPWIN_DATEBUFFER, datebuf, GREPWIN_DATEBUFFER); - _tcsncat_s(date_native, GREPWIN_DATEBUFFER, _T(" "), GREPWIN_DATEBUFFER); + _tcsncat_s(date_native, GREPWIN_DATEBUFFER, L" ", GREPWIN_DATEBUFFER); _tcsncat_s(date_native, GREPWIN_DATEBUFFER, timebuf, GREPWIN_DATEBUFFER); } @@ -3707,7 +3784,7 @@ int CSearchDlg::CheckRegex() } else { - SetDlgItemText(*this, IDC_REGEXOKLABEL, _T("")); + SetDlgItemText(*this, IDC_REGEXOKLABEL, L""); DialogEnableWindow(IDOK, true); DialogEnableWindow(IDC_REPLACE, false); DialogEnableWindow(IDC_CREATEBACKUP, false); @@ -3716,7 +3793,7 @@ int CSearchDlg::CheckRegex() else { m_bUseRegex = false; - SetDlgItemText(*this, IDC_REGEXOKLABEL, _T("")); + SetDlgItemText(*this, IDC_REGEXOKLABEL, L""); DialogEnableWindow(IDOK, true); DialogEnableWindow(IDC_REPLACE, len>0); DialogEnableWindow(IDC_CREATEBACKUP, len>0); diff --git a/grepWinNP3/src/SearchDlg.h b/grepWinNP3/src/SearchDlg.h index 14f00ea54..cb7e0e4ea 100644 --- a/grepWinNP3/src/SearchDlg.h +++ b/grepWinNP3/src/SearchDlg.h @@ -54,6 +54,7 @@ typedef struct _SearchFlags_t { bool bSearchAlways; bool bUTF8; + bool bForceBinary; bool bIncludeBinary; bool bUseRegex; bool bCaseSensitive; @@ -61,6 +62,7 @@ typedef struct _SearchFlags_t bool bCreateBackup; bool bBackupInFolder; bool bReplace; + bool bCaptureSearch; } SearchFlags_t; @@ -88,7 +90,8 @@ public: void SetMatchesNewline(bool bSet) {m_bDotMatchesNewlineC = true; m_bDotMatchesNewline = bSet;} void SetCreateBackups(bool bSet) { m_bCreateBackupC = true; m_bCreateBackup = bSet; m_bConfirmationOnReplace = false; } void SetCreateBackupsInFolders(bool bSet) { m_bCreateBackupInFoldersC = true; m_bCreateBackupInFolders = bSet; SetCreateBackups(bSet); } - void SetUTF8(bool bSet) {m_bUTF8C = true;m_bUTF8 = bSet;} + void SetUTF8(bool bSet) { m_bUTF8C = true; m_bUTF8 = bSet; m_bForceBinary = false; } + void SetBinary(bool bSet) { m_bUTF8C = true; m_bForceBinary = bSet; m_bUTF8 = false; } void SetSize(uint64_t size, int cmp) {m_bSizeC = true; m_lSize = size; m_sizeCmp = cmp; m_bAllSize = (size == (uint64_t)-1);} void SetIncludeSystem(bool bSet) {m_bIncludeSystemC = true; m_bIncludeSystem = bSet;} void SetIncludeHidden(bool bSet) {m_bIncludeHiddenC = true; m_bIncludeHidden = bSet;} @@ -173,10 +176,13 @@ private: bool m_bCreateBackupInFoldersC; bool m_bUTF8; bool m_bUTF8C; + bool m_bForceBinary; bool m_bCaseSensitive; bool m_bCaseSensitiveC; bool m_bDotMatchesNewline; bool m_bDotMatchesNewlineC; + bool m_bNOTSearch; + bool m_bCaptureSearch; bool m_bSizeC; bool m_endDialog; ExecuteAction m_ExecuteImmediately; @@ -233,6 +239,7 @@ private: CRegStdDWORD m_regIncludeBinary; CRegStdDWORD m_regCreateBackup; CRegStdDWORD m_regUTF8; + CRegStdDWORD m_regBinary; CRegStdDWORD m_regCaseSensitive; CRegStdDWORD m_regDotMatchesNewline; CRegStdDWORD m_regUseRegexForPaths; diff --git a/grepWinNP3/src/Settings.cpp b/grepWinNP3/src/Settings.cpp index f75a8f4be..60e9fec48 100644 --- a/grepWinNP3/src/Settings.cpp +++ b/grepWinNP3/src/Settings.cpp @@ -189,6 +189,7 @@ LRESULT CSettingsDlg::DlgFunc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPa #endif SendDlgItemMessage(hwndDlg, IDC_DARKMODE, BM_SETCHECK, CTheme::Instance().IsDarkTheme() ? BST_CHECKED : BST_UNCHECKED, 0); EnableWindow(GetDlgItem(*this, IDC_DARKMODE), CTheme::Instance().IsDarkModeAllowed()); + SetDlgItemText(*this, IDC_NUMNULL, bPortable ? g_iniFile.GetValue(L"settings", L"nullbytes", L"0") : std::to_wstring(DWORD(CRegStdDWORD(L"Software\\grepWin\\nullbytes", 0))).c_str()); DWORD const nMaxWorker = std::thread::hardware_concurrency() << 2; SendDlgItemMessage(hwndDlg, IDC_SPIN_MAXWORKER, UDM_SETRANGE, 0, MAKELPARAM(nMaxWorker, 1)); @@ -210,6 +211,7 @@ LRESULT CSettingsDlg::DlgFunc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPa m_resizer.AddControl(hwndDlg, IDC_STATIC2, RESIZER_TOPLEFTRIGHT); m_resizer.AddControl(hwndDlg, IDC_STATIC3, RESIZER_TOPLEFT); m_resizer.AddControl(hwndDlg, IDC_STATIC4, RESIZER_TOPLEFT); + m_resizer.AddControl(hwndDlg, IDC_NUMNULL, RESIZER_TOPRIGHT); m_resizer.AddControl(hwndDlg, IDC_LANGUAGE, RESIZER_TOPRIGHT); m_resizer.AddControl(hwndDlg, IDC_ESCKEY, RESIZER_TOPLEFTRIGHT); m_resizer.AddControl(hwndDlg, IDC_BACKUPINFOLDER, RESIZER_TOPLEFTRIGHT); @@ -220,11 +222,11 @@ LRESULT CSettingsDlg::DlgFunc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPa #endif m_resizer.AddControl(hwndDlg, IDC_DARKMODE, RESIZER_TOPLEFT); m_resizer.AddControl(hwndDlg, IDC_DARKMODEINFO, RESIZER_TOPLEFTRIGHT); + m_resizer.AddControl(hwndDlg, IDC_TEXT_NUMOFWORKER, RESIZER_TOPRIGHT); + m_resizer.AddControl(hwndDlg, IDC_MAXNUMWORKER, RESIZER_TOPRIGHT); + m_resizer.AddControl(hwndDlg, IDC_SPIN_MAXWORKER, RESIZER_TOPRIGHT); m_resizer.AddControl(hwndDlg, IDOK, RESIZER_BOTTOMRIGHT); m_resizer.AddControl(hwndDlg, IDCANCEL, RESIZER_BOTTOMRIGHT); - m_resizer.AddControl(hwndDlg, IDC_TEXT_NUMOFWORKER, RESIZER_BOTTOMRIGHT); - m_resizer.AddControl(hwndDlg, IDC_MAXNUMWORKER, RESIZER_BOTTOMRIGHT); - m_resizer.AddControl(hwndDlg, IDC_SPIN_MAXWORKER, RESIZER_BOTTOMRIGHT); } return TRUE; case WM_COMMAND: @@ -301,6 +303,7 @@ LRESULT CSettingsDlg::DoCommand(int id, int /*msg*/) wchar_t worker[32]; SendDlgItemMessage(*this, IDC_MAXNUMWORKER, WM_GETTEXT, (LPARAM)32, (WPARAM)worker); long const nWorker = _wtol((wchar_t*)worker); + std::wstring sNumNull = GetDlgItemText(IDC_NUMNULL).get(); if (bPortable) { @@ -311,6 +314,7 @@ LRESULT CSettingsDlg::DoCommand(int id, int /*msg*/) #ifdef NP3_ALLOW_UPDATE g_iniFile.SetBoolValue(L"global", L"CheckForUpdates", (IsDlgButtonChecked(*this, IDC_DOUPDATECHECKS) == BST_CHECKED)); #endif + g_iniFile.SetValue(L"settings", L"nullbytes", sNumNull.c_str()); g_iniFile.SetLongValue(L"global", L"MaxNumOfWorker", nWorker); } else @@ -327,8 +331,10 @@ LRESULT CSettingsDlg::DoCommand(int id, int /*msg*/) CRegStdDWORD regCheckForUpdates(L"Software\\grepWinNP3\\CheckForUpdates", FALSE); regCheckForUpdates = (IsDlgButtonChecked(*this, IDC_DOUPDATECHECKS) == BST_CHECKED); #endif - CRegStdDWORD nwrk(L"Software\\grepWinNP3\\MaxNumOfWorker", 1); - nwrk = nWorker; + CRegStdDWORD regNumNull(L"Software\\grepWinNP3\\nullbytes", FALSE); + regNumNull = _wtoi(sNumNull.c_str()); + CRegStdDWORD regNumWorker(L"Software\\grepWinNP3\\MaxNumOfWorker", 1); + regNumWorker = nWorker; } CTheme::Instance().SetDarkTheme(IsDlgButtonChecked(*this, IDC_DARKMODE) == BST_CHECKED); } diff --git a/grepWinNP3/src/ShellContextMenu.cpp b/grepWinNP3/src/ShellContextMenu.cpp index ba7a76da6..bb2d3fb8e 100644 --- a/grepWinNP3/src/ShellContextMenu.cpp +++ b/grepWinNP3/src/ShellContextMenu.cpp @@ -1,6 +1,6 @@ // grepWin - regex search and replace for Windows -// Copyright (C) 2007-2015, 2017 - Stefan Kueng +// Copyright (C) 2007-2015, 2017, 2020 - Stefan Kueng // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License @@ -272,15 +272,15 @@ UINT CShellContextMenu::ShowContextMenu(HWND hWnd, POINT pt) case 1: { // This is the command line for explorer which tells it to select the given file - std::wstring sFolder = _T( "/Select,\"" ) + m_strVector[0].filepath + _T("\""); + std::wstring sFolder = L"/Select,\"" + m_strVector[0].filepath + L"\""; // Prepare shell execution params SHELLEXECUTEINFO shExecInfo = { 0 }; shExecInfo.cbSize = sizeof(shExecInfo); - shExecInfo.lpFile = _T("explorer.exe"); + shExecInfo.lpFile = L"explorer.exe"; shExecInfo.lpParameters = sFolder.c_str(); shExecInfo.nShow = SW_SHOWNORMAL; - shExecInfo.lpVerb = _T("open"); // Context menu item + shExecInfo.lpVerb = L"open"; // Context menu item shExecInfo.fMask = SEE_MASK_INVOKEIDLIST | SEE_MASK_FLAG_DDEWAIT | SEE_MASK_FLAG_NO_UI; // Select file in explorer @@ -293,7 +293,7 @@ UINT CShellContextMenu::ShowContextMenu(HWND hWnd, POINT pt) for (auto it = m_strVector.begin(); it != m_strVector.end(); ++it) { if (!pathnames.empty()) - pathnames += _T("\r\n"); + pathnames += L"\r\n"; pathnames += it->filepath; } WriteAsciiStringToClipboard(pathnames.c_str(), hWnd); @@ -305,7 +305,7 @@ UINT CShellContextMenu::ShowContextMenu(HWND hWnd, POINT pt) for (auto it = m_strVector.begin(); it != m_strVector.end(); ++it) { if (!pathnames.empty()) - pathnames += _T("\r\n"); + pathnames += L"\r\n"; std::wstring p = it->filepath; p = p.substr(p.find_last_of('\\')+1); pathnames += p; @@ -319,7 +319,7 @@ UINT CShellContextMenu::ShowContextMenu(HWND hWnd, POINT pt) for (auto it = m_lineVector.begin(); it != m_lineVector.end(); ++it) { if (!lines.empty()) - lines += _T("\r\n"); + lines += L"\r\n"; for (auto it2 = it->lines.cbegin(); it2 != it->lines.cend(); ++it2) { std::wstring l = it2->text; diff --git a/grepWinNP3/src/grepWin.cpp b/grepWinNP3/src/grepWin.cpp index f632dd4f0..1c552996d 100644 --- a/grepWinNP3/src/grepWin.cpp +++ b/grepWinNP3/src/grepWin.cpp @@ -38,7 +38,7 @@ CSimpleIni g_iniFile; HANDLE hInitProtection = nullptr; ULONGLONG g_startTime = GetTickCount64(); -UINT GREPWIN_STARTUPMSG = RegisterWindowMessage(_T("grepWinNP3_StartupMessage")); +UINT GREPWIN_STARTUPMSG = RegisterWindowMessage(L"grepWinNP3_StartupMessage"); static std::wstring SanitizeSearchPaths(const std::wstring& searchpath) { @@ -167,7 +167,7 @@ int APIENTRY _tWinMain(HINSTANCE hInstance, icex.dwICC = ICC_LINK_CLASS | ICC_LISTVIEW_CLASSES | ICC_PAGESCROLLER_CLASS | ICC_PROGRESS_CLASS | ICC_STANDARD_CLASSES | ICC_TAB_CLASSES | ICC_TREEVIEW_CLASSES | ICC_UPDOWN_CLASS | ICC_USEREX_CLASSES | ICC_WIN95_CLASSES; InitCommonControlsEx(&icex); - HMODULE hRichEdt = LoadLibrary(_T("Riched20.dll")); + HMODULE hRichEdt = LoadLibrary(L"Riched20.dll"); CCmdLineParser parser(lpCmdLine); @@ -218,9 +218,9 @@ int APIENTRY _tWinMain(HINSTANCE hInstance, } while ((hWnd == nullptr) && alreadyRunning && timeout); } auto modulename = CPathUtils::GetFileName(CPathUtils::GetModulePath(nullptr)); - bPortable = ((_tcsstr(modulename.c_str(), _T("portable"))) || - (_tcsstr(modulename.c_str(), _T("NP3"))) || - (parser.HasKey(_T("portable")))); + bPortable = ((_tcsstr(modulename.c_str(), L"portable")) || + (_tcsstr(modulename.c_str(), L"NP3")) || + (parser.HasKey(L"portable"))); std::wstring iniPath = CPathUtils::GetModuleDir(nullptr); iniPath += L"\\grepWinNP3.ini"; @@ -246,7 +246,7 @@ int APIENTRY _tWinMain(HINSTANCE hInstance, if (hWnd) { bool bOnlyOne = bPortable ? g_iniFile.GetBoolValue(L"global", L"onlyone", L"false") : - !!DWORD(CRegStdDWORD(_T("Software\\grepWinNP3\\onlyone"), 0)); + !!DWORD(CRegStdDWORD(L"Software\\grepWinNP3\\onlyone", 0)); if (SendMessage(hWnd, GREPWIN_STARTUPMSG, 1, 0)) // check if grepWin was started moments ago { @@ -254,11 +254,11 @@ int APIENTRY _tWinMain(HINSTANCE hInstance, // grepWin was started just moments ago: // add the new path to the existing search path in that grepWin instance - std::wstring spath = parser.HasVal(L"searchpath") ? parser.GetVal(_T("searchpath")) : + std::wstring spath = parser.HasVal(L"searchpath") ? parser.GetVal(L"searchpath") : (bPortable ? g_iniFile.GetValue(L"global", L"searchpath", L"") : L""); SearchReplace(spath, L"/", L"\\"); spath = SanitizeSearchPaths(spath); - std::wstring searchfor = parser.HasVal(_T("searchfor")) ? parser.GetVal(_T("searchfor")) : + std::wstring searchfor = parser.HasVal(L"searchfor") ? parser.GetVal(L"searchfor") : (bPortable ? g_iniFile.GetValue(L"global", L"searchfor", L"") : L""); COPYDATASTRUCT CopyData = {0}; CopyData.lpData = (LPVOID)spath.c_str(); @@ -271,11 +271,11 @@ int APIENTRY _tWinMain(HINSTANCE hInstance, } else if (bOnlyOne) { - std::wstring spath = parser.HasVal(L"searchpath") ? parser.GetVal(_T("searchpath")) : + std::wstring spath = parser.HasVal(L"searchpath") ? parser.GetVal(L"searchpath") : (bPortable ? g_iniFile.GetValue(L"global", L"searchpath", L"") : L""); SearchReplace(spath, L"/", L"\\"); spath = SanitizeSearchPaths(spath); - std::wstring searchfor = parser.HasVal(_T("searchfor")) ? parser.GetVal(_T("searchfor")) : + std::wstring searchfor = parser.HasVal(L"searchfor") ? parser.GetVal(L"searchfor") : (bPortable ? g_iniFile.GetValue(L"global", L"searchfor", L"") : L""); COPYDATASTRUCT CopyData = {0}; CopyData.lpData = (LPVOID)spath.c_str(); @@ -315,7 +315,7 @@ int APIENTRY _tWinMain(HINSTANCE hInstance, else CLanguage::Instance().LoadFile(std::wstring(CRegStdString(L"Software\\grepWinNP3\\languagefile"))); - if (parser.HasKey(_T("about"))||parser.HasKey(_T("?"))||parser.HasKey(_T("help"))) + if (parser.HasKey(L"about")||parser.HasKey(_T("?"))||parser.HasKey(L"help")) { if (hInitProtection) CloseHandle(hInitProtection); @@ -326,55 +326,57 @@ int APIENTRY _tWinMain(HINSTANCE hInstance, { CSearchDlg searchDlg(nullptr); - std::wstring spath = parser.HasVal(L"searchpath") ? parser.GetVal(_T("searchpath")) : + std::wstring spath = parser.HasVal(L"searchpath") ? parser.GetVal(L"searchpath") : (bPortable ? g_iniFile.GetValue(L"global", L"searchpath", L"") : L""); SearchReplace(spath, L"/", L"\\"); spath = SanitizeSearchPaths(spath); searchDlg.SetSearchPath(spath); - std::wstring searchfor = parser.HasVal(_T("searchfor")) ? parser.GetVal(_T("searchfor")) : + std::wstring searchfor = parser.HasVal(L"searchfor") ? parser.GetVal(L"searchfor") : (bPortable ? g_iniFile.GetValue(L"global", L"searchfor", L"") : L""); searchDlg.SetSearchString(searchfor); - if (parser.HasVal(_T("filemaskregex"))) - searchDlg.SetFileMask(parser.GetVal(_T("filemaskregex")), true); - if (parser.HasVal(_T("filemask"))) - searchDlg.SetFileMask(parser.GetVal(_T("filemask")), false); - if (parser.HasVal(_T("direxcluderegex"))) - searchDlg.SetDirExcludeRegexMask(parser.GetVal(_T("direxcluderegex"))); - else if (parser.HasVal(_T("filemaskexclude"))) - searchDlg.SetDirExcludeRegexMask(parser.GetVal(_T("filemaskexclude"))); - if (parser.HasVal(_T("replacewith"))) - searchDlg.SetReplaceWith(parser.GetVal(_T("replacewith"))); - if (parser.HasVal(_T("preset"))) - searchDlg.SetPreset(parser.GetVal(_T("preset"))); + if (parser.HasVal(L"filemaskregex")) + searchDlg.SetFileMask(parser.GetVal(L"filemaskregex"), true); + if (parser.HasVal(L"filemask")) + searchDlg.SetFileMask(parser.GetVal(L"filemask"), false); + if (parser.HasVal(L"direxcluderegex")) + searchDlg.SetDirExcludeRegexMask(parser.GetVal(L"direxcluderegex")); + else if (parser.HasVal(L"filemaskexclude")) + searchDlg.SetDirExcludeRegexMask(parser.GetVal(L"filemaskexclude")); + if (parser.HasVal(L"replacewith")) + searchDlg.SetReplaceWith(parser.GetVal(L"replacewith")); + if (parser.HasVal(L"preset")) + searchDlg.SetPreset(parser.GetVal(L"preset")); - if (parser.HasVal(_T("i"))) - searchDlg.SetCaseSensitive(_tcsicmp(parser.GetVal(_T("i")), _T("yes"))!=0); - if (parser.HasVal(_T("n"))) - searchDlg.SetMatchesNewline(_tcsicmp(parser.GetVal(_T("n")), _T("yes"))==0); - if (parser.HasVal(_T("k"))) - searchDlg.SetCreateBackups(_tcsicmp(parser.GetVal(_T("k")), _T("yes"))==0); - if (parser.HasVal(_T("utf8"))) - searchDlg.SetUTF8(_tcsicmp(parser.GetVal(_T("utf8")), _T("yes"))==0); - if (parser.HasVal(_T("size"))) + if (parser.HasVal(L"i")) + searchDlg.SetCaseSensitive(_tcsicmp(parser.GetVal(L"i"), L"yes")!=0); + if (parser.HasVal(L"n")) + searchDlg.SetMatchesNewline(_tcsicmp(parser.GetVal(L"n"), L"yes")==0); + if (parser.HasVal(L"k")) + searchDlg.SetCreateBackups(_tcsicmp(parser.GetVal(L"k"), L"yes")==0); + if (parser.HasVal(L"utf8")) + searchDlg.SetUTF8(_tcsicmp(parser.GetVal(L"utf8"), L"yes")==0); + if (parser.HasVal(L"binary")) + searchDlg.SetBinary(_tcsicmp(parser.GetVal(L"binary"), L"yes") == 0); + if (parser.HasVal(L"size")) { int cmp = 0; - if (parser.HasVal(_T("sizecmp"))) - cmp = parser.GetLongVal(_T("sizecmp")); - searchDlg.SetSize(parser.GetLongVal(_T("size")), cmp); + if (parser.HasVal(L"sizecmp")) + cmp = parser.GetLongVal(L"sizecmp"); + searchDlg.SetSize(parser.GetLongVal(L"size"), cmp); } - if (parser.HasVal(_T("s"))) - searchDlg.SetIncludeSystem(_tcsicmp(parser.GetVal(_T("s")), _T("yes"))==0); - if (parser.HasVal(_T("h"))) - searchDlg.SetIncludeHidden(_tcsicmp(parser.GetVal(_T("h")), _T("yes"))==0); - if (parser.HasVal(_T("u"))) - searchDlg.SetIncludeSubfolders(_tcsicmp(parser.GetVal(_T("u")), _T("yes"))==0); - if (parser.HasVal(_T("b"))) - searchDlg.SetIncludeBinary(_tcsicmp(parser.GetVal(_T("b")), _T("yes"))==0); - if (parser.HasVal(_T("regex"))) - searchDlg.SetUseRegex(_tcsicmp(parser.GetVal(_T("regex")), _T("yes")) == 0); - else if(parser.HasVal(_T("searchfor"))) + if (parser.HasVal(L"s")) + searchDlg.SetIncludeSystem(_tcsicmp(parser.GetVal(L"s"), L"yes")==0); + if (parser.HasVal(L"h")) + searchDlg.SetIncludeHidden(_tcsicmp(parser.GetVal(L"h"), L"yes")==0); + if (parser.HasVal(L"u")) + searchDlg.SetIncludeSubfolders(_tcsicmp(parser.GetVal(L"u"), L"yes")==0); + if (parser.HasVal(L"b")) + searchDlg.SetIncludeBinary(_tcsicmp(parser.GetVal(L"b"), L"yes")==0); + if (parser.HasVal(L"regex")) + searchDlg.SetUseRegex(_tcsicmp(parser.GetVal(L"regex"), L"yes") == 0); + else if(parser.HasVal(L"searchfor")) searchDlg.SetUseRegex(true); if (parser.HasKey(L"execute") || parser.HasKey(L"executesearch")) diff --git a/grepWinNP3/src/last/version.h b/grepWinNP3/src/last/version.h index 717e9bc21..34af090bb 100644 --- a/grepWinNP3/src/last/version.h +++ b/grepWinNP3/src/last/version.h @@ -6,13 +6,13 @@ //#pragma message(__LOC__"Run the NAnt script to get proper version info") -#define FILEVER 2, 1, 2, 16 -#define PRODUCTVER 2, 1, 2, 16 -#define STRFILEVER "2.1.2.16\0" -#define STRPRODUCTVER "2.1.2.16\0" +#define FILEVER 2, 1, 2, 17 +#define PRODUCTVER 2, 1, 2, 17 +#define STRFILEVER "2.1.2.17\0" +#define STRPRODUCTVER "2.1.2.17\0" #define GREPWIN_VERMAJOR 2 #define GREPWIN_VERMINOR 1 #define GREPWIN_VERMICRO 2 -#define GREPWIN_VERBUILD 16 -#define GREPWIN_VERDATE "2020-07-02" +#define GREPWIN_VERBUILD 17 +#define GREPWIN_VERDATE "2020-07-12" diff --git a/grepWinNP3/src/resource.h b/grepWinNP3/src/resource.h index cd260f191..51842e937 100644 --- a/grepWinNP3/src/resource.h +++ b/grepWinNP3/src/resource.h @@ -1,6 +1,6 @@ //{{NO_DEPENDENCIES}} // Microsoft Visual C++ generated include file. -// Used by D:\_projects\_github\Notepad3\grepWinNP3\src\Resources\grepWin.rc +// Used by Notepad3\grepWinNP3\src\Resources\grepWin.rc // encoding: CP-1252 #define IDS_APP_TITLE 103 #define IDS_NAME 104 @@ -79,6 +79,7 @@ #define IDS_EXPORTMATCHLINENUMBER 166 #define IDS_EXPORTMATCHLINECONTENT 167 #define IDS_UPDATEAVAILABLE 168 +#define IDS_CAPTURESEARCH 169 #define IDC_SEARCHTEXT 1000 #define IDC_REGEXRADIO 1001 #define IDC_TEXTRADIO 1002 @@ -125,7 +126,8 @@ #define IDC_DOTMATCHNEWLINE 1051 #define IDC_ABOUTLINK 1052 #define IDC_UTF8 1053 -#define IDC_RESETDEFAULT 1054 +#define IDC_UTF9 1054 +#define IDC_BINARY 1054 #define IDC_INFOLABEL 1056 #define IDC_RESULTFILES 1059 #define IDC_RADIO2 1060 @@ -135,6 +137,7 @@ #define IDC_EDITMULTILINE1 1061 #define IDC_CHECK1 1062 #define IDC_ESCKEY 1062 +#define IDC_INCLUDEPATH 1062 #define IDC_EDITMULTILINE2 1063 #define IDC_ONLYONE 1063 #define IDC_PATHMRU 1064 @@ -154,36 +157,43 @@ #define IDC_DWM 1076 #define IDC_BACKUPINFOLDER 1077 #define IDC_RADIO_DATE_ALL 1078 +#define IDC_BACKUPINFOLDER2 1078 +#define IDC_NOWARNINGIFNOBACKUP 1078 #define IDC_RADIO_DATE_NEWER 1079 #define IDC_RADIO_DATE_OLDER 1080 #define IDC_RADIO_DATE_BETWEEN 1081 #define IDC_DATEPICK1 1082 #define IDC_DATEPICK2 1083 -#define IDC_DARKMODEINFO 1084 -#define IDC_NP3_DISCLAIMER 1085 -#define IDC_SPIN_MAXWORKER 1086 -#define IDC_MAXNUMWORKER 1087 -#define IDC_TEXT_NUMOFWORKER 1088 -#define IDC_BACKUPINFOLDER2 1089 -#define IDC_NOWARNINGIFNOBACKUP 1090 -#define IDC_INVERSESEARCH 1091 -#define IDC_SEARCHINFOUNDFILES 1092 -#define IDC_EXPORT 1093 -#define IDC_UPDATELINK 1094 -#define IDC_DOUPDATECHECKS 1095 +#define IDC_DARKMODEINFO 1083 +#define IDC_INVERSESEARCH 1084 +#define IDC_SEARCHINFOUNDFILES 1085 +#define IDC_EXPORT 1086 +#define IDC_UPDATELINK 1087 +#define IDC_DOUPDATECHECKS 1088 +#define IDC_CAPTURESEARCH 1089 +#define IDC_STATIC5 1090 +#define IDC_NUMNULL 1091 + +#define IDC_RESETDEFAULT 3000 +#define IDC_NP3_DISCLAIMER 3001 +#define IDC_SPIN_MAXWORKER 3002 +#define IDC_MAXNUMWORKER 3003 +#define IDC_TEXT_NUMOFWORKER 3004 + + #define ID_REMOVEBOOKMARK 32771 #define ID_DUMMY_RENAMEPRESET 32774 #define ID_RENAMEBOOKMARK 32775 #define IDC_STATIC -1 // Next default values for new objects -// +// #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NO_MFC 1 -#define _APS_NEXT_RESOURCE_VALUE 169 +#define _APS_NEXT_RESOURCE_VALUE 139 #define _APS_NEXT_COMMAND_VALUE 32776 -#define _APS_NEXT_CONTROL_VALUE 1096 +#define _APS_NEXT_CONTROL_VALUE 1091 #define _APS_NEXT_SYMED_VALUE 110 #endif #endif