]> git.saurik.com Git - wxWidgets.git/blob - src/common/dlgcmn.cpp
Redirect wxComboBox::SetFocus to its text field Part I.
[wxWidgets.git] / src / common / dlgcmn.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: common/dlgcmn.cpp
3 // Purpose: common (to all ports) wxDialog functions
4 // Author: Vadim Zeitlin
5 // Modified by:
6 // Created: 28.06.99
7 // RCS-ID: $Id$
8 // Copyright: (c) Vadim Zeitlin
9 // Licence: wxWindows license
10 /////////////////////////////////////////////////////////////////////////////
11
12 // ============================================================================
13 // declarations
14 // ============================================================================
15
16 // ----------------------------------------------------------------------------
17 // headers
18 // ----------------------------------------------------------------------------
19
20 #ifdef __GNUG__
21 #pragma implementation "dialogbase.h"
22 #endif
23
24 // For compilers that support precompilation, includes "wx.h".
25 #include "wx/wxprec.h"
26
27 #ifdef __BORLANDC__
28 #pragma hdrstop
29 #endif
30
31 #ifndef WX_PRECOMP
32 #include "wx/button.h"
33 #include "wx/dialog.h"
34 #include "wx/dcclient.h"
35 #include "wx/intl.h"
36 #include "wx/settings.h"
37 #include "wx/stattext.h"
38 #include "wx/sizer.h"
39 #include "wx/button.h"
40 #include "wx/containr.h"
41 #endif
42
43
44 //--------------------------------------------------------------------------
45 // wxDialogBase
46 //--------------------------------------------------------------------------
47
48 // FIXME - temporary hack in absence of wxtopLevelWindow, should be always used
49 #ifdef wxTopLevelWindowNative
50 BEGIN_EVENT_TABLE(wxDialogBase, wxTopLevelWindow)
51 WX_EVENT_TABLE_CONTROL_CONTAINER(wxDialogBase)
52 END_EVENT_TABLE()
53
54 WX_DELEGATE_TO_CONTROL_CONTAINER(wxDialogBase)
55 #endif
56
57 void wxDialogBase::Init()
58 {
59 m_returnCode = 0;
60
61 // the dialogs have this flag on by default to prevent the events from the
62 // dialog controls from reaching the parent frame which is usually
63 // undesirable and can lead to unexpected and hard to find bugs
64 SetExtraStyle(GetExtraStyle() | wxWS_EX_BLOCK_EVENTS);
65
66 #ifdef wxTopLevelWindowNative // FIXME - temporary hack, should be always used!
67 m_container.SetContainerWindow(this);
68 #endif
69 }
70
71 #if wxUSE_STATTEXT && wxUSE_TEXTCTRL
72
73 wxSizer *wxDialogBase::CreateTextSizer( const wxString& message )
74 {
75 wxBoxSizer *box = new wxBoxSizer( wxVERTICAL );
76
77 // get line height for empty lines
78 int y = 0;
79 wxFont font( GetFont() );
80 if (!font.Ok())
81 font = *wxSWISS_FONT;
82 GetTextExtent(_T("H"), (int*)NULL, &y, (int*)NULL, (int*)NULL, &font);
83
84 wxString line;
85 for ( size_t pos = 0; pos < message.length(); pos++ )
86 {
87 switch ( message[pos] )
88 {
89 case _T('\n'):
90 if (!line.IsEmpty())
91 {
92 wxStaticText *s1 = new wxStaticText( this, -1, line );
93 box->Add( s1 );
94 line = wxT("");
95 }
96 else
97 {
98 box->Add( 5, y );
99 }
100 break;
101
102 case _T('&'):
103 // this is used as accel mnemonic prefix in the wxWindows
104 // controls but in the static messages created by
105 // CreateTextSizer() (used by wxMessageBox, for example), we
106 // don't want this special meaning, so we need to quote it
107 line += _T('&');
108
109 // fall through to add it normally too
110
111 default:
112 line += message[pos];
113 }
114 }
115
116 // remaining text behind last '\n'
117 if (!line.IsEmpty())
118 {
119 wxStaticText *s2 = new wxStaticText( this, -1, line );
120 box->Add( s2 );
121 }
122
123 return box;
124 }
125
126 #endif // wxUSE_STATTEXT && wxUSE_TEXTCTRL
127
128 #if wxUSE_BUTTON
129
130 wxSizer *wxDialogBase::CreateButtonSizer( long flags )
131 {
132 wxBoxSizer *box = new wxBoxSizer( wxHORIZONTAL );
133
134 #if defined(__WXMSW__) || defined(__WXMAC__)
135 static const int margin = 6;
136 #else
137 static const int margin = 10;
138 #endif
139
140 wxButton *ok = (wxButton *) NULL;
141 wxButton *cancel = (wxButton *) NULL;
142 wxButton *yes = (wxButton *) NULL;
143 wxButton *no = (wxButton *) NULL;
144
145 // always show an OK button, unless we have both YES and NO
146 if ( (flags & wxYES_NO) != wxYES_NO )
147 flags |= wxOK;
148
149 if (flags & wxYES)
150 {
151 yes = new wxButton( this, wxID_YES, _("Yes"),wxDefaultPosition,wxDefaultSize,wxCLIP_SIBLINGS );
152 box->Add( yes, 0, wxLEFT|wxRIGHT, margin );
153 }
154 if (flags & wxNO)
155 {
156 no = new wxButton( this, wxID_NO, _("No"),wxDefaultPosition,wxDefaultSize,wxCLIP_SIBLINGS );
157 box->Add( no, 0, wxLEFT|wxRIGHT, margin );
158 }
159
160 if (flags & wxOK)
161 {
162 ok = new wxButton( this, wxID_OK, _("OK"),wxDefaultPosition,wxDefaultSize,wxCLIP_SIBLINGS );
163 box->Add( ok, 0, wxLEFT|wxRIGHT, margin );
164 }
165
166 if (flags & wxFORWARD)
167 box->Add( new wxButton( this, wxID_FORWARD, _("Forward"),wxDefaultPosition,wxDefaultSize,wxCLIP_SIBLINGS ), 0, wxLEFT|wxRIGHT, margin );
168
169 if (flags & wxBACKWARD)
170 box->Add( new wxButton( this, wxID_BACKWARD, _("Backward"),wxDefaultPosition,wxDefaultSize,wxCLIP_SIBLINGS ), 0, wxLEFT|wxRIGHT, margin );
171
172 if (flags & wxSETUP)
173 box->Add( new wxButton( this, wxID_SETUP, _("Setup"),wxDefaultPosition,wxDefaultSize,wxCLIP_SIBLINGS ), 0, wxLEFT|wxRIGHT, margin );
174
175 if (flags & wxMORE)
176 box->Add( new wxButton( this, wxID_MORE, _("More..."),wxDefaultPosition,wxDefaultSize,wxCLIP_SIBLINGS ), 0, wxLEFT|wxRIGHT, margin );
177
178 if (flags & wxHELP)
179 box->Add( new wxButton( this, wxID_HELP, _("Help"),wxDefaultPosition,wxDefaultSize,wxCLIP_SIBLINGS ), 0, wxLEFT|wxRIGHT, margin );
180
181 if (flags & wxCANCEL)
182 {
183 cancel = new wxButton( this, wxID_CANCEL, _("Cancel"),wxDefaultPosition,wxDefaultSize,wxCLIP_SIBLINGS );
184 box->Add( cancel, 0, wxLEFT|wxRIGHT, margin );
185 }
186
187 // choose the default button
188 if (flags & wxNO_DEFAULT)
189 {
190 if (no)
191 {
192 no->SetDefault();
193 no->SetFocus();
194 }
195 }
196 else
197 {
198 if (ok)
199 {
200 ok->SetDefault();
201 ok->SetFocus();
202 }
203 else if (yes)
204 {
205 yes->SetDefault();
206 yes->SetFocus();
207 }
208 }
209
210 return box;
211 }
212
213 #endif // wxUSE_BUTTON