]> git.saurik.com Git - wxWidgets.git/blob - src/generic/panelg.cpp
Corrections to Forty Thieves; wxMemoryDC problem temporarily sorted
[wxWidgets.git] / src / generic / panelg.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: panelg.cpp
3 // Purpose: wxPanel
4 // Author: Julian Smart
5 // Modified by:
6 // Created: 04/01/98
7 // RCS-ID: $Id$
8 // Copyright: (c) Julian Smart and Markus Holzem
9 // Licence: wxWindows license
10 /////////////////////////////////////////////////////////////////////////////
11
12 #ifdef __GNUG__
13 #pragma implementation "panelg.h"
14 #endif
15
16 // For compilers that support precompilation, includes "wx.h".
17 #include "wx/wxprec.h"
18
19 #ifdef __BORLANDC__
20 #pragma hdrstop
21 #endif
22
23 #ifndef WX_PRECOMP
24 #include "wx/settings.h"
25 #endif
26
27 #include "wx/generic/panelg.h"
28
29 #if !USE_SHARED_LIBRARY
30 IMPLEMENT_DYNAMIC_CLASS(wxPanel, wxWindow)
31
32 BEGIN_EVENT_TABLE(wxPanel, wxWindow)
33 EVT_SYS_COLOUR_CHANGED(wxPanel::OnSysColourChanged)
34 EVT_NAVIGATION_KEY(wxPanel::OnNavigationKey)
35 END_EVENT_TABLE()
36
37 #endif
38
39 wxPanel::wxPanel()
40 {
41 }
42
43 bool wxPanel::Create(wxWindow *parent, wxWindowID id,
44 const wxPoint& pos,
45 const wxSize& size,
46 long style,
47 const wxString& name)
48 {
49 bool ret = wxWindow::Create(parent, id, pos, size, style, name);
50
51 if ( ret ) {
52 #ifndef __WXGTK__
53 SetBackgroundColour(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE));
54 SetFont(wxSystemSettings::GetSystemFont(wxSYS_DEFAULT_GUI_FONT));
55 #endif
56 }
57
58 return ret;
59 }
60
61 void wxPanel::InitDialog(void)
62 {
63 wxInitDialogEvent event(GetId());
64 event.SetEventObject(this);
65 GetEventHandler()->ProcessEvent(event);
66 }
67
68 void wxPanel::SetFocus()
69 {
70 SetFocusToNextChild();
71 }
72
73 // Responds to colour changes, and passes event on to children.
74 void wxPanel::OnSysColourChanged(wxSysColourChangedEvent& event)
75 {
76 SetBackgroundColour(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE));
77 Refresh();
78
79 // Propagate the event to the non-top-level children
80 wxWindow::OnSysColourChanged(event);
81 }
82
83 void wxPanel::OnNavigationKey(wxNavigationKeyEvent& event)
84 {
85 // don't process these ones here
86 if ( event.IsWindowChange() ) {
87 event.Skip();
88 return;
89 }
90
91 // first of all, find the window which currently has the focus
92 wxNode *node = GetChildren().First();
93 wxWindow *winFocus = event.GetCurrentFocus();
94
95 // @@@ no FindFocus() in wxGTK
96 #ifndef __WXGTK__
97 if ( winFocus == NULL )
98 winFocus = wxWindow::FindFocus();
99 #endif
100
101 while ( node != NULL ) {
102 if ( node->Data() == winFocus )
103 break;
104
105 node = node->Next();
106 }
107
108 if ( !SetFocusToNextChild(node, event.GetDirection()) )
109 event.Skip();
110 }
111
112 // set focus to the next child which accepts it (or first/last if node == NULL)
113 bool wxPanel::SetFocusToNextChild(wxNode *node, bool bForward)
114 {
115 // @@ using typed list would be better...
116 #define WIN(node) ((wxWindow *)(node->Data()))
117
118 bool bFound = FALSE; // have we found a window we will set focus to?
119
120 wxList *children = & GetChildren();
121 if ( node == NULL ) {
122 // we've never had focus before
123 node = bForward ? children->First() : children->Last();
124 if ( node == NULL ) {
125 // no children
126 return FALSE;
127 }
128
129 bFound = WIN(node)->AcceptsFocus();
130 }
131 #if 0 // to restore when it will really work (now it's triggered all the time)
132 else {
133 // just to be sure it's the right one
134 wxASSERT( WIN(node)->AcceptsFocus() );
135 }
136 #endif // 0
137
138 // find the next child which accepts focus
139 bool bParentWantsIt = TRUE;
140 while ( !bFound ) {
141 node = bForward ? node->Next() : node->Previous();
142 if ( node == NULL ) {
143 if ( !bParentWantsIt ) {
144 // we've already been here which means that we've done a whole
145 // cycle without success - get out from the infinite loop
146 return FALSE;
147 }
148
149 // ask parent if he doesn't want to advance focus to the next panel
150 if ( GetParent() != NULL ) {
151 wxNavigationKeyEvent event;
152 event.SetDirection(bForward);
153 event.SetWindowChange(FALSE);
154 event.SetCurrentFocus(this);
155
156 if ( GetParent()->ProcessEvent(event) )
157 return TRUE;
158 }
159
160 // a sentinel to avoid infinite loops
161 bParentWantsIt = FALSE;
162
163 // wrap around
164 node = bForward ? children->First() : children->Last();
165 }
166
167 bFound = WIN(node)->AcceptsFocus();
168 }
169
170 WIN(node)->SetFocus();
171
172 #undef WIN
173
174 return TRUE;
175 }
176