From f242653114d93920f01390320bc69923a8f2c3d9 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Thu, 10 Aug 2006 15:42:07 +0000 Subject: [PATCH] move the logic for changing notebook pages using the standard Ctrl-Tab/PageUp/Dn keys even when focus is outside of the notebook to wxControlContainer from wxTopLevelWindowMSW to allow it work for notebooks whose parent is not a TLW (as a side effect, this now also works in all ports although I don't really know how desirable this is) git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@40552 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/msw/toplevel.h | 3 --- src/common/containr.cpp | 36 +++++++++++++++++++++++++++++++++ src/msw/toplevel.cpp | 42 --------------------------------------- 3 files changed, 36 insertions(+), 45 deletions(-) diff --git a/include/wx/msw/toplevel.h b/include/wx/msw/toplevel.h index cc6e916466..64359f658d 100644 --- a/include/wx/msw/toplevel.h +++ b/include/wx/msw/toplevel.h @@ -103,9 +103,6 @@ public: // choose the right parent to use with CreateWindow() virtual WXHWND MSWGetParent() const; - // return true if the message was preprocessed and shouldn't be dispatched - virtual bool MSWProcessMessage(WXMSG* pMsg); - // window proc for the frames WXLRESULT MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam); diff --git a/src/common/containr.cpp b/src/common/containr.cpp index 0a034ba01e..4f05ea60f2 100644 --- a/src/common/containr.cpp +++ b/src/common/containr.cpp @@ -276,6 +276,42 @@ void wxControlContainer::HandleOnNavigationKey( wxNavigationKeyEvent& event ) const wxWindowList& children = m_winParent->GetChildren(); + // if we have exactly one notebook-like child window (actually it could be + // any window that returns true from its HasMultiplePages()), then + // [Shift-]Ctrl-Tab and Ctrl-PageUp/Down keys should iterate over its pages + // even if the focus is outside of the control because this is how the + // standard MSW properties dialogs behave and we do it under other platforms + // as well because it seems like a good idea -- but we can always put this + // block inside "#ifdef __WXMSW__" if it's not suitable there + if ( event.IsWindowChange() && !goingDown ) + { + // check if we have a unique notebook-like child + wxWindow *bookctrl = NULL; + for ( wxWindowList::const_iterator i = children.begin(), + end = children.end(); + i != end; + ++i ) + { + wxWindow * const window = *i; + if ( window->HasMultiplePages() ) + { + if ( bookctrl ) + { + // this is the second book-like control already so don't do + // anything as we don't know which one should have its page + // changed + bookctrl = NULL; + break; + } + + bookctrl = window; + } + } + + if ( bookctrl && bookctrl->GetEventHandler()->ProcessEvent(event) ) + return; + } + // there is not much to do if we don't have children and we're not // interested in "notebook page change" events here if ( !children.GetCount() || event.IsWindowChange() ) diff --git a/src/msw/toplevel.cpp b/src/msw/toplevel.cpp index 0c5d936882..17ba69beda 100644 --- a/src/msw/toplevel.cpp +++ b/src/msw/toplevel.cpp @@ -331,48 +331,6 @@ bool wxTopLevelWindowMSW::HandleSettingChange(WXWPARAM wParam, WXLPARAM lParam) } #endif -bool wxTopLevelWindowMSW::MSWProcessMessage(WXMSG* pMsg) -{ - // MSW specific feature: if the dialog has only one notebook-like child - // window (actually it could be any window that returns true from its - // HasMultiplePages()), then [Shift-]Ctrl-Tab and Ctrl-PageUp/Down keys - // should iterate over its pages even if the focus is outside of the - // control because this is how the standard MSW properties dialogs behave - if ( pMsg->message == WM_KEYDOWN && wxIsCtrlDown() && - (pMsg->wParam == VK_TAB || - pMsg->wParam == VK_PRIOR || - pMsg->wParam == VK_NEXT) ) - { - // check if we have a unique notebook-like child - wxWindow *bookctrl = NULL; - for ( wxWindowList::const_iterator i = GetChildren().begin(), - end = GetChildren().end(); - i != end; - ++i ) - { - wxWindow * const window = *i; - if ( window->HasMultiplePages() ) - { - if ( bookctrl ) - { - // this is the second book-like control already so don't do - // anything as we don't know which one should have its page - // changed - bookctrl = NULL; - break; - } - - bookctrl = window; - } - } - - if ( bookctrl && bookctrl->wxWindowMSW::MSWProcessMessage(pMsg) ) - return true; - } - - return wxTopLevelWindowBase::MSWProcessMessage(pMsg); -} - WXLRESULT wxTopLevelWindowMSW::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam) { WXLRESULT rc = 0; -- 2.45.2