Allow Ctrl-TAB to switch tabs in PluginAdmin and UDL dialogs

Fix #7932, close #15015
This commit is contained in:
ozone10 2024-04-17 18:41:46 +02:00 committed by Don Ho
parent b7ebd389c7
commit 61083a4468
10 changed files with 107 additions and 31 deletions

View File

@ -3711,6 +3711,29 @@ BOOL Notepad_plus::processIncrFindAccel(MSG *msg) const
return ::TranslateAccelerator(_incrementFindDlg.getHSelf(), _accelerator.getIncrFindAccTable(), msg); return ::TranslateAccelerator(_incrementFindDlg.getHSelf(), _accelerator.getIncrFindAccTable(), msg);
} }
BOOL Notepad_plus::processTabSwitchAccel(MSG* msg) const
{
HWND hDlg = nullptr;
auto isRightDlg = [&msg, &hDlg](HWND hWnd) -> bool {
const bool isRight = (hWnd == msg->hwnd || (::IsChild(hWnd, msg->hwnd) == TRUE));
if (isRight)
{
hDlg = hWnd;
}
return isRight;
};
if (isRightDlg(_findReplaceDlg.getHSelf())
|| isRightDlg(_pluginsAdminDlg.getHSelf())
|| (ScintillaEditView::getUserDefineDlg() != nullptr
&& isRightDlg(ScintillaEditView::getUserDefineDlg()->getHSelf()))
)
{
return static_cast<BOOL>(::TranslateAccelerator(hDlg, _accelerator.getTabSwitchAccTable(), msg));
}
return FALSE;
}
void Notepad_plus::setLanguage(LangType langType) void Notepad_plus::setLanguage(LangType langType)
{ {
//Add logic to prevent changing a language when a document is shared between two views //Add logic to prevent changing a language when a document is shared between two views

View File

@ -501,6 +501,7 @@ private:
BOOL processIncrFindAccel(MSG *msg) const; BOOL processIncrFindAccel(MSG *msg) const;
BOOL processFindAccel(MSG *msg) const; BOOL processFindAccel(MSG *msg) const;
BOOL processTabSwitchAccel(MSG* msg) const;
void checkMenuItem(int itemID, bool willBeChecked) const { void checkMenuItem(int itemID, bool willBeChecked) const {
::CheckMenuItem(_mainMenuHandle, itemID, MF_BYCOMMAND | (willBeChecked?MF_CHECKED:MF_UNCHECKED)); ::CheckMenuItem(_mainMenuHandle, itemID, MF_BYCOMMAND | (willBeChecked?MF_CHECKED:MF_UNCHECKED));

View File

@ -422,6 +422,9 @@ void Notepad_plus_Window::init(HINSTANCE hInst, HWND parent, const TCHAR *cmdLin
bool Notepad_plus_Window::isDlgsMsg(MSG *msg) const bool Notepad_plus_Window::isDlgsMsg(MSG *msg) const
{ {
if (_notepad_plus_plus_core.processTabSwitchAccel(msg))
return true;
if (_notepad_plus_plus_core.processIncrFindAccel(msg)) if (_notepad_plus_plus_core.processIncrFindAccel(msg))
return true; return true;

View File

@ -1694,25 +1694,9 @@ intptr_t CALLBACK FindReplaceDlg::run_dlgProc(UINT message, WPARAM wParam, LPARA
case IDC_NEXT_TAB: case IDC_NEXT_TAB:
case IDC_PREV_TAB: case IDC_PREV_TAB:
{ {
const int lastTab = TabCtrl_GetItemCount(_tab.getHSelf()) - 1; const int selTabIdx = _tab.getNextOrPrevTabIdx(LOWORD(wParam) == IDC_NEXT_TAB);
int selTab = TabCtrl_GetCurSel(_tab.getHSelf());
if (LOWORD(wParam) == IDC_NEXT_TAB) switch (static_cast<DIALOG_TYPE>(selTabIdx))
{
if (selTab++ == lastTab)
{
selTab = 0;
}
}
else
{
if (selTab-- == 0)
{
selTab = lastTab;
}
}
switch (static_cast<DIALOG_TYPE>(selTab))
{ {
case DIALOG_TYPE::FIND_DLG: case DIALOG_TYPE::FIND_DLG:
{ {

View File

@ -1144,7 +1144,7 @@ intptr_t CALLBACK UserDefineDialog::run_dlgProc(UINT message, WPARAM wParam, LPA
return TRUE; return TRUE;
} }
case WM_COMMAND : case WM_COMMAND:
{ {
if (HIWORD(wParam) == EN_CHANGE) if (HIWORD(wParam) == EN_CHANGE)
{ {
@ -1153,19 +1153,32 @@ intptr_t CALLBACK UserDefineDialog::run_dlgProc(UINT message, WPARAM wParam, LPA
_pUserLang->_ext = ext; _pUserLang->_ext = ext;
return TRUE; return TRUE;
} }
else if (HIWORD(wParam) == CBN_SELCHANGE) else if (HIWORD(wParam) == CBN_SELCHANGE) // HIWORD(wParam) for accelerators is also 1
{ {
if (LOWORD(wParam) == IDC_LANGNAME_COMBO) switch (LOWORD(wParam))
{ {
auto i = ::SendDlgItemMessage(_hSelf, LOWORD(wParam), CB_GETCURSEL, 0, 0); case IDC_LANGNAME_COMBO:
enableLangAndControlsBy(i); {
updateDlg(); auto i = ::SendDlgItemMessage(_hSelf, LOWORD(wParam), CB_GETCURSEL, 0, 0);
enableLangAndControlsBy(i);
updateDlg();
return TRUE;
}
case IDC_NEXT_TAB:
case IDC_PREV_TAB:
{
const int selTabIdx = _ctrlTab.getNextOrPrevTabIdx(LOWORD(wParam) == IDC_NEXT_TAB);
_ctrlTab.activateAt(selTabIdx);
_ctrlTab.clickedUpdate();
return TRUE;
}
} }
return TRUE;
} }
else else
{ {
switch (wParam) switch (LOWORD(wParam))
{ {
case IDC_DOCK_BUTTON : case IDC_DOCK_BUTTON :
{ {

View File

@ -1187,7 +1187,7 @@ intptr_t CALLBACK PluginsAdminDlg::run_dlgProc(UINT message, WPARAM wParam, LPAR
} }
} }
switch (wParam) switch (LOWORD(wParam))
{ {
case IDOK: case IDOK:
if (::GetFocus() == ::GetDlgItem(_hSelf, IDC_PLUGINADM_SEARCH_EDIT)) if (::GetFocus() == ::GetDlgItem(_hSelf, IDC_PLUGINADM_SEARCH_EDIT))
@ -1198,6 +1198,16 @@ intptr_t CALLBACK PluginsAdminDlg::run_dlgProc(UINT message, WPARAM wParam, LPAR
display(false); display(false);
return TRUE; return TRUE;
case IDC_NEXT_TAB:
case IDC_PREV_TAB:
{
const int selTabIdx = _tab.getNextOrPrevTabIdx(LOWORD(wParam) == IDC_NEXT_TAB);
_tab.activateAt(selTabIdx);
switchDialog(selTabIdx);
return TRUE;
}
case IDC_PLUGINADM_RESEARCH_NEXT: case IDC_PLUGINADM_RESEARCH_NEXT:
searchInPlugins(true); searchInPlugins(true);
return true; return true;

View File

@ -157,6 +157,28 @@ void TabBar::setFont(const TCHAR *fontName, int fontSize)
::SendMessage(_hSelf, WM_SETFONT, reinterpret_cast<WPARAM>(_hFont), 0); ::SendMessage(_hSelf, WM_SETFONT, reinterpret_cast<WPARAM>(_hFont), 0);
} }
int TabBar::getNextOrPrevTabIdx(bool isNext) const
{
const HWND hTab = _hSelf;
const int lastTabIdx = TabCtrl_GetItemCount(hTab) - 1;
int selTabIdx = TabCtrl_GetCurSel(hTab);
if (isNext)
{
if (selTabIdx++ == lastTabIdx)
{
selTabIdx = 0;
}
}
else
{
if (selTabIdx-- == 0)
{
selTabIdx = lastTabIdx;
}
}
return selTabIdx;
}
void TabBar::activateAt(int index) const void TabBar::activateAt(int index) const
{ {

View File

@ -108,6 +108,8 @@ public:
return isReduced ? _hFont : _hLargeFont; return isReduced ? _hFont : _hLargeFont;
} }
int getNextOrPrevTabIdx(bool isNext) const;
protected: protected:
size_t _nbItem = 0; size_t _nbItem = 0;
bool _hasImgLst = false; bool _hasImgLst = false;

View File

@ -624,19 +624,33 @@ void Accelerator::updateShortcuts()
_hIncFindAccTab = ::CreateAcceleratorTable(tmpIncrFindAccelArray, static_cast<int32_t>(nb)); _hIncFindAccTab = ::CreateAcceleratorTable(tmpIncrFindAccelArray, static_cast<int32_t>(nb));
delete [] tmpIncrFindAccelArray; delete [] tmpIncrFindAccelArray;
if (_hFindAccTab) if (_hAccTabSwitch)
::DestroyAcceleratorTable(_hFindAccTab); ::DestroyAcceleratorTable(_hAccTabSwitch);
ACCEL accNextTab{ BYTE{FVIRTKEY | FCONTROL}, VK_TAB, IDC_NEXT_TAB }; ACCEL accNextTab{ BYTE{FVIRTKEY | FCONTROL}, VK_TAB, IDC_NEXT_TAB };
ACCEL accPrevTab{ BYTE{FVIRTKEY | FCONTROL | FSHIFT}, VK_TAB, IDC_PREV_TAB }; ACCEL accPrevTab{ BYTE{FVIRTKEY | FCONTROL | FSHIFT}, VK_TAB, IDC_PREV_TAB };
findReplaceAcc.emplace_back(accNextTab); vector<ACCEL> tabSwitchAcc{ accNextTab, accPrevTab };
findReplaceAcc.emplace_back(accPrevTab); const size_t nbTabSwitchAcc = tabSwitchAcc.size();
if (nbTabSwitchAcc > 0)
{
ACCEL* tmpTabSwitchAcc = new ACCEL[nbTabSwitchAcc];
for (i = 0; i < nbTabSwitchAcc; ++i)
tmpTabSwitchAcc[i] = tabSwitchAcc.at(i);
_hAccTabSwitch = ::CreateAcceleratorTable(tmpTabSwitchAcc, static_cast<int>(nbTabSwitchAcc));
delete[] tmpTabSwitchAcc;
}
if (_hFindAccTab)
::DestroyAcceleratorTable(_hFindAccTab);
size_t nbFindReplaceAcc = findReplaceAcc.size(); size_t nbFindReplaceAcc = findReplaceAcc.size();
if (nbFindReplaceAcc) if (nbFindReplaceAcc)
{ {
ACCEL* tmpFindAccelArray = new ACCEL[nbFindReplaceAcc]; ACCEL* tmpFindAccelArray = new ACCEL[nbFindReplaceAcc];
for (size_t j = 0; j < nbFindReplaceAcc; ++j) for (size_t j = 0; j < nbFindReplaceAcc; ++j)
tmpFindAccelArray[j] = findReplaceAcc[j]; tmpFindAccelArray[j] = findReplaceAcc[j];
_hFindAccTab = ::CreateAcceleratorTable(tmpFindAccelArray, static_cast<int>(nbFindReplaceAcc)); _hFindAccTab = ::CreateAcceleratorTable(tmpFindAccelArray, static_cast<int>(nbFindReplaceAcc));
delete[] tmpFindAccelArray; delete[] tmpFindAccelArray;
} }

View File

@ -362,6 +362,8 @@ public:
::DestroyAcceleratorTable(_hIncFindAccTab); ::DestroyAcceleratorTable(_hIncFindAccTab);
if (_hFindAccTab) if (_hFindAccTab)
::DestroyAcceleratorTable(_hFindAccTab); ::DestroyAcceleratorTable(_hFindAccTab);
if (_hAccTabSwitch)
::DestroyAcceleratorTable(_hAccTabSwitch);
delete [] _pAccelArray; delete [] _pAccelArray;
}; };
void init(HMENU hMenu, HWND menuParent) { void init(HMENU hMenu, HWND menuParent) {
@ -372,6 +374,7 @@ public:
HACCEL getAccTable() const {return _hAccTable;}; HACCEL getAccTable() const {return _hAccTable;};
HACCEL getIncrFindAccTable() const { return _hIncFindAccTab; }; HACCEL getIncrFindAccTable() const { return _hIncFindAccTab; };
HACCEL getFindAccTable() const { return _hFindAccTab; }; HACCEL getFindAccTable() const { return _hFindAccTab; };
HACCEL getTabSwitchAccTable() const { return _hAccTabSwitch; };
void updateShortcuts(); void updateShortcuts();
void updateFullMenu(); void updateFullMenu();
@ -382,6 +385,7 @@ private:
HACCEL _hAccTable = nullptr; HACCEL _hAccTable = nullptr;
HACCEL _hIncFindAccTab = nullptr; HACCEL _hIncFindAccTab = nullptr;
HACCEL _hFindAccTab = nullptr; HACCEL _hFindAccTab = nullptr;
HACCEL _hAccTabSwitch = nullptr;
ACCEL *_pAccelArray = nullptr; ACCEL *_pAccelArray = nullptr;
int _nbAccelItems = 0; int _nbAccelItems = 0;