]>
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/generic/choicdgg.h"
45 // ----------------------------------------------------------------------------
47 // ----------------------------------------------------------------------------
49 #define wxID_LISTBOX 3000
51 // ---------------------------------------------------------------------------
53 // ---------------------------------------------------------------------------
55 /* Macro for avoiding #ifdefs when value have to be different depending on size of
56 device we display on - take it from something like wxDesktopPolicy in the future
59 #if defined(__SMARTPHONE__)
60 #define wxLARGESMALL(large,small) small
62 #define wxLARGESMALL(large,small) large
65 // ----------------------------------------------------------------------------
67 // ----------------------------------------------------------------------------
69 // convert wxArrayString into a wxString[] which must be delete[]d by caller
70 static int ConvertWXArrayToC(const wxArrayString
& aChoices
, wxString
**choices
);
72 // ============================================================================
74 // ============================================================================
76 // ----------------------------------------------------------------------------
78 // ----------------------------------------------------------------------------
80 int ConvertWXArrayToC(const wxArrayString
& aChoices
, wxString
**choices
)
82 int n
= aChoices
.GetCount();
83 *choices
= new wxString
[n
];
85 for ( int i
= 0; i
< n
; i
++ )
87 (*choices
)[i
] = aChoices
[i
];
93 // ----------------------------------------------------------------------------
95 // ----------------------------------------------------------------------------
97 wxString
wxGetSingleChoice( const wxString
& message
,
98 const wxString
& caption
,
99 int n
, const wxString
*choices
,
101 int WXUNUSED(x
), int WXUNUSED(y
),
102 bool WXUNUSED(centre
),
103 int WXUNUSED(width
), int WXUNUSED(height
) )
105 wxSingleChoiceDialog
dialog(parent
, message
, caption
, n
, choices
);
107 if ( dialog
.ShowModal() == wxID_OK
)
108 choice
= dialog
.GetStringSelection();
113 wxString
wxGetSingleChoice( const wxString
& message
,
114 const wxString
& caption
,
115 const wxArrayString
& aChoices
,
119 int width
, int height
)
122 int n
= ConvertWXArrayToC(aChoices
, &choices
);
123 wxString res
= wxGetSingleChoice(message
, caption
, n
, choices
, parent
,
124 x
, y
, centre
, width
, height
);
130 int wxGetSingleChoiceIndex( const wxString
& message
,
131 const wxString
& caption
,
132 int n
, const wxString
*choices
,
134 int WXUNUSED(x
), int WXUNUSED(y
),
135 bool WXUNUSED(centre
),
136 int WXUNUSED(width
), int WXUNUSED(height
) )
138 wxSingleChoiceDialog
dialog(parent
, message
, caption
, n
, choices
);
140 if ( dialog
.ShowModal() == wxID_OK
)
141 choice
= dialog
.GetSelection();
148 int wxGetSingleChoiceIndex( const wxString
& message
,
149 const wxString
& caption
,
150 const wxArrayString
& aChoices
,
154 int width
, int height
)
157 int n
= ConvertWXArrayToC(aChoices
, &choices
);
158 int res
= wxGetSingleChoiceIndex(message
, caption
, n
, choices
, parent
,
159 x
, y
, centre
, width
, height
);
165 void *wxGetSingleChoiceData( const wxString
& message
,
166 const wxString
& caption
,
167 int n
, const wxString
*choices
,
170 int WXUNUSED(x
), int WXUNUSED(y
),
171 bool WXUNUSED(centre
),
172 int WXUNUSED(width
), int WXUNUSED(height
) )
174 wxSingleChoiceDialog
dialog(parent
, message
, caption
, n
, choices
,
175 (char **)client_data
);
177 if ( dialog
.ShowModal() == wxID_OK
)
178 data
= dialog
.GetSelectionClientData();
185 void *wxGetSingleChoiceData( const wxString
& message
,
186 const wxString
& caption
,
187 const wxArrayString
& aChoices
,
192 int width
, int height
)
195 int n
= ConvertWXArrayToC(aChoices
, &choices
);
196 void *res
= wxGetSingleChoiceData(message
, caption
, n
, choices
,
198 x
, y
, centre
, width
, height
);
204 size_t wxGetMultipleChoices(wxArrayInt
& selections
,
205 const wxString
& message
,
206 const wxString
& caption
,
207 int n
, const wxString
*choices
,
209 int WXUNUSED(x
), int WXUNUSED(y
),
210 bool WXUNUSED(centre
),
211 int WXUNUSED(width
), int WXUNUSED(height
))
213 wxMultiChoiceDialog
dialog(parent
, message
, caption
, n
, choices
);
215 // call this even if selections array is empty and this then (correctly)
216 // deselects the first item which is selected by default
217 dialog
.SetSelections(selections
);
219 if ( dialog
.ShowModal() == wxID_OK
)
220 selections
= dialog
.GetSelections();
224 return selections
.GetCount();
227 size_t wxGetMultipleChoices(wxArrayInt
& selections
,
228 const wxString
& message
,
229 const wxString
& caption
,
230 const wxArrayString
& aChoices
,
234 int width
, int height
)
237 int n
= ConvertWXArrayToC(aChoices
, &choices
);
238 size_t res
= wxGetMultipleChoices(selections
, message
, caption
,
240 x
, y
, centre
, width
, height
);
246 // ----------------------------------------------------------------------------
248 // ----------------------------------------------------------------------------
250 bool wxAnyChoiceDialog::Create(wxWindow
*parent
,
251 const wxString
& message
,
252 const wxString
& caption
,
253 int n
, const wxString
*choices
,
258 #if defined(__SMARTPHONE__) || defined(__POCKETPC__)
259 styleDlg
&= ~wxBORDER_MASK
;
260 styleDlg
&= ~wxRESIZE_BORDER
;
261 styleDlg
&= ~wxCAPTION
;
264 if ( !wxDialog::Create(parent
, wxID_ANY
, caption
, pos
, wxDefaultSize
, styleDlg
& (~wxCANCEL
) ) )
267 if ( !wxDialog::Create(parent
, wxID_ANY
, caption
, pos
, wxDefaultSize
, styleDlg
) )
271 wxBoxSizer
*topsizer
= new wxBoxSizer( wxVERTICAL
);
275 // align text and list at least on mac
276 topsizer
->Add( CreateTextSizer( message
), 0, wxALL
, wxLARGESMALL(15,0) );
278 topsizer
->Add( CreateTextSizer( message
), 0, wxALL
, wxLARGESMALL(10,0) );
281 m_listbox
= CreateList(n
,choices
,styleLbox
);
284 m_listbox
->SetSelection(0);
286 topsizer
->Add( m_listbox
, 1, wxEXPAND
|wxLEFT
|wxRIGHT
, wxLARGESMALL(15,0) );
289 wxSizer
*buttonSizer
= CreateButtonSizer( styleDlg
& ButtonSizerFlags
, true, wxLARGESMALL(10,0) );
290 if(buttonSizer
->GetChildren().GetCount() > 0 )
292 topsizer
->Add( buttonSizer
, 0, wxEXPAND
| wxALL
, wxLARGESMALL(10,0) );
296 topsizer
->AddSpacer( wxLARGESMALL(15,0) );
300 SetSizer( topsizer
);
302 #if !defined(__SMARTPHONE__) && !defined(__POCKETPC__)
303 topsizer
->SetSizeHints( this );
304 topsizer
->Fit( this );
306 if ( styleDlg
& wxCENTRE
)
310 m_listbox
->SetFocus();
315 bool wxAnyChoiceDialog::Create(wxWindow
*parent
,
316 const wxString
& message
,
317 const wxString
& caption
,
318 const wxArrayString
& choices
,
323 wxCArrayString
chs(choices
);
324 return Create(parent
, message
, caption
, chs
.GetCount(), chs
.GetStrings(),
325 styleDlg
, pos
, styleLbox
);
328 wxListBoxBase
*wxAnyChoiceDialog::CreateList(int n
, const wxString
*choices
, long styleLbox
)
330 return new wxListBox( this, wxID_LISTBOX
,
331 wxDefaultPosition
, wxDefaultSize
,
336 // ----------------------------------------------------------------------------
337 // wxSingleChoiceDialog
338 // ----------------------------------------------------------------------------
340 BEGIN_EVENT_TABLE(wxSingleChoiceDialog
, wxDialog
)
341 EVT_BUTTON(wxID_OK
, wxSingleChoiceDialog::OnOK
)
342 #ifndef __SMARTPHONE__
343 EVT_LISTBOX_DCLICK(wxID_LISTBOX
, wxSingleChoiceDialog::OnListBoxDClick
)
346 EVT_JOY_BUTTON_DOWN(wxSingleChoiceDialog::OnJoystickButtonDown
)
350 IMPLEMENT_DYNAMIC_CLASS(wxSingleChoiceDialog
, wxDialog
)
352 wxSingleChoiceDialog::wxSingleChoiceDialog(wxWindow
*parent
,
353 const wxString
& message
,
354 const wxString
& caption
,
356 const wxString
*choices
,
359 const wxPoint
& WXUNUSED(pos
))
361 Create(parent
, message
, caption
, n
, choices
, clientData
, style
);
364 wxSingleChoiceDialog::wxSingleChoiceDialog(wxWindow
*parent
,
365 const wxString
& message
,
366 const wxString
& caption
,
367 const wxArrayString
& choices
,
370 const wxPoint
& WXUNUSED(pos
))
372 Create(parent
, message
, caption
, choices
, clientData
, style
);
375 bool wxSingleChoiceDialog::Create( wxWindow
*parent
,
376 const wxString
& message
,
377 const wxString
& caption
,
379 const wxString
*choices
,
384 if ( !wxAnyChoiceDialog::Create(parent
, message
, caption
,
389 m_selection
= n
> 0 ? 0 : -1;
393 for (int i
= 0; i
< n
; i
++)
394 m_listbox
->SetClientData(i
, clientData
[i
]);
400 bool wxSingleChoiceDialog::Create( wxWindow
*parent
,
401 const wxString
& message
,
402 const wxString
& caption
,
403 const wxArrayString
& choices
,
408 wxCArrayString
chs(choices
);
409 return Create( parent
, message
, caption
, chs
.GetCount(), chs
.GetStrings(),
410 clientData
, style
, pos
);
414 void wxSingleChoiceDialog::SetSelection(int sel
)
416 m_listbox
->SetSelection(sel
);
420 void wxSingleChoiceDialog::OnOK(wxCommandEvent
& WXUNUSED(event
))
425 #ifndef __SMARTPHONE__
426 void wxSingleChoiceDialog::OnListBoxDClick(wxCommandEvent
& WXUNUSED(event
))
433 void wxSingleChoiceDialog::OnJoystickButtonDown(wxJoystickEvent
& WXUNUSED(event
))
439 void wxSingleChoiceDialog::DoChoice()
441 m_selection
= m_listbox
->GetSelection();
442 m_stringSelection
= m_listbox
->GetStringSelection();
444 if ( m_listbox
->HasClientUntypedData() )
445 SetClientData(m_listbox
->GetClientData(m_selection
));
450 // ----------------------------------------------------------------------------
451 // wxMultiChoiceDialog
452 // ----------------------------------------------------------------------------
454 IMPLEMENT_DYNAMIC_CLASS(wxMultiChoiceDialog
, wxDialog
)
456 bool wxMultiChoiceDialog::Create( wxWindow
*parent
,
457 const wxString
& message
,
458 const wxString
& caption
,
460 const wxString
*choices
,
464 if ( !wxAnyChoiceDialog::Create(parent
, message
, caption
,
467 wxLB_ALWAYS_SB
| wxLB_EXTENDED
) )
473 bool wxMultiChoiceDialog::Create( wxWindow
*parent
,
474 const wxString
& message
,
475 const wxString
& caption
,
476 const wxArrayString
& choices
,
480 wxCArrayString
chs(choices
);
481 return Create( parent
, message
, caption
, chs
.GetCount(),
482 chs
.GetStrings(), style
, pos
);
485 void wxMultiChoiceDialog::SetSelections(const wxArrayInt
& selections
)
487 // first clear all currently selected items
489 count
= m_listbox
->GetCount();
490 for ( n
= 0; n
< count
; ++n
)
492 m_listbox
->Deselect(n
);
495 // now select the ones which should be selected
496 count
= selections
.GetCount();
497 for ( n
= 0; n
< count
; n
++ )
499 m_listbox
->Select(selections
[n
]);
503 bool wxMultiChoiceDialog::TransferDataFromWindow()
505 m_selections
.Empty();
506 size_t count
= m_listbox
->GetCount();
507 for ( size_t n
= 0; n
< count
; n
++ )
509 if ( m_listbox
->IsSelected(n
) )
516 #if wxUSE_CHECKLISTBOX
518 wxListBoxBase
*wxMultiChoiceDialog::CreateList(int n
, const wxString
*choices
, long styleLbox
)
520 return new wxCheckListBox( this, wxID_LISTBOX
,
521 wxDefaultPosition
, wxDefaultSize
,
526 #endif // wxUSE_CHECKLISTBOX
528 #endif // wxUSE_CHOICEDLG