]>
Commit | Line | Data |
---|---|---|
c801d85f KB |
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); | |
ef77f91e | 228 | listBox->SetSelection(m_selection); |
c801d85f KB |
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 | ||
ef77f91e JS |
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 | ||
c801d85f KB |
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 |