]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/carbon/spinctrl.cpp
Query value from the model column given by col->GetModelColumn()
[wxWidgets.git] / src / mac / carbon / spinctrl.cpp
index 8702e0bd874d31dc05a6872a64f0736b68cb8f91..f9b3fb9e95d347ea467fc7c14ee378aa599f8164 100644 (file)
 // 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)