X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/e07a2142811be9d4a4f5eaa730eeebcbe88b24c9..2cf3a6d7bef6f20bea35062dd3d4dbf0aec9efb5:/src/mac/carbon/spinctrl.cpp diff --git a/src/mac/carbon/spinctrl.cpp b/src/mac/carbon/spinctrl.cpp index 1325f233d9..a4dd944e31 100644 --- a/src/mac/carbon/spinctrl.cpp +++ b/src/mac/carbon/spinctrl.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: spinbutt.cpp +// Name: src/mac/carbon/spinbutt.cpp // Purpose: wxSpinCtrl // Author: Robert // Modified by: Mark Newsam (Based on GTK file) @@ -8,18 +8,18 @@ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) -#pragma implementation "spinctrl.h" -#endif - -#include "wx/defs.h" +#include "wx/wxprec.h" #if wxUSE_SPINCTRL -#include "wx/spinbutt.h" #include "wx/spinctrl.h" -#include "wx/textctrl.h" +#ifndef WX_PRECOMP + #include "wx/textctrl.h" + #include "wx/containr.h" +#endif + +#include "wx/spinbutt.h" // ---------------------------------------------------------------------------- // constants @@ -27,7 +27,7 @@ // the focus rect around a text may have 4 pixels in each direction // we handle these problems right now in an extended vis region of a window -static const wxCoord TEXTBORDER = 0 ; +static const wxCoord TEXTBORDER = 4 ; // the margin between the text control and the spin static const wxCoord MARGIN = 8 - TEXTBORDER; @@ -39,14 +39,23 @@ 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); } + bool ProcessEvent(wxEvent &event) + { + // Hand button down events to wxSpinCtrl. Doesn't work. + if (event.GetEventType() == wxEVT_LEFT_DOWN && m_spin->ProcessEvent( event )) + return true; + + return wxTextCtrl::ProcessEvent( event ); + } + protected: void OnTextChange(wxCommandEvent& event) { @@ -55,9 +64,19 @@ protected: { m_spin->GetSpinButton()->SetValue(val); + // If we're already processing a text update from m_spin, + // don't send it again, since we could end up recursing + // infinitely. + if (event.GetId() == m_spin->GetId()) + { + event.Skip(); + return; + } + // Send event that the text was manually changed wxCommandEvent event(wxEVT_COMMAND_TEXT_UPDATED, m_spin->GetId()); event.SetEventObject(m_spin); + event.SetString(m_spin->GetText()->GetValue()); event.SetInt(val); m_spin->GetEventHandler()->ProcessEvent(event); @@ -66,15 +85,6 @@ protected: event.Skip(); } - bool ProcessEvent(wxEvent &event) - { - // Hand button down events to wxSpinCtrl. Doesn't work. - if (event.GetEventType() == wxEVT_LEFT_DOWN && m_spin->ProcessEvent( event )) - return TRUE; - - return wxTextCtrl::ProcessEvent( event ); - } - private: wxSpinCtrl *m_spin; @@ -82,7 +92,7 @@ private: }; BEGIN_EVENT_TABLE(wxSpinCtrlText, wxTextCtrl) - EVT_TEXT(-1, wxSpinCtrlText::OnTextChange) + EVT_TEXT(wxID_ANY, wxSpinCtrlText::OnTextChange) END_EVENT_TABLE() // ---------------------------------------------------------------------------- @@ -127,11 +137,18 @@ 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) - + +BEGIN_EVENT_TABLE(wxSpinCtrl, wxControl) + WX_EVENT_TABLE_CONTROL_CONTAINER(wxSpinCtrl) +END_EVENT_TABLE() + +WX_DELEGATE_TO_CONTROL_CONTAINER(wxSpinCtrl) + + // ============================================================================ // implementation // ============================================================================ @@ -144,6 +161,7 @@ void wxSpinCtrl::Init() { m_text = NULL; m_btn = NULL; + m_container.SetContainerWindow(this); } bool wxSpinCtrl::Create(wxWindow *parent, @@ -161,7 +179,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 @@ -178,26 +196,26 @@ bool wxSpinCtrl::Create(wxWindow *parent, wxSize csize = size ; m_text = new wxSpinCtrlText(this, value); m_btn = new wxSpinCtrlButton(this, style); - + m_btn->SetRange(min, max); m_btn->SetValue(initial); - if ( size.x == -1 ){ + if ( size.x == wxDefaultCoord ){ csize.x = m_text->GetSize().x + MARGIN + m_btn->GetSize().x ; } - if ( size.y == -1 ) { - 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 ; + 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 ; } - + //SetSize(csize); - + //MacPostControlCreate(pos, csize); SetInitialBestSize(csize); - return TRUE; + return true; } wxSpinCtrl::~wxSpinCtrl() @@ -219,7 +237,7 @@ wxSize wxSpinCtrl::DoGetBestSize() const { if (!m_btn || !m_text) return GetSize(); - + wxSize sizeBtn = m_btn->GetBestSize(), sizeText = m_text->GetBestSize(); @@ -231,7 +249,7 @@ wxSize wxSpinCtrl::DoGetBestSize() const height = sizeText.y; else height = sizeBtn.y; - + return wxSize(sizeBtn.x + sizeText.x + MARGIN, height ); } @@ -240,11 +258,11 @@ void wxSpinCtrl::DoMoveWindow(int x, int y, int width, int height) // position the subcontrols inside the client area wxSize sizeBtn = m_btn->GetSize(); wxSize sizeText = m_text->GetSize(); - + wxControl::DoMoveWindow(x, y, width, 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 ); } @@ -256,15 +274,15 @@ void wxSpinCtrl::DoMoveWindow(int x, int y, int width, int height) bool wxSpinCtrl::Enable(bool enable) { if ( !wxControl::Enable(enable) ) - return FALSE; - return TRUE; + return false; + return true; } bool wxSpinCtrl::Show(bool show) { if ( !wxControl::Show(show) ) - return FALSE; - return TRUE; + return false; + return true; } // ---------------------------------------------------------------------------- @@ -277,18 +295,18 @@ 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; - return TRUE; + return true; } int wxSpinCtrl::GetValue() const @@ -361,9 +379,9 @@ void wxSpinCtrl::SetSelection(long from, long to) // be selected if ( (from == -1) && (to == -1) ) { - from = 0; + from = 0; } m_text->SetSelection(from, to); -} +} #endif // wxUSE_SPINCTRL