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();
95 // @@@ no FindFocus() in wxGTK
97 if ( winFocus
== NULL
)
98 winFocus
= wxWindow::FindFocus();
101 while ( node
!= NULL
) {
102 if ( node
->Data() == winFocus
)
108 if ( !SetFocusToNextChild(node
, event
.GetDirection()) )
112 // set focus to the next child which accepts it (or first/last if node == NULL)
113 bool wxPanel::SetFocusToNextChild(wxNode
*node
, bool bForward
)
115 // Added by JACS since this seems to cause an infinite loop.
118 // @@ using typed list would be better...
119 #define WIN(node) ((wxWindow *)(node->Data()))
121 bool bFound
= FALSE
; // have we found a window we will set focus to?
123 wxList
*children
= GetChildren();
124 if ( node
== NULL
) {
125 // we've never had focus before
126 node
= bForward
? children
->First() : children
->Last();
127 if ( node
== NULL
) {
132 bFound
= WIN(node
)->AcceptsFocus();
135 // just to be sure it's the right one
136 wxASSERT( WIN(node
)->AcceptsFocus() );
139 // find the next child which accepts focus
141 node
= bForward
? node
->Next() : node
->Previous();
142 if ( node
== NULL
) {
143 // ask parent if he doesn't want to advance focus to the next panel
144 if ( GetParent() != NULL
) {
145 wxNavigationKeyEvent event
;
146 event
.SetDirection(bForward
);
147 event
.SetWindowChange(FALSE
);
148 event
.SetCurrentFocus(this);
150 if ( GetParent()->ProcessEvent(event
) )
155 node
= bForward
? children
->First() : children
->Last();
158 bFound
= WIN(node
)->AcceptsFocus();
161 WIN(node
)->SetFocus();