X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/6c20e8f816b21b911e3a8ed8197c21df6ce726d6..ffbf7f6634ebdce1055ec21256c4fd3e3bd410c8:/src/mac/carbon/spinctrl.cpp diff --git a/src/mac/carbon/spinctrl.cpp b/src/mac/carbon/spinctrl.cpp index 8702e0bd87..f9b3fb9e95 100644 --- a/src/mac/carbon/spinctrl.cpp +++ b/src/mac/carbon/spinctrl.cpp @@ -29,7 +29,10 @@ // we handle these problems right now in an extended vis region of a window static const wxCoord TEXTBORDER = 4 ; // the margin between the text control and the spin -static const wxCoord MARGIN = 8 - TEXTBORDER; +// HIG says 2px between text and stepper control, +// but a value of 3 leads to the same look as the +// spin controls in Apple's apps +static const wxCoord MARGIN = 3; // ---------------------------------------------------------------------------- // wxSpinCtrlText: text control used by spin control @@ -44,7 +47,7 @@ public: m_spin = spin; // remove the default minsize, the spinctrl will have one instead - SetSizeHints(-1,-1); + SetMinSize(wxDefaultSize); } bool ProcessEvent(wxEvent &event) @@ -57,6 +60,43 @@ public: } protected: + void OnKillFocus(wxFocusEvent& WXUNUSED(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->HandleWindowEvent(event); + + m_spin->m_oldValue = l; + } + } + void OnTextChange(wxCommandEvent& event) { int val; @@ -79,7 +119,7 @@ protected: event.SetString(m_spin->GetText()->GetValue()); event.SetInt(val); - m_spin->GetEventHandler()->ProcessEvent(event); + m_spin->HandleWindowEvent(event); } event.Skip(); @@ -93,6 +133,7 @@ private: BEGIN_EVENT_TABLE(wxSpinCtrlText, wxTextCtrl) EVT_TEXT(wxID_ANY, wxSpinCtrlText::OnTextChange) + EVT_KILL_FOCUS( wxSpinCtrlText::OnKillFocus) END_EVENT_TABLE() // ---------------------------------------------------------------------------- @@ -115,19 +156,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(pos); - wxCommandEvent event(wxEVT_COMMAND_SPINCTRL_UPDATED, m_spin->GetId()); - event.SetEventObject(m_spin); - event.SetInt(eventSpin.GetPosition()); + m_spin->HandleWindowEvent(event); - m_spin->GetEventHandler()->ProcessEvent(event); + m_spin->m_oldValue = pos; } private: @@ -161,7 +205,7 @@ void wxSpinCtrl::Init() { m_text = NULL; m_btn = NULL; - m_container.SetContainerWindow(this); + WX_INIT_CONTROL_CONTAINER(); } bool wxSpinCtrl::Create(wxWindow *parent, @@ -199,6 +243,8 @@ bool wxSpinCtrl::Create(wxWindow *parent, m_btn->SetRange(min, max); m_btn->SetValue(initial); + // make it different + m_oldValue = GetMin()-1; if ( size.x == wxDefaultCoord ){ csize.x = m_text->GetSize().x + MARGIN + m_btn->GetSize().x ; @@ -213,7 +259,7 @@ bool wxSpinCtrl::Create(wxWindow *parent, //SetSize(csize); //MacPostControlCreate(pos, csize); - SetInitialBestSize(csize); + SetInitialSize(csize); return true; } @@ -264,7 +310,7 @@ void wxSpinCtrl::DoMoveWindow(int x, int y, int width, int height) wxCoord wText = width - sizeBtn.x - MARGIN - 2 * TEXTBORDER; m_text->SetSize(TEXTBORDER, (height - sizeText.y) / 2, wText, -1); - m_btn->SetSize(0 + wText + MARGIN + 2 * TEXTBORDER , (height - sizeBtn.y) / 2 , -1, -1 ); + m_btn->SetSize(0 + wText + MARGIN + TEXTBORDER , (height - sizeBtn.y) / 2 , -1, -1 ); } // ---------------------------------------------------------------------------- @@ -348,6 +394,7 @@ void wxSpinCtrl::SetValue(int val) SetTextValue(val); m_btn->SetValue(val); + m_oldValue = val; } void wxSpinCtrl::SetValue(const wxString& text)