From 1e8dba5e29eba7ac5e53fa4035e65ceeaeed3884 Mon Sep 17 00:00:00 2001
From: Robert Roebling <robert@roebling.de>
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;
 }
 
 // ----------------------------------------------------------------------------
-- 
2.50.0

