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