]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/carbon/slider.cpp
moved splines rendering code into wxDCBase
[wxWidgets.git] / src / mac / carbon / slider.cpp
index c9952342a968bc6f464811f2f05a047ee51d4028..05b29b696adb2240abdf004566d6fb949d3b708e 100644 (file)
@@ -14,6 +14,7 @@
 #endif
 
 #include "wx/slider.h"
+#include "wx/mac/uma.h"
 
 #if !USE_SHARED_LIBRARY
 IMPLEMENT_DYNAMIC_CLASS(wxSlider, wxControl)
@@ -34,6 +35,8 @@ wxSlider::wxSlider()
   m_tickFreq = 0;
 }
 
+extern ControlActionUPP wxMacLiveScrollbarActionUPP ;
+
 bool wxSlider::Create(wxWindow *parent, wxWindowID id,
            int value, int minValue, int maxValue,
            const wxPoint& pos,
@@ -41,28 +44,141 @@ bool wxSlider::Create(wxWindow *parent, wxWindowID id,
            const wxValidator& validator,
            const wxString& name)
 {
-    SetName(name);
-    SetValidator(validator);
-
-    if (parent) parent->AddChild(this);
-
-    m_lineSize = 1;
-    m_windowStyle = style;
-    m_tickFreq = 0;
-
-    if ( id == -1 )
-           m_windowId = (int)NewControlId();
-    else
-           m_windowId = id;
-
-    m_rangeMax = maxValue;
-    m_rangeMin = minValue;
-
-    m_pageSize = (int)((maxValue-minValue)/10);
-
-    // TODO create slider
+  Rect bounds ;
+  Str255 title ;
+  wxSize slsize;
+  int maxtextwidth, textheight;
+  
+  // Is control horizontal or vertical (Can be ambigous if user selects
+  // another style without also specifying horz or vert
+  if (!(style & wxSL_HORIZONTAL) && !(style & wxSL_VERTICAL)) {
+    // Default is horizontal so make it so
+    style |= wxSL_HORIZONTAL;
+  }
+  slsize = size;
+  // Check that size corresponds with users selection of vertical or
+  // horizontal slider and insert suitable default values
+  if (style & wxSL_HORIZONTAL) 
+    {
+      slsize.y = 15;      // Slider width
+      if (slsize.x == -1) {
+        slsize.x = 150;  // Slider default length
+      }
+    }
+  else
+    {
+      slsize.x = 15;      // Slider width
+      if (slsize.y == -1) {
+        slsize.y = 150;  // Slider default length
+      }
+    }
+  /* Set the height and width for the slider control region.  The actual 
+   * slider is set at 10 pixels across.  If the slider has labels then the
+   * control region must be large enough to contain these labels
+   */
+  if (style & wxSL_LABELS) 
+    {
+      wxString text;
+      int ht, wd;
+      
+      // Get maximum text label width and height
+      text.Printf("%d", minValue);
+      parent->GetTextExtent(text, &maxtextwidth, &textheight);
+      text.Printf("%d", maxValue);
+      parent->GetTextExtent(text, &wd, &ht);
+      if(ht > textheight) {
+        textheight = ht;
+      }
+      if (wd > maxtextwidth) {
+        maxtextwidth = wd;
+      }
+      
+      if (style & wxSL_VERTICAL) {
+        slsize.x = (15 + maxtextwidth + 2); // Slider wd plus mac text width
+      }
+      if (style & wxSL_HORIZONTAL) {
+        slsize.y = (15 + textheight);  // Slider ht plus text ht.
+      }
+    }
+  
+  MacPreControlCreate( parent , id ,  "" , pos , slsize , style,
+                      validator , name , &bounds , title ) ;
+  
+  m_macMinimumStatic = NULL ;
+  m_macMaximumStatic = NULL ;
+  m_macValueStatic = NULL ;
+  
+  m_lineSize = 1;
+  m_tickFreq = 0;
 
-    return FALSE;
+  m_rangeMax = maxValue;
+  m_rangeMin = minValue;
+
+  m_pageSize = (int)((maxValue-minValue)/10);
+  
+  // Must modify bounds to that of the slider dimensions from slider
+  // dimensions plus text labels.
+  if (style & wxSL_LABELS)
+    {
+      if ( style & wxSL_HORIZONTAL )
+       {
+         bounds.bottom = bounds.top + 15;
+          bounds.right -= (5 + maxtextwidth);
+       }
+      else  // Vertical slider
+       {
+          bounds.right = bounds.left + 15;
+          bounds.bottom -= (5 + textheight);
+       }
+    }
+  
+  m_macControl = UMANewControl( parent->GetMacRootWindow() , &bounds ,
+                               title , true ,  value , minValue , maxValue, 
+                               kControlSliderProc +  kControlSliderLiveFeedback + ( ( style & wxSL_AUTOTICKS ) ? kControlSliderHasTickMarks : 0 ) , (long) this ) ;
+  
+  wxASSERT_MSG( m_macControl != NULL , "No valid mac control" ) ;
+  
+  ::SetControlAction( m_macControl , wxMacLiveScrollbarActionUPP ) ;
+  
+  MacPostControlCreate() ;
+  
+  if ( style & wxSL_LABELS )
+    {
+      if ( style & wxSL_HORIZONTAL )
+       {
+         wxPoint leftpos( 0 , 15 ) ;
+         wxPoint rightpos( m_width - (maxtextwidth + 20) , 15 ) ;
+         wxPoint valuepos( m_width - maxtextwidth , 0 ) ;
+         wxString valuestring ;
+         
+         valuestring.Printf( "%d" , minValue ) ;
+         m_macMinimumStatic = new wxStaticText( this , -1 , valuestring , leftpos ) ;
+
+         valuestring.Printf( "%d" , maxValue ) ;
+         m_macMinimumStatic = new wxStaticText( this , -1 , valuestring , rightpos ) ;
+
+         valuestring.Printf( "%d" , value ) ;
+         m_macMinimumStatic = new wxStaticText( this , -1 , valuestring , valuepos ) ;
+       }
+      else // Vertical slider
+       {
+         wxPoint toppos( 17 , 0 ) ;
+         wxPoint bottompos( 17 , m_height - (textheight + 15) ) ;
+         wxPoint valuepos( 0 , m_height - textheight ) ;
+         wxString valuestring ;
+         
+         valuestring.Printf( "%d" , minValue ) ;
+         m_macMinimumStatic = new wxStaticText( this , -1 , valuestring , bottompos ) ;
+
+         valuestring.Printf( "%d" , maxValue ) ;
+         m_macMinimumStatic = new wxStaticText( this , -1 , valuestring , toppos ) ;
+
+         valuestring.Printf( "%d" , value ) ;
+         m_macMinimumStatic = new wxStaticText( this , -1 , valuestring , valuepos ) ;
+       }
+    }
+  
+  return true;
 }
 
 wxSlider::~wxSlider()
@@ -71,36 +187,38 @@ wxSlider::~wxSlider()
 
 int wxSlider::GetValue() const
 {
-    // TODO
-    return 0;
+       return GetControlValue( m_macControl) ;
 }
 
 void wxSlider::SetValue(int value)
 {
-    // TODO
-}
-
-void wxSlider::GetSize(int *width, int *height) const
-{
-    // TODO
-}
-
-void wxSlider::GetPosition(int *x, int *y) const
-{
-    // TODO
-}
-
-void wxSlider::SetSize(int x, int y, int width, int height, int sizeFlags)
-{
-    // TODO
+       wxString valuestring ;
+       valuestring.Printf( "%d" , value ) ;    
+       if ( m_macMinimumStatic )
+               m_macMinimumStatic->SetLabel( valuestring ) ;
+       SetControlValue( m_macControl , value ) ;
 }
 
 void wxSlider::SetRange(int minValue, int maxValue)
 {
-    m_rangeMin = minValue;
-    m_rangeMax = maxValue;
-
-    // TODO
+  wxString value;
+
+  m_rangeMin = minValue;
+  m_rangeMax = maxValue;
+
+  // TODO
+  SetControlMinimum(m_macControl, m_rangeMin);
+  SetControlMaximum(m_macControl, m_rangeMax);
+  
+  if(m_macMinimumStatic) {
+    value.Printf("%d", m_rangeMin);
+    m_macMinimumStatic->SetLabel(value);
+  }
+  if(m_macMaximumStatic) {
+    value.Printf("%d", m_rangeMax);
+    m_macMaximumStatic->SetLabel(value);
+  }
+  SetValue(m_rangeMin);
 }
 
 // For trackbars only
@@ -182,9 +300,32 @@ void wxSlider::Command (wxCommandEvent & event)
   ProcessCommand (event);
 }
 
-bool wxSlider::Show(bool show)
+bool wxSlider::Show( bool show ) 
 {
-    // TODO
-    return TRUE;
+       return wxWindow::Show( show ) ;
 }
 
+void wxSlider::MacHandleControlClick( ControlHandle control , SInt16 controlpart ) 
+{
+       SInt16 value = ::GetControlValue( m_macControl ) ;
+       
+       SetValue( value ) ;             
+       
+       wxScrollEvent event(wxEVT_SCROLL_THUMBTRACK, m_windowId);
+       event.SetPosition(GetControlValue( m_macControl) );
+       event.SetEventObject( this );
+
+#if WXWIN_COMPATIBILITY
+
+    wxEventType oldEvent = event.GetEventType();
+    event.SetEventType( wxEVT_COMMAND_SLIDER_UPDATED );
+    if ( !GetEventHandler()->ProcessEvent(event) )
+    {
+        event.SetEventType( oldEvent );
+        if (!GetParent()->GetEventHandler()->ProcessEvent(event))
+            event.Skip();
+    }
+#else
+       GetEventHandler()->ProcessEvent(event);
+#endif
+}