]> git.saurik.com Git - wxWidgets.git/commitdiff
corrected scrolling problems for controls, switched to separate wxSpinCtrl implementa...
authorStefan Csomor <csomor@advancedconcepts.ch>
Fri, 2 Aug 2002 15:46:45 +0000 (15:46 +0000)
committerStefan Csomor <csomor@advancedconcepts.ch>
Fri, 2 Aug 2002 15:46:45 +0000 (15:46 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@16352 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

src/mac/carbon/combobox.cpp
src/mac/carbon/control.cpp
src/mac/carbon/slider.cpp
src/mac/carbon/spinctrl.cpp
src/mac/carbon/window.cpp
src/mac/combobox.cpp
src/mac/control.cpp
src/mac/slider.cpp
src/mac/spinctrl.cpp
src/mac/window.cpp

index e67e1d9601b56859d03035a4fb9c7009450fdf87..4fa350e70970e8e776aec6bad0cfecb8e23b10a5 100644 (file)
@@ -51,7 +51,7 @@ class wxComboBoxText : public wxTextCtrl
 {
 public:
     wxComboBoxText( wxComboBox * cb )
-        : wxTextCtrl( cb->GetParent(), 1 )
+        : wxTextCtrl( cb , 1 )
     {
         m_cb = cb;
     }
@@ -81,7 +81,7 @@ class wxComboBoxChoice : public wxChoice
 {
 public:
     wxComboBoxChoice(wxComboBox *cb, int style)
-        : wxChoice( cb->GetParent(), 1 )
+        : wxChoice( cb , 1 )
     {
         m_cb = cb;
     }
@@ -145,13 +145,13 @@ void wxComboBox::DoMoveWindow(int x, int y, int width, int height) {
 
     if ( m_text == 0 )
     {
-        m_choice->SetSize(x, y, width, -1);
+        m_choice->SetSize(0, 0 , width, -1);
     }
     else
     {
         wxCoord wText = width - POPUPWIDTH;
-        m_text->SetSize(x, y, wText, height);
-        m_choice->SetSize(x + wText + MARGIN, y, POPUPWIDTH, -1);
+        m_text->SetSize(0, 0, wText, height);
+        m_choice->SetSize(0 + wText + MARGIN, 0, POPUPWIDTH, -1);
     }    
 }
 
@@ -166,13 +166,6 @@ bool wxComboBox::Enable(bool enable)
     if ( !wxControl::Enable(enable) )
         return FALSE;
 
-    m_choice->Enable(enable);
-    
-    if ( m_text != 0 )
-    {
-        m_text->Enable(enable);
-    }
-
     return TRUE;
 }
 
@@ -181,17 +174,6 @@ bool wxComboBox::Show(bool show)
     if ( !wxControl::Show(show) )
         return FALSE;
 
-    // under GTK Show() is called the first time before we are fully
-    // constructed
-    if ( m_choice )
-    {
-        m_choice->Show(show);
-        if ( m_text != 0 )
-        {
-            m_text->Show(show);
-        }
-    }
-
     return TRUE;
 }
 
@@ -224,13 +206,13 @@ bool wxComboBox::Create(wxWindow *parent, wxWindowID id,
     Rect bounds ;
     Str255 title ;
 
-    if ( !wxControl::Create(parent, id, pos, size, style,
+    if ( !wxControl::Create(parent, id, wxDefaultPosition, wxDefaultSize, style ,
                             wxDefaultValidator, name) )
     {
         return FALSE;
     }
 
-    m_choice = new wxComboBoxChoice(this, style);
+    m_choice = new wxComboBoxChoice(this, style );
 
     wxSize csize = size;
     if ( style & wxCB_READONLY )
@@ -246,21 +228,12 @@ bool wxComboBox::Create(wxWindow *parent, wxWindowID id,
     }
     
     DoSetSize(pos.x, pos.y, csize.x, csize.y);
+    
     for ( int i = 0 ; i < n ; i++ )
     {
         m_choice->DoAppend( choices[ i ] );
     }
 
-    // have to disable this window to avoid interfering it with message
-    // processing to the text and the button... but pretend it is enabled to
-    // make IsEnabled() return TRUE
-    wxControl::Enable(FALSE); // don't use non virtual Disable() here!
-    m_isEnabled = TRUE;
-
-    // we don't even need to show this window itself - and not doing it avoids
-    // that it overwrites the text control
-    wxControl::Show(FALSE);
-
     return TRUE;
 }
 
index 945441b4ea1faaf4a93f026316af07de2b18df4e..d416ffa799886aa5a738be5581ac69f6166ac2f7 100644 (file)
@@ -118,7 +118,13 @@ bool wxControl::Create(wxWindow *parent, wxWindowID id,
     m_macControl = NULL ;
     m_macHorizontalBorder = 0 ; // additional pixels around the real control
     m_macVerticalBorder = 0 ;
+    
     bool rval = wxWindow::Create(parent, id, pos, size, style, name);
+    if ( parent )
+    {
+        m_backgroundColour = parent->GetBackgroundColour() ;
+        m_foregroundColour = parent->GetForegroundColour() ;
+    }
     if (rval) {
 #if wxUSE_VALIDATORS
         SetValidator(validator);
@@ -410,7 +416,7 @@ void wxControl::MacAdjustControlRect()
             else
                 m_width = bestsize.right - bestsize.left ;
             
-            m_width += 2 * m_macHorizontalBorder ;
+            m_width += 2 * m_macHorizontalBorder + MacGetLeftBorderSize() + MacGetRightBorderSize() ;
         }
         if ( m_height == -1 )
         {
@@ -418,10 +424,10 @@ void wxControl::MacAdjustControlRect()
             if ( m_height < 10 )
                 m_height = 13 ;
 
-            m_height += 2 * m_macVerticalBorder;
+            m_height += 2 * m_macVerticalBorder + MacGetTopBorderSize() + MacGetBottomBorderSize() ;
         }
-        
-        UMASizeControl( (ControlHandle) m_macControl , m_width - 2 * m_macHorizontalBorder, m_height -  2 * m_macVerticalBorder ) ;
+               MacUpdateDimensions() ;      
+//        UMASizeControl( (ControlHandle) m_macControl , m_width - 2 * m_macHorizontalBorder, m_height -  2 * m_macVerticalBorder ) ;
     }
 }
 
@@ -433,35 +439,49 @@ WXWidget wxControl::MacGetContainerForEmbedding()
     return wxWindow::MacGetContainerForEmbedding() ;
 }
 
-void wxControl::MacSuperChangedPosition() 
+void wxControl::MacUpdateDimensions() 
 {
-    if ( (ControlHandle) m_macControl )
-    {
-        Rect contrlRect ;       
-        GetControlBounds( (ControlHandle) m_macControl , &contrlRect ) ; 
-        int former_mac_x = contrlRect.left ;
-        int former_mac_y = contrlRect.top ;
-        int mac_x = m_x ;
-        int mac_y = m_y ;
-        GetParent()->MacWindowToRootWindow( & mac_x , & mac_y ) ;
-        
-        WindowRef rootwindow = (WindowRef) MacGetRootWindow() ;
-
-        if ( mac_x + m_macHorizontalBorder != former_mac_x || 
-            mac_y + m_macVerticalBorder != former_mac_y )
-        {
-            {
-                Rect inval = { former_mac_y , former_mac_x , former_mac_y + m_height , former_mac_x + m_width } ;
-                InvalWindowRect( rootwindow , &inval ) ;
-            }
-            UMAMoveControl( (ControlHandle) m_macControl , mac_x + m_macHorizontalBorder , mac_y + m_macVerticalBorder ) ;
-            {
-                Rect inval = { mac_y , mac_x , mac_y + m_height , mac_x + m_width } ;
-                InvalWindowRect( rootwindow , &inval ) ;
-            }
-        }
-    }
+       // actually in the current systems this should never be possible, but later reparenting
+       // may become a reality
+       
+       if ( (ControlHandle) m_macControl == NULL )
+               return ;
+               
+       if ( GetParent() == NULL )
+               return ;
+               
+    WindowRef rootwindow = (WindowRef) MacGetRootWindow() ;
+    if ( rootwindow == NULL )
+       return ;
+       
+    Rect oldBounds ;       
+    GetControlBounds( (ControlHandle) m_macControl , &oldBounds ) ; 
+    
+    int new_x = m_x + MacGetLeftBorderSize() + m_macHorizontalBorder ;
+    int new_y = m_y + MacGetTopBorderSize() + m_macVerticalBorder ;
+    int new_width = m_width - MacGetLeftBorderSize() - MacGetRightBorderSize() - 2 * m_macHorizontalBorder ;
+    int new_height = m_height - MacGetTopBorderSize() - MacGetBottomBorderSize() - 2 * m_macVerticalBorder ;
+    
+    GetParent()->MacWindowToRootWindow( & new_x , & new_y ) ;
+    bool doMove = new_x != oldBounds.left || new_y != oldBounds.top ;
+    bool doResize =  ( oldBounds.right - oldBounds.left ) != new_width || (oldBounds.bottom - oldBounds.top ) != new_height ;
+       if ( doMove || doResize )
+       {
+               InvalWindowRect( rootwindow, &oldBounds ) ;
+               if ( doMove )
+               {
+                       UMAMoveControl( (ControlHandle) m_macControl , new_x , new_y ) ;
+               }
+               if ( doResize )
+               {
+                       UMASizeControl( (ControlHandle) m_macControl , new_width , new_height ) ;
+               }
+       }
+}
 
+void wxControl::MacSuperChangedPosition() 
+{
+       MacUpdateDimensions() ;
     wxWindow::MacSuperChangedPosition() ;
 }
 
@@ -500,6 +520,10 @@ void  wxControl::DoSetSize(int x, int y,
             int width, int height,
             int sizeFlags )
 {
+    wxWindow::DoSetSize( x , y ,width , height ,sizeFlags ) ;
+    return ;
+/*
+
     if ( (ControlHandle) m_macControl == NULL )
     {
         wxWindow::DoSetSize( x , y ,width , height ,sizeFlags ) ;
@@ -614,6 +638,7 @@ void  wxControl::DoSetSize(int x, int y,
  
           Refresh() ;
      }
+*/
 }
 
 bool  wxControl::Show(bool show) 
index f76b09fc6857e22c36db4c69a2b7b62b46735ba6..8dcae35279edadfa0781d1636bba03a895005915 100644 (file)
@@ -327,119 +327,30 @@ void wxSlider::MacHandleControlClick( WXWidget control , wxInt16 controlpart )
  
  void wxSlider::DoSetSize(int x, int y, int width, int height, int sizeFlags)
  {
-     Rect oldbounds, newbounds;
-     int new_x, new_y, new_width, new_height;
-     int mac_x, mac_y;
-     new_x = m_x;
-     new_y = m_y;
-     new_width  = m_width;
-     new_height = m_height;
-     if (sizeFlags & wxSIZE_ALLOW_MINUS_ONE)
-     {
-         new_x      = x;
-         new_y      = y;
-         new_width  = width;
-         new_height = height;
-     }
-     else
-     {
-         if (x != -1)      new_x      = x;
-         if (y != -1)      new_y      = y;
-         if (width != -1)  new_width  = width;
-         if (height != -1) new_height = height;
-     }
-     if(sizeFlags & wxSIZE_AUTO)
-     {
-         wxSize size = GetBestSize();
-         if (sizeFlags & wxSIZE_AUTO_WIDTH)
-         {
-             if (width == -1)   new_width = size.x;
-         }
-         if (sizeFlags & wxSIZE_AUTO_HEIGHT)
-         {
-             if (height == -1)   new_height = size.y;
-         }
-     }
-     AdjustForParentClientOrigin(new_x, new_y, sizeFlags);
-     mac_x = new_x;
-     mac_y = new_y;
-     if(GetParent()) {
-         GetParent()->MacClientToRootWindow(&mac_x, &mac_y);
-     }
-     GetControlBounds( (ControlHandle) m_macControl, &oldbounds);
-     oldbounds.right = oldbounds.left + m_width;
-     oldbounds.bottom = oldbounds.top + m_height;
-     bool doMove = false;
-     bool doResize = false;
-     if ( mac_x != oldbounds.left || mac_y != oldbounds.top )
-     {
-         doMove = true ;
-     }
-     if ( new_width != m_width || new_height != m_height )
-     {
-         doResize = true ;
-     }
-     if ( doMove || doResize )
-     {
-         // Ensure resize is within constraints
-         if ((m_minWidth != -1) && (new_width < m_minWidth)) {
-             new_width = m_minWidth;
-         }
-         if ((m_minHeight != -1) && (new_height < m_minHeight)) {
-             new_height = m_minHeight;
-         }
-         if ((m_maxWidth != -1) && (new_width > m_maxWidth)) {
-             new_width = m_maxWidth;
-         }
-         if ((m_maxHeight != -1) && (new_height > m_maxHeight)) {
-             new_height = m_maxHeight;
-         }
-         DoMoveWindow(new_x, new_y, new_width, new_height);
-         // Update window at old and new positions
-         SetRect(&newbounds, m_x, m_y, m_x + m_width, m_y + m_height);
-         WindowRef rootwindow = (WindowRef) MacGetRootWindow();
-         InvalWindowRect( rootwindow , &oldbounds );
-         InvalWindowRect( rootwindow , &newbounds );
-         if ( doMove )
-         {
-             wxMoveEvent event(wxPoint(m_x, m_y), m_windowId);
-             event.SetEventObject(this);
-             GetEventHandler()->ProcessEvent(event) ;
-         }
-         if ( doResize )
-         {
-             wxSizeEvent event(wxSize(m_width, m_height), m_windowId);
-             event.SetEventObject(this);
-             GetEventHandler()->ProcessEvent(event);
-         }
-     }
+    wxControl::DoSetSize( x, y , width , height ,sizeFlags ) ;
  }
  
- void wxSlider::DoMoveWindow(int x, int y, int width, int height)
- {
-     m_x = x;
-     m_y = y;
-     m_width  = width;
-     m_height = height;
+ void wxSlider::MacUpdateDimensions() 
+{
+       // actually in the current systems this should never be possible, but later reparenting
+       // may become a reality
+       
+       if ( (ControlHandle) m_macControl == NULL )
+               return ;
+               
+       if ( GetParent() == NULL )
+               return ;
+               
+    WindowRef rootwindow = (WindowRef) MacGetRootWindow() ;
+    if ( rootwindow == NULL )
+       return ;
+       
      int  xborder, yborder;
      int  minValWidth, maxValWidth, textwidth, textheight;
      int  sliderBreadth;
  
      xborder = yborder = 0;
+
      if (GetWindowStyle() & wxSL_LABELS)
      {
          wxString text;
@@ -469,22 +380,45 @@ void wxSlider::MacHandleControlClick( WXWidget control , wxInt16 controlpart )
          if(GetWindowStyle() & wxSL_VERTICAL)
          {
              m_macMinimumStatic->Move(sliderBreadth + wxSLIDER_BORDERTEXT,
-                                      height - yborder - textheight);
+                                      m_height - yborder - textheight);
              m_macMaximumStatic->Move(sliderBreadth + wxSLIDER_BORDERTEXT, 0);
-             m_macValueStatic->Move(0, height - textheight);
+             m_macValueStatic->Move(0, m_height - textheight);
          }
          else
          {
              m_macMinimumStatic->Move(0, sliderBreadth + wxSLIDER_BORDERTEXT);
-             m_macMaximumStatic->Move(width - xborder - maxValWidth / 2,
+             m_macMaximumStatic->Move(m_width - xborder - maxValWidth / 2,
                                       sliderBreadth + wxSLIDER_BORDERTEXT);
-             m_macValueStatic->Move(width - textwidth, 0);
+             m_macValueStatic->Move(m_width - textwidth, 0);
          }
      }
-     if(GetParent()) {
-         GetParent()->MacClientToRootWindow(&x, &y);
-     }
-     UMAMoveControl( (ControlHandle) m_macControl, x, y);
-     UMASizeControl( (ControlHandle) m_macControl, width - xborder, height - yborder);
+
+    Rect oldBounds ;       
+    GetControlBounds( (ControlHandle) m_macControl , &oldBounds ) ; 
+    
+    int new_x = m_x + MacGetLeftBorderSize() + m_macHorizontalBorder ;
+    int new_y = m_y + MacGetTopBorderSize() + m_macVerticalBorder ;
+    int new_width = m_width - MacGetLeftBorderSize() - MacGetRightBorderSize() - 2 * m_macHorizontalBorder - xborder ;
+    int new_height = m_height - MacGetTopBorderSize() - MacGetBottomBorderSize() - 2 * m_macVerticalBorder - yborder ;
+    
+    GetParent()->MacWindowToRootWindow( & new_x , & new_y ) ;
+    bool doMove = new_x != oldBounds.left || new_y != oldBounds.top ;
+    bool doResize =  ( oldBounds.right - oldBounds.left ) != new_width || (oldBounds.bottom - oldBounds.top ) != new_height ;
+       if ( doMove || doResize )
+       {
+               InvalWindowRect( rootwindow, &oldBounds ) ;
+               if ( doMove )
+               {
+                       UMAMoveControl( (ControlHandle) m_macControl , new_x , new_y ) ;
+               }
+               if ( doResize )
+               {
+                       UMASizeControl( (ControlHandle) m_macControl , new_width , new_height ) ;
+               }
+       }
+}
+
+ void wxSlider::DoMoveWindow(int x, int y, int width, int height)
+ {
+    wxControl::DoMoveWindow(x,y,width,height) ;
 }
\ No newline at end of file
index 272c0791f351eefd4919902012cdf8bb7769669b..a083c8a3c5418bfe281aeea205269a88bee7c10e 100644 (file)
 
 #include "wx/defs.h"
 
+#ifndef WX_PRECOMP
+    #include "wx/textctrl.h"
+#endif //WX_PRECOMP
+
 #if wxUSE_SPINCTRL
 
+#include "wx/spinbutt.h"
 #include "wx/spinctrl.h"
 
-#if 0
 
-// now using the generic impl
-//-----------------------------------------------------------------------------
-// wxSpinCtrl
-//-----------------------------------------------------------------------------
+#include "wx/spinctrl.h"
 
-#if wxUSE_SPINBTN && !defined(__WXMAC__)
+// ----------------------------------------------------------------------------
+// constants
+// ----------------------------------------------------------------------------
 
-#if !USE_SHARED_LIBRARY
-     IMPLEMENT_DYNAMIC_CLASS(wxSpinCtrl,wxControl)
-#endif
+// the margin between the text control and the spin
+static const wxCoord MARGIN = 2;
 
-#else // !wxUSE_SPINBTN
+// ----------------------------------------------------------------------------
+// wxSpinCtrlText: text control used by spin control
+// ----------------------------------------------------------------------------
 
-#if !USE_SHARED_LIBRARY
-     IMPLEMENT_DYNAMIC_CLASS(wxSpinCtrl,wxTextCtrl)
-#endif
+class wxSpinCtrlText : public wxTextCtrl
+{
+public:
+    wxSpinCtrlText(wxSpinCtrl *spin, const wxString& value)
+        : wxTextCtrl(spin , -1, value)
+    {
+        m_spin = spin;
+    }
+
+protected:
+    void OnTextChange(wxCommandEvent& event)
+    {
+        int val;
+        if ( m_spin->GetTextValue(&val) )
+        {
+            m_spin->GetSpinButton()->SetValue(val);
+        }
+
+        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;
+
+    DECLARE_EVENT_TABLE()
+};
+
+BEGIN_EVENT_TABLE(wxSpinCtrlText, wxTextCtrl)
+    EVT_TEXT(-1, wxSpinCtrlText::OnTextChange)
+END_EVENT_TABLE()
+
+// ----------------------------------------------------------------------------
+// wxSpinCtrlButton: spin button used by spin control
+// ----------------------------------------------------------------------------
+
+class wxSpinCtrlButton : public wxSpinButton
+{
+public:
+    wxSpinCtrlButton(wxSpinCtrl *spin, int style)
+        : wxSpinButton(spin )
+    {
+        m_spin = spin;
+
+        SetWindowStyle(style | wxSP_VERTICAL);
+    }
 
-#endif // wxUSE_SPINBTN/!wxUSE_SPINBTN
+protected:
+    void OnSpinButton(wxSpinEvent& eventSpin)
+    {
+#if defined(__WXMAC__) || defined(__WXMOTIF__)
+      m_spin->SetTextValue(eventSpin.GetPosition());
 
+      wxCommandEvent event(wxEVT_COMMAND_SPINCTRL_UPDATED, m_spin->GetId());
+      event.SetEventObject(m_spin);
+      event.SetInt(eventSpin.GetPosition());
+
+      m_spin->GetEventHandler()->ProcessEvent(event);
+#else
+        m_spin->SetTextValue(eventSpin.GetPosition());
+        eventSpin.Skip();
 #endif
+    }
+
+private:
+    wxSpinCtrl *m_spin;
+
+    DECLARE_EVENT_TABLE()
+};
+
+BEGIN_EVENT_TABLE(wxSpinCtrlButton, wxSpinButton)
+    EVT_SPIN(-1, wxSpinCtrlButton::OnSpinButton)
+END_EVENT_TABLE()
+
+IMPLEMENT_DYNAMIC_CLASS(wxSpinCtrl, wxControl)
+    
+// ============================================================================
+// implementation
+// ============================================================================
+
+// ----------------------------------------------------------------------------
+// wxSpinCtrl creation
+// ----------------------------------------------------------------------------
+
+void wxSpinCtrl::Init()
+{
+    m_text = NULL;
+    m_btn = NULL;
+}
+
+bool wxSpinCtrl::Create(wxWindow *parent,
+                        wxWindowID id,
+                        const wxString& value,
+                        const wxPoint& pos,
+                        const wxSize& size,
+                        long style,
+                        int min,
+                        int max,
+                        int initial,
+                        const wxString& name)
+{
+    if ( !wxControl::Create(parent, id, wxDefaultPosition, wxDefaultSize, style,
+                            wxDefaultValidator, name) )
+    {
+        return FALSE;
+    }
+
+    // the string value overrides the numeric one (for backwards compatibility
+    // reasons and also because it is simpler to satisfy the string value which
+    // comes much sooner in the list of arguments and leave the initial
+    // parameter unspecified)
+    if ( !value.empty() )
+    {
+        long l;
+        if ( value.ToLong(&l) )
+            initial = l;
+    }
+
+    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.y == -1 ) {
+      csize.y = m_text->GetSize().y ;
+    }
+    DoSetSize(pos.x , pos.y , csize.x, csize.y);
+
+    return TRUE;
+}
+
+wxSpinCtrl::~wxSpinCtrl()
+{
+    // delete the controls now, don't leave them alive even though they would
+    // still be eventually deleted by our parent - but it will be too late, the
+    // user code expects them to be gone now
+    delete m_text;
+    m_text = NULL ;
+    delete m_btn;
+    m_btn = NULL ;
+}
+
+// ----------------------------------------------------------------------------
+// geometry
+// ----------------------------------------------------------------------------
+
+wxSize wxSpinCtrl::DoGetBestSize() const
+{
+    wxSize sizeBtn = m_btn->GetBestSize(),
+           sizeText = m_text->GetBestSize();
+
+    return wxSize(sizeBtn.x + sizeText.x + MARGIN, sizeText.y);
+}
+
+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();
+
+    wxCoord wText = width - sizeBtn.x;
+    m_text->SetSize(0, 0, wText, height);
+    m_btn->SetSize(0 + wText + MARGIN, 0, -1, -1);
+}
+
+// ----------------------------------------------------------------------------
+// operations forwarded to the subcontrols
+// ----------------------------------------------------------------------------
+
+bool wxSpinCtrl::Enable(bool enable)
+{
+    if ( !wxControl::Enable(enable) )
+        return FALSE;
+    return TRUE;
+}
+
+bool wxSpinCtrl::Show(bool show)
+{
+    if ( !wxControl::Show(show) )
+        return FALSE;
+    return TRUE;
+}
+
+// ----------------------------------------------------------------------------
+// value and range access
+// ----------------------------------------------------------------------------
+
+bool wxSpinCtrl::GetTextValue(int *val) const
+{
+    long l;
+    if ( !m_text->GetValue().ToLong(&l) )
+    {
+        // not a number at all
+        return FALSE;
+    }
+
+    if ( l < GetMin() || l > GetMax() )
+    {
+        // out of range
+        return FALSE;
+    }
+
+    *val = l;
+
+    return TRUE;
+}
+
+int wxSpinCtrl::GetValue() const
+{
+    return m_btn ? m_btn->GetValue() : 0;
+}
+
+int wxSpinCtrl::GetMin() const
+{
+    return m_btn ? m_btn->GetMin() : 0;
+}
+
+int wxSpinCtrl::GetMax() const
+{
+    return m_btn ? m_btn->GetMax() : 0;
+}
+
+// ----------------------------------------------------------------------------
+// changing value and range
+// ----------------------------------------------------------------------------
+
+void wxSpinCtrl::SetTextValue(int val)
+{
+    wxCHECK_RET( m_text, _T("invalid call to wxSpinCtrl::SetTextValue") );
+
+    m_text->SetValue(wxString::Format(_T("%d"), val));
+
+    // select all text
+    m_text->SetSelection(0, -1);
+
+    // and give focus to the control!
+    // m_text->SetFocus();    Why???? TODO.
+}
+
+void wxSpinCtrl::SetValue(int val)
+{
+    wxCHECK_RET( m_btn, _T("invalid call to wxSpinCtrl::SetValue") );
+
+    SetTextValue(val);
+
+    m_btn->SetValue(val);
+}
+
+void wxSpinCtrl::SetValue(const wxString& text)
+{
+    wxCHECK_RET( m_text, _T("invalid call to wxSpinCtrl::SetValue") );
+
+    long val;
+    if ( text.ToLong(&val) && ((val > INT_MIN) && (val < INT_MAX)) )
+    {
+        SetValue((int)val);
+    }
+    else // not a number at all or out of range
+    {
+        m_text->SetValue(text);
+        m_text->SetSelection(0, -1);
+    }
+}
+
+void wxSpinCtrl::SetRange(int min, int max)
+{
+    wxCHECK_RET( m_btn, _T("invalid call to wxSpinCtrl::SetRange") );
 
-#endif   // wxUSE_SPINCTRL
+    m_btn->SetRange(min, max);
+}
 
+#endif // wxUSE_SPINCTRL
index 868a2c03c58a1bee553f0de1180e105526ca9d3c..143edf6c1e2bd021009a5bca591529cc91cf7143 100644 (file)
@@ -594,6 +594,9 @@ void wxWindowMac::DoMoveWindow(int x, int y, int width, int height)
         m_width = actualWidth ;
         m_height = actualHeight ;
 
+               // update any low-level frame-relative positions
+
+               MacUpdateDimensions() ;
         // erase new position
 
         Refresh() ;
@@ -1195,6 +1198,7 @@ void wxWindowMac::ScrollWindow(int dx, int dy, const wxRect *rect)
         if (child == m_vScrollBar) continue;
         if (child == m_hScrollBar) continue;
         if (child->IsTopLevel()) continue;
+        
         int x,y;
         child->GetPosition( &x, &y );
         int w,h;
@@ -1437,7 +1441,7 @@ bool wxWindowMac::MacDispatchMouseEvent(wxMouseEvent& event)
         return FALSE;
 
 
-    if ( IsKindOf( CLASSINFO ( wxStaticBox ) ) || IsKindOf( CLASSINFO( wxSpinCtrl ) ))
+    if ( IsKindOf( CLASSINFO ( wxStaticBox ) ) /* || IsKindOf( CLASSINFO( wxSpinCtrl ) ) */)
         return FALSE ;
 
     WindowRef window = (WindowRef) MacGetRootWindow() ;
index e67e1d9601b56859d03035a4fb9c7009450fdf87..4fa350e70970e8e776aec6bad0cfecb8e23b10a5 100644 (file)
@@ -51,7 +51,7 @@ class wxComboBoxText : public wxTextCtrl
 {
 public:
     wxComboBoxText( wxComboBox * cb )
-        : wxTextCtrl( cb->GetParent(), 1 )
+        : wxTextCtrl( cb , 1 )
     {
         m_cb = cb;
     }
@@ -81,7 +81,7 @@ class wxComboBoxChoice : public wxChoice
 {
 public:
     wxComboBoxChoice(wxComboBox *cb, int style)
-        : wxChoice( cb->GetParent(), 1 )
+        : wxChoice( cb , 1 )
     {
         m_cb = cb;
     }
@@ -145,13 +145,13 @@ void wxComboBox::DoMoveWindow(int x, int y, int width, int height) {
 
     if ( m_text == 0 )
     {
-        m_choice->SetSize(x, y, width, -1);
+        m_choice->SetSize(0, 0 , width, -1);
     }
     else
     {
         wxCoord wText = width - POPUPWIDTH;
-        m_text->SetSize(x, y, wText, height);
-        m_choice->SetSize(x + wText + MARGIN, y, POPUPWIDTH, -1);
+        m_text->SetSize(0, 0, wText, height);
+        m_choice->SetSize(0 + wText + MARGIN, 0, POPUPWIDTH, -1);
     }    
 }
 
@@ -166,13 +166,6 @@ bool wxComboBox::Enable(bool enable)
     if ( !wxControl::Enable(enable) )
         return FALSE;
 
-    m_choice->Enable(enable);
-    
-    if ( m_text != 0 )
-    {
-        m_text->Enable(enable);
-    }
-
     return TRUE;
 }
 
@@ -181,17 +174,6 @@ bool wxComboBox::Show(bool show)
     if ( !wxControl::Show(show) )
         return FALSE;
 
-    // under GTK Show() is called the first time before we are fully
-    // constructed
-    if ( m_choice )
-    {
-        m_choice->Show(show);
-        if ( m_text != 0 )
-        {
-            m_text->Show(show);
-        }
-    }
-
     return TRUE;
 }
 
@@ -224,13 +206,13 @@ bool wxComboBox::Create(wxWindow *parent, wxWindowID id,
     Rect bounds ;
     Str255 title ;
 
-    if ( !wxControl::Create(parent, id, pos, size, style,
+    if ( !wxControl::Create(parent, id, wxDefaultPosition, wxDefaultSize, style ,
                             wxDefaultValidator, name) )
     {
         return FALSE;
     }
 
-    m_choice = new wxComboBoxChoice(this, style);
+    m_choice = new wxComboBoxChoice(this, style );
 
     wxSize csize = size;
     if ( style & wxCB_READONLY )
@@ -246,21 +228,12 @@ bool wxComboBox::Create(wxWindow *parent, wxWindowID id,
     }
     
     DoSetSize(pos.x, pos.y, csize.x, csize.y);
+    
     for ( int i = 0 ; i < n ; i++ )
     {
         m_choice->DoAppend( choices[ i ] );
     }
 
-    // have to disable this window to avoid interfering it with message
-    // processing to the text and the button... but pretend it is enabled to
-    // make IsEnabled() return TRUE
-    wxControl::Enable(FALSE); // don't use non virtual Disable() here!
-    m_isEnabled = TRUE;
-
-    // we don't even need to show this window itself - and not doing it avoids
-    // that it overwrites the text control
-    wxControl::Show(FALSE);
-
     return TRUE;
 }
 
index 945441b4ea1faaf4a93f026316af07de2b18df4e..d416ffa799886aa5a738be5581ac69f6166ac2f7 100644 (file)
@@ -118,7 +118,13 @@ bool wxControl::Create(wxWindow *parent, wxWindowID id,
     m_macControl = NULL ;
     m_macHorizontalBorder = 0 ; // additional pixels around the real control
     m_macVerticalBorder = 0 ;
+    
     bool rval = wxWindow::Create(parent, id, pos, size, style, name);
+    if ( parent )
+    {
+        m_backgroundColour = parent->GetBackgroundColour() ;
+        m_foregroundColour = parent->GetForegroundColour() ;
+    }
     if (rval) {
 #if wxUSE_VALIDATORS
         SetValidator(validator);
@@ -410,7 +416,7 @@ void wxControl::MacAdjustControlRect()
             else
                 m_width = bestsize.right - bestsize.left ;
             
-            m_width += 2 * m_macHorizontalBorder ;
+            m_width += 2 * m_macHorizontalBorder + MacGetLeftBorderSize() + MacGetRightBorderSize() ;
         }
         if ( m_height == -1 )
         {
@@ -418,10 +424,10 @@ void wxControl::MacAdjustControlRect()
             if ( m_height < 10 )
                 m_height = 13 ;
 
-            m_height += 2 * m_macVerticalBorder;
+            m_height += 2 * m_macVerticalBorder + MacGetTopBorderSize() + MacGetBottomBorderSize() ;
         }
-        
-        UMASizeControl( (ControlHandle) m_macControl , m_width - 2 * m_macHorizontalBorder, m_height -  2 * m_macVerticalBorder ) ;
+               MacUpdateDimensions() ;      
+//        UMASizeControl( (ControlHandle) m_macControl , m_width - 2 * m_macHorizontalBorder, m_height -  2 * m_macVerticalBorder ) ;
     }
 }
 
@@ -433,35 +439,49 @@ WXWidget wxControl::MacGetContainerForEmbedding()
     return wxWindow::MacGetContainerForEmbedding() ;
 }
 
-void wxControl::MacSuperChangedPosition() 
+void wxControl::MacUpdateDimensions() 
 {
-    if ( (ControlHandle) m_macControl )
-    {
-        Rect contrlRect ;       
-        GetControlBounds( (ControlHandle) m_macControl , &contrlRect ) ; 
-        int former_mac_x = contrlRect.left ;
-        int former_mac_y = contrlRect.top ;
-        int mac_x = m_x ;
-        int mac_y = m_y ;
-        GetParent()->MacWindowToRootWindow( & mac_x , & mac_y ) ;
-        
-        WindowRef rootwindow = (WindowRef) MacGetRootWindow() ;
-
-        if ( mac_x + m_macHorizontalBorder != former_mac_x || 
-            mac_y + m_macVerticalBorder != former_mac_y )
-        {
-            {
-                Rect inval = { former_mac_y , former_mac_x , former_mac_y + m_height , former_mac_x + m_width } ;
-                InvalWindowRect( rootwindow , &inval ) ;
-            }
-            UMAMoveControl( (ControlHandle) m_macControl , mac_x + m_macHorizontalBorder , mac_y + m_macVerticalBorder ) ;
-            {
-                Rect inval = { mac_y , mac_x , mac_y + m_height , mac_x + m_width } ;
-                InvalWindowRect( rootwindow , &inval ) ;
-            }
-        }
-    }
+       // actually in the current systems this should never be possible, but later reparenting
+       // may become a reality
+       
+       if ( (ControlHandle) m_macControl == NULL )
+               return ;
+               
+       if ( GetParent() == NULL )
+               return ;
+               
+    WindowRef rootwindow = (WindowRef) MacGetRootWindow() ;
+    if ( rootwindow == NULL )
+       return ;
+       
+    Rect oldBounds ;       
+    GetControlBounds( (ControlHandle) m_macControl , &oldBounds ) ; 
+    
+    int new_x = m_x + MacGetLeftBorderSize() + m_macHorizontalBorder ;
+    int new_y = m_y + MacGetTopBorderSize() + m_macVerticalBorder ;
+    int new_width = m_width - MacGetLeftBorderSize() - MacGetRightBorderSize() - 2 * m_macHorizontalBorder ;
+    int new_height = m_height - MacGetTopBorderSize() - MacGetBottomBorderSize() - 2 * m_macVerticalBorder ;
+    
+    GetParent()->MacWindowToRootWindow( & new_x , & new_y ) ;
+    bool doMove = new_x != oldBounds.left || new_y != oldBounds.top ;
+    bool doResize =  ( oldBounds.right - oldBounds.left ) != new_width || (oldBounds.bottom - oldBounds.top ) != new_height ;
+       if ( doMove || doResize )
+       {
+               InvalWindowRect( rootwindow, &oldBounds ) ;
+               if ( doMove )
+               {
+                       UMAMoveControl( (ControlHandle) m_macControl , new_x , new_y ) ;
+               }
+               if ( doResize )
+               {
+                       UMASizeControl( (ControlHandle) m_macControl , new_width , new_height ) ;
+               }
+       }
+}
 
+void wxControl::MacSuperChangedPosition() 
+{
+       MacUpdateDimensions() ;
     wxWindow::MacSuperChangedPosition() ;
 }
 
@@ -500,6 +520,10 @@ void  wxControl::DoSetSize(int x, int y,
             int width, int height,
             int sizeFlags )
 {
+    wxWindow::DoSetSize( x , y ,width , height ,sizeFlags ) ;
+    return ;
+/*
+
     if ( (ControlHandle) m_macControl == NULL )
     {
         wxWindow::DoSetSize( x , y ,width , height ,sizeFlags ) ;
@@ -614,6 +638,7 @@ void  wxControl::DoSetSize(int x, int y,
  
           Refresh() ;
      }
+*/
 }
 
 bool  wxControl::Show(bool show) 
index f76b09fc6857e22c36db4c69a2b7b62b46735ba6..8dcae35279edadfa0781d1636bba03a895005915 100644 (file)
@@ -327,119 +327,30 @@ void wxSlider::MacHandleControlClick( WXWidget control , wxInt16 controlpart )
  
  void wxSlider::DoSetSize(int x, int y, int width, int height, int sizeFlags)
  {
-     Rect oldbounds, newbounds;
-     int new_x, new_y, new_width, new_height;
-     int mac_x, mac_y;
-     new_x = m_x;
-     new_y = m_y;
-     new_width  = m_width;
-     new_height = m_height;
-     if (sizeFlags & wxSIZE_ALLOW_MINUS_ONE)
-     {
-         new_x      = x;
-         new_y      = y;
-         new_width  = width;
-         new_height = height;
-     }
-     else
-     {
-         if (x != -1)      new_x      = x;
-         if (y != -1)      new_y      = y;
-         if (width != -1)  new_width  = width;
-         if (height != -1) new_height = height;
-     }
-     if(sizeFlags & wxSIZE_AUTO)
-     {
-         wxSize size = GetBestSize();
-         if (sizeFlags & wxSIZE_AUTO_WIDTH)
-         {
-             if (width == -1)   new_width = size.x;
-         }
-         if (sizeFlags & wxSIZE_AUTO_HEIGHT)
-         {
-             if (height == -1)   new_height = size.y;
-         }
-     }
-     AdjustForParentClientOrigin(new_x, new_y, sizeFlags);
-     mac_x = new_x;
-     mac_y = new_y;
-     if(GetParent()) {
-         GetParent()->MacClientToRootWindow(&mac_x, &mac_y);
-     }
-     GetControlBounds( (ControlHandle) m_macControl, &oldbounds);
-     oldbounds.right = oldbounds.left + m_width;
-     oldbounds.bottom = oldbounds.top + m_height;
-     bool doMove = false;
-     bool doResize = false;
-     if ( mac_x != oldbounds.left || mac_y != oldbounds.top )
-     {
-         doMove = true ;
-     }
-     if ( new_width != m_width || new_height != m_height )
-     {
-         doResize = true ;
-     }
-     if ( doMove || doResize )
-     {
-         // Ensure resize is within constraints
-         if ((m_minWidth != -1) && (new_width < m_minWidth)) {
-             new_width = m_minWidth;
-         }
-         if ((m_minHeight != -1) && (new_height < m_minHeight)) {
-             new_height = m_minHeight;
-         }
-         if ((m_maxWidth != -1) && (new_width > m_maxWidth)) {
-             new_width = m_maxWidth;
-         }
-         if ((m_maxHeight != -1) && (new_height > m_maxHeight)) {
-             new_height = m_maxHeight;
-         }
-         DoMoveWindow(new_x, new_y, new_width, new_height);
-         // Update window at old and new positions
-         SetRect(&newbounds, m_x, m_y, m_x + m_width, m_y + m_height);
-         WindowRef rootwindow = (WindowRef) MacGetRootWindow();
-         InvalWindowRect( rootwindow , &oldbounds );
-         InvalWindowRect( rootwindow , &newbounds );
-         if ( doMove )
-         {
-             wxMoveEvent event(wxPoint(m_x, m_y), m_windowId);
-             event.SetEventObject(this);
-             GetEventHandler()->ProcessEvent(event) ;
-         }
-         if ( doResize )
-         {
-             wxSizeEvent event(wxSize(m_width, m_height), m_windowId);
-             event.SetEventObject(this);
-             GetEventHandler()->ProcessEvent(event);
-         }
-     }
+    wxControl::DoSetSize( x, y , width , height ,sizeFlags ) ;
  }
  
- void wxSlider::DoMoveWindow(int x, int y, int width, int height)
- {
-     m_x = x;
-     m_y = y;
-     m_width  = width;
-     m_height = height;
+ void wxSlider::MacUpdateDimensions() 
+{
+       // actually in the current systems this should never be possible, but later reparenting
+       // may become a reality
+       
+       if ( (ControlHandle) m_macControl == NULL )
+               return ;
+               
+       if ( GetParent() == NULL )
+               return ;
+               
+    WindowRef rootwindow = (WindowRef) MacGetRootWindow() ;
+    if ( rootwindow == NULL )
+       return ;
+       
      int  xborder, yborder;
      int  minValWidth, maxValWidth, textwidth, textheight;
      int  sliderBreadth;
  
      xborder = yborder = 0;
+
      if (GetWindowStyle() & wxSL_LABELS)
      {
          wxString text;
@@ -469,22 +380,45 @@ void wxSlider::MacHandleControlClick( WXWidget control , wxInt16 controlpart )
          if(GetWindowStyle() & wxSL_VERTICAL)
          {
              m_macMinimumStatic->Move(sliderBreadth + wxSLIDER_BORDERTEXT,
-                                      height - yborder - textheight);
+                                      m_height - yborder - textheight);
              m_macMaximumStatic->Move(sliderBreadth + wxSLIDER_BORDERTEXT, 0);
-             m_macValueStatic->Move(0, height - textheight);
+             m_macValueStatic->Move(0, m_height - textheight);
          }
          else
          {
              m_macMinimumStatic->Move(0, sliderBreadth + wxSLIDER_BORDERTEXT);
-             m_macMaximumStatic->Move(width - xborder - maxValWidth / 2,
+             m_macMaximumStatic->Move(m_width - xborder - maxValWidth / 2,
                                       sliderBreadth + wxSLIDER_BORDERTEXT);
-             m_macValueStatic->Move(width - textwidth, 0);
+             m_macValueStatic->Move(m_width - textwidth, 0);
          }
      }
-     if(GetParent()) {
-         GetParent()->MacClientToRootWindow(&x, &y);
-     }
-     UMAMoveControl( (ControlHandle) m_macControl, x, y);
-     UMASizeControl( (ControlHandle) m_macControl, width - xborder, height - yborder);
+
+    Rect oldBounds ;       
+    GetControlBounds( (ControlHandle) m_macControl , &oldBounds ) ; 
+    
+    int new_x = m_x + MacGetLeftBorderSize() + m_macHorizontalBorder ;
+    int new_y = m_y + MacGetTopBorderSize() + m_macVerticalBorder ;
+    int new_width = m_width - MacGetLeftBorderSize() - MacGetRightBorderSize() - 2 * m_macHorizontalBorder - xborder ;
+    int new_height = m_height - MacGetTopBorderSize() - MacGetBottomBorderSize() - 2 * m_macVerticalBorder - yborder ;
+    
+    GetParent()->MacWindowToRootWindow( & new_x , & new_y ) ;
+    bool doMove = new_x != oldBounds.left || new_y != oldBounds.top ;
+    bool doResize =  ( oldBounds.right - oldBounds.left ) != new_width || (oldBounds.bottom - oldBounds.top ) != new_height ;
+       if ( doMove || doResize )
+       {
+               InvalWindowRect( rootwindow, &oldBounds ) ;
+               if ( doMove )
+               {
+                       UMAMoveControl( (ControlHandle) m_macControl , new_x , new_y ) ;
+               }
+               if ( doResize )
+               {
+                       UMASizeControl( (ControlHandle) m_macControl , new_width , new_height ) ;
+               }
+       }
+}
+
+ void wxSlider::DoMoveWindow(int x, int y, int width, int height)
+ {
+    wxControl::DoMoveWindow(x,y,width,height) ;
 }
\ No newline at end of file
index 272c0791f351eefd4919902012cdf8bb7769669b..a083c8a3c5418bfe281aeea205269a88bee7c10e 100644 (file)
 
 #include "wx/defs.h"
 
+#ifndef WX_PRECOMP
+    #include "wx/textctrl.h"
+#endif //WX_PRECOMP
+
 #if wxUSE_SPINCTRL
 
+#include "wx/spinbutt.h"
 #include "wx/spinctrl.h"
 
-#if 0
 
-// now using the generic impl
-//-----------------------------------------------------------------------------
-// wxSpinCtrl
-//-----------------------------------------------------------------------------
+#include "wx/spinctrl.h"
 
-#if wxUSE_SPINBTN && !defined(__WXMAC__)
+// ----------------------------------------------------------------------------
+// constants
+// ----------------------------------------------------------------------------
 
-#if !USE_SHARED_LIBRARY
-     IMPLEMENT_DYNAMIC_CLASS(wxSpinCtrl,wxControl)
-#endif
+// the margin between the text control and the spin
+static const wxCoord MARGIN = 2;
 
-#else // !wxUSE_SPINBTN
+// ----------------------------------------------------------------------------
+// wxSpinCtrlText: text control used by spin control
+// ----------------------------------------------------------------------------
 
-#if !USE_SHARED_LIBRARY
-     IMPLEMENT_DYNAMIC_CLASS(wxSpinCtrl,wxTextCtrl)
-#endif
+class wxSpinCtrlText : public wxTextCtrl
+{
+public:
+    wxSpinCtrlText(wxSpinCtrl *spin, const wxString& value)
+        : wxTextCtrl(spin , -1, value)
+    {
+        m_spin = spin;
+    }
+
+protected:
+    void OnTextChange(wxCommandEvent& event)
+    {
+        int val;
+        if ( m_spin->GetTextValue(&val) )
+        {
+            m_spin->GetSpinButton()->SetValue(val);
+        }
+
+        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;
+
+    DECLARE_EVENT_TABLE()
+};
+
+BEGIN_EVENT_TABLE(wxSpinCtrlText, wxTextCtrl)
+    EVT_TEXT(-1, wxSpinCtrlText::OnTextChange)
+END_EVENT_TABLE()
+
+// ----------------------------------------------------------------------------
+// wxSpinCtrlButton: spin button used by spin control
+// ----------------------------------------------------------------------------
+
+class wxSpinCtrlButton : public wxSpinButton
+{
+public:
+    wxSpinCtrlButton(wxSpinCtrl *spin, int style)
+        : wxSpinButton(spin )
+    {
+        m_spin = spin;
+
+        SetWindowStyle(style | wxSP_VERTICAL);
+    }
 
-#endif // wxUSE_SPINBTN/!wxUSE_SPINBTN
+protected:
+    void OnSpinButton(wxSpinEvent& eventSpin)
+    {
+#if defined(__WXMAC__) || defined(__WXMOTIF__)
+      m_spin->SetTextValue(eventSpin.GetPosition());
 
+      wxCommandEvent event(wxEVT_COMMAND_SPINCTRL_UPDATED, m_spin->GetId());
+      event.SetEventObject(m_spin);
+      event.SetInt(eventSpin.GetPosition());
+
+      m_spin->GetEventHandler()->ProcessEvent(event);
+#else
+        m_spin->SetTextValue(eventSpin.GetPosition());
+        eventSpin.Skip();
 #endif
+    }
+
+private:
+    wxSpinCtrl *m_spin;
+
+    DECLARE_EVENT_TABLE()
+};
+
+BEGIN_EVENT_TABLE(wxSpinCtrlButton, wxSpinButton)
+    EVT_SPIN(-1, wxSpinCtrlButton::OnSpinButton)
+END_EVENT_TABLE()
+
+IMPLEMENT_DYNAMIC_CLASS(wxSpinCtrl, wxControl)
+    
+// ============================================================================
+// implementation
+// ============================================================================
+
+// ----------------------------------------------------------------------------
+// wxSpinCtrl creation
+// ----------------------------------------------------------------------------
+
+void wxSpinCtrl::Init()
+{
+    m_text = NULL;
+    m_btn = NULL;
+}
+
+bool wxSpinCtrl::Create(wxWindow *parent,
+                        wxWindowID id,
+                        const wxString& value,
+                        const wxPoint& pos,
+                        const wxSize& size,
+                        long style,
+                        int min,
+                        int max,
+                        int initial,
+                        const wxString& name)
+{
+    if ( !wxControl::Create(parent, id, wxDefaultPosition, wxDefaultSize, style,
+                            wxDefaultValidator, name) )
+    {
+        return FALSE;
+    }
+
+    // the string value overrides the numeric one (for backwards compatibility
+    // reasons and also because it is simpler to satisfy the string value which
+    // comes much sooner in the list of arguments and leave the initial
+    // parameter unspecified)
+    if ( !value.empty() )
+    {
+        long l;
+        if ( value.ToLong(&l) )
+            initial = l;
+    }
+
+    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.y == -1 ) {
+      csize.y = m_text->GetSize().y ;
+    }
+    DoSetSize(pos.x , pos.y , csize.x, csize.y);
+
+    return TRUE;
+}
+
+wxSpinCtrl::~wxSpinCtrl()
+{
+    // delete the controls now, don't leave them alive even though they would
+    // still be eventually deleted by our parent - but it will be too late, the
+    // user code expects them to be gone now
+    delete m_text;
+    m_text = NULL ;
+    delete m_btn;
+    m_btn = NULL ;
+}
+
+// ----------------------------------------------------------------------------
+// geometry
+// ----------------------------------------------------------------------------
+
+wxSize wxSpinCtrl::DoGetBestSize() const
+{
+    wxSize sizeBtn = m_btn->GetBestSize(),
+           sizeText = m_text->GetBestSize();
+
+    return wxSize(sizeBtn.x + sizeText.x + MARGIN, sizeText.y);
+}
+
+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();
+
+    wxCoord wText = width - sizeBtn.x;
+    m_text->SetSize(0, 0, wText, height);
+    m_btn->SetSize(0 + wText + MARGIN, 0, -1, -1);
+}
+
+// ----------------------------------------------------------------------------
+// operations forwarded to the subcontrols
+// ----------------------------------------------------------------------------
+
+bool wxSpinCtrl::Enable(bool enable)
+{
+    if ( !wxControl::Enable(enable) )
+        return FALSE;
+    return TRUE;
+}
+
+bool wxSpinCtrl::Show(bool show)
+{
+    if ( !wxControl::Show(show) )
+        return FALSE;
+    return TRUE;
+}
+
+// ----------------------------------------------------------------------------
+// value and range access
+// ----------------------------------------------------------------------------
+
+bool wxSpinCtrl::GetTextValue(int *val) const
+{
+    long l;
+    if ( !m_text->GetValue().ToLong(&l) )
+    {
+        // not a number at all
+        return FALSE;
+    }
+
+    if ( l < GetMin() || l > GetMax() )
+    {
+        // out of range
+        return FALSE;
+    }
+
+    *val = l;
+
+    return TRUE;
+}
+
+int wxSpinCtrl::GetValue() const
+{
+    return m_btn ? m_btn->GetValue() : 0;
+}
+
+int wxSpinCtrl::GetMin() const
+{
+    return m_btn ? m_btn->GetMin() : 0;
+}
+
+int wxSpinCtrl::GetMax() const
+{
+    return m_btn ? m_btn->GetMax() : 0;
+}
+
+// ----------------------------------------------------------------------------
+// changing value and range
+// ----------------------------------------------------------------------------
+
+void wxSpinCtrl::SetTextValue(int val)
+{
+    wxCHECK_RET( m_text, _T("invalid call to wxSpinCtrl::SetTextValue") );
+
+    m_text->SetValue(wxString::Format(_T("%d"), val));
+
+    // select all text
+    m_text->SetSelection(0, -1);
+
+    // and give focus to the control!
+    // m_text->SetFocus();    Why???? TODO.
+}
+
+void wxSpinCtrl::SetValue(int val)
+{
+    wxCHECK_RET( m_btn, _T("invalid call to wxSpinCtrl::SetValue") );
+
+    SetTextValue(val);
+
+    m_btn->SetValue(val);
+}
+
+void wxSpinCtrl::SetValue(const wxString& text)
+{
+    wxCHECK_RET( m_text, _T("invalid call to wxSpinCtrl::SetValue") );
+
+    long val;
+    if ( text.ToLong(&val) && ((val > INT_MIN) && (val < INT_MAX)) )
+    {
+        SetValue((int)val);
+    }
+    else // not a number at all or out of range
+    {
+        m_text->SetValue(text);
+        m_text->SetSelection(0, -1);
+    }
+}
+
+void wxSpinCtrl::SetRange(int min, int max)
+{
+    wxCHECK_RET( m_btn, _T("invalid call to wxSpinCtrl::SetRange") );
 
-#endif   // wxUSE_SPINCTRL
+    m_btn->SetRange(min, max);
+}
 
+#endif // wxUSE_SPINCTRL
index 868a2c03c58a1bee553f0de1180e105526ca9d3c..143edf6c1e2bd021009a5bca591529cc91cf7143 100644 (file)
@@ -594,6 +594,9 @@ void wxWindowMac::DoMoveWindow(int x, int y, int width, int height)
         m_width = actualWidth ;
         m_height = actualHeight ;
 
+               // update any low-level frame-relative positions
+
+               MacUpdateDimensions() ;
         // erase new position
 
         Refresh() ;
@@ -1195,6 +1198,7 @@ void wxWindowMac::ScrollWindow(int dx, int dy, const wxRect *rect)
         if (child == m_vScrollBar) continue;
         if (child == m_hScrollBar) continue;
         if (child->IsTopLevel()) continue;
+        
         int x,y;
         child->GetPosition( &x, &y );
         int w,h;
@@ -1437,7 +1441,7 @@ bool wxWindowMac::MacDispatchMouseEvent(wxMouseEvent& event)
         return FALSE;
 
 
-    if ( IsKindOf( CLASSINFO ( wxStaticBox ) ) || IsKindOf( CLASSINFO( wxSpinCtrl ) ))
+    if ( IsKindOf( CLASSINFO ( wxStaticBox ) ) /* || IsKindOf( CLASSINFO( wxSpinCtrl ) ) */)
         return FALSE ;
 
     WindowRef window = (WindowRef) MacGetRootWindow() ;