]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/carbon/spinctrl.cpp
Compilo.
[wxWidgets.git] / src / mac / carbon / spinctrl.cpp
index 9e258d0e54eab6077c12f41c33a01a345294bfe8..3db287f0a86e675182f28f85876f6087fe3c66bc 100644 (file)
 
 #if wxUSE_SPINCTRL
 
-#include "wx/spinbutt.h"
+#include "wx/spinctrl.h"
 
 #ifndef WX_PRECOMP
     #include "wx/textctrl.h"
+    #include "wx/containr.h"
 #endif
 
-#include "wx/spinctrl.h"
-#include "wx/containr.h"
+#include "wx/spinbutt.h"
 
 // ----------------------------------------------------------------------------
 // constants
@@ -39,7 +39,7 @@ 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;
 
@@ -57,6 +57,43 @@ public:
     }
 
 protected:
+     void OnKillFocus(wxFocusEvent &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->GetEventHandler()->ProcessEvent(event);
+             
+             m_spin->m_oldValue = l;
+         } 
+    }
+   
     void OnTextChange(wxCommandEvent& event)
     {
         int val;
@@ -92,7 +129,8 @@ private:
 };
 
 BEGIN_EVENT_TABLE(wxSpinCtrlText, wxTextCtrl)
-    EVT_TEXT(-1, wxSpinCtrlText::OnTextChange)
+    EVT_TEXT(wxID_ANY, wxSpinCtrlText::OnTextChange)
+    EVT_KILL_FOCUS( wxSpinCtrlText::OnKillFocus)
 END_EVENT_TABLE()
 
 // ----------------------------------------------------------------------------
@@ -121,13 +159,16 @@ public:
 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(eventSpin.GetPosition());
+        wxCommandEvent event(wxEVT_COMMAND_SPINCTRL_UPDATED, m_spin->GetId());
+        event.SetEventObject(m_spin);
+        event.SetInt(pos);
 
-      m_spin->GetEventHandler()->ProcessEvent(event);
+        m_spin->GetEventHandler()->ProcessEvent(event);
+
+        m_spin->m_oldValue = pos;
     }
 
 private:
@@ -137,7 +178,7 @@ 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)
@@ -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)
 
 
 // ============================================================================
@@ -179,7 +220,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
@@ -199,12 +240,14 @@ bool wxSpinCtrl::Create(wxWindow *parent,
 
     m_btn->SetRange(min, max);
     m_btn->SetValue(initial);
+    // make it different
+    m_oldValue = GetMin()-1;
 
-    if ( size.x == -1 ){
+    if ( size.x == wxDefaultCoord ){
         csize.x = m_text->GetSize().x + MARGIN + m_btn->GetSize().x ;
     }
 
-    if ( size.y == -1 ) {
+    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 ;
@@ -295,13 +338,13 @@ 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;
@@ -348,6 +391,7 @@ void wxSpinCtrl::SetValue(int val)
     SetTextValue(val);
 
     m_btn->SetValue(val);
+    m_oldValue = val;
 }
 
 void wxSpinCtrl::SetValue(const wxString& text)