From f9d6fb9e31719a0ef9bbc8bd42c262560575adf8 Mon Sep 17 00:00:00 2001 From: Udo Hoffmann Date: Mon, 31 May 2021 17:52:00 +0200 Subject: [PATCH] Close all tabs in stack with single action Shift-click closes the whole stack. Fix #8922, close #9930 --- PowerEditor/installer/nativeLang/english.xml | 1 + .../WinControls/DockingWnd/DockingCont.cpp | 46 ++++++++++++++++--- .../src/WinControls/DockingWnd/DockingCont.h | 2 +- 3 files changed, 41 insertions(+), 8 deletions(-) diff --git a/PowerEditor/installer/nativeLang/english.xml b/PowerEditor/installer/nativeLang/english.xml index 993a6a10f..b94d133b4 100644 --- a/PowerEditor/installer/nativeLang/english.xml +++ b/PowerEditor/installer/nativeLang/english.xml @@ -1436,6 +1436,7 @@ Find in all files except exe, obj && log: + diff --git a/PowerEditor/src/WinControls/DockingWnd/DockingCont.cpp b/PowerEditor/src/WinControls/DockingWnd/DockingCont.cpp index 04d3f8d54..9d1700734 100644 --- a/PowerEditor/src/WinControls/DockingWnd/DockingCont.cpp +++ b/PowerEditor/src/WinControls/DockingWnd/DockingCont.cpp @@ -21,6 +21,7 @@ #include "ToolTip.h" #include "Parameters.h" #include "NppDarkMode.h" +#include "localization.h" using namespace std; @@ -315,7 +316,7 @@ LRESULT DockingCont::runProcCaption(HWND hwnd, UINT Message, WPARAM wParam, LPAR if (_isMouseOver == TRUE) { - doClose(); + doClose(GetKeyState(VK_SHIFT) < 0); } _isMouseClose = FALSE; _isMouseOver = FALSE; @@ -407,7 +408,9 @@ LRESULT DockingCont::runProcCaption(HWND hwnd, UINT Message, WPARAM wParam, LPAR } else { - toolTip.Show(rc, TEXT("Close"), pt.x, pt.y + 20); + NativeLangSpeaker *pNativeSpeaker = (NppParameters::getInstance()).getNativeLangSpeaker(); + generic_string tip = pNativeSpeaker->getLocalizedStrFromID("close-panel-tip", TEXT("Close")); + toolTip.Show(rc, tip.c_str(), pt.x, pt.y + 20); } return TRUE; } @@ -1035,7 +1038,7 @@ INT_PTR CALLBACK DockingCont::run_dlgProc(UINT Message, WPARAM wParam, LPARAM lP switch (LOWORD(wParam)) { case IDCANCEL: - doClose(); + doClose(GetKeyState(VK_SHIFT) < 0); return TRUE; default : break; @@ -1170,13 +1173,13 @@ void DockingCont::onSize() } } -void DockingCont::doClose() +void DockingCont::doClose(BOOL closeAll) { int iItemCnt = static_cast(::SendMessage(_hContTab, TCM_GETITEMCOUNT, 0, 0)); + + // Always close active tab first int iItemCur = getActiveTb(); - - TCITEM tcItem = {0}; - + TCITEM tcItem = {0}; tcItem.mask = TCIF_PARAM; ::SendMessage(_hContTab, TCM_GETITEM, iItemCur, reinterpret_cast(&tcItem)); if (tcItem.lParam) @@ -1189,6 +1192,35 @@ void DockingCont::doClose() } } + // Close all other tabs if requested + if (closeAll) + { + iItemCnt = static_cast(::SendMessage(_hContTab, TCM_GETITEMCOUNT, 0, 0)); + int iItemOff = 0; + for (int iItem = 0; iItem < iItemCnt; ++iItem) + { + TCITEM tcItem = {0}; + // get item data + selectTab(iItemOff); + tcItem.mask = TCIF_PARAM; + ::SendMessage(_hContTab, TCM_GETITEM, iItemOff, reinterpret_cast(&tcItem)); + if (!tcItem.lParam) + continue; + + // notify child windows + if (NotifyParent(DMM_CLOSE) == 0) + { + // delete tab + hideToolbar((tTbData*)tcItem.lParam); + } + else + { + ++iItemOff; + } + } + } + + // Hide dialog window if all tabs closed iItemCnt = static_cast(::SendMessage(_hContTab, TCM_GETITEMCOUNT, 0, 0)); if (iItemCnt == 0) { diff --git a/PowerEditor/src/WinControls/DockingWnd/DockingCont.h b/PowerEditor/src/WinControls/DockingWnd/DockingCont.h index 6192c969c..0a86205d7 100644 --- a/PowerEditor/src/WinControls/DockingWnd/DockingCont.h +++ b/PowerEditor/src/WinControls/DockingWnd/DockingCont.h @@ -155,7 +155,7 @@ protected : eMousePos isInRect(HWND hwnd, int x, int y); // handling of toolbars - void doClose(); + void doClose(BOOL closeAll); // return new item int searchPosInTab(tTbData* pTbData);