X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/32b8ec418aee4e38877d4cb79e2984c766dcc358..02fd8b9b6186623ed61019ac7e69ed9a4ef16773:/samples/widgets/spinbtn.cpp diff --git a/samples/widgets/spinbtn.cpp b/samples/widgets/spinbtn.cpp index 99862dfd6b..8f89806646 100644 --- a/samples/widgets/spinbtn.cpp +++ b/samples/widgets/spinbtn.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Program: wxWindows Widgets Sample +// Program: wxWidgets Widgets Sample // Name: spinbtn.cpp // Purpose: Part of the widgets sample showing wxSpinButton // Author: Vadim Zeitlin @@ -24,10 +24,13 @@ #pragma hdrstop #endif +#if wxUSE_SPINBTN + // for all others, include the necessary headers #ifndef WX_PRECOMP #include "wx/log.h" + #include "wx/bitmap.h" #include "wx/button.h" #include "wx/checkbox.h" #include "wx/radiobox.h" @@ -39,7 +42,7 @@ #include "wx/spinctrl.h" #include "wx/sizer.h" - +#include "wx/stattext.h" #include "widgets.h" #include "icons/spinbtn.xpm" @@ -51,7 +54,7 @@ // control ids enum { - SpinBtnPage_Reset = 100, + SpinBtnPage_Reset = wxID_HIGHEST, SpinBtnPage_Clear, SpinBtnPage_SetValue, SpinBtnPage_SetMinAndMax, @@ -60,7 +63,8 @@ enum SpinBtnPage_MinText, SpinBtnPage_MaxText, SpinBtnPage_SpinBtn, - SpinBtnPage_SpinCtrl + SpinBtnPage_SpinCtrl, + SpinBtnPage_SpinCtrlDouble }; // ---------------------------------------------------------------------------- @@ -70,8 +74,16 @@ enum class SpinBtnWidgetsPage : public WidgetsPage { public: - SpinBtnWidgetsPage(wxNotebook *notebook, wxImageList *imaglist); - virtual ~SpinBtnWidgetsPage(); + SpinBtnWidgetsPage(WidgetsBookCtrl *book, wxImageList *imaglist); + virtual ~SpinBtnWidgetsPage(){}; + + virtual wxControl *GetWidget() const { return m_spinbtn; } + virtual wxControl *GetWidget2() const { return m_spinctrl; } + virtual wxControl *GetWidget3() const { return m_spinctrldbl; } + virtual void RecreateWidget() { CreateSpin(); } + + // lazy creation of the content + virtual void CreateContent(); protected: // event handlers @@ -82,10 +94,13 @@ protected: void OnCheckOrRadioBox(wxCommandEvent& event); - void OnSpinBtn(wxCommandEvent& event); - void OnSpinBtnUp(wxCommandEvent& event); - void OnSpinBtnDown(wxCommandEvent& event); - void OnSpinCtrl(wxCommandEvent& event); + void OnSpinBtn(wxSpinEvent& event); + void OnSpinBtnUp(wxSpinEvent& event); + void OnSpinBtnDown(wxSpinEvent& event); + void OnSpinCtrl(wxSpinEvent& event); + void OnSpinCtrlDouble(wxSpinDoubleEvent& event); + void OnSpinText(wxCommandEvent& event); + void OnSpinTextEnter(wxCommandEvent& event); void OnUpdateUIValueButton(wxUpdateUIEvent& event); void OnUpdateUIMinMaxButton(wxUpdateUIEvent& event); @@ -112,11 +127,13 @@ protected: // the check/radio boxes for styles wxCheckBox *m_chkVert, - *m_chkWrap; + *m_chkWrap, + *m_chkProcessEnter; // the spinbtn and the spinctrl and the sizer containing them wxSpinButton *m_spinbtn; wxSpinCtrl *m_spinctrl; + wxSpinCtrlDouble *m_spinctrldbl; wxSizer *m_sizerSpin; @@ -126,8 +143,8 @@ protected: *m_textMax; private: - DECLARE_EVENT_TABLE(); - DECLARE_WIDGETS_PAGE(SpinBtnWidgetsPage); + DECLARE_EVENT_TABLE() + DECLARE_WIDGETS_PAGE(SpinBtnWidgetsPage) }; // ---------------------------------------------------------------------------- @@ -150,41 +167,61 @@ BEGIN_EVENT_TABLE(SpinBtnWidgetsPage, WidgetsPage) EVT_SPIN_UP(SpinBtnPage_SpinBtn, SpinBtnWidgetsPage::OnSpinBtnUp) EVT_SPIN_DOWN(SpinBtnPage_SpinBtn, SpinBtnWidgetsPage::OnSpinBtnDown) EVT_SPINCTRL(SpinBtnPage_SpinCtrl, SpinBtnWidgetsPage::OnSpinCtrl) + EVT_SPINCTRLDOUBLE(SpinBtnPage_SpinCtrlDouble, SpinBtnWidgetsPage::OnSpinCtrlDouble) + EVT_TEXT(SpinBtnPage_SpinCtrl, SpinBtnWidgetsPage::OnSpinText) + EVT_TEXT_ENTER(SpinBtnPage_SpinCtrl, SpinBtnWidgetsPage::OnSpinTextEnter) + EVT_TEXT(SpinBtnPage_SpinCtrlDouble, SpinBtnWidgetsPage::OnSpinText) - EVT_CHECKBOX(-1, SpinBtnWidgetsPage::OnCheckOrRadioBox) - EVT_RADIOBOX(-1, SpinBtnWidgetsPage::OnCheckOrRadioBox) + EVT_CHECKBOX(wxID_ANY, SpinBtnWidgetsPage::OnCheckOrRadioBox) + EVT_RADIOBOX(wxID_ANY, SpinBtnWidgetsPage::OnCheckOrRadioBox) END_EVENT_TABLE() // ============================================================================ // implementation // ============================================================================ -IMPLEMENT_WIDGETS_PAGE(SpinBtnWidgetsPage, _T("Spin")); +#if defined(__WXUNIVERSAL__) + #define FAMILY_CTRLS UNIVERSAL_CTRLS +#else + #define FAMILY_CTRLS NATIVE_CTRLS +#endif + +IMPLEMENT_WIDGETS_PAGE(SpinBtnWidgetsPage, _T("Spin"), + FAMILY_CTRLS | EDITABLE_CTRLS + ); -SpinBtnWidgetsPage::SpinBtnWidgetsPage(wxNotebook *notebook, +SpinBtnWidgetsPage::SpinBtnWidgetsPage(WidgetsBookCtrl *book, wxImageList *imaglist) - : WidgetsPage(notebook) + : WidgetsPage(book, imaglist, spinbtn_xpm) { - imaglist->Add(wxBitmap(spinbtn_xpm)); + m_chkVert = NULL; + m_chkWrap = NULL; + m_chkProcessEnter = NULL; + m_spinbtn = NULL; + m_spinctrl = NULL; + m_spinctrldbl = NULL; + m_textValue = NULL; + m_textMin = NULL; + m_textMax = NULL; - // init everything m_min = 0; m_max = 10; - m_chkVert = - m_chkWrap = (wxCheckBox *)NULL; - - m_spinbtn = (wxSpinButton *)NULL; - m_sizerSpin = (wxSizer *)NULL; + m_sizerSpin = NULL; +} +void SpinBtnWidgetsPage::CreateContent() +{ wxSizer *sizerTop = new wxBoxSizer(wxHORIZONTAL); // left pane - wxStaticBox *box = new wxStaticBox(this, -1, _T("&Set style")); + wxStaticBox *box = new wxStaticBox(this, wxID_ANY, _T("&Set style")); wxSizer *sizerLeft = new wxStaticBoxSizer(box, wxVERTICAL); m_chkVert = CreateCheckBoxAndAddToSizer(sizerLeft, _T("&Vertical")); m_chkWrap = CreateCheckBoxAndAddToSizer(sizerLeft, _T("&Wrap")); + m_chkProcessEnter = CreateCheckBoxAndAddToSizer(sizerLeft, + _T("Process &Enter")); sizerLeft->Add(5, 5, 0, wxGROW | wxALL, 5); // spacer @@ -192,14 +229,16 @@ SpinBtnWidgetsPage::SpinBtnWidgetsPage(wxNotebook *notebook, sizerLeft->Add(btn, 0, wxALIGN_CENTRE_HORIZONTAL | wxALL, 15); // middle pane - wxStaticBox *box2 = new wxStaticBox(this, -1, _T("&Change spinbtn value")); + wxStaticBox *box2 = new wxStaticBox(this, wxID_ANY, + _T("&Change spinbtn value")); + wxSizer *sizerMiddle = new wxStaticBoxSizer(box2, wxVERTICAL); wxTextCtrl *text; wxSizer *sizerRow = CreateSizerWithTextAndLabel(_T("Current value"), SpinBtnPage_CurValueText, &text); - text->SetEditable(FALSE); + text->SetEditable(false); sizerMiddle->Add(sizerRow, 0, wxALL | wxGROW, 5); @@ -214,17 +253,17 @@ SpinBtnWidgetsPage::SpinBtnWidgetsPage(wxNotebook *notebook, SpinBtnPage_MinText, &m_textMin); - m_textMax = new wxTextCtrl(this, SpinBtnPage_MaxText, _T("")); + m_textMax = new wxTextCtrl(this, SpinBtnPage_MaxText, wxEmptyString); sizerRow->Add(m_textMax, 1, wxLEFT | wxALIGN_CENTRE_VERTICAL, 5); - m_textMin->SetValue(wxString::Format(_T("%lu"), m_min)); - m_textMax->SetValue(wxString::Format(_T("%lu"), m_max)); + m_textMin->SetValue( wxString::Format(_T("%d"), m_min) ); + m_textMax->SetValue( wxString::Format(_T("%d"), m_max) ); sizerMiddle->Add(sizerRow, 0, wxALL | wxGROW, 5); // right pane wxSizer *sizerRight = new wxBoxSizer(wxVERTICAL); - sizerRight->SetMinSize(250, 0); + sizerRight->SetMinSize(150, 0); m_sizerSpin = sizerRight; // save it to modify it later Reset(); @@ -232,18 +271,11 @@ SpinBtnWidgetsPage::SpinBtnWidgetsPage(wxNotebook *notebook, // the 3 panes panes compose the window sizerTop->Add(sizerLeft, 0, wxGROW | (wxALL & ~wxLEFT), 10); - sizerTop->Add(sizerMiddle, 1, wxGROW | wxALL, 10); + sizerTop->Add(sizerMiddle, 0, wxGROW | wxALL, 10); sizerTop->Add(sizerRight, 1, wxGROW | (wxALL & ~wxRIGHT), 10); // final initializations - SetAutoLayout(TRUE); SetSizer(sizerTop); - - sizerTop->Fit(this); -} - -SpinBtnWidgetsPage::~SpinBtnWidgetsPage() -{ } // ---------------------------------------------------------------------------- @@ -252,13 +284,14 @@ SpinBtnWidgetsPage::~SpinBtnWidgetsPage() void SpinBtnWidgetsPage::Reset() { - m_chkVert->SetValue(TRUE); - m_chkWrap->SetValue(FALSE); + m_chkVert->SetValue(true); + m_chkWrap->SetValue(false); + m_chkProcessEnter->SetValue(false); } void SpinBtnWidgetsPage::CreateSpin() { - int flags = 0; + int flags = ms_defaultFlags; bool isVert = m_chkVert->GetValue(); if ( isVert ) @@ -269,6 +302,9 @@ void SpinBtnWidgetsPage::CreateSpin() if ( m_chkWrap->GetValue() ) flags |= wxSP_WRAP; + if ( m_chkProcessEnter->GetValue() ) + flags |= wxTE_PROCESS_ENTER; + int val = m_min; if ( m_spinbtn ) { @@ -278,16 +314,7 @@ void SpinBtnWidgetsPage::CreateSpin() val = valOld; } - m_sizerSpin->Remove(m_spinbtn); - m_sizerSpin->Remove(m_spinctrl); - - // there are 3 spacers left - m_sizerSpin->Remove((int)0); - m_sizerSpin->Remove((int)0); - m_sizerSpin->Remove((int)0); - - delete m_spinbtn; - delete m_spinctrl; + m_sizerSpin->Clear(true /* delete windows */); } m_spinbtn = new wxSpinButton(this, SpinBtnPage_SpinBtn, @@ -303,11 +330,26 @@ void SpinBtnWidgetsPage::CreateSpin() flags, m_min, m_max, val); + m_spinctrldbl = new wxSpinCtrlDouble(this, SpinBtnPage_SpinCtrlDouble, + wxString::Format(_T("%d"), val), + wxDefaultPosition, wxDefaultSize, + flags, + m_min, m_max, val, 0.1); + + // Add spacers, labels and spin controls to the sizer. m_sizerSpin->Add(0, 0, 1); + m_sizerSpin->Add(new wxStaticText(this, wxID_ANY, wxT("wxSpinButton")), + 0, wxALIGN_CENTRE | wxALL, 5); m_sizerSpin->Add(m_spinbtn, 0, wxALIGN_CENTRE | wxALL, 5); m_sizerSpin->Add(0, 0, 1); + m_sizerSpin->Add(new wxStaticText(this, wxID_ANY, wxT("wxSpinCtrl")), + 0, wxALIGN_CENTRE | wxALL, 5); m_sizerSpin->Add(m_spinctrl, 0, wxALIGN_CENTRE | wxALL, 5); m_sizerSpin->Add(0, 0, 1); + m_sizerSpin->Add(new wxStaticText(this, wxID_ANY, wxT("wxSpinCtrlDouble")), + 0, wxALIGN_CENTRE | wxALL, 5); + m_sizerSpin->Add(m_spinctrldbl, 0, wxALIGN_CENTRE | wxALL, 5); + m_sizerSpin->Add(0, 0, 1); m_sizerSpin->Layout(); } @@ -329,7 +371,7 @@ void SpinBtnWidgetsPage::OnButtonSetMinAndMax(wxCommandEvent& WXUNUSED(event)) maxNew = 0; // init to suppress compiler warning if ( !m_textMin->GetValue().ToLong(&minNew) || !m_textMax->GetValue().ToLong(&maxNew) || - minNew >= maxNew ) + minNew > maxNew ) { wxLogWarning(_T("Invalid min/max values for the spinbtn.")); @@ -341,6 +383,7 @@ void SpinBtnWidgetsPage::OnButtonSetMinAndMax(wxCommandEvent& WXUNUSED(event)) m_spinbtn->SetRange(minNew, maxNew); m_spinctrl->SetRange(minNew, maxNew); + m_spinctrldbl->SetRange(minNew, maxNew); } void SpinBtnWidgetsPage::OnButtonSetValue(wxCommandEvent& WXUNUSED(event)) @@ -355,6 +398,7 @@ void SpinBtnWidgetsPage::OnButtonSetValue(wxCommandEvent& WXUNUSED(event)) m_spinbtn->SetValue(val); m_spinctrl->SetValue(val); + m_spinctrldbl->SetValue(val); } void SpinBtnWidgetsPage::OnUpdateUIValueButton(wxUpdateUIEvent& event) @@ -368,15 +412,17 @@ void SpinBtnWidgetsPage::OnUpdateUIMinMaxButton(wxUpdateUIEvent& event) long mn, mx; event.Enable( m_textMin->GetValue().ToLong(&mn) && m_textMax->GetValue().ToLong(&mx) && - mn < mx); + mn <= mx); } void SpinBtnWidgetsPage::OnUpdateUIResetButton(wxUpdateUIEvent& event) { - event.Enable( !m_chkVert->GetValue() || m_chkWrap->GetValue() ); + event.Enable( !m_chkVert->GetValue() || + m_chkWrap->GetValue() || + m_chkProcessEnter->GetValue() ); } -void SpinBtnWidgetsPage::OnCheckOrRadioBox(wxCommandEvent& event) +void SpinBtnWidgetsPage::OnCheckOrRadioBox(wxCommandEvent& WXUNUSED(event)) { CreateSpin(); } @@ -386,7 +432,7 @@ void SpinBtnWidgetsPage::OnUpdateUICurValueText(wxUpdateUIEvent& event) event.SetText( wxString::Format(_T("%d"), m_spinbtn->GetValue())); } -void SpinBtnWidgetsPage::OnSpinBtn(wxCommandEvent& event) +void SpinBtnWidgetsPage::OnSpinBtn(wxSpinEvent& event) { int value = event.GetInt(); @@ -396,19 +442,19 @@ void SpinBtnWidgetsPage::OnSpinBtn(wxCommandEvent& event) wxLogMessage(_T("Spin button value changed, now %d"), value); } -void SpinBtnWidgetsPage::OnSpinBtnUp(wxCommandEvent& event) +void SpinBtnWidgetsPage::OnSpinBtnUp(wxSpinEvent& event) { - wxLogMessage(_T("Spin button value incremented, will be %d (was %d)"), - event.GetInt(), m_spinbtn->GetValue()); + wxLogMessage( _T("Spin button value incremented, will be %d (was %d)"), + event.GetInt(), m_spinbtn->GetValue() ); } -void SpinBtnWidgetsPage::OnSpinBtnDown(wxCommandEvent& event) +void SpinBtnWidgetsPage::OnSpinBtnDown(wxSpinEvent& event) { - wxLogMessage(_T("Spin button value decremented, will be %d (was %d)"), - event.GetInt(), m_spinbtn->GetValue()); + wxLogMessage( _T("Spin button value decremented, will be %d (was %d)"), + event.GetInt(), m_spinbtn->GetValue() ); } -void SpinBtnWidgetsPage::OnSpinCtrl(wxCommandEvent& event) +void SpinBtnWidgetsPage::OnSpinCtrl(wxSpinEvent& event) { int value = event.GetInt(); @@ -417,3 +463,24 @@ void SpinBtnWidgetsPage::OnSpinCtrl(wxCommandEvent& event) wxLogMessage(_T("Spin control value changed, now %d"), value); } + +void SpinBtnWidgetsPage::OnSpinCtrlDouble(wxSpinDoubleEvent& event) +{ + double value = event.GetValue(); + + wxLogMessage(_T("Spin control value changed, now %g"), value); +} + +void SpinBtnWidgetsPage::OnSpinText(wxCommandEvent& event) +{ + wxLogMessage(_T("Text changed in spin control, now \"%s\""), + event.GetString().c_str()); +} + +void SpinBtnWidgetsPage::OnSpinTextEnter(wxCommandEvent& event) +{ + wxLogMessage("\"Enter\" pressed in spin control, text is \"%s\"", + event.GetString()); +} + +#endif // wxUSE_SPINBTN