// the handler for wxSpinButton events
void OnSpinChange(wxSpinEvent& event);
- // Handle processing of special keys
+ // handle processing of special keys
void OnChar(wxKeyEvent& event);
void OnSetFocus(wxFocusEvent& event);
void OnKillFocus(wxFocusEvent& event);
- int m_oldValue;
+ // generate spin control update event with the given value
+ void SendSpinUpdate(int value);
+
+ // called to ensure that the value is in the correct range
virtual void NormalizeValue();
-
+
+
+ // the value of the control before the latest change (which might not have
+ // changed anything in fact -- this is why we need this field)
+ int m_oldValue;
+
// the data for the "buddy" text ctrl
WXHWND m_hwndBuddy;
WXFARPROC m_wndProcBuddy;
void wxSpinCtrl::NormalizeValue()
{
const int value = GetValue();
- const bool changed = value == m_oldValue;
+ 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
if ( changed )
{
- wxCommandEvent event(wxEVT_COMMAND_SPINCTRL_UPDATED, GetId());
- event.SetEventObject(this);
- event.SetInt(value);
- GetEventHandler()->ProcessEvent(event);
- m_oldValue = value;
+ SendSpinUpdate(value);
}
}
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)
#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);
- if (value != m_oldValue)
- (void)GetEventHandler()->ProcessEvent(event);
+ (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;
}
// ----------------------------------------------------------------------------