]> git.saurik.com Git - wxWidgets.git/blame - src/generic/panelg.cpp
* wxStream: I've rewritten the inheritance
[wxWidgets.git] / src / generic / panelg.cpp
CommitLineData
c801d85f
KB
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
30IMPLEMENT_DYNAMIC_CLASS(wxPanel, wxWindow)
31
32BEGIN_EVENT_TABLE(wxPanel, wxWindow)
33 EVT_SYS_COLOUR_CHANGED(wxPanel::OnSysColourChanged)
90c3bdac 34 EVT_NAVIGATION_KEY(wxPanel::OnNavigationKey)
c801d85f
KB
35END_EVENT_TABLE()
36
37#endif
38
90c3bdac 39wxPanel::wxPanel()
c801d85f 40{
c801d85f
KB
41}
42
debe6624 43bool wxPanel::Create(wxWindow *parent, wxWindowID id,
90c3bdac
VZ
44 const wxPoint& pos,
45 const wxSize& size,
46 long style,
47 const wxString& name)
c801d85f
KB
48{
49 bool ret = wxWindow::Create(parent, id, pos, size, style, name);
50
90c3bdac
VZ
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 }
c801d85f 56
90c3bdac 57 return ret;
c801d85f
KB
58}
59
60void wxPanel::InitDialog(void)
61{
62 wxInitDialogEvent event(GetId());
63 event.SetEventObject(this);
64 GetEventHandler()->ProcessEvent(event);
65}
66
90c3bdac
VZ
67void wxPanel::SetFocus()
68{
69 SetFocusToNextChild();
70}
71
c801d85f
KB
72// Responds to colour changes, and passes event on to children.
73void 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
90c3bdac
VZ
83void 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();
6e4739a0
VZ
94
95 // @@@ no FindFocus() in wxGTK
2049ba38 96 #ifndef __WXGTK__
6e4739a0
VZ
97 if ( winFocus == NULL )
98 winFocus = wxWindow::FindFocus();
99 #endif
100
90c3bdac
VZ
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)
113bool wxPanel::SetFocusToNextChild(wxNode *node, bool bForward)
114{
8b9518ee
JS
115 // Added by JACS since this seems to cause an infinite loop.
116 return FALSE;
117
90c3bdac
VZ
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;
6e4739a0 166}