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
This commit is contained in:
@@ -1534,6 +1534,24 @@ Returns the value previously passed to
|
|||||||
\helpref{wxWindow::SetWindowVariant}{wxwindowsetwindowvariant}.
|
\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}
|
\membersection{wxWindow::HandleWindowEvent}\label{wxwindowhandlewindowevent}
|
||||||
|
|
||||||
\func{bool}{HandleWindowEvent}{\param{wxEvent\& }{event}}
|
\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
|
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
|
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
|
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}
|
\membersection{wxWindow::NavigateIn}\label{wxwindownavigatein}
|
||||||
|
@@ -680,6 +680,11 @@ public:
|
|||||||
bool Navigate(int flags = wxNavigationKeyEvent::IsForward)
|
bool Navigate(int flags = wxNavigationKeyEvent::IsForward)
|
||||||
{ return m_parent && ((wxWindowBase *)m_parent)->DoNavigateIn(flags); }
|
{ 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
|
// move this window just before/after the specified one in tab order
|
||||||
// (the other window must be our sibling!)
|
// (the other window must be our sibling!)
|
||||||
void MoveBeforeInTabOrder(wxWindow *win)
|
void MoveBeforeInTabOrder(wxWindow *win)
|
||||||
|
@@ -1651,22 +1651,8 @@ void wxComboCtrlBase::OnKeyEvent(wxKeyEvent& event)
|
|||||||
}
|
}
|
||||||
else // no popup
|
else // no popup
|
||||||
{
|
{
|
||||||
int keycode = event.GetKeyCode();
|
if ( HandleAsNavigationKey(event) )
|
||||||
|
|
||||||
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);
|
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
|
|
||||||
if ( IsKeyPopupToggle(event) )
|
if ( IsKeyPopupToggle(event) )
|
||||||
{
|
{
|
||||||
@@ -1683,6 +1669,8 @@ void wxComboCtrlBase::OnKeyEvent(wxKeyEvent& event)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int keycode = event.GetKeyCode();
|
||||||
|
|
||||||
if ( (comboStyle & wxCB_READONLY) ||
|
if ( (comboStyle & wxCB_READONLY) ||
|
||||||
(keycode != WXK_RIGHT && keycode != WXK_LEFT) )
|
(keycode != WXK_RIGHT && keycode != WXK_LEFT) )
|
||||||
{
|
{
|
||||||
|
@@ -2700,12 +2700,33 @@ bool wxWindowBase::DoNavigateIn(int flags)
|
|||||||
return false;
|
return false;
|
||||||
#else // !wxHAS_NATIVE_TAB_TRAVERSAL
|
#else // !wxHAS_NATIVE_TAB_TRAVERSAL
|
||||||
wxNavigationKeyEvent eventNav;
|
wxNavigationKeyEvent eventNav;
|
||||||
|
wxWindow *focused = FindFocus();
|
||||||
|
eventNav.SetCurrentFocus(focused);
|
||||||
|
eventNav.SetEventObject(focused);
|
||||||
eventNav.SetFlags(flags);
|
eventNav.SetFlags(flags);
|
||||||
eventNav.SetEventObject(FindFocus());
|
|
||||||
return GetEventHandler()->ProcessEvent(eventNav);
|
return GetEventHandler()->ProcessEvent(eventNav);
|
||||||
#endif // wxHAS_NATIVE_TAB_TRAVERSAL/!wxHAS_NATIVE_TAB_TRAVERSAL
|
#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)
|
void wxWindowBase::DoMoveInTabOrder(wxWindow *win, WindowOrder move)
|
||||||
{
|
{
|
||||||
// check that we're not a top level window
|
// check that we're not a top level window
|
||||||
|
@@ -3395,16 +3395,8 @@ void wxDataViewMainWindow::DestroyTree()
|
|||||||
|
|
||||||
void wxDataViewMainWindow::OnChar( wxKeyEvent &event )
|
void wxDataViewMainWindow::OnChar( wxKeyEvent &event )
|
||||||
{
|
{
|
||||||
if (event.GetKeyCode() == WXK_TAB)
|
if ( HandleAsNavigationKey(event) )
|
||||||
{
|
return;
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
// no item -> nothing to do
|
// no item -> nothing to do
|
||||||
if (!HasCurrentRow())
|
if (!HasCurrentRow())
|
||||||
|
@@ -3456,16 +3456,8 @@ void wxListMainWindow::OnChar( wxKeyEvent &event )
|
|||||||
ke.SetEventObject( parent );
|
ke.SetEventObject( parent );
|
||||||
if (parent->GetEventHandler()->ProcessEvent( ke )) return;
|
if (parent->GetEventHandler()->ProcessEvent( ke )) return;
|
||||||
|
|
||||||
if (event.GetKeyCode() == WXK_TAB)
|
if ( HandleAsNavigationKey(event) )
|
||||||
{
|
return;
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
// no item -> nothing to do
|
// no item -> nothing to do
|
||||||
if (!HasCurrent())
|
if (!HasCurrent())
|
||||||
|
@@ -602,13 +602,7 @@ void wxVListBox::OnKeyDown(wxKeyEvent& event)
|
|||||||
case WXK_TAB:
|
case WXK_TAB:
|
||||||
// Since we are using wxWANTS_CHARS we need to send navigation
|
// Since we are using wxWANTS_CHARS we need to send navigation
|
||||||
// events for the tabs on MSW
|
// events for the tabs on MSW
|
||||||
{
|
HandleAsNavigationKey(event);
|
||||||
wxNavigationKeyEvent ne;
|
|
||||||
ne.SetDirection(!event.ShiftDown());
|
|
||||||
ne.SetCurrentFocus(this);
|
|
||||||
ne.SetEventObject(this);
|
|
||||||
GetParent()->GetEventHandler()->ProcessEvent(ne);
|
|
||||||
}
|
|
||||||
// fall through to default
|
// fall through to default
|
||||||
#endif
|
#endif
|
||||||
default:
|
default:
|
||||||
|
Reference in New Issue
Block a user