X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/77ffb5937e89927b621128789401db8921fe580f..344ff08345eba81fcdcc55dd711ce6bc4bb747a3:/src/mac/carbon/spinctrl.cpp?ds=sidebyside diff --git a/src/mac/carbon/spinctrl.cpp b/src/mac/carbon/spinctrl.cpp index 2a57f1e0b9..908ad7a0b5 100644 --- a/src/mac/carbon/spinctrl.cpp +++ b/src/mac/carbon/spinctrl.cpp @@ -5,28 +5,27 @@ // Modified by: Mark Newsam (Based on GTK file) // RCS-ID: $Id$ // Copyright: (c) Robert Roebling -// Licence: wxWidgets licence +// 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" - +#include "wx/containr.h" // ---------------------------------------------------------------------------- // constants // ---------------------------------------------------------------------------- +// 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 = 4 ; // the margin between the text control and the spin -static const wxCoord MARGIN = 2; +static const wxCoord MARGIN = 8 - TEXTBORDER; // ---------------------------------------------------------------------------- // wxSpinCtrlText: text control used by spin control @@ -36,7 +35,7 @@ class wxSpinCtrlText : public wxTextCtrl { public: wxSpinCtrlText(wxSpinCtrl *spin, const wxString& value) - : wxTextCtrl(spin , -1, value) + : wxTextCtrl(spin , -1, value, wxDefaultPosition, wxSize(40, -1)) { m_spin = spin; @@ -44,6 +43,15 @@ public: 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) { @@ -51,20 +59,28 @@ protected: if ( m_spin->GetTextValue(&val) ) { 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); } 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; @@ -92,7 +108,7 @@ public: // differences so change it's default size a bit. SMALL still gets a // bit truncated, but MINI seems to be too small... Readdress this // when the textctrl issues are all sorted out. - SetWindowVariant(wxWINDOW_VARIANT_SMALL); + //SetWindowVariant(wxWINDOW_VARIANT_SMALL); // remove the default minsize, the spinctrl will have one instead SetSizeHints(-1,-1); @@ -122,6 +138,13 @@ 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 // ============================================================================ @@ -134,6 +157,7 @@ void wxSpinCtrl::Init() { m_text = NULL; m_btn = NULL; + m_container.SetContainerWindow(this); } bool wxSpinCtrl::Create(wxWindow *parent, @@ -147,7 +171,8 @@ bool wxSpinCtrl::Create(wxWindow *parent, int initial, const wxString& name) { - if ( !wxControl::Create(parent, id, wxDefaultPosition, wxDefaultSize, style, + m_macIsUserPane = true; + if ( !wxControl::Create(parent, id, pos, size, style, wxDefaultValidator, name) ) { return FALSE; @@ -167,14 +192,24 @@ 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 ){ + csize.x = m_text->GetSize().x + MARGIN + m_btn->GetSize().x ; + } + if ( size.y == -1 ) { - csize.y = m_text->GetSize().y ; + 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 ; } - SetBestSize(csize); + + //SetSize(csize); + + //MacPostControlCreate(pos, csize); + SetInitialBestSize(csize); return TRUE; } @@ -196,22 +231,36 @@ wxSpinCtrl::~wxSpinCtrl() wxSize wxSpinCtrl::DoGetBestSize() const { + if (!m_btn || !m_text) + return GetSize(); + wxSize sizeBtn = m_btn->GetBestSize(), sizeText = m_text->GetBestSize(); - return wxSize(sizeBtn.x + sizeText.x + MARGIN, sizeText.y); + sizeText.y += 2 * TEXTBORDER ; + sizeText.x += 2 * TEXTBORDER ; + + int height; + if (sizeText.y > sizeBtn.y) + height = sizeText.y; + else + height = sizeBtn.y; + + return wxSize(sizeBtn.x + sizeText.x + MARGIN, height ); } void wxSpinCtrl::DoMoveWindow(int x, int y, int width, int height) { - wxControl::DoMoveWindow(x, y, width, 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; - m_text->SetSize(0, 0, wText, height); - m_btn->SetSize(0 + wText + MARGIN, 0, -1, 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 ); } // ----------------------------------------------------------------------------