diff --git a/src/Edit.c b/src/Edit.c index f99c51fe5..5c4a797ce 100644 --- a/src/Edit.c +++ b/src/Edit.c @@ -4952,7 +4952,7 @@ static void _DelayMarkAll(HWND hwnd, int delay, DocPos iStartPos) // // EditFindReplaceDlgProcW() // -static char g_lastFind[FNDRPL_BUFFER] = { L'\0' }; +static char s_lastFind[FNDRPL_BUFFER] = { L'\0' }; INT_PTR CALLBACK EditFindReplaceDlgProcW(HWND hwnd,UINT umsg,WPARAM wParam,LPARAM lParam) { @@ -4971,11 +4971,12 @@ INT_PTR CALLBACK EditFindReplaceDlgProcW(HWND hwnd,UINT umsg,WPARAM wParam,LPARA static int iSaveMarkOcc = -1; static bool bSaveOccVisible = false; - static bool bSaveTFBackSlashes = false; + static bool _bRestoreMarkOcc = true; WCHAR tchBuf[FNDRPL_BUFFER] = { L'\0' }; + switch (umsg) { case WM_INITDIALOG: @@ -4993,6 +4994,7 @@ INT_PTR CALLBACK EditFindReplaceDlgProcW(HWND hwnd,UINT umsg,WPARAM wParam,LPARA iSaveMarkOcc = s_bSwitchedFindReplace ? iSaveMarkOcc : Settings.MarkOccurrences; bSaveOccVisible = s_bSwitchedFindReplace ? bSaveOccVisible : Settings.MarkOccurrencesMatchVisible; + _bRestoreMarkOcc = sg_pefrData->bMarkOccurences; //const WORD wTabSpacing = (WORD)SendMessage(sg_pefrData->hwnd, SCI_GETTABWIDTH, 0, 0);; // dialog box units //SendDlgItemMessage(hwnd, IDC_FINDTEXT, EM_SETTABSTOPS, 1, (LPARAM)&wTabSpacing); @@ -5062,6 +5064,12 @@ INT_PTR CALLBACK EditFindReplaceDlgProcW(HWND hwnd,UINT umsg,WPARAM wParam,LPARA DialogEnableWindow(hwnd, IDC_DOT_MATCH_ALL, false); } + // switch off "mark all occ" in case of initial replace dialog on multiline selection + if (GetDlgItem(hwnd, IDC_REPLACE) && !s_bSwitchedFindReplace) { + if (Sci_IsMultiLineSelection()) { + sg_pefrData->bMarkOccurences = false; + } + } if (sg_pefrData->bMarkOccurences) { Settings.MarkOccurrences = 0; Settings.MarkOccurrencesMatchVisible = false; @@ -5155,6 +5163,7 @@ INT_PTR CALLBACK EditFindReplaceDlgProcW(HWND hwnd,UINT umsg,WPARAM wParam,LPARA } } sg_pefrData->szFind[0] = '\0'; + sg_pefrData->bMarkOccurences = _bRestoreMarkOcc; Settings.MarkOccurrences = iSaveMarkOcc; Settings.MarkOccurrencesMatchVisible = bSaveOccVisible; @@ -5225,7 +5234,8 @@ INT_PTR CALLBACK EditFindReplaceDlgProcW(HWND hwnd,UINT umsg,WPARAM wParam,LPARA EditEnsureSelectionVisible(Globals.hwndEdit); - DialogEnableWindow(hwnd, IDC_REPLACEINSEL, !SciCall_IsSelectionEmpty()); + bool const bEnableReplInSel = !(SciCall_IsSelectionEmpty() || SciCall_IsSelectionRectangle()); + DialogEnableWindow(hwnd, IDC_REPLACEINSEL, bEnableReplInSel); break; } @@ -5318,13 +5328,13 @@ INT_PTR CALLBACK EditFindReplaceDlgProcW(HWND hwnd,UINT umsg,WPARAM wParam,LPARA StringCchCopyNA(szFind, FNDRPL_BUFFER, szCmpBuf, FNDRPL_BUFFER); } - bool bEnableF = (GetWindowTextLengthW(GetDlgItem(hwnd, IDC_FINDTEXT)) || + bool const bEnableF = (GetWindowTextLengthW(GetDlgItem(hwnd, IDC_FINDTEXT)) || CB_ERR != SendDlgItemMessage(hwnd, IDC_FINDTEXT, CB_GETCURSEL, 0, 0)); - bool bEnableR = (GetWindowTextLengthW(GetDlgItem(hwnd, IDC_REPLACETEXT)) || + bool const bEnableR = (GetWindowTextLengthW(GetDlgItem(hwnd, IDC_REPLACETEXT)) || CB_ERR != SendDlgItemMessage(hwnd, IDC_REPLACETEXT, CB_GETCURSEL, 0, 0)); - bool bEnableIS = !(bool)SendMessage(Globals.hwndEdit, SCI_GETSELECTIONEMPTY, 0, 0); + bool const bEnableIS = !(SciCall_IsSelectionEmpty() || SciCall_IsSelectionRectangle()); DialogEnableWindow(hwnd, IDOK, bEnableF); DialogEnableWindow(hwnd, IDC_FINDPREV, bEnableF); @@ -5351,10 +5361,10 @@ INT_PTR CALLBACK EditFindReplaceDlgProcW(HWND hwnd,UINT umsg,WPARAM wParam,LPARA { _SetSearchFlags(hwnd, sg_pefrData); if (sg_pefrData->bMarkOccurences) { - if (sg_pefrData->bStateChanged || (StringCchCompareXA(g_lastFind, sg_pefrData->szFind) != 0)) { + if (sg_pefrData->bStateChanged || (StringCchCompareXA(s_lastFind, sg_pefrData->szFind) != 0)) { _IGNORE_NOTIFY_CHANGE_; if (EditToggleView(Globals.hwndEdit, false)) { _DeleteLineStateAll(LINESTATE_OCCURRENCE_MARK); } - StringCchCopyA(g_lastFind, COUNTOF(g_lastFind), sg_pefrData->szFind); + StringCchCopyA(s_lastFind, COUNTOF(s_lastFind), sg_pefrData->szFind); RegExResult_t match = _FindHasMatch(Globals.hwndEdit, sg_pefrData, 0, (sg_pefrData->bMarkOccurences), false); if (s_anyMatch != match) { s_anyMatch = match; } // we have to set Sci's regex instance to first find (have substitution in place) @@ -5391,6 +5401,7 @@ INT_PTR CALLBACK EditFindReplaceDlgProcW(HWND hwnd,UINT umsg,WPARAM wParam,LPARA { iSaveMarkOcc = Settings.MarkOccurrences; bSaveOccVisible = Settings.MarkOccurrencesMatchVisible; + _bRestoreMarkOcc = true; Settings.MarkOccurrences = 0; Settings.MarkOccurrencesMatchVisible = false; @@ -5403,6 +5414,7 @@ INT_PTR CALLBACK EditFindReplaceDlgProcW(HWND hwnd,UINT umsg,WPARAM wParam,LPARA else { // switched OFF Settings.MarkOccurrences = iSaveMarkOcc; Settings.MarkOccurrencesMatchVisible = bSaveOccVisible; + _bRestoreMarkOcc = false; //DialogEnableWindow(hwnd, IDC_TOGGLE_VISIBILITY, (Settings.MarkOccurrences > 0) && !Settings.MarkOccurrencesMatchVisible); DialogEnableWindow(hwnd, IDC_TOGGLE_VISIBILITY, false); if (EditToggleView(Globals.hwndEdit, false)) { diff --git a/src/Notepad3.c b/src/Notepad3.c index f9cfa2e5b..07a3bf5b3 100644 --- a/src/Notepad3.c +++ b/src/Notepad3.c @@ -84,8 +84,7 @@ static WCHAR s_wchTmpFilePath[MAX_PATH + 1] = { L'\0' }; static WCHAR* const s_tchAvailableLanguages = L"af-ZA be-BY de-DE es-ES en-GB fr-FR ja-JP nl-NL ru-RU zh-CN"; // en-US internal -static int s_iSettingsVersion = CFG_VER_NONE; -static bool s_bSaveSettings = true; +static int s_iSettingsVersion = CFG_VER_CURRENT; static bool s_bEnableSaveSettings = true; static prefix_t s_mxSBPrefix[STATUS_SECTOR_COUNT]; @@ -2950,7 +2949,7 @@ LRESULT MsgInitMenu(HWND hwnd, WPARAM wParam, LPARAM lParam) CheckMenuRadioItem(hmenu,IDM_VIEW_NOESCFUNC,IDM_VIEW_ESCEXIT,i,MF_BYCOMMAND); i = (int)StringCchLenW(Globals.IniFile,COUNTOF(Globals.IniFile)); - CheckCmd(hmenu,IDM_VIEW_SAVESETTINGS,s_bSaveSettings && i); + CheckCmd(hmenu,IDM_VIEW_SAVESETTINGS,Settings.SaveSettings && i); EnableCmd(hmenu,IDM_VIEW_REUSEWINDOW,i); EnableCmd(hmenu,IDM_VIEW_STICKYWINPOS,i); @@ -5011,11 +5010,11 @@ LRESULT MsgCommand(HWND hwnd, UINT umsg, WPARAM wParam, LPARAM lParam) case IDM_VIEW_SAVESETTINGS: if (IsCmdEnabled(hwnd, IDM_VIEW_SAVESETTINGS)) { - s_bSaveSettings = !s_bSaveSettings; - if (s_bSaveSettings) + Settings.SaveSettings = !Settings.SaveSettings; + if (Settings.SaveSettings == Defaults.SaveSettings) IniSetString(L"Settings", L"SaveSettings", NULL); else - IniSetBool(L"Settings", L"SaveSettings", s_bSaveSettings); + IniSetBool(L"Settings", L"SaveSettings", Settings.SaveSettings); } break; @@ -6614,9 +6613,11 @@ void LoadSettings() if (pIniSection) { // prerequisites - s_bSaveSettings = IniGetBool(L"Settings", L"SaveSettings", true); s_iSettingsVersion = IniGetInt(L"Settings", L"SettingsVersion", CFG_VER_NONE); + Defaults.SaveSettings = true; + Settings.SaveSettings = IniGetBool(L"Settings", L"SaveSettings", Defaults.SaveSettings); + // first load "hard coded" .ini-Settings // -------------------------------------------------------------------------- LoadIniSection(L"Settings2", pIniSection, cchIniSection); @@ -6648,7 +6649,7 @@ void LoadSettings() // deprecated Defaults.RenderingTechnology = IniSectionGetInt(pIniSection, L"SciDirectWriteTech", -111); - if ((Defaults.RenderingTechnology != -111) && s_bSaveSettings) { + if ((Defaults.RenderingTechnology != -111) && Settings.SaveSettings) { // cleanup IniSetString(L"Settings2", L"SciDirectWriteTech", NULL); } @@ -6656,7 +6657,7 @@ void LoadSettings() // Settings2 deprecated Defaults.Bidirectional = IniSectionGetInt(pIniSection, L"EnableBidirectionalSupport", -111); - if ((Defaults.Bidirectional != -111) && s_bSaveSettings) { + if ((Defaults.Bidirectional != -111) && Settings.SaveSettings) { // cleanup IniSetString(L"Settings2", L"EnableBidirectionalSupport", NULL); } @@ -6747,12 +6748,12 @@ void LoadSettings() LoadIniSection(L"Settings", pIniSection, cchIniSection); // -------------------------------------------------------------------------- -#define GET_BOOL_VALUE_FROM_INISECTION(VARNAME,DEFAULT) \ - Defaults.##VARNAME = DEFAULT; \ +#define GET_BOOL_VALUE_FROM_INISECTION(VARNAME,DEFAULT) \ + Defaults.##VARNAME = DEFAULT; \ Settings.##VARNAME = IniSectionGetBool(pIniSection, STRGW(VARNAME), Defaults.##VARNAME) -#define GET_INT_VALUE_FROM_INISECTION(VARNAME,DEFAULT,MIN,MAX) \ - Defaults.##VARNAME = DEFAULT; \ +#define GET_INT_VALUE_FROM_INISECTION(VARNAME,DEFAULT,MIN,MAX) \ + Defaults.##VARNAME = DEFAULT; \ Settings.##VARNAME = clampi(IniSectionGetInt(pIniSection, STRGW(VARNAME), Defaults.##VARNAME),MIN,MAX) GET_BOOL_VALUE_FROM_INISECTION(SaveRecentFiles, true); @@ -6840,8 +6841,8 @@ void LoadSettings() GET_BOOL_VALUE_FROM_INISECTION(ViewWhiteSpace, false); GET_BOOL_VALUE_FROM_INISECTION(ViewEOLs, false); - GET_INT_VALUE_FROM_INISECTION(DefaultEncoding, CPI_NONE, CED_NO_MAPPING, Encoding_CountOf()-1); - // if DefaultEncoding is not defined set to UTF-8 //~system's current code-page + int const iPrefEncIniSetting = Encoding_MapIniSetting(false, PREFERRED_DEFAULT_ENCODING); + GET_INT_VALUE_FROM_INISECTION(DefaultEncoding, iPrefEncIniSetting, CED_NO_MAPPING, Encoding_CountOf()-1); Settings.DefaultEncoding = ((Settings.DefaultEncoding == CPI_NONE) ? PREFERRED_DEFAULT_ENCODING : Encoding_MapIniSetting(true, Settings.DefaultEncoding)); @@ -7080,7 +7081,7 @@ void LoadSettings() #define SAVE_VALUE_IF_NOT_EQ_DEFAULT(TYPE,VARNAME) \ if (Settings.##VARNAME != Defaults.##VARNAME) { \ - IniSectionSet##TYPE(pIniSection, STRGW(VARNAME), Settings.##VARNAME); \ + IniSectionSet##TYPE(pIniSection, STRGW(VARNAME), Settings.##VARNAME); \ } // ---------------------------------------------------------------------------- @@ -7096,8 +7097,11 @@ void SaveSettings(bool bSaveSettingsNow) CreateIniFile(); - if (!(s_bSaveSettings || bSaveSettingsNow)) { - IniSetBool(L"Settings", L"SaveSettings", s_bSaveSettings); + if (!(Settings.SaveSettings || bSaveSettingsNow)) { + IniSetInt(L"Settings", L"SettingsVersion", CFG_VER_CURRENT); + if (Settings.SaveSettings != Defaults.SaveSettings) { + IniSetBool(L"Settings", L"SaveSettings", Settings.SaveSettings); + } return; } // update window placement @@ -7110,10 +7114,11 @@ void SaveSettings(bool bSaveSettingsNow) int const cchIniSection = INISECTIONBUFCNT * HUGE_BUFFER; WCHAR *pIniSection = AllocMem(sizeof(WCHAR) * cchIniSection, HEAP_ZERO_MEMORY); - if (pIniSection) { + if (pIniSection) + { IniSectionSetInt(pIniSection, L"SettingsVersion", CFG_VER_CURRENT); - IniSectionSetBool(pIniSection, L"SaveSettings", s_bSaveSettings); + SAVE_VALUE_IF_NOT_EQ_DEFAULT(Bool, SaveSettings); SAVE_VALUE_IF_NOT_EQ_DEFAULT(Bool, SaveRecentFiles); SAVE_VALUE_IF_NOT_EQ_DEFAULT(Bool, PreserveCaretPos); SAVE_VALUE_IF_NOT_EQ_DEFAULT(Bool, SaveFindReplace); @@ -7200,9 +7205,10 @@ void SaveSettings(bool bSaveSettingsNow) SAVE_VALUE_IF_NOT_EQ_DEFAULT(Bool, ViewWhiteSpace); SAVE_VALUE_IF_NOT_EQ_DEFAULT(Bool, ViewEOLs); - if (Settings.DefaultEncoding != Defaults.DefaultEncoding) { - IniSectionSetInt(pIniSection, L"DefaultEncoding", Encoding_MapIniSetting(false, Settings.DefaultEncoding)); - } + Settings.DefaultEncoding = Encoding_MapIniSetting(false, Settings.DefaultEncoding); + SAVE_VALUE_IF_NOT_EQ_DEFAULT(Int, DefaultEncoding); + Settings.DefaultEncoding = Encoding_MapIniSetting(true, Settings.DefaultEncoding); + SAVE_VALUE_IF_NOT_EQ_DEFAULT(Bool, UseDefaultForFileEncoding); SAVE_VALUE_IF_NOT_EQ_DEFAULT(Bool, SkipUnicodeDetection); SAVE_VALUE_IF_NOT_EQ_DEFAULT(Bool, SkipANSICodePageDetection); @@ -7903,8 +7909,8 @@ int FindIniFile() { bFound = _CheckIniFile(tchPath,tchModule); } - if (bFound) { - + if (bFound) + { // allow two redirections: administrator -> user -> custom if (_CheckIniFileRedirect(MKWCS(APPNAME), MKWCS(APPNAME) L".ini", tchPath, tchModule)) { _CheckIniFileRedirect(MKWCS(APPNAME), MKWCS(APPNAME) L".ini", tchPath, tchModule); @@ -8843,7 +8849,7 @@ void UpdateSettingsCmds() { HMENU hmenu = GetSystemMenu(Globals.hwndMain, false); bool hasIniFile = (StringCchLenW(Globals.IniFile,COUNTOF(Globals.IniFile)) > 0 || StringCchLenW(s_wchIniFile2,COUNTOF(s_wchIniFile2)) > 0); - CheckCmd(hmenu, IDM_VIEW_SAVESETTINGS, s_bSaveSettings && s_bEnableSaveSettings); + CheckCmd(hmenu, IDM_VIEW_SAVESETTINGS, Settings.SaveSettings && s_bEnableSaveSettings); EnableCmd(hmenu, IDM_VIEW_SAVESETTINGS, hasIniFile && s_bEnableSaveSettings); EnableCmd(hmenu, IDM_VIEW_SAVESETTINGSNOW, hasIniFile && s_bEnableSaveSettings); if (SciCall_GetZoom() != 100) { EditShowZoomCallTip(Globals.hwndEdit); } diff --git a/src/TypeDefs.h b/src/TypeDefs.h index beee2555c..c4d3e627e 100644 --- a/src/TypeDefs.h +++ b/src/TypeDefs.h @@ -258,6 +258,7 @@ extern GLOBALS_T Globals; typedef struct _settings_t { + bool SaveSettings; bool SaveRecentFiles; bool PreserveCaretPos; bool SaveFindReplace;