]> git.saurik.com Git - wxWidgets.git/blame_incremental - src/generic/choicdgg.cpp
added wxCSConv::IsOk() (patch 1637944)
[wxWidgets.git] / src / generic / choicdgg.cpp
... / ...
CommitLineData
1/////////////////////////////////////////////////////////////////////////////
2// Name: src/generic/choicdgg.cpp
3// Purpose: Choice dialogs
4// Author: Julian Smart
5// Modified by: 03.11.00: VZ to add wxArrayString and multiple sel functions
6// Created: 04/01/98
7// RCS-ID: $Id$
8// Copyright: (c) wxWidgets team
9// Licence: wxWindows licence
10/////////////////////////////////////////////////////////////////////////////
11
12// ============================================================================
13// declarations
14// ============================================================================
15
16// ----------------------------------------------------------------------------
17// headers
18// ----------------------------------------------------------------------------
19
20// For compilers that support precompilation, includes "wx.h".
21#include "wx/wxprec.h"
22
23#ifdef __BORLANDC__
24 #pragma hdrstop
25#endif
26
27#if wxUSE_CHOICEDLG
28
29#ifndef WX_PRECOMP
30 #include <stdio.h>
31 #include "wx/utils.h"
32 #include "wx/dialog.h"
33 #include "wx/button.h"
34 #include "wx/listbox.h"
35 #include "wx/checklst.h"
36 #include "wx/stattext.h"
37 #include "wx/intl.h"
38 #include "wx/sizer.h"
39 #include "wx/arrstr.h"
40#endif
41
42#include "wx/statline.h"
43#include "wx/generic/choicdgg.h"
44
45// ----------------------------------------------------------------------------
46// constants
47// ----------------------------------------------------------------------------
48
49#define wxID_LISTBOX 3000
50
51// ----------------------------------------------------------------------------
52// private functions
53// ----------------------------------------------------------------------------
54
55// convert wxArrayString into a wxString[] which must be delete[]d by caller
56static int ConvertWXArrayToC(const wxArrayString& aChoices, wxString **choices);
57
58// ============================================================================
59// implementation
60// ============================================================================
61
62// ----------------------------------------------------------------------------
63// helpers
64// ----------------------------------------------------------------------------
65
66int ConvertWXArrayToC(const wxArrayString& aChoices, wxString **choices)
67{
68 int n = aChoices.GetCount();
69 *choices = new wxString[n];
70
71 for ( int i = 0; i < n; i++ )
72 {
73 (*choices)[i] = aChoices[i];
74 }
75
76 return n;
77}
78
79// ----------------------------------------------------------------------------
80// wrapper functions
81// ----------------------------------------------------------------------------
82
83wxString wxGetSingleChoice( const wxString& message,
84 const wxString& caption,
85 int n, const wxString *choices,
86 wxWindow *parent,
87 int WXUNUSED(x), int WXUNUSED(y),
88 bool WXUNUSED(centre),
89 int WXUNUSED(width), int WXUNUSED(height) )
90{
91 wxSingleChoiceDialog dialog(parent, message, caption, n, choices);
92 wxString choice;
93 if ( dialog.ShowModal() == wxID_OK )
94 choice = dialog.GetStringSelection();
95
96 return choice;
97}
98
99wxString wxGetSingleChoice( const wxString& message,
100 const wxString& caption,
101 const wxArrayString& aChoices,
102 wxWindow *parent,
103 int x, int y,
104 bool centre,
105 int width, int height)
106{
107 wxString *choices;
108 int n = ConvertWXArrayToC(aChoices, &choices);
109 wxString res = wxGetSingleChoice(message, caption, n, choices, parent,
110 x, y, centre, width, height);
111 delete [] choices;
112
113 return res;
114}
115
116int wxGetSingleChoiceIndex( const wxString& message,
117 const wxString& caption,
118 int n, const wxString *choices,
119 wxWindow *parent,
120 int WXUNUSED(x), int WXUNUSED(y),
121 bool WXUNUSED(centre),
122 int WXUNUSED(width), int WXUNUSED(height) )
123{
124 wxSingleChoiceDialog dialog(parent, message, caption, n, choices);
125 int choice;
126 if ( dialog.ShowModal() == wxID_OK )
127 choice = dialog.GetSelection();
128 else
129 choice = -1;
130
131 return choice;
132}
133
134int wxGetSingleChoiceIndex( const wxString& message,
135 const wxString& caption,
136 const wxArrayString& aChoices,
137 wxWindow *parent,
138 int x, int y,
139 bool centre,
140 int width, int height)
141{
142 wxString *choices;
143 int n = ConvertWXArrayToC(aChoices, &choices);
144 int res = wxGetSingleChoiceIndex(message, caption, n, choices, parent,
145 x, y, centre, width, height);
146 delete [] choices;
147
148 return res;
149}
150
151void *wxGetSingleChoiceData( const wxString& message,
152 const wxString& caption,
153 int n, const wxString *choices,
154 void **client_data,
155 wxWindow *parent,
156 int WXUNUSED(x), int WXUNUSED(y),
157 bool WXUNUSED(centre),
158 int WXUNUSED(width), int WXUNUSED(height) )
159{
160 wxSingleChoiceDialog dialog(parent, message, caption, n, choices,
161 (char **)client_data);
162 void *data;
163 if ( dialog.ShowModal() == wxID_OK )
164 data = dialog.GetSelectionClientData();
165 else
166 data = NULL;
167
168 return data;
169}
170
171void *wxGetSingleChoiceData( const wxString& message,
172 const wxString& caption,
173 const wxArrayString& aChoices,
174 void **client_data,
175 wxWindow *parent,
176 int x, int y,
177 bool centre,
178 int width, int height)
179{
180 wxString *choices;
181 int n = ConvertWXArrayToC(aChoices, &choices);
182 void *res = wxGetSingleChoiceData(message, caption, n, choices,
183 client_data, parent,
184 x, y, centre, width, height);
185 delete [] choices;
186
187 return res;
188}
189
190size_t wxGetMultipleChoices(wxArrayInt& selections,
191 const wxString& message,
192 const wxString& caption,
193 int n, const wxString *choices,
194 wxWindow *parent,
195 int WXUNUSED(x), int WXUNUSED(y),
196 bool WXUNUSED(centre),
197 int WXUNUSED(width), int WXUNUSED(height))
198{
199 wxMultiChoiceDialog dialog(parent, message, caption, n, choices);
200
201 // call this even if selections array is empty and this then (correctly)
202 // deselects the first item which is selected by default
203 dialog.SetSelections(selections);
204
205 if ( dialog.ShowModal() == wxID_OK )
206 selections = dialog.GetSelections();
207 else
208 selections.Empty();
209
210 return selections.GetCount();
211}
212
213size_t wxGetMultipleChoices(wxArrayInt& selections,
214 const wxString& message,
215 const wxString& caption,
216 const wxArrayString& aChoices,
217 wxWindow *parent,
218 int x, int y,
219 bool centre,
220 int width, int height)
221{
222 wxString *choices;
223 int n = ConvertWXArrayToC(aChoices, &choices);
224 size_t res = wxGetMultipleChoices(selections, message, caption,
225 n, choices, parent,
226 x, y, centre, width, height);
227 delete [] choices;
228
229 return res;
230}
231
232// ----------------------------------------------------------------------------
233// wxAnyChoiceDialog
234// ----------------------------------------------------------------------------
235
236bool wxAnyChoiceDialog::Create(wxWindow *parent,
237 const wxString& message,
238 const wxString& caption,
239 int n, const wxString *choices,
240 long styleDlg,
241 const wxPoint& pos,
242 long styleLbox)
243{
244#ifdef __WXMAC__
245 // FIXME: why??
246 if ( !wxDialog::Create(parent, wxID_ANY, caption, pos, wxDefaultSize, styleDlg & (~wxCANCEL) ) )
247 return false;
248#else
249 if ( !wxDialog::Create(parent, wxID_ANY, caption, pos, wxDefaultSize, styleDlg) )
250 return false;
251#endif
252
253 wxBoxSizer *topsizer = new wxBoxSizer( wxVERTICAL );
254
255 // 1) text message
256 topsizer->
257 Add(CreateTextSizer(message), wxSizerFlags().Expand().TripleBorder());
258
259 // 2) list box
260 m_listbox = CreateList(n, choices, styleLbox);
261
262 if ( n > 0 )
263 m_listbox->SetSelection(0);
264
265 topsizer->
266 Add(m_listbox, wxSizerFlags().Expand().TripleBorder(wxLEFT | wxRIGHT));
267
268 // 3) buttons if any
269 wxSizer *
270 buttonSizer = CreateSeparatedButtonSizer(styleDlg & ButtonSizerFlags);
271 if ( buttonSizer )
272 {
273 topsizer->Add(buttonSizer, wxSizerFlags().Expand().DoubleBorder());
274 }
275
276 SetSizer( topsizer );
277
278 topsizer->SetSizeHints( this );
279 topsizer->Fit( this );
280
281 if ( styleDlg & wxCENTRE )
282 Centre(wxBOTH);
283
284 m_listbox->SetFocus();
285
286 return true;
287}
288
289bool wxAnyChoiceDialog::Create(wxWindow *parent,
290 const wxString& message,
291 const wxString& caption,
292 const wxArrayString& choices,
293 long styleDlg,
294 const wxPoint& pos,
295 long styleLbox)
296{
297 wxCArrayString chs(choices);
298 return Create(parent, message, caption, chs.GetCount(), chs.GetStrings(),
299 styleDlg, pos, styleLbox);
300}
301
302wxListBoxBase *wxAnyChoiceDialog::CreateList(int n, const wxString *choices, long styleLbox)
303{
304 return new wxListBox( this, wxID_LISTBOX,
305 wxDefaultPosition, wxDefaultSize,
306 n, choices,
307 styleLbox );
308}
309
310// ----------------------------------------------------------------------------
311// wxSingleChoiceDialog
312// ----------------------------------------------------------------------------
313
314BEGIN_EVENT_TABLE(wxSingleChoiceDialog, wxDialog)
315 EVT_BUTTON(wxID_OK, wxSingleChoiceDialog::OnOK)
316#ifndef __SMARTPHONE__
317 EVT_LISTBOX_DCLICK(wxID_LISTBOX, wxSingleChoiceDialog::OnListBoxDClick)
318#endif
319#ifdef __WXWINCE__
320 EVT_JOY_BUTTON_DOWN(wxSingleChoiceDialog::OnJoystickButtonDown)
321#endif
322END_EVENT_TABLE()
323
324IMPLEMENT_DYNAMIC_CLASS(wxSingleChoiceDialog, wxDialog)
325
326wxSingleChoiceDialog::wxSingleChoiceDialog(wxWindow *parent,
327 const wxString& message,
328 const wxString& caption,
329 int n,
330 const wxString *choices,
331 char **clientData,
332 long style,
333 const wxPoint& WXUNUSED(pos))
334{
335 Create(parent, message, caption, n, choices, clientData, style);
336}
337
338wxSingleChoiceDialog::wxSingleChoiceDialog(wxWindow *parent,
339 const wxString& message,
340 const wxString& caption,
341 const wxArrayString& choices,
342 char **clientData,
343 long style,
344 const wxPoint& WXUNUSED(pos))
345{
346 Create(parent, message, caption, choices, clientData, style);
347}
348
349bool wxSingleChoiceDialog::Create( wxWindow *parent,
350 const wxString& message,
351 const wxString& caption,
352 int n,
353 const wxString *choices,
354 char **clientData,
355 long style,
356 const wxPoint& pos )
357{
358 if ( !wxAnyChoiceDialog::Create(parent, message, caption,
359 n, choices,
360 style, pos) )
361 return false;
362
363 m_selection = n > 0 ? 0 : -1;
364
365 if (clientData)
366 {
367 for (int i = 0; i < n; i++)
368 m_listbox->SetClientData(i, clientData[i]);
369 }
370
371 return true;
372}
373
374bool wxSingleChoiceDialog::Create( wxWindow *parent,
375 const wxString& message,
376 const wxString& caption,
377 const wxArrayString& choices,
378 char **clientData,
379 long style,
380 const wxPoint& pos )
381{
382 wxCArrayString chs(choices);
383 return Create( parent, message, caption, chs.GetCount(), chs.GetStrings(),
384 clientData, style, pos );
385}
386
387// Set the selection
388void wxSingleChoiceDialog::SetSelection(int sel)
389{
390 m_listbox->SetSelection(sel);
391 m_selection = sel;
392}
393
394void wxSingleChoiceDialog::OnOK(wxCommandEvent& WXUNUSED(event))
395{
396 DoChoice();
397}
398
399#ifndef __SMARTPHONE__
400void wxSingleChoiceDialog::OnListBoxDClick(wxCommandEvent& WXUNUSED(event))
401{
402 DoChoice();
403}
404#endif
405
406#ifdef __WXWINCE__
407void wxSingleChoiceDialog::OnJoystickButtonDown(wxJoystickEvent& WXUNUSED(event))
408{
409 DoChoice();
410}
411#endif
412
413void wxSingleChoiceDialog::DoChoice()
414{
415 m_selection = m_listbox->GetSelection();
416 m_stringSelection = m_listbox->GetStringSelection();
417
418 if ( m_listbox->HasClientUntypedData() )
419 SetClientData(m_listbox->GetClientData(m_selection));
420
421 EndModal(wxID_OK);
422}
423
424// ----------------------------------------------------------------------------
425// wxMultiChoiceDialog
426// ----------------------------------------------------------------------------
427
428IMPLEMENT_DYNAMIC_CLASS(wxMultiChoiceDialog, wxDialog)
429
430bool wxMultiChoiceDialog::Create( wxWindow *parent,
431 const wxString& message,
432 const wxString& caption,
433 int n,
434 const wxString *choices,
435 long style,
436 const wxPoint& pos )
437{
438 long styleLbox;
439#if wxUSE_CHECKLISTBOX
440 styleLbox = wxLB_ALWAYS_SB;
441#else
442 styleLbox = wxLB_ALWAYS_SB | wxLB_EXTENDED;
443#endif
444
445 if ( !wxAnyChoiceDialog::Create(parent, message, caption,
446 n, choices,
447 style, pos,
448 styleLbox) )
449 return false;
450
451 return true;
452}
453
454bool wxMultiChoiceDialog::Create( wxWindow *parent,
455 const wxString& message,
456 const wxString& caption,
457 const wxArrayString& choices,
458 long style,
459 const wxPoint& pos )
460{
461 wxCArrayString chs(choices);
462 return Create( parent, message, caption, chs.GetCount(),
463 chs.GetStrings(), style, pos );
464}
465
466void wxMultiChoiceDialog::SetSelections(const wxArrayInt& selections)
467{
468#if wxUSE_CHECKLISTBOX
469 wxCheckListBox* checkListBox = wxDynamicCast(m_listbox, wxCheckListBox);
470 if (checkListBox)
471 {
472 // first clear all currently selected items
473 size_t n,
474 count = checkListBox->GetCount();
475 for ( n = 0; n < count; ++n )
476 {
477 if (checkListBox->IsChecked(n))
478 checkListBox->Check(n, false);
479 }
480
481 // now select the ones which should be selected
482 count = selections.GetCount();
483 for ( n = 0; n < count; n++ )
484 {
485 checkListBox->Check(selections[n]);
486 }
487
488 return;
489 }
490#endif
491
492 // first clear all currently selected items
493 size_t n,
494 count = m_listbox->GetCount();
495 for ( n = 0; n < count; ++n )
496 {
497 m_listbox->Deselect(n);
498 }
499
500 // now select the ones which should be selected
501 count = selections.GetCount();
502 for ( n = 0; n < count; n++ )
503 {
504 m_listbox->Select(selections[n]);
505 }
506}
507
508bool wxMultiChoiceDialog::TransferDataFromWindow()
509{
510 m_selections.Empty();
511
512#if wxUSE_CHECKLISTBOX
513 wxCheckListBox* checkListBox = wxDynamicCast(m_listbox, wxCheckListBox);
514 if (checkListBox)
515 {
516 size_t count = checkListBox->GetCount();
517 for ( size_t n = 0; n < count; n++ )
518 {
519 if ( checkListBox->IsChecked(n) )
520 m_selections.Add(n);
521 }
522 return true;
523 }
524#endif
525
526 size_t count = m_listbox->GetCount();
527 for ( size_t n = 0; n < count; n++ )
528 {
529 if ( m_listbox->IsSelected(n) )
530 m_selections.Add(n);
531 }
532
533 return true;
534}
535
536#if wxUSE_CHECKLISTBOX
537
538wxListBoxBase *wxMultiChoiceDialog::CreateList(int n, const wxString *choices, long styleLbox)
539{
540 return new wxCheckListBox( this, wxID_LISTBOX,
541 wxDefaultPosition, wxDefaultSize,
542 n, choices,
543 styleLbox );
544}
545
546#endif // wxUSE_CHECKLISTBOX
547
548#endif // wxUSE_CHOICEDLG