]> git.saurik.com Git - wxWidgets.git/blob - src/generic/choicdgg.cpp
e6997e0511a8689e78da310b9db3fe71c5847fc2
[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 if ( clientData )
229 {
230 int i;
231 for ( i = 0; i < n; i++)
232 {
233 listBox->SetClientData(i, clientData[i]);
234 }
235 }
236
237 wxRowColSizer *listBoxSizer = new wxRowColSizer(topSizer, wxSIZER_ROWS);
238 listBoxSizer->AddSizerChild(listBox);
239 listBoxSizer->SetName("listBoxSizer");
240
241 // Create constraints for the text sizer
242 wxLayoutConstraints *textC = new wxLayoutConstraints;
243 textC->left.SameAs (messageSizer, wxLeft);
244 textC->top.Below (spacingSizer);
245 listBoxSizer->SetConstraints(textC);
246
247 // Insert another spacer
248 wxSpacingSizer *spacingSizer2 = new wxSpacingSizer(topSizer, wxBelow, listBoxSizer, 10);
249 spacingSizer->SetName("spacingSizer2");
250
251 // Insert a sizer for the buttons
252 wxRowColSizer *buttonSizer = new wxRowColSizer(topSizer, wxSIZER_ROWS);
253 buttonSizer->SetName("buttonSizer");
254
255 // Specify constraints for the button sizer
256 wxLayoutConstraints *c = new wxLayoutConstraints;
257 c->width.AsIs ();
258 c->height.AsIs ();
259 c->top.Below (spacingSizer2);
260 c->centreX.SameAs (listBoxSizer, wxCentreX);
261 buttonSizer->SetConstraints(c);
262
263 wxButton *ok = NULL;
264 wxButton *cancel = NULL;
265
266 if (style & wxOK) {
267 ok = new wxButton(this, wxID_OK, _("OK"));
268 buttonSizer->AddSizerChild(ok);
269 }
270
271 if (style & wxCANCEL) {
272 cancel = new wxButton(this, wxID_CANCEL, _("Cancel"));
273 buttonSizer->AddSizerChild(cancel);
274 }
275
276 if (ok)
277 {
278 ok->SetDefault();
279 ok->SetFocus();
280 }
281
282 Layout();
283 Centre(wxBOTH);
284
285 wxEndBusyCursor();
286
287 return TRUE;
288 }
289
290 void wxSingleChoiceDialog::OnOK(wxCommandEvent& WXUNUSED(event))
291 {
292 wxListBox *listBox = (wxListBox *)FindWindow(wxID_LISTBOX);
293 if ( listBox )
294 {
295 m_selection = listBox->GetSelection();
296 m_stringSelection = listBox->GetStringSelection();
297 m_clientData = listBox->GetClientData(m_selection);
298 }
299
300 EndModal(wxID_OK);
301 }
302
303