From: Václav Slavík Date: Tue, 12 Feb 2008 20:13:22 +0000 (+0000) Subject: added wxWindow::HandleAsNavigationKey() helper for handling (not only) TAB key in... X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/f029f1d15b04dd70522008cdf105be87140fabc6 added wxWindow::HandleAsNavigationKey() helper for handling (not only) TAB key in custom controls git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@51741 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/docs/latex/wx/window.tex b/docs/latex/wx/window.tex index 5e3731fe2b..ed85d9d0de 100644 --- a/docs/latex/wx/window.tex +++ b/docs/latex/wx/window.tex @@ -1534,6 +1534,24 @@ Returns the value previously passed to \helpref{wxWindow::SetWindowVariant}{wxwindowsetwindowvariant}. +\membersection{wxWindow::HandleAsNavigationKey}\label{wxwindowhandleasnavigationkey} + +\func{bool}{HandleAsNavigationKey}{\param{const wxKeyEvent\&}{ event}} + +This function will generate the appropriate call to +\helpref{Navigate}{wxwindownavigate} if the key event is one normally used for +keyboard navigation and return \true in this case. + +\wxheading{Return value} + +Returns \true if the key pressed was for navigation and was handled, \false +otherwise. + +\wxheading{See also} + +\helpref{Navigate}{wxwindownavigate} + + \membersection{wxWindow::HandleWindowEvent}\label{wxwindowhandlewindowevent} \func{bool}{HandleWindowEvent}{\param{wxEvent\& }{event}} @@ -1952,7 +1970,8 @@ changed. You may wish to call this from a text control custom keypress handler to do the default navigation behaviour for the tab key, since the standard default behaviour for a multiline text control with the wxTE\_PROCESS\_TAB style is to insert a tab -and not navigate to the next control. See also \helpref{wxNavigationKeyEvent}{wxnavigationkeyevent}. +and not navigate to the next control. See also \helpref{wxNavigationKeyEvent}{wxnavigationkeyevent} and +\helpref{HandleAsNavigationKey}{wxwindowhandleasnavigationkey}. \membersection{wxWindow::NavigateIn}\label{wxwindownavigatein} diff --git a/include/wx/window.h b/include/wx/window.h index 4451f8f50d..218e2ce79e 100644 --- a/include/wx/window.h +++ b/include/wx/window.h @@ -680,6 +680,11 @@ public: bool Navigate(int flags = wxNavigationKeyEvent::IsForward) { return m_parent && ((wxWindowBase *)m_parent)->DoNavigateIn(flags); } + // this function will generate the appropriate call to Navigate() if the + // key event is one normally used for keyboard navigation and return true + // in this case + bool HandleAsNavigationKey(const wxKeyEvent& event); + // move this window just before/after the specified one in tab order // (the other window must be our sibling!) void MoveBeforeInTabOrder(wxWindow *win) diff --git a/src/common/combocmn.cpp b/src/common/combocmn.cpp index 8fb796c2cc..6ed975c8a8 100644 --- a/src/common/combocmn.cpp +++ b/src/common/combocmn.cpp @@ -1651,22 +1651,8 @@ void wxComboCtrlBase::OnKeyEvent(wxKeyEvent& event) } else // no popup { - int keycode = event.GetKeyCode(); - - if ( keycode == WXK_TAB ) - { - wxNavigationKeyEvent evt; - - wxWindow* mainCtrl = GetMainWindowOfCompositeControl(); - - evt.SetFlags(wxNavigationKeyEvent::FromTab| - (!event.ShiftDown() ? wxNavigationKeyEvent::IsForward - : wxNavigationKeyEvent::IsBackward)); - evt.SetEventObject(mainCtrl); - evt.SetCurrentFocus(mainCtrl); - mainCtrl->GetParent()->GetEventHandler()->AddPendingEvent(evt); + if ( HandleAsNavigationKey(event) ) return; - } if ( IsKeyPopupToggle(event) ) { @@ -1683,6 +1669,8 @@ void wxComboCtrlBase::OnKeyEvent(wxKeyEvent& event) return; } + int keycode = event.GetKeyCode(); + if ( (comboStyle & wxCB_READONLY) || (keycode != WXK_RIGHT && keycode != WXK_LEFT) ) { diff --git a/src/common/wincmn.cpp b/src/common/wincmn.cpp index 0c2f15dc96..00c3b89341 100644 --- a/src/common/wincmn.cpp +++ b/src/common/wincmn.cpp @@ -2700,12 +2700,33 @@ bool wxWindowBase::DoNavigateIn(int flags) return false; #else // !wxHAS_NATIVE_TAB_TRAVERSAL wxNavigationKeyEvent eventNav; + wxWindow *focused = FindFocus(); + eventNav.SetCurrentFocus(focused); + eventNav.SetEventObject(focused); eventNav.SetFlags(flags); - eventNav.SetEventObject(FindFocus()); return GetEventHandler()->ProcessEvent(eventNav); #endif // wxHAS_NATIVE_TAB_TRAVERSAL/!wxHAS_NATIVE_TAB_TRAVERSAL } +bool wxWindowBase::HandleAsNavigationKey(const wxKeyEvent& event) +{ + if ( event.GetKeyCode() != WXK_TAB ) + return false; + + int flags = wxNavigationKeyEvent::FromTab; + + if ( event.ShiftDown() ) + flags |= wxNavigationKeyEvent::IsBackward; + else + flags |= wxNavigationKeyEvent::IsForward; + + if ( event.ControlDown() ) + flags |= wxNavigationKeyEvent::WinChange; + + Navigate(flags); + return true; +} + void wxWindowBase::DoMoveInTabOrder(wxWindow *win, WindowOrder move) { // check that we're not a top level window diff --git a/src/generic/datavgen.cpp b/src/generic/datavgen.cpp index 1a442101fc..9fcf58d70b 100644 --- a/src/generic/datavgen.cpp +++ b/src/generic/datavgen.cpp @@ -3395,16 +3395,8 @@ void wxDataViewMainWindow::DestroyTree() void wxDataViewMainWindow::OnChar( wxKeyEvent &event ) { - if (event.GetKeyCode() == WXK_TAB) - { - wxNavigationKeyEvent nevent; - nevent.SetWindowChange( event.ControlDown() ); - nevent.SetDirection( !event.ShiftDown() ); - nevent.SetEventObject( GetParent()->GetParent() ); - nevent.SetCurrentFocus( m_parent ); - if (GetParent()->GetParent()->GetEventHandler()->ProcessEvent( nevent )) - return; - } + if ( HandleAsNavigationKey(event) ) + return; // no item -> nothing to do if (!HasCurrentRow()) diff --git a/src/generic/listctrl.cpp b/src/generic/listctrl.cpp index e8cfa29862..d58f84467e 100644 --- a/src/generic/listctrl.cpp +++ b/src/generic/listctrl.cpp @@ -3456,16 +3456,8 @@ void wxListMainWindow::OnChar( wxKeyEvent &event ) ke.SetEventObject( parent ); if (parent->GetEventHandler()->ProcessEvent( ke )) return; - if (event.GetKeyCode() == WXK_TAB) - { - wxNavigationKeyEvent nevent; - nevent.SetWindowChange( event.ControlDown() ); - nevent.SetDirection( !event.ShiftDown() ); - nevent.SetEventObject( GetParent()->GetParent() ); - nevent.SetCurrentFocus( m_parent ); - if (GetParent()->GetParent()->GetEventHandler()->ProcessEvent( nevent )) - return; - } + if ( HandleAsNavigationKey(event) ) + return; // no item -> nothing to do if (!HasCurrent()) diff --git a/src/generic/vlbox.cpp b/src/generic/vlbox.cpp index 747d828251..d75fc4f130 100644 --- a/src/generic/vlbox.cpp +++ b/src/generic/vlbox.cpp @@ -602,13 +602,7 @@ void wxVListBox::OnKeyDown(wxKeyEvent& event) case WXK_TAB: // Since we are using wxWANTS_CHARS we need to send navigation // events for the tabs on MSW - { - wxNavigationKeyEvent ne; - ne.SetDirection(!event.ShiftDown()); - ne.SetCurrentFocus(this); - ne.SetEventObject(this); - GetParent()->GetEventHandler()->ProcessEvent(ne); - } + HandleAsNavigationKey(event); // fall through to default #endif default: