From 1e8dba5e29eba7ac5e53fa4035e65ceeaeed3884 Mon Sep 17 00:00:00 2001 From: Robert Roebling Date: Wed, 20 Sep 2006 14:15:14 +0000 Subject: [PATCH] Made MSW wxSpinCtrl emit UPDATE event when validating the value in the text field upon kill focus. Documented this behaviour. This is in line with the GTK+ control. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@41316 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- docs/latex/wx/spinctrl.tex | 6 ++++++ include/wx/msw/spinbutt.h | 2 +- include/wx/msw/spinctrl.h | 3 +++ src/msw/spinbutt.cpp | 5 +++++ src/msw/spinctrl.cpp | 26 +++++++++++++++++++++++--- 5 files changed, 38 insertions(+), 4 deletions(-) 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; } // ----------------------------------------------------------------------------