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}.
\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}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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