X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/e816f5c736124307fe587f3fcf3524e699a0f4c1..08bee49e39023211dce786de9cf687b35849e427:/src/msw/spinctrl.cpp diff --git a/src/msw/spinctrl.cpp b/src/msw/spinctrl.cpp index d8368999a9..bf56006ade 100644 --- a/src/msw/spinctrl.cpp +++ b/src/msw/spinctrl.cpp @@ -87,7 +87,7 @@ wxEND_FLAGS( wxSpinCtrlStyle ) IMPLEMENT_DYNAMIC_CLASS_XTI(wxSpinCtrl, wxControl,"wx/spinbut.h") wxBEGIN_PROPERTIES_TABLE(wxSpinCtrl) - wxEVENT_RANGE_PROPERTY( Spin , wxEVT_SCROLL_TOP , wxEVT_SCROLL_ENDSCROLL , wxSpinEvent ) + wxEVENT_RANGE_PROPERTY( Spin , wxEVT_SCROLL_TOP , wxEVT_SCROLL_CHANGED , wxSpinEvent ) wxEVENT_PROPERTY( Updated , wxEVT_COMMAND_SPINCTRL_UPDATED , wxCommandEvent ) wxEVENT_PROPERTY( TextUpdated , wxEVT_COMMAND_TEXT_UPDATED , wxCommandEvent ) wxEVENT_PROPERTY( TextEnter , wxEVT_COMMAND_TEXT_ENTER , wxCommandEvent ) @@ -269,16 +269,17 @@ void wxSpinCtrl::OnSetFocus(wxFocusEvent& event) void wxSpinCtrl::NormalizeValue() { const int value = GetValue(); - if ( value == m_oldValue ) - return; + const bool changed = value != m_oldValue; + // notice that we have to call SetValue() even if the value didn't change + // because otherwise we could be left with empty buddy control when value + // is 0, see comment in SetValue() SetValue(value); - wxCommandEvent event(wxEVT_COMMAND_SPINCTRL_UPDATED, GetId()); - event.SetEventObject(this); - event.SetInt(value); - GetEventHandler()->ProcessEvent(event); - m_oldValue = value; + if ( changed ) + { + SendSpinUpdate(value); + } } // ---------------------------------------------------------------------------- @@ -294,6 +295,11 @@ bool wxSpinCtrl::Create(wxWindow *parent, int min, int max, int initial, const wxString& name) { + // this should be in ctor/init function but I don't want to add one to 2.8 + // to avoid problems with default ctor which can be inlined in the user + // code and so might not get this fix without recompilation + m_oldValue = INT_MIN; + // before using DoGetBestSize(), have to set style to let the base class // know whether this is a horizontal or vertical control (we're always // vertical) @@ -366,10 +372,7 @@ bool wxSpinCtrl::Create(wxWindow *parent, return false; } - SetRange(min, max); - SetValue(initial); - - m_oldValue = initial; + wxSpinButtonBase::SetRange(min, max); // subclass the text ctrl to be able to intercept some events wxSetWindowUserData(GetBuddyHwnd(), this); @@ -398,9 +401,20 @@ bool wxSpinCtrl::Create(wxWindow *parent, // associate the text window with the spin button (void)::SendMessage(GetHwnd(), UDM_SETBUDDY, (WPARAM)m_hwndBuddy, 0); + SetValue(initial); + + // Set the range in the native control + SetRange(min, max); + if ( !value.empty() ) { SetValue(value); + m_oldValue = (int) wxAtol(value); + } + else + { + SetValue(wxString::Format(wxT("%d"), initial)); + m_oldValue = initial; } // do it after finishing with m_hwndBuddy creation to avoid generating @@ -541,25 +555,27 @@ void wxSpinCtrl::DoSetToolTip(wxToolTip *tip) #endif // wxUSE_TOOLTIPS // ---------------------------------------------------------------------------- -// event processing +// events processing and generation // ---------------------------------------------------------------------------- -void wxSpinCtrl::OnSpinChange(wxSpinEvent& eventSpin) +void wxSpinCtrl::SendSpinUpdate(int value) { wxCommandEvent event(wxEVT_COMMAND_SPINCTRL_UPDATED, GetId()); event.SetEventObject(this); - int value = eventSpin.GetPosition(); - event.SetInt( value ); + event.SetInt(value); + + (void)GetEventHandler()->ProcessEvent(event); - if (value != m_oldValue) - (void)GetEventHandler()->ProcessEvent(event); + m_oldValue = value; +} - if ( eventSpin.GetSkipped() ) +void wxSpinCtrl::OnSpinChange(wxSpinEvent& eventSpin) +{ + const int value = eventSpin.GetPosition(); + if ( value != m_oldValue ) { - event.Skip(); + SendSpinUpdate(value); } - - m_oldValue = value; } // ----------------------------------------------------------------------------