]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/control.cpp
Applied [ 590985 ] fix for radiobox under motif
[wxWidgets.git] / src / mac / control.cpp
index 945441b4ea1faaf4a93f026316af07de2b18df4e..fc90b8ea04ce697de35e424fc7a1f16ecafd05ec 100644 (file)
@@ -42,6 +42,7 @@ END_EVENT_TABLE()
 #endif
 
 #include "wx/mac/uma.h"
+#include "wx/mac/private.h"
 
 // Item members
 
@@ -118,7 +119,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 +417,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 +425,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 +440,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 +521,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 +639,7 @@ void  wxControl::DoSetSize(int x, int y,
  
           Refresh() ;
      }
+*/
 }
 
 bool  wxControl::Show(bool show) 
@@ -669,13 +695,27 @@ void wxControl::MacRedrawControl()
     {
         wxClientDC dc(this) ;
         wxMacPortSetter helper(&dc) ;
-        
-        // the controls sometimes draw outside their boundaries, this
-        // should be resolved differently but is not trivial (e.g. drop shadows)
-        // since adding them to the border would yield in enormous gaps between
-        // the controls
+/*
         Rect r = { 0 , 0 , 32000 , 32000 } ;
         ClipRect( &r ) ;
+*/
+        int x = 0 , y = 0;
+        wxWindow *parent = GetParent() ;
+        parent->MacWindowToRootWindow( &x,&y ) ;
+        RgnHandle clrgn = NewRgn() ;
+        RgnHandle insidergn = NewRgn() ;
+        wxSize size = parent->GetSize() ;
+        SetRectRgn( insidergn , parent->MacGetLeftBorderSize() , parent->MacGetTopBorderSize() , 
+         size.x - parent->MacGetLeftBorderSize() - parent->MacGetRightBorderSize(), 
+         size.y - parent->MacGetTopBorderSize() - parent->MacGetBottomBorderSize()) ;
+
+        CopyRgn( (RgnHandle) parent->MacGetVisibleRegion(false).GetWXHRGN() , clrgn ) ;
+               SectRgn( clrgn , insidergn , clrgn ) ;
+        OffsetRgn( clrgn , x , y ) ;
+        SetClip( clrgn ) ;
+               DisposeRgn( clrgn ) ;
+               DisposeRgn( insidergn ) ;
+
         wxDC::MacSetupBackgroundForCurrentPort( MacGetBackgroundBrush() ) ;
         UMADrawControl( (ControlHandle) m_macControl ) ;
     }
@@ -687,12 +727,27 @@ void wxControl::OnPaint(wxPaintEvent& event)
     {
         wxPaintDC dc(this) ;
         wxMacPortSetter helper(&dc) ;
-        // the controls sometimes draw outside their boundaries, this
-        // should be resolved differently but is not trivial (e.g. drop shadows)
-        // since adding them to the border would yield in enormous gaps between
-        // the controls
+/*
         Rect r = { 0 , 0 , 32000 , 32000 } ;
         ClipRect( &r ) ;
+*/
+
+        int x = 0 , y = 0;
+        wxWindow *parent = GetParent() ;
+        parent->MacWindowToRootWindow( &x,&y ) ;
+        RgnHandle clrgn = NewRgn() ;
+        RgnHandle insidergn = NewRgn() ;
+        wxSize size = parent->GetSize() ;
+        SetRectRgn( insidergn , parent->MacGetLeftBorderSize() , parent->MacGetTopBorderSize() , 
+         size.x - parent->MacGetLeftBorderSize() - parent->MacGetRightBorderSize(), 
+         size.y - parent->MacGetTopBorderSize() - parent->MacGetBottomBorderSize()) ;
+
+        CopyRgn( (RgnHandle) parent->MacGetVisibleRegion(false).GetWXHRGN() , clrgn ) ;
+               SectRgn( clrgn , insidergn , clrgn ) ;
+        OffsetRgn( clrgn , x , y ) ;
+        SetClip( clrgn ) ;
+               DisposeRgn( clrgn ) ;
+               DisposeRgn( insidergn ) ;
 
         wxDC::MacSetupBackgroundForCurrentPort( MacGetBackgroundBrush() ) ;
         UMADrawControl( (ControlHandle) m_macControl ) ;