1 /////////////////////////////////////////////////////////////////////////////
2 // Program: wxWidgets Widgets Sample
4 // Purpose: Part of the widgets sample showing wxSpinButton
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"
41 #include "wx/spinbutt.h"
42 #include "wx/spinctrl.h"
48 #include "icons/spinbtn.xpm"
50 // ----------------------------------------------------------------------------
52 // ----------------------------------------------------------------------------
57 SpinBtnPage_Reset
= 100,
60 SpinBtnPage_SetMinAndMax
,
61 SpinBtnPage_CurValueText
,
62 SpinBtnPage_ValueText
,
69 // ----------------------------------------------------------------------------
71 // ----------------------------------------------------------------------------
73 class SpinBtnWidgetsPage
: public WidgetsPage
76 SpinBtnWidgetsPage(wxBookCtrl
*book
, wxImageList
*imaglist
);
77 virtual ~SpinBtnWidgetsPage(){};
79 virtual wxControl
*GetWidget() const { return m_spinbtn
; }
80 virtual wxControl
*GetWidget2() const { return m_spinctrl
; }
84 void OnButtonReset(wxCommandEvent
& event
);
85 void OnButtonClear(wxCommandEvent
& event
);
86 void OnButtonSetValue(wxCommandEvent
& event
);
87 void OnButtonSetMinAndMax(wxCommandEvent
& event
);
89 void OnCheckOrRadioBox(wxCommandEvent
& event
);
91 void OnSpinBtn(wxSpinEvent
& event
);
92 void OnSpinBtnUp(wxSpinEvent
& event
);
93 void OnSpinBtnDown(wxSpinEvent
& event
);
94 void OnSpinCtrl(wxSpinEvent
& event
);
96 void OnUpdateUIValueButton(wxUpdateUIEvent
& event
);
97 void OnUpdateUIMinMaxButton(wxUpdateUIEvent
& event
);
99 void OnUpdateUIResetButton(wxUpdateUIEvent
& event
);
101 void OnUpdateUICurValueText(wxUpdateUIEvent
& event
);
103 // reset the spinbtn parameters
106 // (re)create the spinbtn
109 // is this spinbtn value in range?
110 bool IsValidValue(int val
) const
111 { return (val
>= m_min
) && (val
<= m_max
); }
119 // the check/radio boxes for styles
120 wxCheckBox
*m_chkVert
,
123 // the spinbtn and the spinctrl and the sizer containing them
124 wxSpinButton
*m_spinbtn
;
125 wxSpinCtrl
*m_spinctrl
;
127 wxSizer
*m_sizerSpin
;
129 // the text entries for set value/range
130 wxTextCtrl
*m_textValue
,
135 DECLARE_EVENT_TABLE()
136 DECLARE_WIDGETS_PAGE(SpinBtnWidgetsPage
)
139 // ----------------------------------------------------------------------------
141 // ----------------------------------------------------------------------------
143 BEGIN_EVENT_TABLE(SpinBtnWidgetsPage
, WidgetsPage
)
144 EVT_BUTTON(SpinBtnPage_Reset
, SpinBtnWidgetsPage::OnButtonReset
)
145 EVT_BUTTON(SpinBtnPage_SetValue
, SpinBtnWidgetsPage::OnButtonSetValue
)
146 EVT_BUTTON(SpinBtnPage_SetMinAndMax
, SpinBtnWidgetsPage::OnButtonSetMinAndMax
)
148 EVT_UPDATE_UI(SpinBtnPage_SetValue
, SpinBtnWidgetsPage::OnUpdateUIValueButton
)
149 EVT_UPDATE_UI(SpinBtnPage_SetMinAndMax
, SpinBtnWidgetsPage::OnUpdateUIMinMaxButton
)
151 EVT_UPDATE_UI(SpinBtnPage_Reset
, SpinBtnWidgetsPage::OnUpdateUIResetButton
)
153 EVT_UPDATE_UI(SpinBtnPage_CurValueText
, SpinBtnWidgetsPage::OnUpdateUICurValueText
)
155 EVT_SPIN(SpinBtnPage_SpinBtn
, SpinBtnWidgetsPage::OnSpinBtn
)
156 EVT_SPIN_UP(SpinBtnPage_SpinBtn
, SpinBtnWidgetsPage::OnSpinBtnUp
)
157 EVT_SPIN_DOWN(SpinBtnPage_SpinBtn
, SpinBtnWidgetsPage::OnSpinBtnDown
)
158 EVT_SPINCTRL(SpinBtnPage_SpinCtrl
, SpinBtnWidgetsPage::OnSpinCtrl
)
160 EVT_CHECKBOX(wxID_ANY
, SpinBtnWidgetsPage::OnCheckOrRadioBox
)
161 EVT_RADIOBOX(wxID_ANY
, SpinBtnWidgetsPage::OnCheckOrRadioBox
)
164 // ============================================================================
166 // ============================================================================
168 IMPLEMENT_WIDGETS_PAGE(SpinBtnWidgetsPage
, _T("Spin"));
170 SpinBtnWidgetsPage::SpinBtnWidgetsPage(wxBookCtrl
*book
,
171 wxImageList
*imaglist
)
181 imaglist
->Add(wxBitmap(spinbtn_xpm
));
188 m_chkWrap
= (wxCheckBox
*)NULL
;
190 m_spinbtn
= (wxSpinButton
*)NULL
;
191 m_sizerSpin
= (wxSizer
*)NULL
;
193 wxSizer
*sizerTop
= new wxBoxSizer(wxHORIZONTAL
);
196 wxStaticBox
*box
= new wxStaticBox(this, wxID_ANY
, _T("&Set style"));
197 wxSizer
*sizerLeft
= new wxStaticBoxSizer(box
, wxVERTICAL
);
199 m_chkVert
= CreateCheckBoxAndAddToSizer(sizerLeft
, _T("&Vertical"));
200 m_chkWrap
= CreateCheckBoxAndAddToSizer(sizerLeft
, _T("&Wrap"));
202 sizerLeft
->Add(5, 5, 0, wxGROW
| wxALL
, 5); // spacer
204 wxButton
*btn
= new wxButton(this, SpinBtnPage_Reset
, _T("&Reset"));
205 sizerLeft
->Add(btn
, 0, wxALIGN_CENTRE_HORIZONTAL
| wxALL
, 15);
208 wxStaticBox
*box2
= new wxStaticBox(this, wxID_ANY
,
209 _T("&Change spinbtn value"));
211 wxSizer
*sizerMiddle
= new wxStaticBoxSizer(box2
, wxVERTICAL
);
214 wxSizer
*sizerRow
= CreateSizerWithTextAndLabel(_T("Current value"),
215 SpinBtnPage_CurValueText
,
217 text
->SetEditable(false);
219 sizerMiddle
->Add(sizerRow
, 0, wxALL
| wxGROW
, 5);
221 sizerRow
= CreateSizerWithTextAndButton(SpinBtnPage_SetValue
,
223 SpinBtnPage_ValueText
,
225 sizerMiddle
->Add(sizerRow
, 0, wxALL
| wxGROW
, 5);
227 sizerRow
= CreateSizerWithTextAndButton(SpinBtnPage_SetMinAndMax
,
232 m_textMax
= new wxTextCtrl(this, SpinBtnPage_MaxText
, wxEmptyString
);
233 sizerRow
->Add(m_textMax
, 1, wxLEFT
| wxALIGN_CENTRE_VERTICAL
, 5);
235 m_textMin
->SetValue( wxString::Format(_T("%d"), m_min
) );
236 m_textMax
->SetValue( wxString::Format(_T("%d"), m_max
) );
238 sizerMiddle
->Add(sizerRow
, 0, wxALL
| wxGROW
, 5);
241 wxSizer
*sizerRight
= new wxBoxSizer(wxVERTICAL
);
242 sizerRight
->SetMinSize(150, 0);
243 m_sizerSpin
= sizerRight
; // save it to modify it later
248 // the 3 panes panes compose the window
249 sizerTop
->Add(sizerLeft
, 0, wxGROW
| (wxALL
& ~wxLEFT
), 10);
250 sizerTop
->Add(sizerMiddle
, 0, wxGROW
| wxALL
, 10);
251 sizerTop
->Add(sizerRight
, 1, wxGROW
| (wxALL
& ~wxRIGHT
), 10);
253 // final initializations
259 // ----------------------------------------------------------------------------
261 // ----------------------------------------------------------------------------
263 void SpinBtnWidgetsPage::Reset()
265 m_chkVert
->SetValue(true);
266 m_chkWrap
->SetValue(false);
269 void SpinBtnWidgetsPage::CreateSpin()
273 bool isVert
= m_chkVert
->GetValue();
275 flags
|= wxSP_VERTICAL
;
277 flags
|= wxSP_HORIZONTAL
;
279 if ( m_chkWrap
->GetValue() )
285 int valOld
= m_spinbtn
->GetValue();
286 if ( !IsValidValue(valOld
) )
291 m_sizerSpin
->Detach( m_spinbtn
);
292 m_sizerSpin
->Detach( m_spinctrl
);
294 // there are 3 spacers left
295 m_sizerSpin
->Remove( 0 );
296 m_sizerSpin
->Remove( 0 );
297 m_sizerSpin
->Remove( 0 );
303 m_spinbtn
= new wxSpinButton(this, SpinBtnPage_SpinBtn
,
304 wxDefaultPosition
, wxDefaultSize
,
307 m_spinbtn
->SetValue(val
);
308 m_spinbtn
->SetRange(m_min
, m_max
);
310 m_spinctrl
= new wxSpinCtrl(this, SpinBtnPage_SpinCtrl
,
311 wxString::Format(_T("%d"), val
),
312 wxDefaultPosition
, wxDefaultSize
,
316 m_sizerSpin
->Add(0, 0, 1);
317 m_sizerSpin
->Add(m_spinbtn
, 0, wxALIGN_CENTRE
| wxALL
, 5);
318 m_sizerSpin
->Add(0, 0, 1);
319 m_sizerSpin
->Add(m_spinctrl
, 0, wxALIGN_CENTRE
| wxALL
, 5);
320 m_sizerSpin
->Add(0, 0, 1);
322 m_sizerSpin
->Layout();
325 // ----------------------------------------------------------------------------
327 // ----------------------------------------------------------------------------
329 void SpinBtnWidgetsPage::OnButtonReset(wxCommandEvent
& WXUNUSED(event
))
336 void SpinBtnWidgetsPage::OnButtonSetMinAndMax(wxCommandEvent
& WXUNUSED(event
))
339 maxNew
= 0; // init to suppress compiler warning
340 if ( !m_textMin
->GetValue().ToLong(&minNew
) ||
341 !m_textMax
->GetValue().ToLong(&maxNew
) ||
344 wxLogWarning(_T("Invalid min/max values for the spinbtn."));
352 m_spinbtn
->SetRange(minNew
, maxNew
);
353 m_spinctrl
->SetRange(minNew
, maxNew
);
356 void SpinBtnWidgetsPage::OnButtonSetValue(wxCommandEvent
& WXUNUSED(event
))
359 if ( !m_textValue
->GetValue().ToLong(&val
) || !IsValidValue(val
) )
361 wxLogWarning(_T("Invalid spinbtn value."));
366 m_spinbtn
->SetValue(val
);
367 m_spinctrl
->SetValue(val
);
370 void SpinBtnWidgetsPage::OnUpdateUIValueButton(wxUpdateUIEvent
& event
)
373 event
.Enable( m_textValue
->GetValue().ToLong(&val
) && IsValidValue(val
) );
376 void SpinBtnWidgetsPage::OnUpdateUIMinMaxButton(wxUpdateUIEvent
& event
)
379 event
.Enable( m_textMin
->GetValue().ToLong(&mn
) &&
380 m_textMax
->GetValue().ToLong(&mx
) &&
384 void SpinBtnWidgetsPage::OnUpdateUIResetButton(wxUpdateUIEvent
& event
)
386 event
.Enable( !m_chkVert
->GetValue() || m_chkWrap
->GetValue() );
389 void SpinBtnWidgetsPage::OnCheckOrRadioBox(wxCommandEvent
& WXUNUSED(event
))
394 void SpinBtnWidgetsPage::OnUpdateUICurValueText(wxUpdateUIEvent
& event
)
396 event
.SetText( wxString::Format(_T("%d"), m_spinbtn
->GetValue()));
399 void SpinBtnWidgetsPage::OnSpinBtn(wxSpinEvent
& event
)
401 int value
= event
.GetInt();
403 wxASSERT_MSG( value
== m_spinbtn
->GetValue(),
404 _T("spinbtn value should be the same") );
406 wxLogMessage(_T("Spin button value changed, now %d"), value
);
409 void SpinBtnWidgetsPage::OnSpinBtnUp(wxSpinEvent
& event
)
411 wxLogMessage( _T("Spin button value incremented, will be %ld (was %d)"),
412 event
.GetInt(), m_spinbtn
->GetValue() );
415 void SpinBtnWidgetsPage::OnSpinBtnDown(wxSpinEvent
& event
)
417 wxLogMessage( _T("Spin button value decremented, will be %ld (was %d)"),
418 event
.GetInt(), m_spinbtn
->GetValue() );
421 void SpinBtnWidgetsPage::OnSpinCtrl(wxSpinEvent
& event
)
425 int value
= event
.GetInt();
427 wxASSERT_MSG( value
== m_spinctrl
->GetValue(),
428 _T("spinctrl value should be the same") );
430 wxLogMessage(_T("Spin control value changed, now %d"), value
);