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:
parent
330043b46d
commit
90c3bdac77
@ -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;
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user