diff --git a/docs/latex/wx/spinctrl.tex b/docs/latex/wx/spinctrl.tex index fe9243cee2..f6aacc08bd 100644 --- a/docs/latex/wx/spinctrl.tex +++ b/docs/latex/wx/spinctrl.tex @@ -43,6 +43,12 @@ the corresponding events will not be generated under all platforms. Finally, if the user modifies the text in the edit part of the spin control directly, the {\tt EVT\_TEXT} is generated, like for the \helpref{wxTextCtrl}{wxtextctrl}. +When the use enters text into the text area, the text is not +validated until the control loses focus (e.g. by using the TAB +key). The value is then adjusted to the range and a +\helpref{wxSpinEvent}{wxspinevent} sent then if the value +is different from the last value sent. + \wxheading{See also} \helpref{Event handling overview}{eventhandlingoverview}, diff --git a/include/wx/msw/spinbutt.h b/include/wx/msw/spinbutt.h index b8eeefe3dc..56e69f30b8 100644 --- a/include/wx/msw/spinbutt.h +++ b/include/wx/msw/spinbutt.h @@ -61,7 +61,7 @@ protected: virtual wxSize DoGetBestSize() const; // ensure that the control displays a value in the current range - void NormalizeValue() { SetValue(GetValue()); } + virtual void NormalizeValue(); private: DECLARE_DYNAMIC_CLASS_NO_COPY(wxSpinButton) diff --git a/include/wx/msw/spinctrl.h b/include/wx/msw/spinctrl.h index bd4e0c5f30..edcb026f76 100644 --- a/include/wx/msw/spinctrl.h +++ b/include/wx/msw/spinctrl.h @@ -104,6 +104,9 @@ protected: void OnSetFocus(wxFocusEvent& event); void OnKillFocus(wxFocusEvent& event); + int m_oldValue; + virtual void NormalizeValue(); + // the data for the "buddy" text ctrl WXHWND m_hwndBuddy; WXFARPROC m_wndProcBuddy; diff --git a/src/msw/spinbutt.cpp b/src/msw/spinbutt.cpp index d4e20e76a5..b4b9cfb1e7 100644 --- a/src/msw/spinbutt.cpp +++ b/src/msw/spinbutt.cpp @@ -256,6 +256,11 @@ void wxSpinButton::SetValue(int val) } } +void wxSpinButton::NormalizeValue() +{ + SetValue( GetValue() ); +} + void wxSpinButton::SetRange(int minVal, int maxVal) { const bool hadRange = m_min < m_max; diff --git a/src/msw/spinctrl.cpp b/src/msw/spinctrl.cpp index 58673b0e3b..8f4bd81c89 100644 --- a/src/msw/spinctrl.cpp +++ b/src/msw/spinctrl.cpp @@ -267,6 +267,20 @@ void wxSpinCtrl::OnSetFocus(wxFocusEvent& event) event.Skip(); } +void wxSpinCtrl::NormalizeValue() +{ + int value = GetValue(); + SetValue( value ); + if (value != m_oldValue) + { + wxCommandEvent event( wxEVT_COMMAND_SPINCTRL_UPDATED, GetId() ); + event.SetEventObject( this ); + event.SetInt( value ); + GetEventHandler()->ProcessEvent( event ); + m_oldValue = value; + } +} + // ---------------------------------------------------------------------------- // construction // ---------------------------------------------------------------------------- @@ -354,6 +368,8 @@ bool wxSpinCtrl::Create(wxWindow *parent, SetRange(min, max); SetValue(initial); + + m_oldValue = initial; // subclass the text ctrl to be able to intercept some events wxSetWindowUserData(GetBuddyHwnd(), this); @@ -530,14 +546,18 @@ void wxSpinCtrl::OnSpinChange(wxSpinEvent& eventSpin) { wxCommandEvent event(wxEVT_COMMAND_SPINCTRL_UPDATED, GetId()); event.SetEventObject(this); - event.SetInt(eventSpin.GetPosition()); - - (void)GetEventHandler()->ProcessEvent(event); + int value = eventSpin.GetPosition(); + event.SetInt( value ); + + if (value != m_oldValue) + (void)GetEventHandler()->ProcessEvent(event); if ( eventSpin.GetSkipped() ) { event.Skip(); } + + m_oldValue = value; } // ----------------------------------------------------------------------------