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 SetFont(wxSystemSettings::GetSystemFont(wxSYS_DEFAULT_GUI_FONT
));
59 void wxPanel::InitDialog(void)
61 wxInitDialogEvent
event(GetId());
62 event
.SetEventObject(this);
63 GetEventHandler()->ProcessEvent(event
);
66 void wxPanel::SetFocus()
68 SetFocusToNextChild();
71 // Responds to colour changes, and passes event on to children.
72 void wxPanel::OnSysColourChanged(wxSysColourChangedEvent
& event
)
74 SetBackgroundColour(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE
));
77 // Propagate the event to the non-top-level children
78 wxWindow::OnSysColourChanged(event
);
81 void wxPanel::OnNavigationKey(wxNavigationKeyEvent
& event
)
83 // don't process these ones here
84 if ( event
.IsWindowChange() ) {
89 // first of all, find the window which currently has the focus
90 wxNode
*node
= GetChildren()->First();
91 wxWindow
*winFocus
= event
.GetCurrentFocus();
93 // @@@ no FindFocus() in wxGTK
95 if ( winFocus
== NULL
)
96 winFocus
= wxWindow::FindFocus();
99 while ( node
!= NULL
) {
100 if ( node
->Data() == winFocus
)
106 if ( !SetFocusToNextChild(node
, event
.GetDirection()) )
110 // set focus to the next child which accepts it (or first/last if node == NULL)
111 bool wxPanel::SetFocusToNextChild(wxNode
*node
, bool bForward
)
113 // @@ using typed list would be better...
114 #define WIN(node) ((wxWindow *)(node->Data()))
116 bool bFound
= FALSE
; // have we found a window we will set focus to?
118 wxList
*children
= GetChildren();
119 if ( node
== NULL
) {
120 // we've never had focus before
121 node
= bForward
? children
->First() : children
->Last();
122 if ( node
== NULL
) {
127 bFound
= WIN(node
)->AcceptsFocus();
129 #if 0 // to restore when it will really work (now it's triggered all the time)
131 // just to be sure it's the right one
132 wxASSERT( WIN(node
)->AcceptsFocus() );
136 // find the next child which accepts focus
137 bool bParentWantsIt
= TRUE
;
139 node
= bForward
? node
->Next() : node
->Previous();
140 if ( node
== NULL
) {
141 if ( !bParentWantsIt
) {
142 // we've already been here which means that we've done a whole
143 // cycle without success - get out from the infinite loop
147 // ask parent if he doesn't want to advance focus to the next panel
148 if ( GetParent() != NULL
) {
149 wxNavigationKeyEvent event
;
150 event
.SetDirection(bForward
);
151 event
.SetWindowChange(FALSE
);
152 event
.SetCurrentFocus(this);
154 if ( GetParent()->ProcessEvent(event
) )
158 // a sentinel to avoid infinite loops
159 bParentWantsIt
= FALSE
;
162 node
= bForward
? children
->First() : children
->Last();
165 bFound
= WIN(node
)->AcceptsFocus();
168 WIN(node
)->SetFocus();