]> git.saurik.com Git - wxWidgets.git/blame_incremental - src/generic/choicdgg.cpp
Fixed BCC compilation warning if wxUSE_HELP was 1
[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 license
10/////////////////////////////////////////////////////////////////////////////
11
12// ============================================================================
13// declarations
14// ============================================================================
15
16#ifdef __GNUG__
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#ifndef WX_PRECOMP
32 #include <stdio.h>
33 #include "wx/utils.h"
34 #include "wx/dialog.h"
35 #include "wx/button.h"
36 #include "wx/listbox.h"
37 #include "wx/stattext.h"
38 #include "wx/intl.h"
39 #include "wx/sizer.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#if defined(__WXMSW__) || defined(__WXMAC__)
55#define wxCHOICEDLG_DIALOG_STYLE (wxDEFAULT_DIALOG_STYLE | \
56 wxDIALOG_MODAL | \
57 wxTAB_TRAVERSAL)
58#else
59#define wxCHOICEDLG_DIALOG_STYLE (wxDEFAULT_DIALOG_STYLE | \
60 wxDIALOG_MODAL | \
61 wxRESIZE_BORDER | \
62 wxTAB_TRAVERSAL)
63#endif
64
65// ----------------------------------------------------------------------------
66// private functions
67// ----------------------------------------------------------------------------
68
69// convert wxArrayString into a wxString[] which must be delete[]d by caller
70static int ConvertWXArrayToC(const wxArrayString& aChoices, wxString **choices);
71
72// ============================================================================
73// implementation
74// ============================================================================
75
76// ----------------------------------------------------------------------------
77// helpers
78// ----------------------------------------------------------------------------
79
80int ConvertWXArrayToC(const wxArrayString& aChoices, wxString **choices)
81{
82 int n = aChoices.GetCount();
83 *choices = new wxString[n];
84
85 for ( int i = 0; i < n; i++ )
86 {
87 (*choices)[i] = aChoices[i];
88 }
89
90 return n;
91}
92
93// ----------------------------------------------------------------------------
94// wrapper functions
95// ----------------------------------------------------------------------------
96
97wxString wxGetSingleChoice( const wxString& message,
98 const wxString& caption,
99 int n, const wxString *choices,
100 wxWindow *parent,
101 int WXUNUSED(x), int WXUNUSED(y),
102 bool WXUNUSED(centre),
103 int WXUNUSED(width), int WXUNUSED(height) )
104{
105 wxSingleChoiceDialog dialog(parent, message, caption, n, choices);
106 wxString choice;
107 if ( dialog.ShowModal() == wxID_OK )
108 choice = dialog.GetStringSelection();
109
110 return choice;
111}
112
113wxString wxGetSingleChoice( const wxString& message,
114 const wxString& caption,
115 const wxArrayString& aChoices,
116 wxWindow *parent,
117 int x, int y,
118 bool centre,
119 int width, int height)
120{
121 wxString *choices;
122 int n = ConvertWXArrayToC(aChoices, &choices);
123 wxString res = wxGetSingleChoice(message, caption, n, choices, parent,
124 x, y, centre, width, height);
125 delete [] choices;
126
127 return res;
128}
129
130#ifdef WXWIN_COMPATIBILITY_2
131// Overloaded for backward compatibility
132wxString wxGetSingleChoice( const wxString& message,
133 const wxString& caption,
134 int n, char *choices[],
135 wxWindow *parent,
136 int x, int y, bool centre,
137 int width, int height )
138{
139 wxString *strings = new wxString[n];
140 int i;
141 for ( i = 0; i < n; i++)
142 {
143 strings[i] = choices[i];
144 }
145 wxString ans(wxGetSingleChoice(message, caption, n, (const wxString *)strings, parent,
146 x, y, centre, width, height));
147 delete[] strings;
148 return ans;
149}
150#endif // WXWIN_COMPATIBILITY_2
151
152int wxGetSingleChoiceIndex( const wxString& message,
153 const wxString& caption,
154 int n, const wxString *choices,
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 int choice;
162 if ( dialog.ShowModal() == wxID_OK )
163 choice = dialog.GetSelection();
164 else
165 choice = -1;
166
167 return choice;
168}
169
170#ifdef WXWIN_COMPATIBILITY_2
171// Overloaded for backward compatibility
172int wxGetSingleChoiceIndex( const wxString& message,
173 const wxString& caption,
174 int n, wxChar *choices[],
175 wxWindow *parent,
176 int x, int y, bool centre,
177 int width, int height )
178{
179 wxString *strings = new wxString[n];
180 for ( int i = 0; i < n; i++)
181 strings[i] = choices[i];
182 int ans = wxGetSingleChoiceIndex(message, caption, n, (const wxString *)strings, parent,
183 x, y, centre, width, height);
184 delete[] strings;
185 return ans;
186}
187#endif // WXWIN_COMPATIBILITY_2
188
189void *wxGetSingleChoiceData( const wxString& message,
190 const wxString& caption,
191 int n, const wxString *choices,
192 void **client_data,
193 wxWindow *parent,
194 int WXUNUSED(x), int WXUNUSED(y),
195 bool WXUNUSED(centre),
196 int WXUNUSED(width), int WXUNUSED(height) )
197{
198 wxSingleChoiceDialog dialog(parent, message, caption, n, choices,
199 (char **)client_data);
200 void *data;
201 if ( dialog.ShowModal() == wxID_OK )
202 data = dialog.GetSelectionClientData();
203 else
204 data = NULL;
205
206 return data;
207}
208
209void *wxGetSingleChoiceData( const wxString& message,
210 const wxString& caption,
211 const wxArrayString& aChoices,
212 void **client_data,
213 wxWindow *parent,
214 int x, int y,
215 bool centre,
216 int width, int height)
217{
218 wxString *choices;
219 int n = ConvertWXArrayToC(aChoices, &choices);
220 void *res = wxGetSingleChoiceData(message, caption, n, choices,
221 client_data, parent,
222 x, y, centre, width, height);
223 delete [] choices;
224
225 return res;
226}
227
228#ifdef WXWIN_COMPATIBILITY_2
229// Overloaded for backward compatibility
230void *wxGetSingleChoiceData( const wxString& message,
231 const wxString& caption,
232 int n, wxChar *choices[],
233 void **client_data,
234 wxWindow *parent,
235 int x, int y, bool centre, int width, int height )
236{
237 wxString *strings = new wxString[n];
238 int i;
239 for ( i = 0; i < n; i++)
240 {
241 strings[i] = choices[i];
242 }
243 void *data = wxGetSingleChoiceData(message, caption,
244 n, (const wxString *)strings,
245 client_data, parent,
246 x, y, centre, width, height);
247 delete[] strings;
248 return data;
249}
250#endif // WXWIN_COMPATIBILITY_2
251
252size_t wxGetMultipleChoices(wxArrayInt& selections,
253 const wxString& message,
254 const wxString& caption,
255 int n, const wxString *choices,
256 wxWindow *parent,
257 int WXUNUSED(x), int WXUNUSED(y),
258 bool WXUNUSED(centre),
259 int WXUNUSED(width), int WXUNUSED(height))
260{
261 wxMultiChoiceDialog dialog(parent, message, caption, n, choices);
262
263 if ( !selections.IsEmpty() )
264 dialog.SetSelections(selections);
265
266 if ( dialog.ShowModal() == wxID_OK )
267 selections = dialog.GetSelections();
268 else
269 selections.Empty();
270
271 return selections.GetCount();
272}
273
274size_t wxGetMultipleChoices(wxArrayInt& selections,
275 const wxString& message,
276 const wxString& caption,
277 const wxArrayString& aChoices,
278 wxWindow *parent,
279 int x, int y,
280 bool centre,
281 int width, int height)
282{
283 wxString *choices;
284 int n = ConvertWXArrayToC(aChoices, &choices);
285 size_t res = wxGetMultipleChoices(selections, message, caption,
286 n, choices, parent,
287 x, y, centre, width, height);
288 delete [] choices;
289
290 return res;
291}
292
293// ----------------------------------------------------------------------------
294// wxAnyChoiceDialog
295// ----------------------------------------------------------------------------
296
297bool wxAnyChoiceDialog::Create(wxWindow *parent,
298 const wxString& message,
299 const wxString& caption,
300 int n, const wxString *choices,
301 long WXUNUSED(styleDlg), // FIXME: why unused?
302 const wxPoint& pos,
303 long styleLbox)
304{
305 if ( !wxDialog::Create(parent, -1, caption, pos, wxDefaultSize,
306 wxCHOICEDLG_DIALOG_STYLE) )
307 return FALSE;
308
309 wxBoxSizer *topsizer = new wxBoxSizer( wxVERTICAL );
310
311 // 1) text message
312 topsizer->Add( CreateTextSizer( message ), 0, wxALL, 10 );
313
314 // 2) list box
315 m_listbox = new wxListBox( this, wxID_LISTBOX,
316 wxDefaultPosition, wxDefaultSize,
317 n, choices,
318 styleLbox );
319 if ( n > 0 )
320 m_listbox->SetSelection(0);
321
322 topsizer->Add( m_listbox, 1, wxEXPAND | wxLEFT|wxRIGHT, 15 );
323
324#if wxUSE_STATLINE
325 // 3) static line
326 topsizer->Add( new wxStaticLine( this, -1 ), 0, wxEXPAND | wxLEFT|wxRIGHT|wxTOP, 10 );
327#endif
328
329 // 4) buttons
330 topsizer->Add( CreateButtonSizer( wxOK|wxCANCEL ), 0, wxCENTRE | wxALL, 10 );
331
332 SetAutoLayout( TRUE );
333 SetSizer( topsizer );
334
335 topsizer->SetSizeHints( this );
336 topsizer->Fit( this );
337
338 Centre( wxBOTH );
339
340 m_listbox->SetFocus();
341
342 return TRUE;
343}
344
345// ----------------------------------------------------------------------------
346// wxSingleChoiceDialog
347// ----------------------------------------------------------------------------
348
349BEGIN_EVENT_TABLE(wxSingleChoiceDialog, wxDialog)
350 EVT_BUTTON(wxID_OK, wxSingleChoiceDialog::OnOK)
351 EVT_LISTBOX_DCLICK(wxID_LISTBOX, wxSingleChoiceDialog::OnListBoxDClick)
352END_EVENT_TABLE()
353
354IMPLEMENT_DYNAMIC_CLASS(wxSingleChoiceDialog, wxDialog)
355
356wxSingleChoiceDialog::wxSingleChoiceDialog(wxWindow *parent,
357 const wxString& message,
358 const wxString& caption,
359 int n,
360 const wxString *choices,
361 char **clientData,
362 long style,
363 const wxPoint& WXUNUSED(pos))
364{
365 Create(parent, message, caption, n, choices, clientData, style);
366}
367
368#ifdef WXWIN_COMPATIBILITY_2
369
370wxSingleChoiceDialog::wxSingleChoiceDialog(wxWindow *parent,
371 const wxString& message,
372 const wxString& caption,
373 const wxStringList& choices,
374 char **clientData,
375 long style,
376 const wxPoint& WXUNUSED(pos))
377{
378 Create(parent, message, caption, choices, clientData, style);
379}
380
381bool wxSingleChoiceDialog::Create(wxWindow *parent,
382 const wxString& message,
383 const wxString& caption,
384 const wxStringList& choices,
385 char **clientData,
386 long style,
387 const wxPoint& pos)
388{
389 wxString *strings = new wxString[choices.Number()];
390 int i;
391 for ( i = 0; i < choices.Number(); i++)
392 {
393 strings[i] = (char *)choices.Nth(i)->Data();
394 }
395 bool ans = Create(parent, message, caption, choices.Number(), strings, clientData, style, pos);
396 delete[] strings;
397 return ans;
398}
399
400#endif // WXWIN_COMPATIBILITY_2
401
402bool wxSingleChoiceDialog::Create( wxWindow *parent,
403 const wxString& message,
404 const wxString& caption,
405 int n,
406 const wxString *choices,
407 char **clientData,
408 long style,
409 const wxPoint& pos )
410{
411 if ( !wxAnyChoiceDialog::Create(parent, message, caption,
412 n, choices,
413 style, pos) )
414 return FALSE;
415
416 m_selection = n > 0 ? 0 : -1;
417
418 if (clientData)
419 {
420 for (int i = 0; i < n; i++)
421 m_listbox->SetClientData(i, clientData[i]);
422 }
423
424 return TRUE;
425}
426
427// Set the selection
428void wxSingleChoiceDialog::SetSelection(int sel)
429{
430 m_listbox->SetSelection(sel);
431 m_selection = sel;
432}
433
434void wxSingleChoiceDialog::OnOK(wxCommandEvent& WXUNUSED(event))
435{
436 m_selection = m_listbox->GetSelection();
437 m_stringSelection = m_listbox->GetStringSelection();
438 // TODO!
439#ifndef __WXMOTIF__
440 if ( m_listbox->HasClientUntypedData() )
441 SetClientData(m_listbox->GetClientData(m_selection));
442#endif
443 EndModal(wxID_OK);
444}
445
446void wxSingleChoiceDialog::OnListBoxDClick(wxCommandEvent& WXUNUSED(event))
447{
448 m_selection = m_listbox->GetSelection();
449 m_stringSelection = m_listbox->GetStringSelection();
450
451 // TODO!
452#ifndef __WXMOTIF__
453 if ( m_listbox->HasClientUntypedData() )
454 SetClientData(m_listbox->GetClientData(m_selection));
455#endif
456
457 EndModal(wxID_OK);
458}
459
460// ----------------------------------------------------------------------------
461// wxMultiChoiceDialog
462// ----------------------------------------------------------------------------
463
464IMPLEMENT_DYNAMIC_CLASS(wxMultiChoiceDialog, wxDialog)
465
466bool wxMultiChoiceDialog::Create( wxWindow *parent,
467 const wxString& message,
468 const wxString& caption,
469 int n,
470 const wxString *choices,
471 long style,
472 const wxPoint& pos )
473{
474 if ( !wxAnyChoiceDialog::Create(parent, message, caption,
475 n, choices,
476 style, pos,
477 wxLB_ALWAYS_SB | wxLB_EXTENDED) )
478 return FALSE;
479
480 return TRUE;
481}
482
483void wxMultiChoiceDialog::SetSelections(const wxArrayInt& selections)
484{
485 size_t count = selections.GetCount();
486 for ( size_t n = 0; n < count; n++ )
487 {
488 m_listbox->Select(selections[n]);
489 }
490}
491
492bool wxMultiChoiceDialog::TransferDataFromWindow()
493{
494 // VZ: I hate to do it but I can't fix wxMotif right now (FIXME)
495#ifdef __WXMOTIF__
496 #define IsSelected Selected
497#endif
498
499 m_selections.Empty();
500 size_t count = m_listbox->GetCount();
501 for ( size_t n = 0; n < count; n++ )
502 {
503 if ( m_listbox->IsSelected(n) )
504 m_selections.Add(n);
505 }
506
507 return TRUE;
508}