Don't generate any events from wxSpinCtrl and wxSpinCtrlDouble methods.
After the changes of r53758 wxMSW didn't generate any wxEVT_TEXT events but this was still the case for the generic version (and hence for wxSpinCtrlDouble under MSW too) and wasn't documented. Fix all versions to avoid sending events for programmatic actions, add unit tests checking this behaviour and document it. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@74631 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -406,7 +406,7 @@ void wxSpinCtrlGenericBase::OnSpinButton(wxSpinEvent& event)
|
||||
|
||||
// Sync the textctrl since the user expects that the button will modify
|
||||
// what they see in the textctrl.
|
||||
SyncSpinToText();
|
||||
SyncSpinToText(SendEvent_None);
|
||||
|
||||
int spin_value = event.GetPosition();
|
||||
double step = (event.GetEventType() == wxEVT_SCROLL_LINEUP) ? 1 : -1;
|
||||
@@ -427,13 +427,14 @@ void wxSpinCtrlGenericBase::OnSpinButton(wxSpinEvent& event)
|
||||
|
||||
m_spin_value = spin_value;
|
||||
|
||||
if ( DoSetValue(value) )
|
||||
// Notify about the change in wxTextCtrl too.
|
||||
if ( DoSetValue(value, SendEvent_Text) )
|
||||
DoSendEvent();
|
||||
}
|
||||
|
||||
void wxSpinCtrlGenericBase::OnTextLostFocus(wxFocusEvent& event)
|
||||
{
|
||||
SyncSpinToText();
|
||||
SyncSpinToText(SendEvent_Text);
|
||||
DoSendEvent();
|
||||
|
||||
event.Skip();
|
||||
@@ -473,9 +474,10 @@ void wxSpinCtrlGenericBase::OnTextChar(wxKeyEvent& event)
|
||||
|
||||
value = AdjustToFitInRange(value);
|
||||
|
||||
SyncSpinToText();
|
||||
SyncSpinToText(SendEvent_None);
|
||||
|
||||
if ( DoSetValue(value) )
|
||||
// No need to send event, it was already generated by wxTextCtrl itself.
|
||||
if ( DoSetValue(value, SendEvent_None) )
|
||||
DoSendEvent();
|
||||
}
|
||||
|
||||
@@ -483,7 +485,7 @@ void wxSpinCtrlGenericBase::OnTextChar(wxKeyEvent& event)
|
||||
// Textctrl functions
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
bool wxSpinCtrlGenericBase::SyncSpinToText()
|
||||
bool wxSpinCtrlGenericBase::SyncSpinToText(SendEvent sendEvent)
|
||||
{
|
||||
if ( !m_textCtrl || !m_textCtrl->IsModified() )
|
||||
return false;
|
||||
@@ -505,7 +507,7 @@ bool wxSpinCtrlGenericBase::SyncSpinToText()
|
||||
// we must always set the value here, even if it's equal to m_value, as
|
||||
// otherwise we could be left with an out of range value when leaving the
|
||||
// text control and the current value is already m_max for example
|
||||
return DoSetValue(textValue);
|
||||
return DoSetValue(textValue, sendEvent);
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
@@ -519,16 +521,16 @@ void wxSpinCtrlGenericBase::SetValue(const wxString& text)
|
||||
double val;
|
||||
if ( DoTextToValue(text, &val) && InRange(val) )
|
||||
{
|
||||
DoSetValue(val);
|
||||
DoSetValue(val, SendEvent_None);
|
||||
}
|
||||
else // not a number at all or out of range
|
||||
{
|
||||
m_textCtrl->SetValue(text);
|
||||
m_textCtrl->ChangeValue(text);
|
||||
m_textCtrl->SelectAll();
|
||||
}
|
||||
}
|
||||
|
||||
bool wxSpinCtrlGenericBase::DoSetValue(double val)
|
||||
bool wxSpinCtrlGenericBase::DoSetValue(double val, SendEvent sendEvent)
|
||||
{
|
||||
wxCHECK_MSG( m_textCtrl, false, wxT("invalid call to wxSpinCtrl::SetValue") );
|
||||
|
||||
@@ -556,7 +558,18 @@ bool wxSpinCtrlGenericBase::DoSetValue(double val)
|
||||
{
|
||||
if ( !DoTextToValue(str, &m_value ) ) // wysiwyg for textctrl
|
||||
m_value = val;
|
||||
m_textCtrl->SetValue( str );
|
||||
|
||||
switch ( sendEvent )
|
||||
{
|
||||
case SendEvent_None:
|
||||
m_textCtrl->ChangeValue(str);
|
||||
break;
|
||||
|
||||
case SendEvent_Text:
|
||||
m_textCtrl->SetValue(str);
|
||||
break;
|
||||
}
|
||||
|
||||
m_textCtrl->SelectAll();
|
||||
m_textCtrl->DiscardEdits();
|
||||
return true;
|
||||
@@ -579,10 +592,10 @@ void wxSpinCtrlGenericBase::DoSetRange(double min, double max)
|
||||
{
|
||||
m_min = min;
|
||||
if ( m_value < m_min )
|
||||
DoSetValue(m_min);
|
||||
DoSetValue(m_min, SendEvent_None);
|
||||
m_max = max;
|
||||
if ( m_value > m_max )
|
||||
DoSetValue(m_max);
|
||||
DoSetValue(m_max, SendEvent_None);
|
||||
}
|
||||
|
||||
void wxSpinCtrlGenericBase::DoSetIncrement(double inc)
|
||||
@@ -593,7 +606,7 @@ void wxSpinCtrlGenericBase::DoSetIncrement(double inc)
|
||||
void wxSpinCtrlGenericBase::SetSnapToTicks(bool snap_to_ticks)
|
||||
{
|
||||
m_snap_to_ticks = snap_to_ticks;
|
||||
DoSetValue(m_value);
|
||||
DoSetValue(m_value, SendEvent_None);
|
||||
}
|
||||
|
||||
void wxSpinCtrlGenericBase::SetSelection(long from, long to)
|
||||
@@ -628,7 +641,7 @@ bool wxSpinCtrl::SetBase(int base)
|
||||
|
||||
// ... but DoValueToText() after doing it.
|
||||
if ( hasValidVal )
|
||||
m_textCtrl->SetValue(DoValueToText(val));
|
||||
m_textCtrl->ChangeValue(DoValueToText(val));
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -708,7 +721,7 @@ void wxSpinCtrlDouble::SetDigits(unsigned digits)
|
||||
|
||||
m_format.Printf(wxT("%%0.%ulf"), digits);
|
||||
|
||||
DoSetValue(m_value);
|
||||
DoSetValue(m_value, SendEvent_None);
|
||||
}
|
||||
|
||||
#endif // wxUSE_SPINBTN
|
||||
|
||||
Reference in New Issue
Block a user