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:
Václav Slavík
2008-02-12 20:13:22 +00:00
parent 99404ab05f
commit f029f1d15b
7 changed files with 55 additions and 44 deletions

View File

@@ -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}

View File

@@ -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)

View File

@@ -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) )
{ {

View File

@@ -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

View File

@@ -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())

View File

@@ -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())

View File

@@ -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: