1 /////////////////////////////////////////////////////////////////////////////
2 // Program: wxWidgets Widgets Sample
4 // Purpose: Part of the widgets sample showing wxRadioBox
5 // Author: Vadim Zeitlin
8 // Copyright: (c) 2001 Vadim Zeitlin
9 // License: wxWindows license
10 /////////////////////////////////////////////////////////////////////////////
12 // ============================================================================
14 // ============================================================================
16 // ----------------------------------------------------------------------------
18 // ----------------------------------------------------------------------------
20 // for compilers that support precompilation, includes "wx/wx.h".
21 #include "wx/wxprec.h"
29 // for all others, include the necessary headers
33 #include "wx/bitmap.h"
34 #include "wx/button.h"
35 #include "wx/checkbox.h"
36 #include "wx/radiobox.h"
37 #include "wx/statbox.h"
38 #include "wx/textctrl.h"
45 #include "icons/radiobox.xpm"
47 // ----------------------------------------------------------------------------
49 // ----------------------------------------------------------------------------
54 RadioPage_Reset
= wxID_HIGHEST
,
64 // layout direction radiobox selections
72 // default values for the number of radiobox items
73 static const unsigned int DEFAULT_NUM_ENTRIES
= 12;
74 static const unsigned int DEFAULT_MAJOR_DIM
= 3;
76 // this item is enabled/disabled shown/hidden by the test checkboxes
77 static const int TEST_BUTTON
= 1;
79 // ----------------------------------------------------------------------------
81 // ----------------------------------------------------------------------------
83 class RadioWidgetsPage
: public WidgetsPage
86 RadioWidgetsPage(WidgetsBookCtrl
*book
, wxImageList
*imaglist
);
87 virtual ~RadioWidgetsPage(){};
89 virtual wxControl
*GetWidget() const { return m_radio
; }
90 virtual void RecreateWidget() { CreateRadio(); }
92 // lazy creation of the content
93 virtual void CreateContent();
97 void OnCheckOrRadioBox(wxCommandEvent
& event
);
98 void OnRadioBox(wxCommandEvent
& event
);
100 void OnButtonReset(wxCommandEvent
& event
);
101 void OnButtonRecreate(wxCommandEvent
& event
);
103 void OnButtonSelection(wxCommandEvent
& event
);
104 void OnButtonSetLabel(wxCommandEvent
& event
);
106 void OnEnableItem(wxCommandEvent
& event
);
107 void OnShowItem(wxCommandEvent
& event
);
109 void OnUpdateUIReset(wxUpdateUIEvent
& event
);
110 void OnUpdateUIUpdate(wxUpdateUIEvent
& event
);
111 void OnUpdateUISelection(wxUpdateUIEvent
& event
);
112 void OnUpdateUIEnableItem(wxUpdateUIEvent
& event
);
113 void OnUpdateUIShowItem(wxUpdateUIEvent
& event
);
115 // reset the wxRadioBox parameters
118 // (re)create the wxRadioBox
124 // the check/radio boxes for styles
125 wxCheckBox
*m_chkVert
;
126 wxCheckBox
*m_chkEnableItem
;
127 wxCheckBox
*m_chkShowItem
;
128 wxRadioBox
*m_radioDir
;
130 // the gauge itself and the sizer it is in
132 wxSizer
*m_sizerRadio
;
134 // the text entries for command parameters
135 wxTextCtrl
*m_textNumBtns
,
143 DECLARE_EVENT_TABLE()
144 DECLARE_WIDGETS_PAGE(RadioWidgetsPage
)
147 // ----------------------------------------------------------------------------
149 // ----------------------------------------------------------------------------
151 BEGIN_EVENT_TABLE(RadioWidgetsPage
, WidgetsPage
)
152 EVT_BUTTON(RadioPage_Reset
, RadioWidgetsPage::OnButtonReset
)
154 EVT_BUTTON(RadioPage_Update
, RadioWidgetsPage::OnButtonRecreate
)
155 EVT_BUTTON(RadioPage_LabelBtn
, RadioWidgetsPage::OnButtonRecreate
)
157 EVT_BUTTON(RadioPage_Selection
, RadioWidgetsPage::OnButtonSelection
)
158 EVT_BUTTON(RadioPage_Label
, RadioWidgetsPage::OnButtonSetLabel
)
160 EVT_UPDATE_UI(RadioPage_Update
, RadioWidgetsPage::OnUpdateUIUpdate
)
161 EVT_UPDATE_UI(RadioPage_Selection
, RadioWidgetsPage::OnUpdateUISelection
)
163 EVT_RADIOBOX(RadioPage_Radio
, RadioWidgetsPage::OnRadioBox
)
165 EVT_CHECKBOX(RadioPage_EnableItem
, RadioWidgetsPage::OnEnableItem
)
166 EVT_CHECKBOX(RadioPage_ShowItem
, RadioWidgetsPage::OnShowItem
)
168 EVT_UPDATE_UI(RadioPage_EnableItem
, RadioWidgetsPage::OnUpdateUIEnableItem
)
169 EVT_UPDATE_UI(RadioPage_ShowItem
, RadioWidgetsPage::OnUpdateUIShowItem
)
171 EVT_CHECKBOX(wxID_ANY
, RadioWidgetsPage::OnCheckOrRadioBox
)
172 EVT_RADIOBOX(wxID_ANY
, RadioWidgetsPage::OnCheckOrRadioBox
)
175 // ============================================================================
177 // ============================================================================
179 #if defined(__WXUNIVERSAL__)
180 #define FAMILY_CTRLS UNIVERSAL_CTRLS
182 #define FAMILY_CTRLS NATIVE_CTRLS
185 IMPLEMENT_WIDGETS_PAGE(RadioWidgetsPage
, _T("Radio"),
186 FAMILY_CTRLS
| WITH_ITEMS_CTRLS
189 RadioWidgetsPage::RadioWidgetsPage(WidgetsBookCtrl
*book
,
190 wxImageList
*imaglist
)
191 : WidgetsPage(book
, imaglist
, radio_xpm
)
194 m_chkVert
= (wxCheckBox
*)NULL
;
195 m_chkEnableItem
= (wxCheckBox
*)NULL
;
196 m_chkShowItem
= (wxCheckBox
*)NULL
;
200 m_textLabel
= (wxTextCtrl
*)NULL
;
203 m_radioDir
= (wxRadioBox
*)NULL
;
204 m_sizerRadio
= (wxSizer
*)NULL
;
207 void RadioWidgetsPage::CreateContent()
209 wxSizer
*sizerTop
= new wxBoxSizer(wxHORIZONTAL
);
212 wxStaticBox
*box
= new wxStaticBox(this, wxID_ANY
, _T("&Set style"));
214 wxSizer
*sizerLeft
= new wxStaticBoxSizer(box
, wxVERTICAL
);
216 m_chkVert
= CreateCheckBoxAndAddToSizer(sizerLeft
, _T("&Vertical layout"));
218 static const wxString layoutDir
[] =
225 m_radioDir
= new wxRadioBox(this, wxID_ANY
, _T("Numbering:"),
226 wxDefaultPosition
, wxDefaultSize
,
227 WXSIZEOF(layoutDir
), layoutDir
,
228 1, wxRA_SPECIFY_COLS
);
229 sizerLeft
->Add(m_radioDir
, 0, wxGROW
| wxALL
, 5);
231 // if it's not defined, we can't change the radiobox direction
232 #ifndef wxRA_LEFTTORIGHT
233 m_radioDir
->Disable();
234 #endif // wxRA_LEFTTORIGHT
237 sizerRow
= CreateSizerWithTextAndLabel(_T("&Major dimension:"),
240 sizerLeft
->Add(sizerRow
, 0, wxGROW
| wxALL
, 5);
242 sizerRow
= CreateSizerWithTextAndLabel(_T("&Number of buttons:"),
245 sizerLeft
->Add(sizerRow
, 0, wxGROW
| wxALL
, 5);
248 btn
= new wxButton(this, RadioPage_Update
, _T("&Update"));
249 sizerLeft
->Add(btn
, 0, wxALIGN_CENTRE_HORIZONTAL
| wxALL
, 5);
251 sizerLeft
->Add(5, 5, 0, wxGROW
| wxALL
, 5); // spacer
253 btn
= new wxButton(this, RadioPage_Reset
, _T("&Reset"));
254 sizerLeft
->Add(btn
, 0, wxALIGN_CENTRE_HORIZONTAL
| wxALL
, 15);
257 wxStaticBox
*box2
= new wxStaticBox(this, wxID_ANY
, _T("&Change parameters"));
258 wxSizer
*sizerMiddle
= new wxStaticBoxSizer(box2
, wxVERTICAL
);
260 sizerRow
= CreateSizerWithTextAndLabel(_T("Current selection:"),
263 sizerMiddle
->Add(sizerRow
, 0, wxGROW
| wxALL
, 5);
265 sizerRow
= CreateSizerWithTextAndButton(RadioPage_Selection
,
266 _T("&Change selection:"),
269 sizerMiddle
->Add(sizerRow
, 0, wxGROW
| wxALL
, 5);
271 sizerRow
= CreateSizerWithTextAndButton(RadioPage_Label
,
272 _T("&Label for box:"),
275 sizerMiddle
->Add(sizerRow
, 0, wxGROW
| wxALL
, 5);
277 sizerRow
= CreateSizerWithTextAndButton(RadioPage_LabelBtn
,
278 _T("&Label for buttons:"),
281 sizerMiddle
->Add(sizerRow
, 0, wxGROW
| wxALL
, 5);
283 m_chkEnableItem
= CreateCheckBoxAndAddToSizer(sizerMiddle
,
284 _T("Disable &2nd item"),
285 RadioPage_EnableItem
);
286 m_chkShowItem
= CreateCheckBoxAndAddToSizer(sizerMiddle
,
287 _T("Hide 2nd &item"),
291 wxSizer
*sizerRight
= new wxBoxSizer(wxHORIZONTAL
);
292 sizerRight
->SetMinSize(150, 0);
293 m_sizerRadio
= sizerRight
; // save it to modify it later
298 // the 3 panes panes compose the window
299 sizerTop
->Add(sizerLeft
, 0, wxGROW
| (wxALL
& ~wxLEFT
), 10);
300 sizerTop
->Add(sizerMiddle
, 1, wxGROW
| wxALL
, 10);
301 sizerTop
->Add(sizerRight
, 0, wxGROW
| (wxALL
& ~wxRIGHT
), 10);
303 // final initializations
307 // ----------------------------------------------------------------------------
309 // ----------------------------------------------------------------------------
311 void RadioWidgetsPage::Reset()
313 m_textMajorDim
->SetValue(wxString::Format(_T("%u"), DEFAULT_MAJOR_DIM
));
314 m_textNumBtns
->SetValue(wxString::Format(_T("%u"), DEFAULT_NUM_ENTRIES
));
315 m_textLabel
->SetValue(_T("I'm a radiobox"));
316 m_textLabelBtns
->SetValue(_T("item"));
318 m_chkVert
->SetValue(false);
319 m_chkEnableItem
->SetValue(true);
320 m_chkShowItem
->SetValue(true);
321 m_radioDir
->SetSelection(RadioDir_Default
);
324 void RadioWidgetsPage::CreateRadio()
329 sel
= m_radio
->GetSelection();
331 m_sizerRadio
->Detach( m_radio
);
335 else // first time creation, no old selection to preserve
341 if ( !m_textNumBtns
->GetValue().ToULong(&count
) )
343 wxLogWarning(_T("Should have a valid number for number of items."));
345 // fall back to default
346 count
= DEFAULT_NUM_ENTRIES
;
349 unsigned long majorDim
;
350 if ( !m_textMajorDim
->GetValue().ToULong(&majorDim
) )
352 wxLogWarning(_T("Should have a valid major dimension number."));
354 // fall back to default
355 majorDim
= DEFAULT_MAJOR_DIM
;
358 wxString
*items
= new wxString
[count
];
360 wxString labelBtn
= m_textLabelBtns
->GetValue();
361 for ( size_t n
= 0; n
< count
; n
++ )
363 items
[n
] = wxString::Format(_T("%s %lu"),
364 labelBtn
.c_str(), (unsigned long)n
+ 1);
367 int flags
= m_chkVert
->GetValue() ? wxRA_VERTICAL
370 flags
|= ms_defaultFlags
;
372 #ifdef wxRA_LEFTTORIGHT
373 switch ( m_radioDir
->GetSelection() )
376 wxFAIL_MSG( _T("unexpected wxRadioBox layout direction") );
379 case RadioDir_Default
:
383 flags
|= wxRA_LEFTTORIGHT
;
387 flags
|= wxRA_TOPTOBOTTOM
;
390 #endif // wxRA_LEFTTORIGHT
392 m_radio
= new wxRadioBox(this, RadioPage_Radio
,
393 m_textLabel
->GetValue(),
394 wxDefaultPosition
, wxDefaultSize
,
401 if ( sel
>= 0 && (size_t)sel
< count
)
403 m_radio
->SetSelection(sel
);
406 m_sizerRadio
->Add(m_radio
, 1, wxGROW
);
407 m_sizerRadio
->Layout();
409 m_chkEnableItem
->SetValue(true);
410 m_chkEnableItem
->SetValue(true);
413 // ----------------------------------------------------------------------------
415 // ----------------------------------------------------------------------------
417 void RadioWidgetsPage::OnButtonReset(wxCommandEvent
& WXUNUSED(event
))
424 void RadioWidgetsPage::OnCheckOrRadioBox(wxCommandEvent
& WXUNUSED(event
))
429 void RadioWidgetsPage::OnRadioBox(wxCommandEvent
& event
)
431 int sel
= m_radio
->GetSelection();
432 int event_sel
= event
.GetSelection();
433 wxUnusedVar(event_sel
);
435 wxLogMessage(_T("Radiobox selection changed, now %d"), sel
);
437 wxASSERT_MSG( sel
== event_sel
,
438 _T("selection should be the same in event and radiobox") );
440 m_textCurSel
->SetValue(wxString::Format(_T("%d"), sel
));
443 void RadioWidgetsPage::OnButtonRecreate(wxCommandEvent
& WXUNUSED(event
))
448 void RadioWidgetsPage::OnButtonSetLabel(wxCommandEvent
& WXUNUSED(event
))
450 m_radio
->wxControl::SetLabel(m_textLabel
->GetValue());
453 void RadioWidgetsPage::OnButtonSelection(wxCommandEvent
& WXUNUSED(event
))
456 if ( !m_textSel
->GetValue().ToULong(&sel
) ||
457 (sel
>= (size_t)m_radio
->GetCount()) )
459 wxLogWarning(_T("Invalid number specified as new selection."));
463 m_radio
->SetSelection(sel
);
467 void RadioWidgetsPage::OnEnableItem(wxCommandEvent
& event
)
469 m_radio
->Enable(TEST_BUTTON
, event
.IsChecked());
472 void RadioWidgetsPage::OnShowItem(wxCommandEvent
& event
)
474 m_radio
->Show(TEST_BUTTON
, event
.IsChecked());
477 void RadioWidgetsPage::OnUpdateUIUpdate(wxUpdateUIEvent
& event
)
480 event
.Enable( m_textNumBtns
->GetValue().ToULong(&n
) &&
481 m_textMajorDim
->GetValue().ToULong(&n
) );
484 void RadioWidgetsPage::OnUpdateUISelection(wxUpdateUIEvent
& event
)
487 event
.Enable( m_textSel
->GetValue().ToULong(&n
) &&
488 (n
< (size_t)m_radio
->GetCount()) );
491 void RadioWidgetsPage::OnUpdateUIReset(wxUpdateUIEvent
& event
)
493 // only enable it if something is not set to default
494 bool enable
= m_chkVert
->GetValue();
498 unsigned long numEntries
;
500 enable
= !m_textNumBtns
->GetValue().ToULong(&numEntries
) ||
501 numEntries
!= DEFAULT_NUM_ENTRIES
;
505 unsigned long majorDim
;
507 enable
= !m_textMajorDim
->GetValue().ToULong(&majorDim
) ||
508 majorDim
!= DEFAULT_MAJOR_DIM
;
512 event
.Enable(enable
);
515 void RadioWidgetsPage::OnUpdateUIEnableItem(wxUpdateUIEvent
& event
)
517 event
.SetText(m_radio
->IsItemEnabled(TEST_BUTTON
) ? _T("Disable &2nd item")
518 : _T("Enable &2nd item"));
521 void RadioWidgetsPage::OnUpdateUIShowItem(wxUpdateUIEvent
& event
)
523 event
.SetText(m_radio
->IsItemShown(TEST_BUTTON
) ? _T("Hide 2nd &item")
524 : _T("Show 2nd &item"));
527 #endif // wxUSE_RADIOBOX