X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/fec9cc08e7d94574af3f04b4c5fbafde63ac0b31..bf9a1615ed0d4a051d6165014c7a0b6636f9ed43:/src/mac/carbon/spinctrl.cpp diff --git a/src/mac/carbon/spinctrl.cpp b/src/mac/carbon/spinctrl.cpp index 9e258d0e54..63b1a7c41c 100644 --- a/src/mac/carbon/spinctrl.cpp +++ b/src/mac/carbon/spinctrl.cpp @@ -12,14 +12,14 @@ #if wxUSE_SPINCTRL -#include "wx/spinbutt.h" +#include "wx/spinctrl.h" #ifndef WX_PRECOMP #include "wx/textctrl.h" + #include "wx/containr.h" #endif -#include "wx/spinctrl.h" -#include "wx/containr.h" +#include "wx/spinbutt.h" // ---------------------------------------------------------------------------- // constants @@ -39,12 +39,12 @@ class wxSpinCtrlText : public wxTextCtrl { public: wxSpinCtrlText(wxSpinCtrl *spin, const wxString& value) - : wxTextCtrl(spin , -1, value, wxDefaultPosition, wxSize(40, -1)) + : wxTextCtrl(spin , wxID_ANY, value, wxDefaultPosition, wxSize(40, wxDefaultCoord)) { m_spin = spin; // remove the default minsize, the spinctrl will have one instead - SetSizeHints(-1,-1); + SetMinSize(wxDefaultSize); } bool ProcessEvent(wxEvent &event) @@ -57,6 +57,43 @@ public: } protected: + void OnKillFocus(wxFocusEvent &event) + { + long l; + if ( !GetValue().ToLong(&l) ) + { + // not a number at all + return; + } + + // is within range + if (l < m_spin->GetMin()) + l = m_spin->GetMin(); + if (l > m_spin->GetMax()) + l = m_spin->GetMax(); + + // Update text control + wxString str; + str.Printf( wxT("%d"), (int)l ); + if (str != GetValue()) + SetValue( str ); + + if (l != m_spin->m_oldValue) + { + // set value in spin button + // does that trigger an event? + m_spin->m_btn->SetValue( l ); + + // if not + wxCommandEvent event(wxEVT_COMMAND_SPINCTRL_UPDATED, m_spin->GetId()); + event.SetEventObject(m_spin); + event.SetInt(l); + m_spin->GetEventHandler()->ProcessEvent(event); + + m_spin->m_oldValue = l; + } + } + void OnTextChange(wxCommandEvent& event) { int val; @@ -92,7 +129,8 @@ private: }; BEGIN_EVENT_TABLE(wxSpinCtrlText, wxTextCtrl) - EVT_TEXT(-1, wxSpinCtrlText::OnTextChange) + EVT_TEXT(wxID_ANY, wxSpinCtrlText::OnTextChange) + EVT_KILL_FOCUS( wxSpinCtrlText::OnKillFocus) END_EVENT_TABLE() // ---------------------------------------------------------------------------- @@ -115,19 +153,22 @@ public: //SetWindowVariant(wxWINDOW_VARIANT_SMALL); // remove the default minsize, the spinctrl will have one instead - SetSizeHints(-1,-1); + SetMinSize(wxDefaultSize); } protected: void OnSpinButton(wxSpinEvent& eventSpin) { - m_spin->SetTextValue(eventSpin.GetPosition()); + int pos = eventSpin.GetPosition(); + m_spin->SetTextValue(pos); - wxCommandEvent event(wxEVT_COMMAND_SPINCTRL_UPDATED, m_spin->GetId()); - event.SetEventObject(m_spin); - event.SetInt(eventSpin.GetPosition()); + wxCommandEvent event(wxEVT_COMMAND_SPINCTRL_UPDATED, m_spin->GetId()); + event.SetEventObject(m_spin); + event.SetInt(pos); - m_spin->GetEventHandler()->ProcessEvent(event); + m_spin->GetEventHandler()->ProcessEvent(event); + + m_spin->m_oldValue = pos; } private: @@ -137,7 +178,7 @@ private: }; BEGIN_EVENT_TABLE(wxSpinCtrlButton, wxSpinButton) - EVT_SPIN(-1, wxSpinCtrlButton::OnSpinButton) + EVT_SPIN(wxID_ANY, wxSpinCtrlButton::OnSpinButton) END_EVENT_TABLE() IMPLEMENT_DYNAMIC_CLASS(wxSpinCtrl, wxControl) @@ -146,7 +187,7 @@ BEGIN_EVENT_TABLE(wxSpinCtrl, wxControl) WX_EVENT_TABLE_CONTROL_CONTAINER(wxSpinCtrl) END_EVENT_TABLE() -WX_DELEGATE_TO_CONTROL_CONTAINER(wxSpinCtrl) +WX_DELEGATE_TO_CONTROL_CONTAINER(wxSpinCtrl, wxControl) // ============================================================================ @@ -179,7 +220,7 @@ bool wxSpinCtrl::Create(wxWindow *parent, if ( !wxControl::Create(parent, id, pos, size, style, wxDefaultValidator, name) ) { - return FALSE; + return false; } // the string value overrides the numeric one (for backwards compatibility @@ -199,12 +240,14 @@ bool wxSpinCtrl::Create(wxWindow *parent, m_btn->SetRange(min, max); m_btn->SetValue(initial); + // make it different + m_oldValue = GetMin()-1; - if ( size.x == -1 ){ + if ( size.x == wxDefaultCoord ){ csize.x = m_text->GetSize().x + MARGIN + m_btn->GetSize().x ; } - if ( size.y == -1 ) { + if ( size.y == wxDefaultCoord ) { csize.y = m_text->GetSize().y + 2 * TEXTBORDER ; //allow for text border highlights if ( m_btn->GetSize().y > csize.y ) csize.y = m_btn->GetSize().y ; @@ -213,7 +256,7 @@ bool wxSpinCtrl::Create(wxWindow *parent, //SetSize(csize); //MacPostControlCreate(pos, csize); - SetInitialBestSize(csize); + SetInitialSize(csize); return true; } @@ -295,13 +338,13 @@ bool wxSpinCtrl::GetTextValue(int *val) const if ( !m_text->GetValue().ToLong(&l) ) { // not a number at all - return FALSE; + return false; } if ( l < GetMin() || l > GetMax() ) { // out of range - return FALSE; + return false; } *val = l; @@ -348,6 +391,7 @@ void wxSpinCtrl::SetValue(int val) SetTextValue(val); m_btn->SetValue(val); + m_oldValue = val; } void wxSpinCtrl::SetValue(const wxString& text)