]> git.saurik.com Git - wxWidgets.git/blame_incremental - src/generic/choicdgg.cpp
wxMac linking fix
[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#if wxUSE_STATLINE
43 #include "wx/statline.h"
44#endif
45
46#include "wx/generic/choicdgg.h"
47
48// ----------------------------------------------------------------------------
49// constants
50// ----------------------------------------------------------------------------
51
52#define wxID_LISTBOX 3000
53
54// ---------------------------------------------------------------------------
55// macros
56// ---------------------------------------------------------------------------
57
58/* Macro for avoiding #ifdefs when value have to be different depending on size of
59 device we display on - take it from something like wxDesktopPolicy in the future
60 */
61
62#if defined(__SMARTPHONE__)
63 #define wxLARGESMALL(large,small) small
64#else
65 #define wxLARGESMALL(large,small) large
66#endif
67
68// ----------------------------------------------------------------------------
69// private functions
70// ----------------------------------------------------------------------------
71
72// convert wxArrayString into a wxString[] which must be delete[]d by caller
73static int ConvertWXArrayToC(const wxArrayString& aChoices, wxString **choices);
74
75// ============================================================================
76// implementation
77// ============================================================================
78
79// ----------------------------------------------------------------------------
80// helpers
81// ----------------------------------------------------------------------------
82
83int ConvertWXArrayToC(const wxArrayString& aChoices, wxString **choices)
84{
85 int n = aChoices.GetCount();
86 *choices = new wxString[n];
87
88 for ( int i = 0; i < n; i++ )
89 {
90 (*choices)[i] = aChoices[i];
91 }
92
93 return n;
94}
95
96// ----------------------------------------------------------------------------
97// wrapper functions
98// ----------------------------------------------------------------------------
99
100wxString wxGetSingleChoice( const wxString& message,
101 const wxString& caption,
102 int n, const wxString *choices,
103 wxWindow *parent,
104 int WXUNUSED(x), int WXUNUSED(y),
105 bool WXUNUSED(centre),
106 int WXUNUSED(width), int WXUNUSED(height) )
107{
108 wxSingleChoiceDialog dialog(parent, message, caption, n, choices);
109 wxString choice;
110 if ( dialog.ShowModal() == wxID_OK )
111 choice = dialog.GetStringSelection();
112
113 return choice;
114}
115
116wxString wxGetSingleChoice( const wxString& message,
117 const wxString& caption,
118 const wxArrayString& aChoices,
119 wxWindow *parent,
120 int x, int y,
121 bool centre,
122 int width, int height)
123{
124 wxString *choices;
125 int n = ConvertWXArrayToC(aChoices, &choices);
126 wxString res = wxGetSingleChoice(message, caption, n, choices, parent,
127 x, y, centre, width, height);
128 delete [] choices;
129
130 return res;
131}
132
133int wxGetSingleChoiceIndex( const wxString& message,
134 const wxString& caption,
135 int n, const wxString *choices,
136 wxWindow *parent,
137 int WXUNUSED(x), int WXUNUSED(y),
138 bool WXUNUSED(centre),
139 int WXUNUSED(width), int WXUNUSED(height) )
140{
141 wxSingleChoiceDialog dialog(parent, message, caption, n, choices);
142 int choice;
143 if ( dialog.ShowModal() == wxID_OK )
144 choice = dialog.GetSelection();
145 else
146 choice = -1;
147
148 return choice;
149}
150
151int wxGetSingleChoiceIndex( const wxString& message,
152 const wxString& caption,
153 const wxArrayString& aChoices,
154 wxWindow *parent,
155 int x, int y,
156 bool centre,
157 int width, int height)
158{
159 wxString *choices;
160 int n = ConvertWXArrayToC(aChoices, &choices);
161 int res = wxGetSingleChoiceIndex(message, caption, n, choices, parent,
162 x, y, centre, width, height);
163 delete [] choices;
164
165 return res;
166}
167
168void *wxGetSingleChoiceData( const wxString& message,
169 const wxString& caption,
170 int n, const wxString *choices,
171 void **client_data,
172 wxWindow *parent,
173 int WXUNUSED(x), int WXUNUSED(y),
174 bool WXUNUSED(centre),
175 int WXUNUSED(width), int WXUNUSED(height) )
176{
177 wxSingleChoiceDialog dialog(parent, message, caption, n, choices,
178 (char **)client_data);
179 void *data;
180 if ( dialog.ShowModal() == wxID_OK )
181 data = dialog.GetSelectionClientData();
182 else
183 data = NULL;
184
185 return data;
186}
187
188void *wxGetSingleChoiceData( const wxString& message,
189 const wxString& caption,
190 const wxArrayString& aChoices,
191 void **client_data,
192 wxWindow *parent,
193 int x, int y,
194 bool centre,
195 int width, int height)
196{
197 wxString *choices;
198 int n = ConvertWXArrayToC(aChoices, &choices);
199 void *res = wxGetSingleChoiceData(message, caption, n, choices,
200 client_data, parent,
201 x, y, centre, width, height);
202 delete [] choices;
203
204 return res;
205}
206
207size_t wxGetMultipleChoices(wxArrayInt& selections,
208 const wxString& message,
209 const wxString& caption,
210 int n, const wxString *choices,
211 wxWindow *parent,
212 int WXUNUSED(x), int WXUNUSED(y),
213 bool WXUNUSED(centre),
214 int WXUNUSED(width), int WXUNUSED(height))
215{
216 wxMultiChoiceDialog dialog(parent, message, caption, n, choices);
217
218 // call this even if selections array is empty and this then (correctly)
219 // deselects the first item which is selected by default
220 dialog.SetSelections(selections);
221
222 if ( dialog.ShowModal() == wxID_OK )
223 selections = dialog.GetSelections();
224 else
225 selections.Empty();
226
227 return selections.GetCount();
228}
229
230size_t wxGetMultipleChoices(wxArrayInt& selections,
231 const wxString& message,
232 const wxString& caption,
233 const wxArrayString& aChoices,
234 wxWindow *parent,
235 int x, int y,
236 bool centre,
237 int width, int height)
238{
239 wxString *choices;
240 int n = ConvertWXArrayToC(aChoices, &choices);
241 size_t res = wxGetMultipleChoices(selections, message, caption,
242 n, choices, parent,
243 x, y, centre, width, height);
244 delete [] choices;
245
246 return res;
247}
248
249// ----------------------------------------------------------------------------
250// wxAnyChoiceDialog
251// ----------------------------------------------------------------------------
252
253bool wxAnyChoiceDialog::Create(wxWindow *parent,
254 const wxString& message,
255 const wxString& caption,
256 int n, const wxString *choices,
257 long styleDlg,
258 const wxPoint& pos,
259 long styleLbox)
260{
261#if defined(__SMARTPHONE__) || defined(__POCKETPC__)
262 styleDlg &= ~wxBORDER_MASK;
263 styleDlg &= ~wxRESIZE_BORDER;
264 styleDlg &= ~wxCAPTION;
265#endif
266
267 if ( !wxDialog::Create(parent, wxID_ANY, caption, pos, wxDefaultSize, styleDlg) )
268 return false;
269
270 wxBoxSizer *topsizer = new wxBoxSizer( wxVERTICAL );
271
272 // 1) text message
273 topsizer->Add( CreateTextSizer( message ), 0, wxALL, wxLARGESMALL(10,0) );
274
275 // 2) list box
276 m_listbox = CreateList(n,choices,styleLbox);
277
278 if ( n > 0 )
279 m_listbox->SetSelection(0);
280
281 topsizer->Add( m_listbox, 1, wxEXPAND|wxLEFT|wxRIGHT, wxLARGESMALL(15,0) );
282
283 // smart phones does not support or do not waste space for wxButtons
284#ifdef __SMARTPHONE__
285
286 SetRightMenu(wxID_CANCEL, _("Cancel"));
287
288#else // __SMARTPHONE__/!__SMARTPHONE__
289
290#if wxUSE_STATLINE
291 // 3) static line
292 topsizer->Add( new wxStaticLine( this, wxID_ANY ), 0, wxEXPAND | wxLEFT|wxRIGHT|wxTOP, 10 );
293#endif
294
295 // 4) buttons
296 topsizer->Add( CreateButtonSizer( styleDlg & (wxOK|wxCANCEL) ), 0, wxEXPAND | wxALL, 10 );
297
298#endif // !__SMARTPHONE__
299
300 SetSizer( topsizer );
301
302#if !defined(__SMARTPHONE__) && !defined(__POCKETPC__)
303 topsizer->SetSizeHints( this );
304 topsizer->Fit( this );
305
306 if ( styleDlg & wxCENTRE )
307 Centre(wxBOTH);
308#endif
309
310 m_listbox->SetFocus();
311
312 return true;
313}
314
315bool wxAnyChoiceDialog::Create(wxWindow *parent,
316 const wxString& message,
317 const wxString& caption,
318 const wxArrayString& choices,
319 long styleDlg,
320 const wxPoint& pos,
321 long styleLbox)
322{
323 wxCArrayString chs(choices);
324 return Create(parent, message, caption, chs.GetCount(), chs.GetStrings(),
325 styleDlg, pos, styleLbox);
326}
327
328wxListBoxBase *wxAnyChoiceDialog::CreateList(int n, const wxString *choices, long styleLbox)
329{
330 return new wxListBox( this, wxID_LISTBOX,
331 wxDefaultPosition, wxDefaultSize,
332 n, choices,
333 styleLbox );
334}
335
336// ----------------------------------------------------------------------------
337// wxSingleChoiceDialog
338// ----------------------------------------------------------------------------
339
340BEGIN_EVENT_TABLE(wxSingleChoiceDialog, wxDialog)
341 EVT_BUTTON(wxID_OK, wxSingleChoiceDialog::OnOK)
342#ifndef __SMARTPHONE__
343 EVT_LISTBOX_DCLICK(wxID_LISTBOX, wxSingleChoiceDialog::OnListBoxDClick)
344#endif
345#ifdef __WXWINCE__
346 EVT_JOY_BUTTON_DOWN(wxSingleChoiceDialog::OnJoystickButtonDown)
347#endif
348END_EVENT_TABLE()
349
350IMPLEMENT_DYNAMIC_CLASS(wxSingleChoiceDialog, wxDialog)
351
352wxSingleChoiceDialog::wxSingleChoiceDialog(wxWindow *parent,
353 const wxString& message,
354 const wxString& caption,
355 int n,
356 const wxString *choices,
357 char **clientData,
358 long style,
359 const wxPoint& WXUNUSED(pos))
360{
361 Create(parent, message, caption, n, choices, clientData, style);
362}
363
364wxSingleChoiceDialog::wxSingleChoiceDialog(wxWindow *parent,
365 const wxString& message,
366 const wxString& caption,
367 const wxArrayString& choices,
368 char **clientData,
369 long style,
370 const wxPoint& WXUNUSED(pos))
371{
372 Create(parent, message, caption, choices, clientData, style);
373}
374
375bool wxSingleChoiceDialog::Create( wxWindow *parent,
376 const wxString& message,
377 const wxString& caption,
378 int n,
379 const wxString *choices,
380 char **clientData,
381 long style,
382 const wxPoint& pos )
383{
384 if ( !wxAnyChoiceDialog::Create(parent, message, caption,
385 n, choices,
386 style, pos) )
387 return false;
388
389 m_selection = n > 0 ? 0 : -1;
390
391 if (clientData)
392 {
393 for (int i = 0; i < n; i++)
394 m_listbox->SetClientData(i, clientData[i]);
395 }
396
397 return true;
398}
399
400bool wxSingleChoiceDialog::Create( wxWindow *parent,
401 const wxString& message,
402 const wxString& caption,
403 const wxArrayString& choices,
404 char **clientData,
405 long style,
406 const wxPoint& pos )
407{
408 wxCArrayString chs(choices);
409 return Create( parent, message, caption, chs.GetCount(), chs.GetStrings(),
410 clientData, style, pos );
411}
412
413// Set the selection
414void wxSingleChoiceDialog::SetSelection(int sel)
415{
416 m_listbox->SetSelection(sel);
417 m_selection = sel;
418}
419
420void wxSingleChoiceDialog::OnOK(wxCommandEvent& WXUNUSED(event))
421{
422 DoChoice();
423}
424
425#ifndef __SMARTPHONE__
426void wxSingleChoiceDialog::OnListBoxDClick(wxCommandEvent& WXUNUSED(event))
427{
428 DoChoice();
429}
430#endif
431
432#ifdef __WXWINCE__
433void wxSingleChoiceDialog::OnJoystickButtonDown(wxJoystickEvent& WXUNUSED(event))
434{
435 DoChoice();
436}
437#endif
438
439void wxSingleChoiceDialog::DoChoice()
440{
441 m_selection = m_listbox->GetSelection();
442 m_stringSelection = m_listbox->GetStringSelection();
443
444 if ( m_listbox->HasClientUntypedData() )
445 SetClientData(m_listbox->GetClientData(m_selection));
446
447 EndModal(wxID_OK);
448}
449
450// ----------------------------------------------------------------------------
451// wxMultiChoiceDialog
452// ----------------------------------------------------------------------------
453
454IMPLEMENT_DYNAMIC_CLASS(wxMultiChoiceDialog, wxDialog)
455
456bool wxMultiChoiceDialog::Create( wxWindow *parent,
457 const wxString& message,
458 const wxString& caption,
459 int n,
460 const wxString *choices,
461 long style,
462 const wxPoint& pos )
463{
464 if ( !wxAnyChoiceDialog::Create(parent, message, caption,
465 n, choices,
466 style, pos,
467 wxLB_ALWAYS_SB | wxLB_EXTENDED) )
468 return false;
469
470 return true;
471}
472
473bool wxMultiChoiceDialog::Create( wxWindow *parent,
474 const wxString& message,
475 const wxString& caption,
476 const wxArrayString& choices,
477 long style,
478 const wxPoint& pos )
479{
480 wxCArrayString chs(choices);
481 return Create( parent, message, caption, chs.GetCount(),
482 chs.GetStrings(), style, pos );
483}
484
485void wxMultiChoiceDialog::SetSelections(const wxArrayInt& selections)
486{
487 // first clear all currently selected items
488 size_t n,
489 count = m_listbox->GetCount();
490 for ( n = 0; n < count; ++n )
491 {
492 m_listbox->Deselect(n);
493 }
494
495 // now select the ones which should be selected
496 count = selections.GetCount();
497 for ( n = 0; n < count; n++ )
498 {
499 m_listbox->Select(selections[n]);
500 }
501}
502
503bool wxMultiChoiceDialog::TransferDataFromWindow()
504{
505 m_selections.Empty();
506 size_t count = m_listbox->GetCount();
507 for ( size_t n = 0; n < count; n++ )
508 {
509 if ( m_listbox->IsSelected(n) )
510 m_selections.Add(n);
511 }
512
513 return true;
514}
515
516#if wxUSE_CHECKLISTBOX
517
518wxListBoxBase *wxMultiChoiceDialog::CreateList(int n, const wxString *choices, long styleLbox)
519{
520 return new wxCheckListBox( this, wxID_LISTBOX,
521 wxDefaultPosition, wxDefaultSize,
522 n, choices,
523 styleLbox );
524}
525
526#endif // wxUSE_CHECKLISTBOX
527
528#endif // wxUSE_CHOICEDLG