]>
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"
43 #include "wx/statline.h"
46 #include "wx/generic/choicdgg.h"
48 // ----------------------------------------------------------------------------
50 // ----------------------------------------------------------------------------
52 #define wxID_LISTBOX 3000
54 // ---------------------------------------------------------------------------
56 // ---------------------------------------------------------------------------
58 /* Macro for avoiding #ifdefs when value have to be different depending on size of
59 device we display on - take it from something like wxDesktopPolicy in the future
62 #if defined(__SMARTPHONE__)
63 #define wxLARGESMALL(large,small) small
65 #define wxLARGESMALL(large,small) large
68 // ----------------------------------------------------------------------------
70 // ----------------------------------------------------------------------------
72 // convert wxArrayString into a wxString[] which must be delete[]d by caller
73 static int ConvertWXArrayToC(const wxArrayString
& aChoices
, wxString
**choices
);
75 // ============================================================================
77 // ============================================================================
79 // ----------------------------------------------------------------------------
81 // ----------------------------------------------------------------------------
83 int ConvertWXArrayToC(const wxArrayString
& aChoices
, wxString
**choices
)
85 int n
= aChoices
.GetCount();
86 *choices
= new wxString
[n
];
88 for ( int i
= 0; i
< n
; i
++ )
90 (*choices
)[i
] = aChoices
[i
];
96 // ----------------------------------------------------------------------------
98 // ----------------------------------------------------------------------------
100 wxString
wxGetSingleChoice( const wxString
& message
,
101 const wxString
& caption
,
102 int n
, const wxString
*choices
,
104 int WXUNUSED(x
), int WXUNUSED(y
),
105 bool WXUNUSED(centre
),
106 int WXUNUSED(width
), int WXUNUSED(height
) )
108 wxSingleChoiceDialog
dialog(parent
, message
, caption
, n
, choices
);
110 if ( dialog
.ShowModal() == wxID_OK
)
111 choice
= dialog
.GetStringSelection();
116 wxString
wxGetSingleChoice( const wxString
& message
,
117 const wxString
& caption
,
118 const wxArrayString
& aChoices
,
122 int width
, int height
)
125 int n
= ConvertWXArrayToC(aChoices
, &choices
);
126 wxString res
= wxGetSingleChoice(message
, caption
, n
, choices
, parent
,
127 x
, y
, centre
, width
, height
);
133 int wxGetSingleChoiceIndex( const wxString
& message
,
134 const wxString
& caption
,
135 int n
, const wxString
*choices
,
137 int WXUNUSED(x
), int WXUNUSED(y
),
138 bool WXUNUSED(centre
),
139 int WXUNUSED(width
), int WXUNUSED(height
) )
141 wxSingleChoiceDialog
dialog(parent
, message
, caption
, n
, choices
);
143 if ( dialog
.ShowModal() == wxID_OK
)
144 choice
= dialog
.GetSelection();
151 int wxGetSingleChoiceIndex( const wxString
& message
,
152 const wxString
& caption
,
153 const wxArrayString
& aChoices
,
157 int width
, int height
)
160 int n
= ConvertWXArrayToC(aChoices
, &choices
);
161 int res
= wxGetSingleChoiceIndex(message
, caption
, n
, choices
, parent
,
162 x
, y
, centre
, width
, height
);
168 void *wxGetSingleChoiceData( const wxString
& message
,
169 const wxString
& caption
,
170 int n
, const wxString
*choices
,
173 int WXUNUSED(x
), int WXUNUSED(y
),
174 bool WXUNUSED(centre
),
175 int WXUNUSED(width
), int WXUNUSED(height
) )
177 wxSingleChoiceDialog
dialog(parent
, message
, caption
, n
, choices
,
178 (char **)client_data
);
180 if ( dialog
.ShowModal() == wxID_OK
)
181 data
= dialog
.GetSelectionClientData();
188 void *wxGetSingleChoiceData( const wxString
& message
,
189 const wxString
& caption
,
190 const wxArrayString
& aChoices
,
195 int width
, int height
)
198 int n
= ConvertWXArrayToC(aChoices
, &choices
);
199 void *res
= wxGetSingleChoiceData(message
, caption
, n
, choices
,
201 x
, y
, centre
, width
, height
);
207 size_t wxGetMultipleChoices(wxArrayInt
& selections
,
208 const wxString
& message
,
209 const wxString
& caption
,
210 int n
, const wxString
*choices
,
212 int WXUNUSED(x
), int WXUNUSED(y
),
213 bool WXUNUSED(centre
),
214 int WXUNUSED(width
), int WXUNUSED(height
))
216 wxMultiChoiceDialog
dialog(parent
, message
, caption
, n
, choices
);
218 // call this even if selections array is empty and this then (correctly)
219 // deselects the first item which is selected by default
220 dialog
.SetSelections(selections
);
222 if ( dialog
.ShowModal() == wxID_OK
)
223 selections
= dialog
.GetSelections();
227 return selections
.GetCount();
230 size_t wxGetMultipleChoices(wxArrayInt
& selections
,
231 const wxString
& message
,
232 const wxString
& caption
,
233 const wxArrayString
& aChoices
,
237 int width
, int height
)
240 int n
= ConvertWXArrayToC(aChoices
, &choices
);
241 size_t res
= wxGetMultipleChoices(selections
, message
, caption
,
243 x
, y
, centre
, width
, height
);
249 // ----------------------------------------------------------------------------
251 // ----------------------------------------------------------------------------
253 bool wxAnyChoiceDialog::Create(wxWindow
*parent
,
254 const wxString
& message
,
255 const wxString
& caption
,
256 int n
, const wxString
*choices
,
261 #if defined(__SMARTPHONE__) || defined(__POCKETPC__)
262 styleDlg
&= ~wxBORDER_MASK
;
263 styleDlg
&= ~wxRESIZE_BORDER
;
264 styleDlg
&= ~wxCAPTION
;
267 if ( !wxDialog::Create(parent
, wxID_ANY
, caption
, pos
, wxDefaultSize
, styleDlg
& (~wxCANCEL
) ) )
270 if ( !wxDialog::Create(parent
, wxID_ANY
, caption
, pos
, wxDefaultSize
, styleDlg
) )
274 wxBoxSizer
*topsizer
= new wxBoxSizer( wxVERTICAL
);
278 // align text and list at least on mac
279 topsizer
->Add( CreateTextSizer( message
), 0, wxALL
, wxLARGESMALL(15,0) );
281 topsizer
->Add( CreateTextSizer( message
), 0, wxALL
, wxLARGESMALL(10,0) );
284 m_listbox
= CreateList(n
,choices
,styleLbox
);
287 m_listbox
->SetSelection(0);
289 topsizer
->Add( m_listbox
, 1, wxEXPAND
|wxLEFT
|wxRIGHT
, wxLARGESMALL(15,0) );
291 // smart phones does not support or do not waste space for wxButtons
292 #ifdef __SMARTPHONE__
294 SetRightMenu(wxID_CANCEL
, _("Cancel"));
296 #else // __SMARTPHONE__/!__SMARTPHONE__
298 // Mac Human Interface Guidelines recommend not to use static lines as grouping elements
302 topsizer
->Add( new wxStaticLine( this, wxID_ANY
), 0, wxEXPAND
| wxLEFT
|wxRIGHT
|wxTOP
, 10 );
307 topsizer
->Add( CreateButtonSizer( styleDlg
& (wxOK
|wxCANCEL
) ), 0, wxEXPAND
| wxALL
, 10 );
309 #endif // !__SMARTPHONE__
311 SetSizer( topsizer
);
313 #if !defined(__SMARTPHONE__) && !defined(__POCKETPC__)
314 topsizer
->SetSizeHints( this );
315 topsizer
->Fit( this );
317 if ( styleDlg
& wxCENTRE
)
321 m_listbox
->SetFocus();
326 bool wxAnyChoiceDialog::Create(wxWindow
*parent
,
327 const wxString
& message
,
328 const wxString
& caption
,
329 const wxArrayString
& choices
,
334 wxCArrayString
chs(choices
);
335 return Create(parent
, message
, caption
, chs
.GetCount(), chs
.GetStrings(),
336 styleDlg
, pos
, styleLbox
);
339 wxListBoxBase
*wxAnyChoiceDialog::CreateList(int n
, const wxString
*choices
, long styleLbox
)
341 return new wxListBox( this, wxID_LISTBOX
,
342 wxDefaultPosition
, wxDefaultSize
,
347 // ----------------------------------------------------------------------------
348 // wxSingleChoiceDialog
349 // ----------------------------------------------------------------------------
351 BEGIN_EVENT_TABLE(wxSingleChoiceDialog
, wxDialog
)
352 EVT_BUTTON(wxID_OK
, wxSingleChoiceDialog::OnOK
)
353 #ifndef __SMARTPHONE__
354 EVT_LISTBOX_DCLICK(wxID_LISTBOX
, wxSingleChoiceDialog::OnListBoxDClick
)
357 EVT_JOY_BUTTON_DOWN(wxSingleChoiceDialog::OnJoystickButtonDown
)
361 IMPLEMENT_DYNAMIC_CLASS(wxSingleChoiceDialog
, wxDialog
)
363 wxSingleChoiceDialog::wxSingleChoiceDialog(wxWindow
*parent
,
364 const wxString
& message
,
365 const wxString
& caption
,
367 const wxString
*choices
,
370 const wxPoint
& WXUNUSED(pos
))
372 Create(parent
, message
, caption
, n
, choices
, clientData
, style
);
375 wxSingleChoiceDialog::wxSingleChoiceDialog(wxWindow
*parent
,
376 const wxString
& message
,
377 const wxString
& caption
,
378 const wxArrayString
& choices
,
381 const wxPoint
& WXUNUSED(pos
))
383 Create(parent
, message
, caption
, choices
, clientData
, style
);
386 bool wxSingleChoiceDialog::Create( wxWindow
*parent
,
387 const wxString
& message
,
388 const wxString
& caption
,
390 const wxString
*choices
,
395 if ( !wxAnyChoiceDialog::Create(parent
, message
, caption
,
400 m_selection
= n
> 0 ? 0 : -1;
404 for (int i
= 0; i
< n
; i
++)
405 m_listbox
->SetClientData(i
, clientData
[i
]);
411 bool wxSingleChoiceDialog::Create( wxWindow
*parent
,
412 const wxString
& message
,
413 const wxString
& caption
,
414 const wxArrayString
& choices
,
419 wxCArrayString
chs(choices
);
420 return Create( parent
, message
, caption
, chs
.GetCount(), chs
.GetStrings(),
421 clientData
, style
, pos
);
425 void wxSingleChoiceDialog::SetSelection(int sel
)
427 m_listbox
->SetSelection(sel
);
431 void wxSingleChoiceDialog::OnOK(wxCommandEvent
& WXUNUSED(event
))
436 #ifndef __SMARTPHONE__
437 void wxSingleChoiceDialog::OnListBoxDClick(wxCommandEvent
& WXUNUSED(event
))
444 void wxSingleChoiceDialog::OnJoystickButtonDown(wxJoystickEvent
& WXUNUSED(event
))
450 void wxSingleChoiceDialog::DoChoice()
452 m_selection
= m_listbox
->GetSelection();
453 m_stringSelection
= m_listbox
->GetStringSelection();
455 if ( m_listbox
->HasClientUntypedData() )
456 SetClientData(m_listbox
->GetClientData(m_selection
));
461 // ----------------------------------------------------------------------------
462 // wxMultiChoiceDialog
463 // ----------------------------------------------------------------------------
465 IMPLEMENT_DYNAMIC_CLASS(wxMultiChoiceDialog
, wxDialog
)
467 bool wxMultiChoiceDialog::Create( wxWindow
*parent
,
468 const wxString
& message
,
469 const wxString
& caption
,
471 const wxString
*choices
,
475 if ( !wxAnyChoiceDialog::Create(parent
, message
, caption
,
478 wxLB_ALWAYS_SB
| wxLB_EXTENDED
) )
484 bool wxMultiChoiceDialog::Create( wxWindow
*parent
,
485 const wxString
& message
,
486 const wxString
& caption
,
487 const wxArrayString
& choices
,
491 wxCArrayString
chs(choices
);
492 return Create( parent
, message
, caption
, chs
.GetCount(),
493 chs
.GetStrings(), style
, pos
);
496 void wxMultiChoiceDialog::SetSelections(const wxArrayInt
& selections
)
498 // first clear all currently selected items
500 count
= m_listbox
->GetCount();
501 for ( n
= 0; n
< count
; ++n
)
503 m_listbox
->Deselect(n
);
506 // now select the ones which should be selected
507 count
= selections
.GetCount();
508 for ( n
= 0; n
< count
; n
++ )
510 m_listbox
->Select(selections
[n
]);
514 bool wxMultiChoiceDialog::TransferDataFromWindow()
516 m_selections
.Empty();
517 size_t count
= m_listbox
->GetCount();
518 for ( size_t n
= 0; n
< count
; n
++ )
520 if ( m_listbox
->IsSelected(n
) )
527 #if wxUSE_CHECKLISTBOX
529 wxListBoxBase
*wxMultiChoiceDialog::CreateList(int n
, const wxString
*choices
, long styleLbox
)
531 return new wxCheckListBox( this, wxID_LISTBOX
,
532 wxDefaultPosition
, wxDefaultSize
,
537 #endif // wxUSE_CHECKLISTBOX
539 #endif // wxUSE_CHOICEDLG