X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/4a528443651296fc50db585e780173cbe5e42db3..81bfc17cc63bde7034da16df0c9cb246a8738337:/src/msw/spinctrl.cpp diff --git a/src/msw/spinctrl.cpp b/src/msw/spinctrl.cpp index dbc1bdd3ff..14bdda9ae0 100644 --- a/src/msw/spinctrl.cpp +++ b/src/msw/spinctrl.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: msw/spinctrl.cpp +// Name: src/msw/spinctrl.cpp // Purpose: wxSpinCtrl class implementation for Win32 // Author: Vadim Zeitlin // Modified by: @@ -24,15 +24,17 @@ #pragma hdrstop #endif -#ifndef WX_PRECOMP - #include "wx/wx.h" -#endif - #if wxUSE_SPINCTRL #include "wx/spinctrl.h" + +#ifndef WX_PRECOMP + #include "wx/msw/wrapcctl.h" // include "properly" + #include "wx/event.h" + #include "wx/textctrl.h" +#endif + #include "wx/msw/private.h" -#include "wx/msw/wrapcctl.h" #if wxUSE_TOOLTIPS #include "wx/tooltip.h" @@ -198,28 +200,14 @@ wxSpinCtrl *wxSpinCtrl::GetSpinForTextCtrl(WXHWND hwndBuddy) // process a WM_COMMAND generated by the buddy text control bool wxSpinCtrl::ProcessTextCommand(WXWORD cmd, WXWORD WXUNUSED(id)) { - switch (cmd) + if ( cmd == EN_CHANGE ) { - case EN_CHANGE: - { - wxCommandEvent event(wxEVT_COMMAND_TEXT_UPDATED, GetId()); - event.SetEventObject(this); - wxString val = wxGetWindowText(m_hwndBuddy); - event.SetString(val); - event.SetInt(GetValue()); - return GetEventHandler()->ProcessEvent(event); - } - case EN_SETFOCUS: - case EN_KILLFOCUS: - { - wxFocusEvent event(cmd == EN_KILLFOCUS ? wxEVT_KILL_FOCUS - : wxEVT_SET_FOCUS, - m_windowId); - event.SetEventObject( this ); - return GetEventHandler()->ProcessEvent(event); - } - default: - break; + wxCommandEvent event(wxEVT_COMMAND_TEXT_UPDATED, GetId()); + event.SetEventObject(this); + wxString val = wxGetWindowText(m_hwndBuddy); + event.SetString(val); + event.SetInt(GetValue()); + return GetEventHandler()->ProcessEvent(event); } // not processed @@ -265,8 +253,8 @@ void wxSpinCtrl::OnChar(wxKeyEvent& event) void wxSpinCtrl::OnKillFocus(wxFocusEvent& event) { - // ensure that the value is shown correctly - SetValue(GetValue()) ; + // ensure that a correct value is shown by the control + NormalizeValue(); event.Skip(); } @@ -279,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 // ---------------------------------------------------------------------------- @@ -366,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); @@ -431,16 +435,36 @@ void wxSpinCtrl::SetValue(const wxString& text) } } +void wxSpinCtrl::SetValue(int val) +{ + wxSpinButton::SetValue(val); + + // normally setting the value of the spin button is enough as it updates + // its buddy control automatically ... + if ( wxGetWindowText(m_hwndBuddy).empty() ) + { + // ... but sometimes it doesn't, notably when the value is 0 and the + // text control is currently empty, the spin button seems to be happy + // to leave it like this, while we really want to always show the + // current value in the control, so do it manually + ::SetWindowText(GetBuddyHwnd(), wxString::Format(_T("%d"), val)); + } + + m_oldValue = GetValue(); +} + int wxSpinCtrl::GetValue() const { wxString val = wxGetWindowText(m_hwndBuddy); long n; - if ( (wxSscanf(val, wxT("%lu"), &n) != 1) ) + if ( (wxSscanf(val, wxT("%ld"), &n) != 1) ) n = INT_MIN; - if (n < m_min) n = m_min; - if (n > m_max) n = m_max; + if ( n < m_min ) + n = m_min; + if ( n > m_max ) + n = m_max; return n; } @@ -524,14 +548,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; } // ---------------------------------------------------------------------------- @@ -604,4 +632,3 @@ void wxSpinCtrl::DoGetPosition(int *x, int *y) const } #endif // wxUSE_SPINCTRL -