]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/carbon/spinctrl.cpp
Performance optimization
[wxWidgets.git] / src / mac / carbon / spinctrl.cpp
index a4dd944e312a3e4031ef142b582f39721e678d3b..47c2332911f2e5ff54c44ab86d7ad786e5191980 100644 (file)
@@ -44,7 +44,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 +57,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 +116,7 @@ protected:
             event.SetString(m_spin->GetText()->GetValue());
             event.SetInt(val);
 
-            m_spin->GetEventHandler()->ProcessEvent(event);
+            m_spin->HandleWindowEvent(event);
         }
 
         event.Skip();
@@ -93,6 +130,7 @@ private:
 
 BEGIN_EVENT_TABLE(wxSpinCtrlText, wxTextCtrl)
     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(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:
@@ -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)
 
 
 // ============================================================================
@@ -161,7 +202,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 +240,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 +256,7 @@ bool wxSpinCtrl::Create(wxWindow *parent,
     //SetSize(csize);
 
     //MacPostControlCreate(pos, csize);
-    SetInitialBestSize(csize);
+    SetInitialSize(csize);
 
     return true;
 }
@@ -348,6 +391,7 @@ void wxSpinCtrl::SetValue(int val)
     SetTextValue(val);
 
     m_btn->SetValue(val);
+    m_oldValue = val;
 }
 
 void wxSpinCtrl::SetValue(const wxString& text)