keyboard handling added (OnNavigationKey)

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@193 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin 1998-07-08 22:12:03 +00:00
parent 330043b46d
commit 90c3bdac77

View File

@ -31,35 +31,30 @@ IMPLEMENT_DYNAMIC_CLASS(wxPanel, wxWindow)
BEGIN_EVENT_TABLE(wxPanel, wxWindow) BEGIN_EVENT_TABLE(wxPanel, wxWindow)
EVT_SYS_COLOUR_CHANGED(wxPanel::OnSysColourChanged) EVT_SYS_COLOUR_CHANGED(wxPanel::OnSysColourChanged)
EVT_NAVIGATION_KEY(wxPanel::OnNavigationKey)
END_EVENT_TABLE() END_EVENT_TABLE()
#endif #endif
wxPanel::wxPanel(void) wxPanel::wxPanel()
{ {
SetBackgroundColour(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE));
SetDefaultBackgroundColour(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE));
} }
bool wxPanel::Create(wxWindow *parent, wxWindowID id, bool wxPanel::Create(wxWindow *parent, wxWindowID id,
const wxPoint& pos, const wxPoint& pos,
const wxSize& size, const wxSize& size,
long style, long style,
const wxString& name) const wxString& name)
{ {
bool ret = wxWindow::Create(parent, id, pos, size, style, name); bool ret = wxWindow::Create(parent, id, pos, size, style, name);
SetBackgroundColour(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE)); if ( ret ) {
SetDefaultBackgroundColour(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE)); SetBackgroundColour(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE));
SetFont(wxSystemSettings::GetSystemFont(wxSYS_DEFAULT_GUI_FONT)); SetDefaultBackgroundColour(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE));
return ret; SetFont(wxSystemSettings::GetSystemFont(wxSYS_DEFAULT_GUI_FONT));
} }
void wxPanel::OnPaint(wxPaintEvent& WXUNUSED(event)) return ret;
{
// No: if you call the default procedure, it makes
// the following painting code not work.
// wxWindow::OnPaint(event);
} }
void wxPanel::InitDialog(void) void wxPanel::InitDialog(void)
@ -69,6 +64,11 @@ void wxPanel::InitDialog(void)
GetEventHandler()->ProcessEvent(event); GetEventHandler()->ProcessEvent(event);
} }
void wxPanel::SetFocus()
{
SetFocusToNextChild();
}
// Responds to colour changes, and passes event on to children. // Responds to colour changes, and passes event on to children.
void wxPanel::OnSysColourChanged(wxSysColourChangedEvent& event) void wxPanel::OnSysColourChanged(wxSysColourChangedEvent& event)
{ {
@ -80,3 +80,79 @@ void wxPanel::OnSysColourChanged(wxSysColourChangedEvent& event)
wxWindow::OnSysColourChanged(event); wxWindow::OnSysColourChanged(event);
} }
void wxPanel::OnNavigationKey(wxNavigationKeyEvent& event)
{
// don't process these ones here
if ( event.IsWindowChange() ) {
event.Skip();
return;
}
// first of all, find the window which currently has the focus
wxNode *node = GetChildren()->First();
wxWindow *winFocus = event.GetCurrentFocus();
if ( winFocus == NULL )
winFocus = wxWindow::FindFocus();
while ( node != NULL ) {
if ( node->Data() == winFocus )
break;
node = node->Next();
}
if ( !SetFocusToNextChild(node, event.GetDirection()) )
event.Skip();
}
// set focus to the next child which accepts it (or first/last if node == NULL)
bool wxPanel::SetFocusToNextChild(wxNode *node, bool bForward)
{
// @@ using typed list would be better...
#define WIN(node) ((wxWindow *)(node->Data()))
bool bFound = FALSE; // have we found a window we will set focus to?
wxList *children = GetChildren();
if ( node == NULL ) {
// we've never had focus before
node = bForward ? children->First() : children->Last();
if ( node == NULL ) {
// no children
return FALSE;
}
bFound = WIN(node)->AcceptsFocus();
}
else {
// just to be sure it's the right one
wxASSERT( WIN(node)->AcceptsFocus() );
}
// find the next child which accepts focus
while ( !bFound ) {
node = bForward ? node->Next() : node->Previous();
if ( node == NULL ) {
// ask parent if he doesn't want to advance focus to the next panel
if ( GetParent() != NULL ) {
wxNavigationKeyEvent event;
event.SetDirection(bForward);
event.SetWindowChange(FALSE);
event.SetCurrentFocus(this);
if ( GetParent()->ProcessEvent(event) )
return TRUE;
}
// wrap around
node = bForward ? children->First() : children->Last();
}
bFound = WIN(node)->AcceptsFocus();
}
WIN(node)->SetFocus();
#undef WIN
return TRUE;
}