diff --git a/language/common_res.h b/language/common_res.h index fce50948a..03f228011 100644 --- a/language/common_res.h +++ b/language/common_res.h @@ -63,6 +63,7 @@ #define IDS_MUI_BACKSLASHHELP 12022 #define IDS_MUI_REGEXPHELP 12023 #define IDS_MUI_WILDCARDHELP 12024 +#define IDS_CLEAR_ALL 12025 #define IDS_MUI_ERR_LOADFILE 13000 #define IDS_MUI_ERR_SAVEFILE 13001 @@ -154,6 +155,8 @@ #define IDS_MUI_ABOUT_ACKNOWLEDGES 15039 #define IDS_MUI_ABOUT_MORE 15040 #define IDS_MUI_ABOUT_LICENSES 15041 +#define IDS_MUI_CLEAR_FIND_HISTORY 15042 +#define IDS_MUI_CLEAR_REPL_HISTORY 15043 #define IDS_MUI_TRANSL_AUTHOR 15050 #define IDS_MUI_ASSOCIATED_EXT 15051 @@ -356,6 +359,7 @@ #define IDC_MULTIEDGELINE 18120 #define IDC_SHOWEDGELINE 18121 #define IDC_BACKGRDCOLOR 18122 +#define IDC_CLEAR_LIST 18123 #define CMD_ESCAPE 20000 #define CMD_SHIFTESC 20001 diff --git a/language/np3_de_de/dialogs_de_de.rc b/language/np3_de_de/dialogs_de_de.rc index d0bfe8689..22ac0414c 100644 --- a/language/np3_de_de/dialogs_de_de.rc +++ b/language/np3_de_de/dialogs_de_de.rc @@ -267,7 +267,7 @@ BEGIN CONTROL "&Speichere Historie beim Beenden.",IDC_SAVEMRU,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,107,120,10 CONTROL "&Letztes Suchmuster merken.",IDC_REMEMBERSEARCHPATTERN, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,130,120,10 - PUSHBUTTON "Verwerfen",IDC_REMOVE,212,107,50,14,WS_DISABLED + CONTROL "Verwerfen", IDC_REMOVE, "Button", BS_DEFSPLITBUTTON | WS_TABSTOP | WS_DISABLED, 212, 107, 50, 14 DEFPUSHBUTTON "OK",IDOK,154,139,50,14,WS_DISABLED PUSHBUTTON "Abbrechen",IDCANCEL,212,139,50,14 SCROLLBAR IDC_RESIZEGRIP,7,146,10,10 diff --git a/language/np3_de_de/strings_de_de.rc b/language/np3_de_de/strings_de_de.rc index c87462861..d13046ecd 100644 --- a/language/np3_de_de/strings_de_de.rc +++ b/language/np3_de_de/strings_de_de.rc @@ -253,6 +253,11 @@ BEGIN IDM_THEMES_FILE_ITEM "Standard Einstellungen" IDS_MUI_STATUSBAR_PREFIXES "Z ,Sp ,Sel ,GrB ,SelZ ,Vork ,,,,,,,Zch ,Ersz ,Ergb ," IDS_MUI_STATUSBAR_POSTFIXES ",,,,,,,,,,,,,,," + IDS_CLEAR_ALL "Alle löschen" + IDS_MUI_CLEAR_FIND_HISTORY + "Suchen-Historie löschen" + IDS_MUI_CLEAR_REPL_HISTORY + "Ersetzen-Historie löschen" END STRINGTABLE diff --git a/language/np3_en_us/dialogs_en_us.rc b/language/np3_en_us/dialogs_en_us.rc index 4bd4a7b80..5b074666d 100644 --- a/language/np3_en_us/dialogs_en_us.rc +++ b/language/np3_en_us/dialogs_en_us.rc @@ -267,7 +267,8 @@ BEGIN CONTROL "&Save recent file list on exit.",IDC_SAVEMRU,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,107,96,10 CONTROL "&Remember search pattern.",IDC_REMEMBERSEARCHPATTERN, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,130,96,10 - PUSHBUTTON "Discard",IDC_REMOVE,212,107,50,14,WS_DISABLED + //PUSHBUTTON "Discard",IDC_REMOVE,212,107,50,14,WS_DISABLED + CONTROL "Discard", IDC_REMOVE, "Button", BS_DEFSPLITBUTTON | WS_TABSTOP | WS_DISABLED, 212, 107, 50, 14 DEFPUSHBUTTON "OK",IDOK,154,139,50,14,WS_DISABLED PUSHBUTTON "Cancel",IDCANCEL,212,139,50,14 SCROLLBAR IDC_RESIZEGRIP,7,143,10,10 diff --git a/language/np3_en_us/strings_en_us.rc b/language/np3_en_us/strings_en_us.rc index 3f79c2d54..62c91d028 100644 --- a/language/np3_en_us/strings_en_us.rc +++ b/language/np3_en_us/strings_en_us.rc @@ -253,6 +253,11 @@ BEGIN IDM_THEMES_FILE_ITEM "Standard Settings" IDS_MUI_STATUSBAR_PREFIXES "Ln ,Col ,Sel ,Sb ,SLn ,Occ ,,,,,,,Ch ,Repl ,Eval ," IDS_MUI_STATUSBAR_POSTFIXES ",,,,,,,,,,,,,,," + IDS_CLEAR_ALL "Clear All" + IDS_MUI_CLEAR_FIND_HISTORY + "Clear Find History" + IDS_MUI_CLEAR_REPL_HISTORY + "Clear Replace History" END STRINGTABLE diff --git a/src/Config/Config.cpp b/src/Config/Config.cpp index 4797a0554..33c63dec8 100644 --- a/src/Config/Config.cpp +++ b/src/Config/Config.cpp @@ -2067,7 +2067,7 @@ __try { { if (!Settings.SaveRecentFiles) { // Cleanup unwanted MRUs - MRU_Empty(Globals.pFileMRU); + MRU_Empty(Globals.pFileMRU, false); MRU_Save(Globals.pFileMRU); } else { @@ -2077,9 +2077,9 @@ __try { if (!Settings.SaveFindReplace) { // Cleanup unwanted MRUs - MRU_Empty(Globals.pMRUfind); + MRU_Empty(Globals.pMRUfind, false); MRU_Save(Globals.pMRUfind); - MRU_Empty(Globals.pMRUreplace); + MRU_Empty(Globals.pMRUreplace, false); MRU_Save(Globals.pMRUreplace); } else { @@ -2356,10 +2356,11 @@ bool MRU_Delete(LPMRULIST pmru, int iIndex) } -bool MRU_Empty(LPMRULIST pmru) +bool MRU_Empty(LPMRULIST pmru, bool bExceptLeast) { if (pmru) { - for (int i = 0; i < pmru->iSize; ++i) { + int const beg = bExceptLeast ? 1 : 0; + for (int i = beg; i < pmru->iSize; ++i) { if (pmru->pszItems[i]) { LocalFree(pmru->pszItems[i]); // StrDup() pmru->pszItems[i] = NULL; @@ -2406,8 +2407,7 @@ bool MRU_Load(LPMRULIST pmru, bool bFileProps) int n = 0; if (IsIniFileCached()) { - MRU_Empty(pmru); - //if (bFileProps) { ClearDestinationsOnRecentDocs(); } + MRU_Empty(pmru, false); const WCHAR* const RegKey_Section = pmru->szRegKey; diff --git a/src/Config/Config.h b/src/Config/Config.h index 0f07857cf..ee20d3e6a 100644 --- a/src/Config/Config.h +++ b/src/Config/Config.h @@ -129,7 +129,7 @@ bool MRU_Add(LPMRULIST pmru, LPCWSTR pszNew, cpi_enc_t iEnc, DocPos iPos, D bool MRU_FindFile(LPMRULIST pmru, LPCWSTR pszFile, int* iIndex); bool MRU_AddFile(LPMRULIST pmru, LPWSTR pszFile, bool bRelativePath, bool bUnexpandMyDocs, cpi_enc_t iEnc, DocPos iPos, DocPos iSelAnc, LPCWSTR pszBookMarks); bool MRU_Delete(LPMRULIST pmru, int iIndex); -bool MRU_Empty(LPMRULIST pmru); +bool MRU_Empty(LPMRULIST pmru, bool bExceptLeast); int MRU_Enum(LPMRULIST pmru, int iIndex, LPWSTR pszItem, int cchItem); bool MRU_Load(LPMRULIST pmru, bool bFileProps); void MRU_Save(LPMRULIST pmru); diff --git a/src/Dialogs.c b/src/Dialogs.c index 6cdf16675..440fc20be 100644 --- a/src/Dialogs.c +++ b/src/Dialogs.c @@ -1895,94 +1895,136 @@ static INT_PTR CALLBACK FileMRUDlgProc(HWND hwnd, UINT umsg, WPARAM wParam, LPAR case WM_NOTIFY: { - if (((LPNMHDR)(lParam))->idFrom == IDC_FILEMRU) { - switch (((LPNMHDR)(lParam))->code) { - case NM_DBLCLK: - SendWMCommand(hwnd, IDOK); + switch (wParam) + { + case IDC_REMOVE: + switch (((LPNMHDR)lParam)->code) { + case BCN_DROPDOWN: + { + const NMBCDROPDOWN* pDropDown = (NMBCDROPDOWN*)lParam; + // Get screen coordinates of the button. + POINT pt; + pt.x = pDropDown->rcButton.left; + pt.y = pDropDown->rcButton.bottom; + ClientToScreen(pDropDown->hdr.hwndFrom, &pt); + // Create a menu and add items. + HMENU hSplitMenu = CreatePopupMenu(); + if (!hSplitMenu) + break; + if (pDropDown->hdr.hwndFrom == GetDlgItem(hwnd, IDC_REMOVE)) { + WCHAR szMenu[80] = {L'\0'}; + GetLngString(IDS_CLEAR_ALL, szMenu, COUNTOF(szMenu)); + AppendMenu(hSplitMenu, MF_STRING, IDC_CLEAR_LIST, szMenu); + } + + // Display the menu. + TrackPopupMenu(hSplitMenu, TPM_LEFTALIGN | TPM_TOPALIGN, pt.x, pt.y, 0, hwnd, NULL); + DestroyMenu(hSplitMenu); + return !0; + } break; - case LVN_GETDISPINFO: - { - /* - LV_DISPINFO *lpdi = (LPVOID)lParam; + default: + break; + } + break; - if (lpdi->item.mask & LVIF_IMAGE) { + case IDC_FILEMRU: + if (((LPNMHDR)(lParam))->idFrom == IDC_FILEMRU) { + switch (((LPNMHDR)(lParam))->code) { + case NM_DBLCLK: + SendWMCommand(hwnd, IDOK); + break; - WCHAR tch[MAX_PATH] = { L'\0' }; - LV_ITEM lvi; - SHFILEINFO shfi; - DWORD dwFlags = SHGFI_SMALLICON | SHGFI_SYSICONINDEX | SHGFI_ATTRIBUTES | SHGFI_ATTR_SPECIFIED; - DWORD dwAttr = 0; + case LVN_GETDISPINFO: + { + /* + LV_DISPINFO *lpdi = (LPVOID)lParam; - ZeroMemory(&lvi,sizeof(LV_ITEM)); + if (lpdi->item.mask & LVIF_IMAGE) { - lvi.mask = LVIF_TEXT; - lvi.pszText = tch; - lvi.cchTextMax = COUNTOF(tch); - lvi.iItem = lpdi->item.iItem; + WCHAR tch[MAX_PATH] = { L'\0' }; + LV_ITEM lvi; + SHFILEINFO shfi; + DWORD dwFlags = SHGFI_SMALLICON | SHGFI_SYSICONINDEX | SHGFI_ATTRIBUTES | SHGFI_ATTR_SPECIFIED; + DWORD dwAttr = 0; - ListView_GetItem(GetDlgItem(hwnd,IDC_FILEMRU),&lvi); + ZeroMemory(&lvi,sizeof(LV_ITEM)); - if (!PathIsExistingFile(tch)) { - dwFlags |= SHGFI_USEFILEATTRIBUTES; - dwAttr = FILE_ATTRIBUTE_NORMAL; - shfi.dwAttributes = 0; - SHGetFileInfo(PathFindFileName(tch),dwAttr,&shfi,sizeof(SHFILEINFO),dwFlags); + lvi.mask = LVIF_TEXT; + lvi.pszText = tch; + lvi.cchTextMax = COUNTOF(tch); + lvi.iItem = lpdi->item.iItem; + + ListView_GetItem(GetDlgItem(hwnd,IDC_FILEMRU),&lvi); + + if (!PathIsExistingFile(tch)) { + dwFlags |= SHGFI_USEFILEATTRIBUTES; + dwAttr = FILE_ATTRIBUTE_NORMAL; + shfi.dwAttributes = 0; + SHGetFileInfo(PathFindFileName(tch),dwAttr,&shfi,sizeof(SHFILEINFO),dwFlags); + } + + else { + shfi.dwAttributes = SFGAO_LINK | SFGAO_SHARE; + SHGetFileInfo(tch,dwAttr,&shfi,sizeof(SHFILEINFO),dwFlags); + } + + lpdi->item.iImage = shfi.iIcon; + lpdi->item.mask |= LVIF_DI_SETITEM; + + lpdi->item.stateMask = 0; + lpdi->item.state = 0; + + if (shfi.dwAttributes & SFGAO_LINK) { + lpdi->item.mask |= LVIF_STATE; + lpdi->item.stateMask |= LVIS_OVERLAYMASK; + lpdi->item.state |= INDEXTOOVERLAYMASK(2); + } + + if (shfi.dwAttributes & SFGAO_SHARE) { + lpdi->item.mask |= LVIF_STATE; + lpdi->item.stateMask |= LVIS_OVERLAYMASK; + lpdi->item.state |= INDEXTOOVERLAYMASK(1); + } + + dwAttr = GetFileAttributes(tch); + + if (!Flags.NoFadeHidden && + dwAttr != INVALID_FILE_ATTRIBUTES && + dwAttr & (FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM)) { + lpdi->item.mask |= LVIF_STATE; + lpdi->item.stateMask |= LVIS_CUT; + lpdi->item.state |= LVIS_CUT; + } + } + */ } + break; - else { - shfi.dwAttributes = SFGAO_LINK | SFGAO_SHARE; - SHGetFileInfo(tch,dwAttr,&shfi,sizeof(SHFILEINFO),dwFlags); - } - - lpdi->item.iImage = shfi.iIcon; - lpdi->item.mask |= LVIF_DI_SETITEM; - - lpdi->item.stateMask = 0; - lpdi->item.state = 0; - - if (shfi.dwAttributes & SFGAO_LINK) { - lpdi->item.mask |= LVIF_STATE; - lpdi->item.stateMask |= LVIS_OVERLAYMASK; - lpdi->item.state |= INDEXTOOVERLAYMASK(2); - } - - if (shfi.dwAttributes & SFGAO_SHARE) { - lpdi->item.mask |= LVIF_STATE; - lpdi->item.stateMask |= LVIS_OVERLAYMASK; - lpdi->item.state |= INDEXTOOVERLAYMASK(1); - } - - dwAttr = GetFileAttributes(tch); - - if (!Flags.NoFadeHidden && - dwAttr != INVALID_FILE_ATTRIBUTES && - dwAttr & (FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM)) { - lpdi->item.mask |= LVIF_STATE; - lpdi->item.stateMask |= LVIS_CUT; - lpdi->item.state |= LVIS_CUT; + case LVN_ITEMCHANGED: + case LVN_DELETEITEM: + { + UINT const cnt = ListView_GetSelectedCount(hwndIL); + DialogEnableControl(hwnd, IDOK, (cnt > 0)); + // can't discard current file (myself) + int cur = 0; + if (!MRU_FindFile(Globals.pFileMRU, Globals.CurrentFile, &cur)) { + cur = -1; + } + int const item = ListView_GetNextItem(hwndIL, -1, LVNI_ALL | LVNI_SELECTED); + DialogEnableControl(hwnd, IDC_REMOVE, (cnt > 0) && (cur != item)); } + break; } - */ - } break; - - case LVN_ITEMCHANGED: - case LVN_DELETEITEM: - { - UINT const cnt = ListView_GetSelectedCount(hwndIL); - DialogEnableControl(hwnd, IDOK, (cnt > 0)); - // can't discard current file (myself) - int cur = 0; - if (!MRU_FindFile(Globals.pFileMRU, Globals.CurrentFile, &cur)) { - cur = -1; - } - int const item = ListView_GetNextItem(hwndIL, -1, LVNI_ALL | LVNI_SELECTED); - DialogEnableControl(hwnd, IDC_REMOVE, (cnt > 0) && (cur != item)); - } break; - } + } + break; + + default: + break; } } - return !0; + return !0; case WM_COMMAND: @@ -2057,15 +2099,23 @@ static INT_PTR CALLBACK FileMRUDlgProc(HWND hwnd, UINT umsg, WPARAM wParam, LPAR case IDOK: case IDC_REMOVE: + case IDC_CLEAR_LIST: { WCHAR tchFileName[MAX_PATH] = {L'\0'}; - //int iItem; - //if ((iItem = SendDlgItemMessage(hwnd,IDC_FILEMRU,LB_GETCURSEL,0,0)) != LB_ERR) - UINT cnt = ListView_GetSelectedCount(hwndIL); if (cnt > 0) { - //SendDlgItemMessage(hwnd,IDC_FILEMRU,LB_GETTEXT,(WPARAM)iItem,(LPARAM)tch); + + if (LOWORD(wParam) == IDC_CLEAR_LIST) + { + MRU_Empty(Globals.pFileMRU, StrIsNotEmpty(Globals.CurrentFile)); + if (Globals.bCanSaveIniFile) { + MRU_Save(Globals.pFileMRU); + } + PostWMCommand(hwnd, IDC_FILEMRU_UPDATE_VIEW); + break; // done here + } + LV_ITEM lvi; ZeroMemory(&lvi, sizeof(LV_ITEM)); diff --git a/src/Edit.c b/src/Edit.c index 790d72ae1..0e4f5d7b7 100644 --- a/src/Edit.c +++ b/src/Edit.c @@ -5742,12 +5742,20 @@ static INT_PTR CALLBACK EditFindReplaceDlgProc(HWND hwnd,UINT umsg,WPARAM wParam CopyMemory(sg_pefrData, &s_efrSave, sizeof(EDITFINDREPLACE)); } + WCHAR wchMenuBuf[80] = {L'\0'}; HMENU hmenu = GetSystemMenu(hwnd, false); - GetLngString(IDS_MUI_SAVEPOS, s_tchBuf, COUNTOF(s_tchBuf)); - InsertMenu(hmenu, 0, MF_BYPOSITION | MF_STRING | MF_ENABLED, IDS_MUI_SAVEPOS, s_tchBuf); - GetLngString(IDS_MUI_RESETPOS, s_tchBuf, COUNTOF(s_tchBuf)); - InsertMenu(hmenu, 1, MF_BYPOSITION | MF_STRING | MF_ENABLED, IDS_MUI_RESETPOS, s_tchBuf); + + GetLngString(IDS_MUI_SAVEPOS, wchMenuBuf, COUNTOF(wchMenuBuf)); + InsertMenu(hmenu, 0, MF_BYPOSITION | MF_STRING | MF_ENABLED, IDS_MUI_SAVEPOS, wchMenuBuf); + GetLngString(IDS_MUI_RESETPOS, wchMenuBuf, COUNTOF(wchMenuBuf)); + InsertMenu(hmenu, 1, MF_BYPOSITION | MF_STRING | MF_ENABLED, IDS_MUI_RESETPOS, wchMenuBuf); InsertMenu(hmenu, 2, MF_BYPOSITION | MF_SEPARATOR, 0, NULL); + GetLngString(IDS_MUI_CLEAR_FIND_HISTORY, wchMenuBuf, COUNTOF(wchMenuBuf)); + InsertMenu(hmenu, 3, MF_BYPOSITION | MF_STRING | MF_ENABLED, IDS_MUI_CLEAR_FIND_HISTORY, wchMenuBuf); + GetLngString(IDS_MUI_CLEAR_REPL_HISTORY, wchMenuBuf, COUNTOF(wchMenuBuf)); + InsertMenu(hmenu, 4, MF_BYPOSITION | MF_STRING | MF_ENABLED, IDS_MUI_CLEAR_REPL_HISTORY, wchMenuBuf); + InsertMenu(hmenu, 5, MF_BYPOSITION | MF_SEPARATOR, 0, NULL); + hBrushRed = CreateSolidBrush(rgbRedColorRef); hBrushGreen = CreateSolidBrush(rgbGreenColorRef); @@ -6349,6 +6357,16 @@ static INT_PTR CALLBACK EditFindReplaceDlgProc(HWND hwnd,UINT umsg,WPARAM wParam Settings.FindReplaceDlgPosX = Settings.FindReplaceDlgPosY = CW_USEDEFAULT; break; + case IDACC_CLEAR_FIND_HISTORY: + MRU_Empty(Globals.pMRUfind, true); + while ((int)SendDlgItemMessage(hwnd, IDC_FINDTEXT, CB_DELETESTRING, 0, 0) > 0) {}; + break; + + case IDACC_CLEAR_REPL_HISTORY: + MRU_Empty(Globals.pMRUreplace, true); + while ((int)SendDlgItemMessage(hwnd, IDC_REPLACETEXT, CB_DELETESTRING, 0, 0) > 0) {}; + break; + case IDACC_FINDNEXT: PostWMCommand(hwnd, IDOK); break; @@ -6399,6 +6417,14 @@ static INT_PTR CALLBACK EditFindReplaceDlgProc(HWND hwnd,UINT umsg,WPARAM wParam PostWMCommand(hwnd, IDACC_RESETPOS); return !0; } + else if (wParam == IDS_MUI_CLEAR_FIND_HISTORY) { + PostWMCommand(hwnd, IDACC_CLEAR_FIND_HISTORY); + return !0; + } + else if (wParam == IDS_MUI_CLEAR_REPL_HISTORY) { + PostWMCommand(hwnd, IDACC_CLEAR_REPL_HISTORY); + return !0; + } break; case WM_NOTIFY: diff --git a/src/resource.h b/src/resource.h index b059c27fb..05997b3ee 100644 --- a/src/resource.h +++ b/src/resource.h @@ -52,6 +52,8 @@ #define IDACC_SELTOPREV 311 #define IDACC_VIEWSCHEMECONFIG 312 #define IDACC_PREVIEW 313 +#define IDACC_CLEAR_FIND_HISTORY 314 +#define IDACC_CLEAR_REPL_HISTORY 315 #define IDC_SETCURLEXERTV 402