#ifdefed out a typedef not appropriate to MSW; added SetSelection to choice dialog
[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, const int n,
39 const wxString *choices, wxWindow *parent,
40 const int WXUNUSED(x), const int WXUNUSED(y), const bool WXUNUSED(centre),
41 const int WXUNUSED(width), const 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, const int n,
54 char *choices[], wxWindow *parent,
55 const int x, const int y, const bool centre,
56 const int width, const 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, const int n,
71 const wxString *choices, wxWindow *parent,
72 const int WXUNUSED(x), const int WXUNUSED(y), const bool WXUNUSED(centre),
73 const int WXUNUSED(width), const 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, const int n,
86 char *choices[], wxWindow *parent,
87 const int x, const int y, const bool centre,
88 const int width, const 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, const int n,
103 const wxString *choices, char **client_data, wxWindow *parent,
104 const int WXUNUSED(x), const int WXUNUSED(y), const bool WXUNUSED(centre),
105 const int WXUNUSED(width), const 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, const int n,
118 char *choices[], char **client_data, wxWindow *parent,
119 const int x, const int y, const bool centre,
120 const int width, const 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 const int n, const wxString *choices,
154 const int nsel, int * selection,
155 wxWindow *parent , const int x , const int y, const bool centre,
156 const int width, const 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 END_EVENT_TABLE()
168
169 IMPLEMENT_CLASS(wxSingleChoiceDialog, wxDialog)
170 #endif
171
172 wxSingleChoiceDialog::wxSingleChoiceDialog(wxWindow *parent, const wxString& message, const wxString& caption,
173 const int n, const wxString *choices, char **clientData, long style, const wxPoint& pos):
174 wxDialog(parent, -1, caption, pos, wxDefaultSize, wxDEFAULT_DIALOG_STYLE|wxDIALOG_MODAL)
175 {
176 Create(parent, message, caption, n, choices, clientData, style);
177 }
178
179 wxSingleChoiceDialog::wxSingleChoiceDialog(wxWindow *parent, const wxString& message, const wxString& caption,
180 const wxStringList& choices, char **clientData, long style, const wxPoint& pos):
181 wxDialog(parent, -1, caption, pos, wxDefaultSize, wxDEFAULT_DIALOG_STYLE|wxDIALOG_MODAL)
182 {
183 Create(parent, message, caption, choices, clientData, style);
184 }
185
186 bool wxSingleChoiceDialog::Create(wxWindow *parent, const wxString& message, const wxString& caption,
187 const wxStringList& choices, char **clientData, long style, const wxPoint& pos)
188 {
189 wxString *strings = new wxString[choices.Number()];
190 int i;
191 for ( i = 0; i < choices.Number(); i++)
192 {
193 strings[i] = (char *)choices.Nth(i)->Data();
194 }
195 bool ans = Create(parent, message, caption, choices.Number(), strings, clientData, style, pos);
196 delete[] strings;
197 return ans;
198 }
199
200 bool wxSingleChoiceDialog::Create( wxWindow *WXUNUSED(parent), const wxString& message,
201 const wxString& WXUNUSED(caption), const int n,
202 const wxString *choices, char **clientData, long style,
203 const wxPoint& WXUNUSED(pos) )
204 {
205 m_dialogStyle = style;
206 m_selection = 0;
207 m_stringSelection = "";
208 m_clientData = NULL;
209
210 wxBeginBusyCursor();
211
212 wxSizer *topSizer = new wxSizer(this, wxSizerShrink);
213 topSizer->SetBorder(10, 10);
214
215 wxRowColSizer *messageSizer = new wxRowColSizer(topSizer, wxSIZER_COLS, 100);
216 messageSizer->SetName("messageSizer");
217
218 // bool centre = ((style & wxCENTRE) == wxCENTRE);
219
220 wxList messageList;
221 wxSplitMessage2(message, &messageList, this, messageSizer);
222
223 // Insert a spacer
224 wxSpacingSizer *spacingSizer = new wxSpacingSizer(topSizer, wxBelow, messageSizer, 10);
225
226 wxListBox *listBox = new wxListBox(this, wxID_LISTBOX, wxPoint(-1, -1), wxSize(240, 160),
227 n, choices);
228 listBox->SetSelection(m_selection);
229 if ( clientData )
230 {
231 int i;
232 for ( i = 0; i < n; i++)
233 {
234 listBox->SetClientData(i, clientData[i]);
235 }
236 }
237
238 wxRowColSizer *listBoxSizer = new wxRowColSizer(topSizer, wxSIZER_ROWS);
239 listBoxSizer->AddSizerChild(listBox);
240 listBoxSizer->SetName("listBoxSizer");
241
242 // Create constraints for the text sizer
243 wxLayoutConstraints *textC = new wxLayoutConstraints;
244 textC->left.SameAs (messageSizer, wxLeft);
245 textC->top.Below (spacingSizer);
246 listBoxSizer->SetConstraints(textC);
247
248 // Insert another spacer
249 wxSpacingSizer *spacingSizer2 = new wxSpacingSizer(topSizer, wxBelow, listBoxSizer, 10);
250 spacingSizer->SetName("spacingSizer2");
251
252 // Insert a sizer for the buttons
253 wxRowColSizer *buttonSizer = new wxRowColSizer(topSizer, wxSIZER_ROWS);
254 buttonSizer->SetName("buttonSizer");
255
256 // Specify constraints for the button sizer
257 wxLayoutConstraints *c = new wxLayoutConstraints;
258 c->width.AsIs ();
259 c->height.AsIs ();
260 c->top.Below (spacingSizer2);
261 c->centreX.SameAs (listBoxSizer, wxCentreX);
262 buttonSizer->SetConstraints(c);
263
264 wxButton *ok = NULL;
265 wxButton *cancel = NULL;
266
267 if (style & wxOK) {
268 ok = new wxButton(this, wxID_OK, _("OK"));
269 buttonSizer->AddSizerChild(ok);
270 }
271
272 if (style & wxCANCEL) {
273 cancel = new wxButton(this, wxID_CANCEL, _("Cancel"));
274 buttonSizer->AddSizerChild(cancel);
275 }
276
277 if (ok)
278 {
279 ok->SetDefault();
280 ok->SetFocus();
281 }
282
283 Layout();
284 Centre(wxBOTH);
285
286 wxEndBusyCursor();
287
288 return TRUE;
289 }
290
291 // Set the selection
292 void wxSingleChoiceDialog::SetSelection(int sel)
293 {
294 wxListBox *listBox = (wxListBox *)FindWindow(wxID_LISTBOX);
295 if (listBox)
296 {
297 listBox->SetSelection(sel);
298 }
299 m_selection = sel;
300 }
301
302 void wxSingleChoiceDialog::OnOK(wxCommandEvent& WXUNUSED(event))
303 {
304 wxListBox *listBox = (wxListBox *)FindWindow(wxID_LISTBOX);
305 if ( listBox )
306 {
307 m_selection = listBox->GetSelection();
308 m_stringSelection = listBox->GetStringSelection();
309 m_clientData = listBox->GetClientData(m_selection);
310 }
311
312 EndModal(wxID_OK);
313 }
314
315