1 /////////////////////////////////////////////////////////////////////////////
4 // Author: Julian Smart
8 // Copyright: (c) Julian Smart and Markus Holzem
9 // Licence: wxWindows license
10 /////////////////////////////////////////////////////////////////////////////
13 #pragma implementation "panelg.h"
16 // For compilers that support precompilation, includes "wx.h".
17 #include "wx/wxprec.h"
24 #include "wx/settings.h"
27 #include "wx/generic/panelg.h"
29 #if !USE_SHARED_LIBRARY
30 IMPLEMENT_DYNAMIC_CLASS(wxPanel
, wxWindow
)
32 BEGIN_EVENT_TABLE(wxPanel
, wxWindow
)
33 EVT_SYS_COLOUR_CHANGED(wxPanel::OnSysColourChanged
)
34 EVT_NAVIGATION_KEY(wxPanel::OnNavigationKey
)
43 bool wxPanel::Create(wxWindow
*parent
, wxWindowID id
,
49 bool ret
= wxWindow::Create(parent
, id
, pos
, size
, style
, name
);
52 SetBackgroundColour(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE
));
53 SetDefaultBackgroundColour(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE
));
54 SetFont(wxSystemSettings::GetSystemFont(wxSYS_DEFAULT_GUI_FONT
));
60 void wxPanel::InitDialog(void)
62 wxInitDialogEvent
event(GetId());
63 event
.SetEventObject(this);
64 GetEventHandler()->ProcessEvent(event
);
67 void wxPanel::SetFocus()
69 SetFocusToNextChild();
72 // Responds to colour changes, and passes event on to children.
73 void wxPanel::OnSysColourChanged(wxSysColourChangedEvent
& event
)
75 SetBackgroundColour(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE
));
76 SetDefaultBackgroundColour(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE
));
79 // Propagate the event to the non-top-level children
80 wxWindow::OnSysColourChanged(event
);
83 void wxPanel::OnNavigationKey(wxNavigationKeyEvent
& event
)
85 // don't process these ones here
86 if ( event
.IsWindowChange() ) {
91 // first of all, find the window which currently has the focus
92 wxNode
*node
= GetChildren()->First();
93 wxWindow
*winFocus
= event
.GetCurrentFocus();
94 if ( winFocus
== NULL
)
95 winFocus
= wxWindow::FindFocus();
96 while ( node
!= NULL
) {
97 if ( node
->Data() == winFocus
)
103 if ( !SetFocusToNextChild(node
, event
.GetDirection()) )
107 // set focus to the next child which accepts it (or first/last if node == NULL)
108 bool wxPanel::SetFocusToNextChild(wxNode
*node
, bool bForward
)
110 // @@ using typed list would be better...
111 #define WIN(node) ((wxWindow *)(node->Data()))
113 bool bFound
= FALSE
; // have we found a window we will set focus to?
115 wxList
*children
= GetChildren();
116 if ( node
== NULL
) {
117 // we've never had focus before
118 node
= bForward
? children
->First() : children
->Last();
119 if ( node
== NULL
) {
124 bFound
= WIN(node
)->AcceptsFocus();
127 // just to be sure it's the right one
128 wxASSERT( WIN(node
)->AcceptsFocus() );
131 // find the next child which accepts focus
133 node
= bForward
? node
->Next() : node
->Previous();
134 if ( node
== NULL
) {
135 // ask parent if he doesn't want to advance focus to the next panel
136 if ( GetParent() != NULL
) {
137 wxNavigationKeyEvent event
;
138 event
.SetDirection(bForward
);
139 event
.SetWindowChange(FALSE
);
140 event
.SetCurrentFocus(this);
142 if ( GetParent()->ProcessEvent(event
) )
147 node
= bForward
? children
->First() : children
->Last();
150 bFound
= WIN(node
)->AcceptsFocus();
153 WIN(node
)->SetFocus();