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
This commit is contained in:
parent
be2001fedd
commit
f242653114
@ -103,9 +103,6 @@ public:
|
|||||||
// choose the right parent to use with CreateWindow()
|
// choose the right parent to use with CreateWindow()
|
||||||
virtual WXHWND MSWGetParent() const;
|
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
|
// window proc for the frames
|
||||||
WXLRESULT MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam);
|
WXLRESULT MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam);
|
||||||
|
|
||||||
|
@ -276,6 +276,42 @@ void wxControlContainer::HandleOnNavigationKey( wxNavigationKeyEvent& event )
|
|||||||
|
|
||||||
const wxWindowList& children = m_winParent->GetChildren();
|
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
|
// there is not much to do if we don't have children and we're not
|
||||||
// interested in "notebook page change" events here
|
// interested in "notebook page change" events here
|
||||||
if ( !children.GetCount() || event.IsWindowChange() )
|
if ( !children.GetCount() || event.IsWindowChange() )
|
||||||
|
@ -331,48 +331,6 @@ bool wxTopLevelWindowMSW::HandleSettingChange(WXWPARAM wParam, WXLPARAM lParam)
|
|||||||
}
|
}
|
||||||
#endif
|
#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 wxTopLevelWindowMSW::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam)
|
||||||
{
|
{
|
||||||
WXLRESULT rc = 0;
|
WXLRESULT rc = 0;
|
||||||
|
Loading…
Reference in New Issue
Block a user