X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/8cd6a9ad50c00a94e62558a3b55e814028d81100..bed99c22560c0b308e2e70af7d0e615b312dd04b:/samples/widgets/spinbtn.cpp diff --git a/samples/widgets/spinbtn.cpp b/samples/widgets/spinbtn.cpp index 0447d66d65..2c039ee279 100644 --- a/samples/widgets/spinbtn.cpp +++ b/samples/widgets/spinbtn.cpp @@ -6,7 +6,7 @@ // Created: 16.04.01 // Id: $Id$ // Copyright: (c) 2001 Vadim Zeitlin -// License: wxWindows license +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// // ============================================================================ @@ -42,7 +42,7 @@ #include "wx/spinctrl.h" #include "wx/sizer.h" - +#include "wx/stattext.h" #include "widgets.h" #include "icons/spinbtn.xpm" @@ -58,15 +58,25 @@ enum SpinBtnPage_Clear, SpinBtnPage_SetValue, SpinBtnPage_SetMinAndMax, + SpinBtnPage_SetBase, SpinBtnPage_CurValueText, SpinBtnPage_ValueText, SpinBtnPage_MinText, SpinBtnPage_MaxText, + SpinBtnPage_BaseText, SpinBtnPage_SpinBtn, SpinBtnPage_SpinCtrl, SpinBtnPage_SpinCtrlDouble }; +// alignment radiobox values +enum +{ + Align_Left, + Align_Centre, + Align_Right +}; + // ---------------------------------------------------------------------------- // SpinBtnWidgetsPage // ---------------------------------------------------------------------------- @@ -78,8 +88,14 @@ public: virtual ~SpinBtnWidgetsPage(){}; virtual wxControl *GetWidget() const { return m_spinbtn; } - virtual wxControl *GetWidget2() const { return m_spinctrl; } - virtual wxControl *GetWidget3() const { return m_spinctrldbl; } + virtual Widgets GetWidgets() const + { + Widgets widgets(WidgetsPage::GetWidgets()); + widgets.push_back(m_spinctrl); + widgets.push_back(m_spinctrldbl); + return widgets; + } + virtual void RecreateWidget() { CreateSpin(); } // lazy creation of the content @@ -91,6 +107,7 @@ protected: void OnButtonClear(wxCommandEvent& event); void OnButtonSetValue(wxCommandEvent& event); void OnButtonSetMinAndMax(wxCommandEvent& event); + void OnButtonSetBase(wxCommandEvent& event); void OnCheckOrRadioBox(wxCommandEvent& event); @@ -100,9 +117,11 @@ protected: void OnSpinCtrl(wxSpinEvent& event); void OnSpinCtrlDouble(wxSpinDoubleEvent& event); void OnSpinText(wxCommandEvent& event); + void OnSpinTextEnter(wxCommandEvent& event); void OnUpdateUIValueButton(wxUpdateUIEvent& event); void OnUpdateUIMinMaxButton(wxUpdateUIEvent& event); + void OnUpdateUIBaseButton(wxUpdateUIEvent& event); void OnUpdateUIResetButton(wxUpdateUIEvent& event); @@ -121,12 +140,18 @@ protected: // the spinbtn range int m_min, m_max; + // and numeric base + int m_base; + // the controls // ------------ // the check/radio boxes for styles wxCheckBox *m_chkVert, - *m_chkWrap; + *m_chkArrowKeys, + *m_chkWrap, + *m_chkProcessEnter; + wxRadioBox *m_radioAlign; // the spinbtn and the spinctrl and the sizer containing them wxSpinButton *m_spinbtn; @@ -138,7 +163,8 @@ protected: // the text entries for set value/range wxTextCtrl *m_textValue, *m_textMin, - *m_textMax; + *m_textMax, + *m_textBase; private: DECLARE_EVENT_TABLE() @@ -153,9 +179,11 @@ BEGIN_EVENT_TABLE(SpinBtnWidgetsPage, WidgetsPage) EVT_BUTTON(SpinBtnPage_Reset, SpinBtnWidgetsPage::OnButtonReset) EVT_BUTTON(SpinBtnPage_SetValue, SpinBtnWidgetsPage::OnButtonSetValue) EVT_BUTTON(SpinBtnPage_SetMinAndMax, SpinBtnWidgetsPage::OnButtonSetMinAndMax) + EVT_BUTTON(SpinBtnPage_SetBase, SpinBtnWidgetsPage::OnButtonSetBase) EVT_UPDATE_UI(SpinBtnPage_SetValue, SpinBtnWidgetsPage::OnUpdateUIValueButton) EVT_UPDATE_UI(SpinBtnPage_SetMinAndMax, SpinBtnWidgetsPage::OnUpdateUIMinMaxButton) + EVT_UPDATE_UI(SpinBtnPage_SetBase, SpinBtnWidgetsPage::OnUpdateUIBaseButton) EVT_UPDATE_UI(SpinBtnPage_Reset, SpinBtnWidgetsPage::OnUpdateUIResetButton) @@ -167,7 +195,9 @@ BEGIN_EVENT_TABLE(SpinBtnWidgetsPage, WidgetsPage) 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_TEXT_ENTER(SpinBtnPage_SpinCtrlDouble, SpinBtnWidgetsPage::OnSpinTextEnter) EVT_CHECKBOX(wxID_ANY, SpinBtnWidgetsPage::OnCheckOrRadioBox) EVT_RADIOBOX(wxID_ANY, SpinBtnWidgetsPage::OnCheckOrRadioBox) @@ -183,7 +213,7 @@ END_EVENT_TABLE() #define FAMILY_CTRLS NATIVE_CTRLS #endif -IMPLEMENT_WIDGETS_PAGE(SpinBtnWidgetsPage, _T("Spin"), +IMPLEMENT_WIDGETS_PAGE(SpinBtnWidgetsPage, wxT("Spin"), FAMILY_CTRLS | EDITABLE_CTRLS ); @@ -192,23 +222,24 @@ SpinBtnWidgetsPage::SpinBtnWidgetsPage(WidgetsBookCtrl *book, : WidgetsPage(book, imaglist, spinbtn_xpm) { m_chkVert = NULL; + m_chkArrowKeys = NULL; m_chkWrap = NULL; + m_chkProcessEnter = NULL; + m_radioAlign = NULL; m_spinbtn = NULL; m_spinctrl = NULL; m_spinctrldbl = NULL; - m_textValue = NULL; - m_textMin = NULL; - m_textMax = NULL; + m_textValue = + m_textMin = + m_textMax = + m_textBase = NULL; - // init everything m_min = 0; m_max = 10; - m_chkVert = - m_chkWrap = (wxCheckBox *)NULL; + m_base = 10; - m_spinbtn = (wxSpinButton *)NULL; - m_sizerSpin = (wxSizer *)NULL; + m_sizerSpin = NULL; } void SpinBtnWidgetsPage::CreateContent() @@ -216,25 +247,43 @@ void SpinBtnWidgetsPage::CreateContent() wxSizer *sizerTop = new wxBoxSizer(wxHORIZONTAL); // left pane - wxStaticBox *box = new wxStaticBox(this, wxID_ANY, _T("&Set style")); + wxStaticBox *box = new wxStaticBox(this, wxID_ANY, wxT("&Set style")); wxSizer *sizerLeft = new wxStaticBoxSizer(box, wxVERTICAL); - m_chkVert = CreateCheckBoxAndAddToSizer(sizerLeft, _T("&Vertical")); - m_chkWrap = CreateCheckBoxAndAddToSizer(sizerLeft, _T("&Wrap")); + m_chkVert = CreateCheckBoxAndAddToSizer(sizerLeft, wxT("&Vertical")); + m_chkArrowKeys = CreateCheckBoxAndAddToSizer(sizerLeft, wxT("&Arrow Keys")); + m_chkWrap = CreateCheckBoxAndAddToSizer(sizerLeft, wxT("&Wrap")); + m_chkProcessEnter = CreateCheckBoxAndAddToSizer(sizerLeft, + wxT("Process &Enter")); + + sizerLeft->Add(5, 5, 0, wxGROW | wxALL, 5); // spacer + + static const wxString halign[] = + { + wxT("left"), + wxT("centre"), + wxT("right"), + }; + + m_radioAlign = new wxRadioBox(this, wxID_ANY, wxT("&Text alignment"), + wxDefaultPosition, wxDefaultSize, + WXSIZEOF(halign), halign, 1); + + sizerLeft->Add(m_radioAlign, 0, wxGROW | wxALL, 5); sizerLeft->Add(5, 5, 0, wxGROW | wxALL, 5); // spacer - wxButton *btn = new wxButton(this, SpinBtnPage_Reset, _T("&Reset")); + wxButton *btn = new wxButton(this, SpinBtnPage_Reset, wxT("&Reset")); sizerLeft->Add(btn, 0, wxALIGN_CENTRE_HORIZONTAL | wxALL, 15); // middle pane wxStaticBox *box2 = new wxStaticBox(this, wxID_ANY, - _T("&Change spinbtn value")); + wxT("&Change spinbtn value")); wxSizer *sizerMiddle = new wxStaticBoxSizer(box2, wxVERTICAL); wxTextCtrl *text; - wxSizer *sizerRow = CreateSizerWithTextAndLabel(_T("Current value"), + wxSizer *sizerRow = CreateSizerWithTextAndLabel(wxT("Current value"), SpinBtnPage_CurValueText, &text); text->SetEditable(false); @@ -242,22 +291,29 @@ void SpinBtnWidgetsPage::CreateContent() sizerMiddle->Add(sizerRow, 0, wxALL | wxGROW, 5); sizerRow = CreateSizerWithTextAndButton(SpinBtnPage_SetValue, - _T("Set &value"), + wxT("Set &value"), SpinBtnPage_ValueText, &m_textValue); sizerMiddle->Add(sizerRow, 0, wxALL | wxGROW, 5); sizerRow = CreateSizerWithTextAndButton(SpinBtnPage_SetMinAndMax, - _T("&Min and max"), + wxT("&Min and max"), SpinBtnPage_MinText, &m_textMin); m_textMax = new wxTextCtrl(this, SpinBtnPage_MaxText, wxEmptyString); sizerRow->Add(m_textMax, 1, wxLEFT | wxALIGN_CENTRE_VERTICAL, 5); - m_textMin->SetValue( wxString::Format(_T("%d"), m_min) ); - m_textMax->SetValue( wxString::Format(_T("%d"), m_max) ); + m_textMin->SetValue( wxString::Format(wxT("%d"), m_min) ); + m_textMax->SetValue( wxString::Format(wxT("%d"), m_max) ); + + sizerMiddle->Add(sizerRow, 0, wxALL | wxGROW, 5); + sizerRow = CreateSizerWithTextAndButton(SpinBtnPage_SetBase, + "Set &base", + SpinBtnPage_BaseText, + &m_textBase); + m_textBase->SetValue("10"); sizerMiddle->Add(sizerRow, 0, wxALL | wxGROW, 5); // right pane @@ -284,7 +340,10 @@ void SpinBtnWidgetsPage::CreateContent() void SpinBtnWidgetsPage::Reset() { m_chkVert->SetValue(true); + m_chkArrowKeys->SetValue(true); m_chkWrap->SetValue(false); + m_chkProcessEnter->SetValue(false); + m_radioAlign->SetSelection(Align_Right); } void SpinBtnWidgetsPage::CreateSpin() @@ -297,9 +356,35 @@ void SpinBtnWidgetsPage::CreateSpin() else flags |= wxSP_HORIZONTAL; + if ( m_chkArrowKeys->GetValue() ) + flags |= wxSP_ARROW_KEYS; + if ( m_chkWrap->GetValue() ) flags |= wxSP_WRAP; + if ( m_chkProcessEnter->GetValue() ) + flags |= wxTE_PROCESS_ENTER; + + int textFlags = 0; + switch ( m_radioAlign->GetSelection() ) + { + default: + wxFAIL_MSG(wxT("unexpected radiobox selection")); + // fall through + + case Align_Left: + textFlags |= wxALIGN_LEFT; // no-op + break; + + case Align_Centre: + textFlags |= wxALIGN_CENTRE_HORIZONTAL; + break; + + case Align_Right: + textFlags |= wxALIGN_RIGHT; + break; + } + int val = m_min; if ( m_spinbtn ) { @@ -309,19 +394,7 @@ void SpinBtnWidgetsPage::CreateSpin() val = valOld; } - m_sizerSpin->Detach( m_spinbtn ); - m_sizerSpin->Detach( m_spinctrl ); - m_sizerSpin->Detach( m_spinctrldbl ); - - // there are 4 spacers left - m_sizerSpin->Remove( 0 ); - m_sizerSpin->Remove( 0 ); - m_sizerSpin->Remove( 0 ); - m_sizerSpin->Remove( 0 ); - - delete m_spinbtn; - delete m_spinctrl; - delete m_spinctrldbl; + m_sizerSpin->Clear(true /* delete windows */); } m_spinbtn = new wxSpinButton(this, SpinBtnPage_SpinBtn, @@ -332,22 +405,29 @@ void SpinBtnWidgetsPage::CreateSpin() m_spinbtn->SetRange(m_min, m_max); m_spinctrl = new wxSpinCtrl(this, SpinBtnPage_SpinCtrl, - wxString::Format(_T("%d"), val), + wxString::Format(wxT("%d"), val), wxDefaultPosition, wxDefaultSize, - flags, + flags | textFlags, m_min, m_max, val); m_spinctrldbl = new wxSpinCtrlDouble(this, SpinBtnPage_SpinCtrlDouble, - wxString::Format(_T("%d"), val), + wxString::Format(wxT("%d"), val), wxDefaultPosition, wxDefaultSize, - flags, + flags | textFlags, 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); @@ -373,25 +453,54 @@ void SpinBtnWidgetsPage::OnButtonSetMinAndMax(wxCommandEvent& WXUNUSED(event)) !m_textMax->GetValue().ToLong(&maxNew) || minNew > maxNew ) { - wxLogWarning(_T("Invalid min/max values for the spinbtn.")); + wxLogWarning(wxT("Invalid min/max values for the spinbtn.")); return; } m_min = minNew; m_max = maxNew; + wxString smax('9', m_textMax->GetValue().length()); + wxSize + size = m_spinctrl->GetSizeFromTextSize(m_spinctrl->GetTextExtent(smax)); + + m_spinctrl->SetMinSize(size); + m_spinctrl->SetSize(size); + + smax += ".0"; + size = m_spinctrldbl->GetSizeFromTextSize( + m_spinctrldbl->GetTextExtent(smax) + ); + m_spinctrldbl->SetMinSize(size); + m_spinctrldbl->SetSize(size); m_spinbtn->SetRange(minNew, maxNew); m_spinctrl->SetRange(minNew, maxNew); m_spinctrldbl->SetRange(minNew, maxNew); } +void SpinBtnWidgetsPage::OnButtonSetBase(wxCommandEvent& WXUNUSED(event)) +{ + unsigned long base; + if ( !m_textBase->GetValue().ToULong(&base) || !base ) + { + wxLogWarning("Invalid base value."); + return; + } + + m_base = base; + if ( !m_spinctrl->SetBase(m_base) ) + { + wxLogWarning("Setting base %d failed.", m_base); + } +} + void SpinBtnWidgetsPage::OnButtonSetValue(wxCommandEvent& WXUNUSED(event)) { long val; if ( !m_textValue->GetValue().ToLong(&val) || !IsValidValue(val) ) { - wxLogWarning(_T("Invalid spinbtn value.")); + wxLogWarning(wxT("Invalid spinbtn value.")); return; } @@ -415,9 +524,17 @@ void SpinBtnWidgetsPage::OnUpdateUIMinMaxButton(wxUpdateUIEvent& event) mn <= mx); } +void SpinBtnWidgetsPage::OnUpdateUIBaseButton(wxUpdateUIEvent& event) +{ + unsigned long base; + event.Enable( m_textBase->GetValue().ToULong(&base) && base ); +} + 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& WXUNUSED(event)) @@ -427,7 +544,7 @@ void SpinBtnWidgetsPage::OnCheckOrRadioBox(wxCommandEvent& WXUNUSED(event)) void SpinBtnWidgetsPage::OnUpdateUICurValueText(wxUpdateUIEvent& event) { - event.SetText( wxString::Format(_T("%d"), m_spinbtn->GetValue())); + event.SetText( wxString::Format(wxT("%d"), m_spinbtn->GetValue())); } void SpinBtnWidgetsPage::OnSpinBtn(wxSpinEvent& event) @@ -435,20 +552,20 @@ void SpinBtnWidgetsPage::OnSpinBtn(wxSpinEvent& event) int value = event.GetInt(); wxASSERT_MSG( value == m_spinbtn->GetValue(), - _T("spinbtn value should be the same") ); + wxT("spinbtn value should be the same") ); - wxLogMessage(_T("Spin button value changed, now %d"), value); + wxLogMessage(wxT("Spin button value changed, now %d"), value); } void SpinBtnWidgetsPage::OnSpinBtnUp(wxSpinEvent& event) { - wxLogMessage( _T("Spin button value incremented, will be %d (was %d)"), + wxLogMessage( wxT("Spin button value incremented, will be %d (was %d)"), event.GetInt(), m_spinbtn->GetValue() ); } void SpinBtnWidgetsPage::OnSpinBtnDown(wxSpinEvent& event) { - wxLogMessage( _T("Spin button value decremented, will be %d (was %d)"), + wxLogMessage( wxT("Spin button value decremented, will be %d (was %d)"), event.GetInt(), m_spinbtn->GetValue() ); } @@ -457,22 +574,28 @@ void SpinBtnWidgetsPage::OnSpinCtrl(wxSpinEvent& event) int value = event.GetInt(); wxASSERT_MSG( value == m_spinctrl->GetValue(), - _T("spinctrl value should be the same") ); + wxT("spinctrl value should be the same") ); - wxLogMessage(_T("Spin control value changed, now %d"), value); + wxLogMessage(wxT("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); + wxLogMessage(wxT("Spin control value changed, now %g"), value); } void SpinBtnWidgetsPage::OnSpinText(wxCommandEvent& event) { - wxLogMessage(_T("Text changed in spin control, now \"%s\""), + wxLogMessage(wxT("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