]>
git.saurik.com Git - wxWidgets.git/blob - src/generic/choicdgg.cpp
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
8 // Copyright: (c) wxWidgets team
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
12 // ============================================================================
14 // ============================================================================
16 // ----------------------------------------------------------------------------
18 // ----------------------------------------------------------------------------
20 // For compilers that support precompilation, includes "wx.h".
21 #include "wx/wxprec.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"
39 #include "wx/arrstr.h"
42 #include "wx/statline.h"
43 #include "wx/settings.h"
44 #include "wx/generic/choicdgg.h"
46 // ----------------------------------------------------------------------------
48 // ----------------------------------------------------------------------------
50 #define wxID_LISTBOX 3000
52 // ----------------------------------------------------------------------------
54 // ----------------------------------------------------------------------------
56 // convert wxArrayString into a wxString[] which must be delete[]d by caller
57 static int ConvertWXArrayToC(const wxArrayString
& aChoices
, wxString
**choices
);
59 // ============================================================================
61 // ============================================================================
63 // ----------------------------------------------------------------------------
65 // ----------------------------------------------------------------------------
67 int ConvertWXArrayToC(const wxArrayString
& aChoices
, wxString
**choices
)
69 int n
= aChoices
.GetCount();
70 *choices
= new wxString
[n
];
72 for ( int i
= 0; i
< n
; i
++ )
74 (*choices
)[i
] = aChoices
[i
];
80 // ----------------------------------------------------------------------------
82 // ----------------------------------------------------------------------------
84 wxString
wxGetSingleChoice( const wxString
& message
,
85 const wxString
& caption
,
86 int n
, const wxString
*choices
,
88 int WXUNUSED(x
), int WXUNUSED(y
),
89 bool WXUNUSED(centre
),
90 int WXUNUSED(width
), int WXUNUSED(height
) )
92 wxSingleChoiceDialog
dialog(parent
, message
, caption
, n
, choices
);
94 if ( dialog
.ShowModal() == wxID_OK
)
95 choice
= dialog
.GetStringSelection();
100 wxString
wxGetSingleChoice( const wxString
& message
,
101 const wxString
& caption
,
102 const wxArrayString
& aChoices
,
106 int width
, int height
)
109 int n
= ConvertWXArrayToC(aChoices
, &choices
);
110 wxString res
= wxGetSingleChoice(message
, caption
, n
, choices
, parent
,
111 x
, y
, centre
, width
, height
);
117 int wxGetSingleChoiceIndex( const wxString
& message
,
118 const wxString
& caption
,
119 int n
, const wxString
*choices
,
121 int WXUNUSED(x
), int WXUNUSED(y
),
122 bool WXUNUSED(centre
),
123 int WXUNUSED(width
), int WXUNUSED(height
) )
125 wxSingleChoiceDialog
dialog(parent
, message
, caption
, n
, choices
);
127 if ( dialog
.ShowModal() == wxID_OK
)
128 choice
= dialog
.GetSelection();
135 int wxGetSingleChoiceIndex( const wxString
& message
,
136 const wxString
& caption
,
137 const wxArrayString
& aChoices
,
141 int width
, int height
)
144 int n
= ConvertWXArrayToC(aChoices
, &choices
);
145 int res
= wxGetSingleChoiceIndex(message
, caption
, n
, choices
, parent
,
146 x
, y
, centre
, width
, height
);
152 void *wxGetSingleChoiceData( const wxString
& message
,
153 const wxString
& caption
,
154 int n
, const wxString
*choices
,
157 int WXUNUSED(x
), int WXUNUSED(y
),
158 bool WXUNUSED(centre
),
159 int WXUNUSED(width
), int WXUNUSED(height
) )
161 wxSingleChoiceDialog
dialog(parent
, message
, caption
, n
, choices
,
162 (char **)client_data
);
164 if ( dialog
.ShowModal() == wxID_OK
)
165 data
= dialog
.GetSelectionClientData();
172 void *wxGetSingleChoiceData( const wxString
& message
,
173 const wxString
& caption
,
174 const wxArrayString
& aChoices
,
179 int width
, int height
)
182 int n
= ConvertWXArrayToC(aChoices
, &choices
);
183 void *res
= wxGetSingleChoiceData(message
, caption
, n
, choices
,
185 x
, y
, centre
, width
, height
);
191 size_t wxGetMultipleChoices(wxArrayInt
& selections
,
192 const wxString
& message
,
193 const wxString
& caption
,
194 int n
, const wxString
*choices
,
196 int WXUNUSED(x
), int WXUNUSED(y
),
197 bool WXUNUSED(centre
),
198 int WXUNUSED(width
), int WXUNUSED(height
))
200 wxMultiChoiceDialog
dialog(parent
, message
, caption
, n
, choices
);
202 // call this even if selections array is empty and this then (correctly)
203 // deselects the first item which is selected by default
204 dialog
.SetSelections(selections
);
206 if ( dialog
.ShowModal() == wxID_OK
)
207 selections
= dialog
.GetSelections();
211 return selections
.GetCount();
214 size_t wxGetMultipleChoices(wxArrayInt
& selections
,
215 const wxString
& message
,
216 const wxString
& caption
,
217 const wxArrayString
& aChoices
,
221 int width
, int height
)
224 int n
= ConvertWXArrayToC(aChoices
, &choices
);
225 size_t res
= wxGetMultipleChoices(selections
, message
, caption
,
227 x
, y
, centre
, width
, height
);
233 // ----------------------------------------------------------------------------
235 // ----------------------------------------------------------------------------
237 bool wxAnyChoiceDialog::Create(wxWindow
*parent
,
238 const wxString
& message
,
239 const wxString
& caption
,
240 int n
, const wxString
*choices
,
247 if ( !wxDialog::Create(parent
, wxID_ANY
, caption
, pos
, wxDefaultSize
, styleDlg
& (~wxCANCEL
) ) )
250 if ( !wxDialog::Create(parent
, wxID_ANY
, caption
, pos
, wxDefaultSize
, styleDlg
) )
254 wxBoxSizer
*topsizer
= new wxBoxSizer( wxVERTICAL
);
258 Add(CreateTextSizer(message
), wxSizerFlags().Expand().TripleBorder());
261 m_listbox
= CreateList(n
, choices
, styleLbox
);
264 m_listbox
->SetSelection(0);
267 Add(m_listbox
, wxSizerFlags().Expand().Proportion(1).TripleBorder(wxLEFT
| wxRIGHT
));
271 buttonSizer
= CreateSeparatedButtonSizer(styleDlg
& ButtonSizerFlags
);
274 topsizer
->Add(buttonSizer
, wxSizerFlags().Expand().DoubleBorder());
277 SetSizer( topsizer
);
279 topsizer
->SetSizeHints( this );
280 topsizer
->Fit( this );
282 if ( styleDlg
& wxCENTRE
)
285 m_listbox
->SetFocus();
290 bool wxAnyChoiceDialog::Create(wxWindow
*parent
,
291 const wxString
& message
,
292 const wxString
& caption
,
293 const wxArrayString
& choices
,
298 wxCArrayString
chs(choices
);
299 return Create(parent
, message
, caption
, chs
.GetCount(), chs
.GetStrings(),
300 styleDlg
, pos
, styleLbox
);
303 wxListBoxBase
*wxAnyChoiceDialog::CreateList(int n
, const wxString
*choices
, long styleLbox
)
305 return new wxListBox( this, wxID_LISTBOX
,
306 wxDefaultPosition
, wxDefaultSize
,
311 // ----------------------------------------------------------------------------
312 // wxSingleChoiceDialog
313 // ----------------------------------------------------------------------------
315 BEGIN_EVENT_TABLE(wxSingleChoiceDialog
, wxDialog
)
316 EVT_BUTTON(wxID_OK
, wxSingleChoiceDialog::OnOK
)
317 #ifndef __SMARTPHONE__
318 EVT_LISTBOX_DCLICK(wxID_LISTBOX
, wxSingleChoiceDialog::OnListBoxDClick
)
321 EVT_JOY_BUTTON_DOWN(wxSingleChoiceDialog::OnJoystickButtonDown
)
325 IMPLEMENT_DYNAMIC_CLASS(wxSingleChoiceDialog
, wxDialog
)
327 wxSingleChoiceDialog::wxSingleChoiceDialog(wxWindow
*parent
,
328 const wxString
& message
,
329 const wxString
& caption
,
331 const wxString
*choices
,
334 const wxPoint
& WXUNUSED(pos
))
336 Create(parent
, message
, caption
, n
, choices
, clientData
, style
);
339 wxSingleChoiceDialog::wxSingleChoiceDialog(wxWindow
*parent
,
340 const wxString
& message
,
341 const wxString
& caption
,
342 const wxArrayString
& choices
,
345 const wxPoint
& WXUNUSED(pos
))
347 Create(parent
, message
, caption
, choices
, clientData
, style
);
350 bool wxSingleChoiceDialog::Create( wxWindow
*parent
,
351 const wxString
& message
,
352 const wxString
& caption
,
354 const wxString
*choices
,
359 if ( !wxAnyChoiceDialog::Create(parent
, message
, caption
,
364 m_selection
= n
> 0 ? 0 : -1;
368 for (int i
= 0; i
< n
; i
++)
369 m_listbox
->SetClientData(i
, clientData
[i
]);
375 bool wxSingleChoiceDialog::Create( wxWindow
*parent
,
376 const wxString
& message
,
377 const wxString
& caption
,
378 const wxArrayString
& choices
,
383 wxCArrayString
chs(choices
);
384 return Create( parent
, message
, caption
, chs
.GetCount(), chs
.GetStrings(),
385 clientData
, style
, pos
);
389 void wxSingleChoiceDialog::SetSelection(int sel
)
391 m_listbox
->SetSelection(sel
);
395 void wxSingleChoiceDialog::OnOK(wxCommandEvent
& WXUNUSED(event
))
400 #ifndef __SMARTPHONE__
401 void wxSingleChoiceDialog::OnListBoxDClick(wxCommandEvent
& WXUNUSED(event
))
408 void wxSingleChoiceDialog::OnJoystickButtonDown(wxJoystickEvent
& WXUNUSED(event
))
414 void wxSingleChoiceDialog::DoChoice()
416 m_selection
= m_listbox
->GetSelection();
417 m_stringSelection
= m_listbox
->GetStringSelection();
419 if ( m_listbox
->HasClientUntypedData() )
420 SetClientData(m_listbox
->GetClientData(m_selection
));
425 // ----------------------------------------------------------------------------
426 // wxMultiChoiceDialog
427 // ----------------------------------------------------------------------------
429 IMPLEMENT_DYNAMIC_CLASS(wxMultiChoiceDialog
, wxDialog
)
431 bool wxMultiChoiceDialog::Create( wxWindow
*parent
,
432 const wxString
& message
,
433 const wxString
& caption
,
435 const wxString
*choices
,
440 #if wxUSE_CHECKLISTBOX
441 styleLbox
= wxLB_ALWAYS_SB
;
443 styleLbox
= wxLB_ALWAYS_SB
| wxLB_EXTENDED
;
446 if ( !wxAnyChoiceDialog::Create(parent
, message
, caption
,
455 bool wxMultiChoiceDialog::Create( wxWindow
*parent
,
456 const wxString
& message
,
457 const wxString
& caption
,
458 const wxArrayString
& choices
,
462 wxCArrayString
chs(choices
);
463 return Create( parent
, message
, caption
, chs
.GetCount(),
464 chs
.GetStrings(), style
, pos
);
467 void wxMultiChoiceDialog::SetSelections(const wxArrayInt
& selections
)
469 #if wxUSE_CHECKLISTBOX
470 wxCheckListBox
* checkListBox
= wxDynamicCast(m_listbox
, wxCheckListBox
);
473 // first clear all currently selected items
475 count
= checkListBox
->GetCount();
476 for ( n
= 0; n
< count
; ++n
)
478 if (checkListBox
->IsChecked(n
))
479 checkListBox
->Check(n
, false);
482 // now select the ones which should be selected
483 count
= selections
.GetCount();
484 for ( n
= 0; n
< count
; n
++ )
486 checkListBox
->Check(selections
[n
]);
493 // first clear all currently selected items
495 count
= m_listbox
->GetCount();
496 for ( n
= 0; n
< count
; ++n
)
498 m_listbox
->Deselect(n
);
501 // now select the ones which should be selected
502 count
= selections
.GetCount();
503 for ( n
= 0; n
< count
; n
++ )
505 m_listbox
->Select(selections
[n
]);
509 bool wxMultiChoiceDialog::TransferDataFromWindow()
511 m_selections
.Empty();
513 #if wxUSE_CHECKLISTBOX
514 wxCheckListBox
* checkListBox
= wxDynamicCast(m_listbox
, wxCheckListBox
);
517 size_t count
= checkListBox
->GetCount();
518 for ( size_t n
= 0; n
< count
; n
++ )
520 if ( checkListBox
->IsChecked(n
) )
527 size_t count
= m_listbox
->GetCount();
528 for ( size_t n
= 0; n
< count
; n
++ )
530 if ( m_listbox
->IsSelected(n
) )
537 #if wxUSE_CHECKLISTBOX
539 wxListBoxBase
*wxMultiChoiceDialog::CreateList(int n
, const wxString
*choices
, long styleLbox
)
541 return new wxCheckListBox( this, wxID_LISTBOX
,
542 wxDefaultPosition
, wxDefaultSize
,
547 #endif // wxUSE_CHECKLISTBOX
549 #endif // wxUSE_CHOICEDLG