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"
45 #include "wx/stattext.h"
48 #include "icons/spinbtn.xpm"
50 // ----------------------------------------------------------------------------
52 // ----------------------------------------------------------------------------
57 SpinBtnPage_Reset
= wxID_HIGHEST
,
60 SpinBtnPage_SetMinAndMax
,
61 SpinBtnPage_CurValueText
,
62 SpinBtnPage_ValueText
,
67 SpinBtnPage_SpinCtrlDouble
70 // ----------------------------------------------------------------------------
72 // ----------------------------------------------------------------------------
74 class SpinBtnWidgetsPage
: public WidgetsPage
77 SpinBtnWidgetsPage(WidgetsBookCtrl
*book
, wxImageList
*imaglist
);
78 virtual ~SpinBtnWidgetsPage(){};
80 virtual wxControl
*GetWidget() const { return m_spinbtn
; }
81 virtual wxControl
*GetWidget2() const { return m_spinctrl
; }
82 virtual wxControl
*GetWidget3() const { return m_spinctrldbl
; }
83 virtual void RecreateWidget() { CreateSpin(); }
85 // lazy creation of the content
86 virtual void CreateContent();
90 void OnButtonReset(wxCommandEvent
& event
);
91 void OnButtonClear(wxCommandEvent
& event
);
92 void OnButtonSetValue(wxCommandEvent
& event
);
93 void OnButtonSetMinAndMax(wxCommandEvent
& event
);
95 void OnCheckOrRadioBox(wxCommandEvent
& event
);
97 void OnSpinBtn(wxSpinEvent
& event
);
98 void OnSpinBtnUp(wxSpinEvent
& event
);
99 void OnSpinBtnDown(wxSpinEvent
& event
);
100 void OnSpinCtrl(wxSpinEvent
& event
);
101 void OnSpinCtrlDouble(wxSpinDoubleEvent
& event
);
102 void OnSpinText(wxCommandEvent
& event
);
103 void OnSpinTextEnter(wxCommandEvent
& event
);
105 void OnUpdateUIValueButton(wxUpdateUIEvent
& event
);
106 void OnUpdateUIMinMaxButton(wxUpdateUIEvent
& event
);
108 void OnUpdateUIResetButton(wxUpdateUIEvent
& event
);
110 void OnUpdateUICurValueText(wxUpdateUIEvent
& event
);
112 // reset the spinbtn parameters
115 // (re)create the spinbtn
118 // is this spinbtn value in range?
119 bool IsValidValue(int val
) const
120 { return (val
>= m_min
) && (val
<= m_max
); }
128 // the check/radio boxes for styles
129 wxCheckBox
*m_chkVert
,
133 // the spinbtn and the spinctrl and the sizer containing them
134 wxSpinButton
*m_spinbtn
;
135 wxSpinCtrl
*m_spinctrl
;
136 wxSpinCtrlDouble
*m_spinctrldbl
;
138 wxSizer
*m_sizerSpin
;
140 // the text entries for set value/range
141 wxTextCtrl
*m_textValue
,
146 DECLARE_EVENT_TABLE()
147 DECLARE_WIDGETS_PAGE(SpinBtnWidgetsPage
)
150 // ----------------------------------------------------------------------------
152 // ----------------------------------------------------------------------------
154 BEGIN_EVENT_TABLE(SpinBtnWidgetsPage
, WidgetsPage
)
155 EVT_BUTTON(SpinBtnPage_Reset
, SpinBtnWidgetsPage
::OnButtonReset
)
156 EVT_BUTTON(SpinBtnPage_SetValue
, SpinBtnWidgetsPage
::OnButtonSetValue
)
157 EVT_BUTTON(SpinBtnPage_SetMinAndMax
, SpinBtnWidgetsPage
::OnButtonSetMinAndMax
)
159 EVT_UPDATE_UI(SpinBtnPage_SetValue
, SpinBtnWidgetsPage
::OnUpdateUIValueButton
)
160 EVT_UPDATE_UI(SpinBtnPage_SetMinAndMax
, SpinBtnWidgetsPage
::OnUpdateUIMinMaxButton
)
162 EVT_UPDATE_UI(SpinBtnPage_Reset
, SpinBtnWidgetsPage
::OnUpdateUIResetButton
)
164 EVT_UPDATE_UI(SpinBtnPage_CurValueText
, SpinBtnWidgetsPage
::OnUpdateUICurValueText
)
166 EVT_SPIN(SpinBtnPage_SpinBtn
, SpinBtnWidgetsPage
::OnSpinBtn
)
167 EVT_SPIN_UP(SpinBtnPage_SpinBtn
, SpinBtnWidgetsPage
::OnSpinBtnUp
)
168 EVT_SPIN_DOWN(SpinBtnPage_SpinBtn
, SpinBtnWidgetsPage
::OnSpinBtnDown
)
169 EVT_SPINCTRL(SpinBtnPage_SpinCtrl
, SpinBtnWidgetsPage
::OnSpinCtrl
)
170 EVT_SPINCTRLDOUBLE(SpinBtnPage_SpinCtrlDouble
, SpinBtnWidgetsPage
::OnSpinCtrlDouble
)
171 EVT_TEXT(SpinBtnPage_SpinCtrl
, SpinBtnWidgetsPage
::OnSpinText
)
172 EVT_TEXT_ENTER(SpinBtnPage_SpinCtrl
, SpinBtnWidgetsPage
::OnSpinTextEnter
)
173 EVT_TEXT(SpinBtnPage_SpinCtrlDouble
, SpinBtnWidgetsPage
::OnSpinText
)
175 EVT_CHECKBOX(wxID_ANY
, SpinBtnWidgetsPage
::OnCheckOrRadioBox
)
176 EVT_RADIOBOX(wxID_ANY
, SpinBtnWidgetsPage
::OnCheckOrRadioBox
)
179 // ============================================================================
181 // ============================================================================
183 #if defined(__WXUNIVERSAL__)
184 #define FAMILY_CTRLS UNIVERSAL_CTRLS
186 #define FAMILY_CTRLS NATIVE_CTRLS
189 IMPLEMENT_WIDGETS_PAGE(SpinBtnWidgetsPage
, _T("Spin"),
190 FAMILY_CTRLS
| EDITABLE_CTRLS
193 SpinBtnWidgetsPage
::SpinBtnWidgetsPage(WidgetsBookCtrl
*book
,
194 wxImageList
*imaglist
)
195 : WidgetsPage(book
, imaglist
, spinbtn_xpm
)
199 m_chkProcessEnter
= NULL
;
202 m_spinctrldbl
= NULL
;
213 void SpinBtnWidgetsPage
::CreateContent()
215 wxSizer
*sizerTop
= new wxBoxSizer(wxHORIZONTAL
);
218 wxStaticBox
*box
= new wxStaticBox(this, wxID_ANY
, _T("&Set style"));
219 wxSizer
*sizerLeft
= new wxStaticBoxSizer(box
, wxVERTICAL
);
221 m_chkVert
= CreateCheckBoxAndAddToSizer(sizerLeft
, _T("&Vertical"));
222 m_chkWrap
= CreateCheckBoxAndAddToSizer(sizerLeft
, _T("&Wrap"));
223 m_chkProcessEnter
= CreateCheckBoxAndAddToSizer(sizerLeft
,
224 _T("Process &Enter"));
226 sizerLeft
->Add(5, 5, 0, wxGROW
| wxALL
, 5); // spacer
228 wxButton
*btn
= new wxButton(this, SpinBtnPage_Reset
, _T("&Reset"));
229 sizerLeft
->Add(btn
, 0, wxALIGN_CENTRE_HORIZONTAL
| wxALL
, 15);
232 wxStaticBox
*box2
= new wxStaticBox(this, wxID_ANY
,
233 _T("&Change spinbtn value"));
235 wxSizer
*sizerMiddle
= new wxStaticBoxSizer(box2
, wxVERTICAL
);
238 wxSizer
*sizerRow
= CreateSizerWithTextAndLabel(_T("Current value"),
239 SpinBtnPage_CurValueText
,
241 text
->SetEditable(false);
243 sizerMiddle
->Add(sizerRow
, 0, wxALL
| wxGROW
, 5);
245 sizerRow
= CreateSizerWithTextAndButton(SpinBtnPage_SetValue
,
247 SpinBtnPage_ValueText
,
249 sizerMiddle
->Add(sizerRow
, 0, wxALL
| wxGROW
, 5);
251 sizerRow
= CreateSizerWithTextAndButton(SpinBtnPage_SetMinAndMax
,
256 m_textMax
= new wxTextCtrl(this, SpinBtnPage_MaxText
, wxEmptyString
);
257 sizerRow
->Add(m_textMax
, 1, wxLEFT
| wxALIGN_CENTRE_VERTICAL
, 5);
259 m_textMin
->SetValue( wxString
::Format(_T("%d"), m_min
) );
260 m_textMax
->SetValue( wxString
::Format(_T("%d"), m_max
) );
262 sizerMiddle
->Add(sizerRow
, 0, wxALL
| wxGROW
, 5);
265 wxSizer
*sizerRight
= new wxBoxSizer(wxVERTICAL
);
266 sizerRight
->SetMinSize(150, 0);
267 m_sizerSpin
= sizerRight
; // save it to modify it later
272 // the 3 panes panes compose the window
273 sizerTop
->Add(sizerLeft
, 0, wxGROW
| (wxALL
& ~wxLEFT
), 10);
274 sizerTop
->Add(sizerMiddle
, 0, wxGROW
| wxALL
, 10);
275 sizerTop
->Add(sizerRight
, 1, wxGROW
| (wxALL
& ~wxRIGHT
), 10);
277 // final initializations
281 // ----------------------------------------------------------------------------
283 // ----------------------------------------------------------------------------
285 void SpinBtnWidgetsPage
::Reset()
287 m_chkVert
->SetValue(true);
288 m_chkWrap
->SetValue(false);
289 m_chkProcessEnter
->SetValue(false);
292 void SpinBtnWidgetsPage
::CreateSpin()
294 int flags
= ms_defaultFlags
;
296 bool isVert
= m_chkVert
->GetValue();
298 flags
|= wxSP_VERTICAL
;
300 flags
|= wxSP_HORIZONTAL
;
302 if ( m_chkWrap
->GetValue() )
305 if ( m_chkProcessEnter
->GetValue() )
306 flags
|= wxTE_PROCESS_ENTER
;
311 int valOld
= m_spinbtn
->GetValue();
312 if ( !IsValidValue(valOld
) )
317 m_sizerSpin
->Detach( m_spinbtn
);
318 m_sizerSpin
->Detach( m_spinctrl
);
319 m_sizerSpin
->Detach( m_spinctrldbl
);
321 // there are 4 spacers left
322 m_sizerSpin
->Remove( 0 );
323 m_sizerSpin
->Remove( 0 );
324 m_sizerSpin
->Remove( 0 );
325 m_sizerSpin
->Remove( 0 );
329 delete m_spinctrldbl
;
332 m_spinbtn
= new wxSpinButton(this, SpinBtnPage_SpinBtn
,
333 wxDefaultPosition
, wxDefaultSize
,
336 m_spinbtn
->SetValue(val
);
337 m_spinbtn
->SetRange(m_min
, m_max
);
339 m_spinctrl
= new wxSpinCtrl(this, SpinBtnPage_SpinCtrl
,
340 wxString
::Format(_T("%d"), val
),
341 wxDefaultPosition
, wxDefaultSize
,
345 m_spinctrldbl
= new wxSpinCtrlDouble(this, SpinBtnPage_SpinCtrlDouble
,
346 wxString
::Format(_T("%d"), val
),
347 wxDefaultPosition
, wxDefaultSize
,
349 m_min
, m_max
, val
, 0.1);
351 // Add spacers, labels and spin controls to the sizer.
352 m_sizerSpin
->Add(0, 0, 1);
353 m_sizerSpin
->Add(new wxStaticText(this, wxID_ANY
, wxT("wxSpinButton")),
354 0, wxALIGN_CENTRE
| wxALL
, 5);
355 m_sizerSpin
->Add(m_spinbtn
, 0, wxALIGN_CENTRE
| wxALL
, 5);
356 m_sizerSpin
->Add(0, 0, 1);
357 m_sizerSpin
->Add(new wxStaticText(this, wxID_ANY
, wxT("wxSpinCtrl")),
358 0, wxALIGN_CENTRE
| wxALL
, 5);
359 m_sizerSpin
->Add(m_spinctrl
, 0, wxALIGN_CENTRE
| wxALL
, 5);
360 m_sizerSpin
->Add(0, 0, 1);
361 m_sizerSpin
->Add(new wxStaticText(this, wxID_ANY
, wxT("wxSpinCtrlDouble")),
362 0, wxALIGN_CENTRE
| wxALL
, 5);
363 m_sizerSpin
->Add(m_spinctrldbl
, 0, wxALIGN_CENTRE
| wxALL
, 5);
364 m_sizerSpin
->Add(0, 0, 1);
366 m_sizerSpin
->Layout();
369 // ----------------------------------------------------------------------------
371 // ----------------------------------------------------------------------------
373 void SpinBtnWidgetsPage
::OnButtonReset(wxCommandEvent
& WXUNUSED(event
))
380 void SpinBtnWidgetsPage
::OnButtonSetMinAndMax(wxCommandEvent
& WXUNUSED(event
))
383 maxNew
= 0; // init to suppress compiler warning
384 if ( !m_textMin
->GetValue().ToLong(&minNew
) ||
385 !m_textMax
->GetValue().ToLong(&maxNew
) ||
388 wxLogWarning(_T("Invalid min/max values for the spinbtn."));
396 m_spinbtn
->SetRange(minNew
, maxNew
);
397 m_spinctrl
->SetRange(minNew
, maxNew
);
398 m_spinctrldbl
->SetRange(minNew
, maxNew
);
401 void SpinBtnWidgetsPage
::OnButtonSetValue(wxCommandEvent
& WXUNUSED(event
))
404 if ( !m_textValue
->GetValue().ToLong(&val
) || !IsValidValue(val
) )
406 wxLogWarning(_T("Invalid spinbtn value."));
411 m_spinbtn
->SetValue(val
);
412 m_spinctrl
->SetValue(val
);
413 m_spinctrldbl
->SetValue(val
);
416 void SpinBtnWidgetsPage
::OnUpdateUIValueButton(wxUpdateUIEvent
& event
)
419 event
.Enable( m_textValue
->GetValue().ToLong(&val
) && IsValidValue(val
) );
422 void SpinBtnWidgetsPage
::OnUpdateUIMinMaxButton(wxUpdateUIEvent
& event
)
425 event
.Enable( m_textMin
->GetValue().ToLong(&mn
) &&
426 m_textMax
->GetValue().ToLong(&mx
) &&
430 void SpinBtnWidgetsPage
::OnUpdateUIResetButton(wxUpdateUIEvent
& event
)
432 event
.Enable( !m_chkVert
->GetValue() ||
433 m_chkWrap
->GetValue() ||
434 m_chkProcessEnter
->GetValue() );
437 void SpinBtnWidgetsPage
::OnCheckOrRadioBox(wxCommandEvent
& WXUNUSED(event
))
442 void SpinBtnWidgetsPage
::OnUpdateUICurValueText(wxUpdateUIEvent
& event
)
444 event
.SetText( wxString
::Format(_T("%d"), m_spinbtn
->GetValue()));
447 void SpinBtnWidgetsPage
::OnSpinBtn(wxSpinEvent
& event
)
449 int value
= event
.GetInt();
451 wxASSERT_MSG( value
== m_spinbtn
->GetValue(),
452 _T("spinbtn value should be the same") );
454 wxLogMessage(_T("Spin button value changed, now %d"), value
);
457 void SpinBtnWidgetsPage
::OnSpinBtnUp(wxSpinEvent
& event
)
459 wxLogMessage( _T("Spin button value incremented, will be %d (was %d)"),
460 event
.GetInt(), m_spinbtn
->GetValue() );
463 void SpinBtnWidgetsPage
::OnSpinBtnDown(wxSpinEvent
& event
)
465 wxLogMessage( _T("Spin button value decremented, will be %d (was %d)"),
466 event
.GetInt(), m_spinbtn
->GetValue() );
469 void SpinBtnWidgetsPage
::OnSpinCtrl(wxSpinEvent
& event
)
471 int value
= event
.GetInt();
473 wxASSERT_MSG( value
== m_spinctrl
->GetValue(),
474 _T("spinctrl value should be the same") );
476 wxLogMessage(_T("Spin control value changed, now %d"), value
);
479 void SpinBtnWidgetsPage
::OnSpinCtrlDouble(wxSpinDoubleEvent
& event
)
481 double value
= event
.GetValue();
483 wxLogMessage(_T("Spin control value changed, now %g"), value
);
486 void SpinBtnWidgetsPage
::OnSpinText(wxCommandEvent
& event
)
488 wxLogMessage(_T("Text changed in spin control, now \"%s\""),
489 event
.GetString().c_str());
492 void SpinBtnWidgetsPage
::OnSpinTextEnter(wxCommandEvent
& event
)
494 wxLogMessage("\"Enter\" pressed in spin control, text is \"%s\"",
498 #endif // wxUSE_SPINBTN