]> git.saurik.com Git - wxWidgets.git/blob - src/generic/panelg.cpp
* wxMemory*Stream link problem fix.
[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 SetBackgroundColour(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE));
53 SetDefaultBackgroundColour(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE));
54 SetFont(wxSystemSettings::GetSystemFont(wxSYS_DEFAULT_GUI_FONT));
55 }
56
57 return ret;
58 }
59
60 void wxPanel::InitDialog(void)
61 {
62 wxInitDialogEvent event(GetId());
63 event.SetEventObject(this);
64 GetEventHandler()->ProcessEvent(event);
65 }
66
67 void wxPanel::SetFocus()
68 {
69 SetFocusToNextChild();
70 }
71
72 // Responds to colour changes, and passes event on to children.
73 void wxPanel::OnSysColourChanged(wxSysColourChangedEvent& event)
74 {
75 SetBackgroundColour(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE));
76 SetDefaultBackgroundColour(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 // Added by JACS since this seems to cause an infinite loop.
116 return FALSE;
117
118 // @@ using typed list would be better...
119 #define WIN(node) ((wxWindow *)(node->Data()))
120
121 bool bFound = FALSE; // have we found a window we will set focus to?
122
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 ) {
128 // no children
129 return FALSE;
130 }
131
132 bFound = WIN(node)->AcceptsFocus();
133 }
134 else {
135 // just to be sure it's the right one
136 wxASSERT( WIN(node)->AcceptsFocus() );
137 }
138
139 // find the next child which accepts focus
140 while ( !bFound ) {
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);
149
150 if ( GetParent()->ProcessEvent(event) )
151 return TRUE;
152 }
153
154 // wrap around
155 node = bForward ? children->First() : children->Last();
156 }
157
158 bFound = WIN(node)->AcceptsFocus();
159 }
160
161 WIN(node)->SetFocus();
162
163 #undef WIN
164
165 return TRUE;
166 }