Sorry, I went and removed consts as per the style guide :-)
[wxWidgets.git] / src / generic / choicdgg.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: choicesg.cpp
3 // Purpose: Choice dialogs
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 "choicdgg.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 <stdio.h>
25 #include "wx/utils.h"
26 #include "wx/dialog.h"
27 #include "wx/listbox.h"
28 #include "wx/button.h"
29 #include "wx/stattext.h"
30 #include "wx/layout.h"
31 #include "wx/intl.h"
32 #endif
33
34 #include "wx/generic/choicdgg.h"
35
36 extern void wxSplitMessage2(const char *message, wxList *messageList, wxWindow *parent, wxRowColSizer *sizer);
37
38 wxString wxGetSingleChoice( const wxString& message, const wxString& caption, int n,
39 const wxString *choices, wxWindow *parent,
40 int WXUNUSED(x), int WXUNUSED(y), bool WXUNUSED(centre),
41 int WXUNUSED(width), int WXUNUSED(height) )
42 {
43 wxSingleChoiceDialog dialog(parent, message, caption, n, choices);
44 if ( dialog.ShowModal() == wxID_OK )
45 {
46 return dialog.GetStringSelection();
47 }
48 else
49 return "";
50 }
51
52 // Overloaded for backward compatibility
53 wxString wxGetSingleChoice( const wxString& message, const wxString& caption, int n,
54 char *choices[], wxWindow *parent,
55 int x, int y, bool centre,
56 int width, int height )
57 {
58 wxString *strings = new wxString[n];
59 int i;
60 for ( i = 0; i < n; i++)
61 {
62 strings[i] = choices[i];
63 }
64 wxString ans(wxGetSingleChoice(message, caption, n, (const wxString *)strings, parent,
65 x, y, centre, width, height));
66 delete[] strings;
67 return ans;
68 }
69
70 int wxGetSingleChoiceIndex( const wxString& message, const wxString& caption, int n,
71 const wxString *choices, wxWindow *parent,
72 int WXUNUSED(x), int WXUNUSED(y), bool WXUNUSED(centre),
73 int WXUNUSED(width), int WXUNUSED(height) )
74 {
75 wxSingleChoiceDialog dialog(parent, message, caption, n, choices);
76 if ( dialog.ShowModal() == wxID_OK )
77 {
78 return dialog.GetSelection();
79 }
80 else
81 return -1;
82 }
83
84 // Overloaded for backward compatibility
85 int wxGetSingleChoiceIndex( const wxString& message, const wxString& caption, int n,
86 char *choices[], wxWindow *parent,
87 int x, int y, bool centre,
88 int width, int height )
89 {
90 wxString *strings = new wxString[n];
91 int i;
92 for ( i = 0; i < n; i++)
93 {
94 strings[i] = choices[i];
95 }
96 int ans = wxGetSingleChoiceIndex(message, caption, n, (const wxString *)strings, parent,
97 x, y, centre, width, height);
98 delete[] strings;
99 return ans;
100 }
101
102 char *wxGetSingleChoiceData( const wxString& message, const wxString& caption, int n,
103 const wxString *choices, char **client_data, wxWindow *parent,
104 int WXUNUSED(x), int WXUNUSED(y), bool WXUNUSED(centre),
105 int WXUNUSED(width), int WXUNUSED(height) )
106 {
107 wxSingleChoiceDialog dialog(parent, message, caption, n, choices, client_data);
108 if ( dialog.ShowModal() == wxID_OK )
109 {
110 return dialog.GetSelectionClientData();
111 }
112 else
113 return NULL;
114 }
115
116 // Overloaded for backward compatibility
117 char *wxGetSingleChoiceData( const wxString& message, const wxString& caption, int n,
118 char *choices[], char **client_data, wxWindow *parent,
119 int x, int y, bool centre,
120 int width, int height )
121 {
122 wxString *strings = new wxString[n];
123 int i;
124 for ( i = 0; i < n; i++)
125 {
126 strings[i] = choices[i];
127 }
128 char *data = wxGetSingleChoiceData(message, caption, n, (const wxString *)strings, client_data, parent,
129 x, y, centre, width, height);
130 delete[] strings;
131 return data;
132 }
133
134
135 /* Multiple choice dialog contributed by Robert Cowell
136 *
137
138 The new data passed are in the "int nsel" and "int * selection"
139
140 The idea is to make a multiple selection from list of strings.
141 The returned value is the total number selected. initialily there
142 are nsel selected, with indices stored in
143 selection[0],...,selection[nsel-1] which appear highlighted to
144 begin with. On exit with value i
145 selection[0..i-1] contains the indices of the selected items.
146 (Some prior selectecions might be deselected.)
147 Thus selection must be as big as choices, in case all items are
148 selected.
149
150 */
151 /*
152 int wxGetMultipleChoice(const wxString& message, const wxString& caption,
153 int n, const wxString *choices,
154 int nsel, int * selection,
155 wxWindow *parent , int x , int y, bool centre,
156 int width, int height)
157 {
158 return -1;
159 }
160 */
161
162 // wxSingleChoiceDialog
163
164 #if !USE_SHARED_LIBRARY
165 BEGIN_EVENT_TABLE(wxSingleChoiceDialog, wxDialog)
166 EVT_BUTTON(wxID_OK, wxSingleChoiceDialog::OnOK)
167 EVT_LISTBOX_DCLICK(wxID_LISTBOX, wxSingleChoiceDialog::OnListBoxDClick)
168 END_EVENT_TABLE()
169
170 IMPLEMENT_CLASS(wxSingleChoiceDialog, wxDialog)
171 #endif
172
173 wxSingleChoiceDialog::wxSingleChoiceDialog(wxWindow *parent, const wxString& message, const wxString& caption,
174 int n, const wxString *choices, char **clientData, long style, const wxPoint& pos):
175 wxDialog(parent, -1, caption, pos, wxDefaultSize, wxDEFAULT_DIALOG_STYLE|wxDIALOG_MODAL)
176 {
177 Create(parent, message, caption, n, choices, clientData, style);
178 }
179
180 wxSingleChoiceDialog::wxSingleChoiceDialog(wxWindow *parent, const wxString& message, const wxString& caption,
181 const wxStringList& choices, char **clientData, long style, const wxPoint& pos):
182 wxDialog(parent, -1, caption, pos, wxDefaultSize, wxDEFAULT_DIALOG_STYLE|wxDIALOG_MODAL)
183 {
184 Create(parent, message, caption, choices, clientData, style);
185 }
186
187 bool wxSingleChoiceDialog::Create(wxWindow *parent, const wxString& message, const wxString& caption,
188 const wxStringList& choices, char **clientData, long style, const wxPoint& pos)
189 {
190 wxString *strings = new wxString[choices.Number()];
191 int i;
192 for ( i = 0; i < choices.Number(); i++)
193 {
194 strings[i] = (char *)choices.Nth(i)->Data();
195 }
196 bool ans = Create(parent, message, caption, choices.Number(), strings, clientData, style, pos);
197 delete[] strings;
198 return ans;
199 }
200
201 bool wxSingleChoiceDialog::Create( wxWindow *WXUNUSED(parent), const wxString& message,
202 const wxString& WXUNUSED(caption), int n,
203 const wxString *choices, char **clientData, long style,
204 const wxPoint& WXUNUSED(pos) )
205 {
206 m_dialogStyle = style;
207 m_selection = 0;
208 m_stringSelection = "";
209 m_clientData = NULL;
210
211 wxBeginBusyCursor();
212
213 wxSizer *topSizer = new wxSizer(this, wxSizerShrink);
214 topSizer->SetBorder(10, 10);
215
216 wxRowColSizer *messageSizer = new wxRowColSizer(topSizer, wxSIZER_COLS, 100);
217 messageSizer->SetName("messageSizer");
218
219 // bool centre = ((style & wxCENTRE) == wxCENTRE);
220
221 wxList messageList;
222 wxSplitMessage2(message, &messageList, this, messageSizer);
223
224 // Insert a spacer
225 wxSpacingSizer *spacingSizer = new wxSpacingSizer(topSizer, wxBelow, messageSizer, 10);
226
227 wxListBox *listBox = new wxListBox(this, wxID_LISTBOX, wxPoint(-1, -1), wxSize(240, 160),
228 n, choices);
229 listBox->SetSelection(m_selection);
230 if ( clientData )
231 {
232 int i;
233 for ( i = 0; i < n; i++)
234 {
235 listBox->SetClientData(i, clientData[i]);
236 }
237 }
238
239 wxRowColSizer *listBoxSizer = new wxRowColSizer(topSizer, wxSIZER_ROWS);
240 listBoxSizer->AddSizerChild(listBox);
241 listBoxSizer->SetName("listBoxSizer");
242
243 // Create constraints for the text sizer
244 wxLayoutConstraints *textC = new wxLayoutConstraints;
245 textC->left.SameAs (messageSizer, wxLeft);
246 textC->top.Below (spacingSizer);
247 listBoxSizer->SetConstraints(textC);
248
249 // Insert another spacer
250 wxSpacingSizer *spacingSizer2 = new wxSpacingSizer(topSizer, wxBelow, listBoxSizer, 10);
251 spacingSizer->SetName("spacingSizer2");
252
253 // Insert a sizer for the buttons
254 wxRowColSizer *buttonSizer = new wxRowColSizer(topSizer, wxSIZER_ROWS);
255 buttonSizer->SetName("buttonSizer");
256
257 // Specify constraints for the button sizer
258 wxLayoutConstraints *c = new wxLayoutConstraints;
259 c->width.AsIs ();
260 c->height.AsIs ();
261 c->top.Below (spacingSizer2);
262 c->centreX.SameAs (listBoxSizer, wxCentreX);
263 buttonSizer->SetConstraints(c);
264
265 wxButton *ok = NULL;
266 wxButton *cancel = NULL;
267
268 if (style & wxOK) {
269 ok = new wxButton(this, wxID_OK, _("OK"));
270 buttonSizer->AddSizerChild(ok);
271 }
272
273 if (style & wxCANCEL) {
274 cancel = new wxButton(this, wxID_CANCEL, _("Cancel"));
275 buttonSizer->AddSizerChild(cancel);
276 }
277
278 if (ok)
279 {
280 ok->SetDefault();
281 ok->SetFocus();
282 }
283
284 Layout();
285 Centre(wxBOTH);
286
287 wxEndBusyCursor();
288
289 return TRUE;
290 }
291
292 // Set the selection
293 void wxSingleChoiceDialog::SetSelection(int sel)
294 {
295 wxListBox *listBox = (wxListBox *)FindWindow(wxID_LISTBOX);
296 if (listBox)
297 {
298 listBox->SetSelection(sel);
299 }
300 m_selection = sel;
301 }
302
303 void wxSingleChoiceDialog::OnOK(wxCommandEvent& WXUNUSED(event))
304 {
305 wxListBox *listBox = (wxListBox *)FindWindow(wxID_LISTBOX);
306 if ( listBox )
307 {
308 m_selection = listBox->GetSelection();
309 m_stringSelection = listBox->GetStringSelection();
310 m_clientData = listBox->GetClientData(m_selection);
311 }
312
313 EndModal(wxID_OK);
314 }
315
316 void wxSingleChoiceDialog::OnListBoxDClick(wxCommandEvent& WXUNUSED(event))
317 {
318 wxListBox *listBox = (wxListBox *)FindWindow(wxID_LISTBOX);
319 if ( listBox )
320 {
321 m_selection = listBox->GetSelection();
322 m_stringSelection = listBox->GetStringSelection();
323 m_clientData = listBox->GetClientData(m_selection);
324 }
325
326 EndModal(wxID_OK);
327 }
328
329