]> git.saurik.com Git - wxWidgets.git/blame_incremental - src/generic/choicdgg.cpp
showing a bevel button for a multiline label (is not multline on the OS level, but...
[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) wxWindows 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// private functions
59// ----------------------------------------------------------------------------
60
61// convert wxArrayString into a wxString[] which must be delete[]d by caller
62static int ConvertWXArrayToC(const wxArrayString& aChoices, wxString **choices);
63
64// ============================================================================
65// implementation
66// ============================================================================
67
68// ----------------------------------------------------------------------------
69// helpers
70// ----------------------------------------------------------------------------
71
72int ConvertWXArrayToC(const wxArrayString& aChoices, wxString **choices)
73{
74 int n = aChoices.GetCount();
75 *choices = new wxString[n];
76
77 for ( int i = 0; i < n; i++ )
78 {
79 (*choices)[i] = aChoices[i];
80 }
81
82 return n;
83}
84
85// ----------------------------------------------------------------------------
86// wrapper functions
87// ----------------------------------------------------------------------------
88
89wxString wxGetSingleChoice( const wxString& message,
90 const wxString& caption,
91 int n, const wxString *choices,
92 wxWindow *parent,
93 int WXUNUSED(x), int WXUNUSED(y),
94 bool WXUNUSED(centre),
95 int WXUNUSED(width), int WXUNUSED(height) )
96{
97 wxSingleChoiceDialog dialog(parent, message, caption, n, choices);
98 wxString choice;
99 if ( dialog.ShowModal() == wxID_OK )
100 choice = dialog.GetStringSelection();
101
102 return choice;
103}
104
105wxString wxGetSingleChoice( const wxString& message,
106 const wxString& caption,
107 const wxArrayString& aChoices,
108 wxWindow *parent,
109 int x, int y,
110 bool centre,
111 int width, int height)
112{
113 wxString *choices;
114 int n = ConvertWXArrayToC(aChoices, &choices);
115 wxString res = wxGetSingleChoice(message, caption, n, choices, parent,
116 x, y, centre, width, height);
117 delete [] choices;
118
119 return res;
120}
121
122int wxGetSingleChoiceIndex( const wxString& message,
123 const wxString& caption,
124 int n, const wxString *choices,
125 wxWindow *parent,
126 int WXUNUSED(x), int WXUNUSED(y),
127 bool WXUNUSED(centre),
128 int WXUNUSED(width), int WXUNUSED(height) )
129{
130 wxSingleChoiceDialog dialog(parent, message, caption, n, choices);
131 int choice;
132 if ( dialog.ShowModal() == wxID_OK )
133 choice = dialog.GetSelection();
134 else
135 choice = -1;
136
137 return choice;
138}
139
140int wxGetSingleChoiceIndex( const wxString& message,
141 const wxString& caption,
142 const wxArrayString& aChoices,
143 wxWindow *parent,
144 int x, int y,
145 bool centre,
146 int width, int height)
147{
148 wxString *choices;
149 int n = ConvertWXArrayToC(aChoices, &choices);
150 int res = wxGetSingleChoiceIndex(message, caption, n, choices, parent,
151 x, y, centre, width, height);
152 delete [] choices;
153
154 return res;
155}
156
157void *wxGetSingleChoiceData( const wxString& message,
158 const wxString& caption,
159 int n, const wxString *choices,
160 void **client_data,
161 wxWindow *parent,
162 int WXUNUSED(x), int WXUNUSED(y),
163 bool WXUNUSED(centre),
164 int WXUNUSED(width), int WXUNUSED(height) )
165{
166 wxSingleChoiceDialog dialog(parent, message, caption, n, choices,
167 (char **)client_data);
168 void *data;
169 if ( dialog.ShowModal() == wxID_OK )
170 data = dialog.GetSelectionClientData();
171 else
172 data = NULL;
173
174 return data;
175}
176
177void *wxGetSingleChoiceData( const wxString& message,
178 const wxString& caption,
179 const wxArrayString& aChoices,
180 void **client_data,
181 wxWindow *parent,
182 int x, int y,
183 bool centre,
184 int width, int height)
185{
186 wxString *choices;
187 int n = ConvertWXArrayToC(aChoices, &choices);
188 void *res = wxGetSingleChoiceData(message, caption, n, choices,
189 client_data, parent,
190 x, y, centre, width, height);
191 delete [] choices;
192
193 return res;
194}
195
196size_t wxGetMultipleChoices(wxArrayInt& selections,
197 const wxString& message,
198 const wxString& caption,
199 int n, const wxString *choices,
200 wxWindow *parent,
201 int WXUNUSED(x), int WXUNUSED(y),
202 bool WXUNUSED(centre),
203 int WXUNUSED(width), int WXUNUSED(height))
204{
205 wxMultiChoiceDialog dialog(parent, message, caption, n, choices);
206
207 if ( !selections.IsEmpty() )
208 dialog.SetSelections(selections);
209
210 if ( dialog.ShowModal() == wxID_OK )
211 selections = dialog.GetSelections();
212 else
213 selections.Empty();
214
215 return selections.GetCount();
216}
217
218size_t wxGetMultipleChoices(wxArrayInt& selections,
219 const wxString& message,
220 const wxString& caption,
221 const wxArrayString& aChoices,
222 wxWindow *parent,
223 int x, int y,
224 bool centre,
225 int width, int height)
226{
227 wxString *choices;
228 int n = ConvertWXArrayToC(aChoices, &choices);
229 size_t res = wxGetMultipleChoices(selections, message, caption,
230 n, choices, parent,
231 x, y, centre, width, height);
232 delete [] choices;
233
234 return res;
235}
236
237// ----------------------------------------------------------------------------
238// wxAnyChoiceDialog
239// ----------------------------------------------------------------------------
240
241bool wxAnyChoiceDialog::Create(wxWindow *parent,
242 const wxString& message,
243 const wxString& caption,
244 int n, const wxString *choices,
245 long styleDlg,
246 const wxPoint& pos,
247 long styleLbox)
248{
249 if ( !wxDialog::Create(parent, -1, caption, pos, wxDefaultSize, styleDlg) )
250 return FALSE;
251
252 wxBoxSizer *topsizer = new wxBoxSizer( wxVERTICAL );
253
254 // 1) text message
255 topsizer->Add( CreateTextSizer( message ), 0, wxALL, 10 );
256
257 // 2) list box
258 m_listbox = new wxListBox( this, wxID_LISTBOX,
259 wxDefaultPosition, wxDefaultSize,
260 n, choices,
261 styleLbox );
262 if ( n > 0 )
263 m_listbox->SetSelection(0);
264
265 topsizer->Add( m_listbox, 1, wxEXPAND | wxLEFT|wxRIGHT, 15 );
266
267#if wxUSE_STATLINE
268 // 3) static line
269 topsizer->Add( new wxStaticLine( this, -1 ), 0, wxEXPAND | wxLEFT|wxRIGHT|wxTOP, 10 );
270#endif
271
272 // 4) buttons
273 topsizer->Add( CreateButtonSizer( styleDlg & (wxOK|wxCANCEL) ), 0, wxCENTRE | wxALL, 10 );
274
275 SetAutoLayout( TRUE );
276 SetSizer( topsizer );
277
278 topsizer->SetSizeHints( this );
279 topsizer->Fit( this );
280
281 Centre( wxBOTH );
282
283 m_listbox->SetFocus();
284
285 return TRUE;
286}
287
288bool wxAnyChoiceDialog::Create(wxWindow *parent,
289 const wxString& message,
290 const wxString& caption,
291 const wxArrayString& choices,
292 long styleDlg,
293 const wxPoint& pos,
294 long styleLbox)
295{
296 wxCArrayString chs(choices);
297 return Create(parent, message, caption, chs.GetCount(), chs.GetStrings(),
298 styleDlg, pos, styleLbox);
299}
300
301// ----------------------------------------------------------------------------
302// wxSingleChoiceDialog
303// ----------------------------------------------------------------------------
304
305BEGIN_EVENT_TABLE(wxSingleChoiceDialog, wxDialog)
306 EVT_BUTTON(wxID_OK, wxSingleChoiceDialog::OnOK)
307 EVT_LISTBOX_DCLICK(wxID_LISTBOX, wxSingleChoiceDialog::OnListBoxDClick)
308END_EVENT_TABLE()
309
310IMPLEMENT_DYNAMIC_CLASS(wxSingleChoiceDialog, wxDialog)
311
312wxSingleChoiceDialog::wxSingleChoiceDialog(wxWindow *parent,
313 const wxString& message,
314 const wxString& caption,
315 int n,
316 const wxString *choices,
317 char **clientData,
318 long style,
319 const wxPoint& WXUNUSED(pos))
320{
321 Create(parent, message, caption, n, choices, clientData, style);
322}
323
324wxSingleChoiceDialog::wxSingleChoiceDialog(wxWindow *parent,
325 const wxString& message,
326 const wxString& caption,
327 const wxArrayString& choices,
328 char **clientData,
329 long style,
330 const wxPoint& WXUNUSED(pos))
331{
332 Create(parent, message, caption, choices, clientData, style);
333}
334
335bool wxSingleChoiceDialog::Create( wxWindow *parent,
336 const wxString& message,
337 const wxString& caption,
338 int n,
339 const wxString *choices,
340 char **clientData,
341 long style,
342 const wxPoint& pos )
343{
344 if ( !wxAnyChoiceDialog::Create(parent, message, caption,
345 n, choices,
346 style, pos) )
347 return FALSE;
348
349 m_selection = n > 0 ? 0 : -1;
350
351 if (clientData)
352 {
353 for (int i = 0; i < n; i++)
354 m_listbox->SetClientData(i, clientData[i]);
355 }
356
357 return TRUE;
358}
359
360bool wxSingleChoiceDialog::Create( wxWindow *parent,
361 const wxString& message,
362 const wxString& caption,
363 const wxArrayString& choices,
364 char **clientData,
365 long style,
366 const wxPoint& pos )
367{
368 wxCArrayString chs(choices);
369 return Create( parent, message, caption, chs.GetCount(), chs.GetStrings(),
370 clientData, style, pos );
371}
372
373// Set the selection
374void wxSingleChoiceDialog::SetSelection(int sel)
375{
376 m_listbox->SetSelection(sel);
377 m_selection = sel;
378}
379
380void wxSingleChoiceDialog::OnOK(wxCommandEvent& WXUNUSED(event))
381{
382 m_selection = m_listbox->GetSelection();
383 m_stringSelection = m_listbox->GetStringSelection();
384 if ( m_listbox->HasClientUntypedData() )
385 SetClientData(m_listbox->GetClientData(m_selection));
386 EndModal(wxID_OK);
387}
388
389void wxSingleChoiceDialog::OnListBoxDClick(wxCommandEvent& WXUNUSED(event))
390{
391 m_selection = m_listbox->GetSelection();
392 m_stringSelection = m_listbox->GetStringSelection();
393
394 if ( m_listbox->HasClientUntypedData() )
395 SetClientData(m_listbox->GetClientData(m_selection));
396
397 EndModal(wxID_OK);
398}
399
400// ----------------------------------------------------------------------------
401// wxMultiChoiceDialog
402// ----------------------------------------------------------------------------
403
404IMPLEMENT_DYNAMIC_CLASS(wxMultiChoiceDialog, wxDialog)
405
406bool wxMultiChoiceDialog::Create( wxWindow *parent,
407 const wxString& message,
408 const wxString& caption,
409 int n,
410 const wxString *choices,
411 long style,
412 const wxPoint& pos )
413{
414 if ( !wxAnyChoiceDialog::Create(parent, message, caption,
415 n, choices,
416 style, pos,
417 wxLB_ALWAYS_SB | wxLB_EXTENDED) )
418 return FALSE;
419
420 return TRUE;
421}
422
423bool wxMultiChoiceDialog::Create( wxWindow *parent,
424 const wxString& message,
425 const wxString& caption,
426 const wxArrayString& choices,
427 long style,
428 const wxPoint& pos )
429{
430 wxCArrayString chs(choices);
431 return Create( parent, message, caption, chs.GetCount(),
432 chs.GetStrings(), style, pos );
433}
434
435void wxMultiChoiceDialog::SetSelections(const wxArrayInt& selections)
436{
437 size_t count = selections.GetCount();
438 for ( size_t n = 0; n < count; n++ )
439 {
440 m_listbox->Select(selections[n]);
441 }
442}
443
444bool wxMultiChoiceDialog::TransferDataFromWindow()
445{
446 m_selections.Empty();
447 size_t count = m_listbox->GetCount();
448 for ( size_t n = 0; n < count; n++ )
449 {
450 if ( m_listbox->IsSelected(n) )
451 m_selections.Add(n);
452 }
453
454 return TRUE;
455}
456
457#endif // wxUSE_CHOICEDLG