]> git.saurik.com Git - wxWidgets.git/blobdiff - src/osx/window_osx.cpp
wxSplitterWindow mouse capture improvements and cleanup.
[wxWidgets.git] / src / osx / window_osx.cpp
index fb1040f88d717c074da16d8de3a8fe79577ad066..42c94ae66048d011bb973f4c18d3271dd01b30cf 100644 (file)
 #include "wx/osx/uma.h"
 #else
 #include "wx/osx/private.h"
 #include "wx/osx/uma.h"
 #else
 #include "wx/osx/private.h"
+#if wxOSX_USE_COCOA
 // bring in themeing
 #include <Carbon/Carbon.h>
 #endif
 // bring in themeing
 #include <Carbon/Carbon.h>
 #endif
+#endif
 
 #define MAC_SCROLLBAR_SIZE 15
 #define MAC_SMALL_SCROLLBAR_SIZE 11
 
 #define MAC_SCROLLBAR_SIZE 15
 #define MAC_SMALL_SCROLLBAR_SIZE 11
@@ -83,8 +85,6 @@
 #endif
 
 BEGIN_EVENT_TABLE(wxWindowMac, wxWindowBase)
 #endif
 
 BEGIN_EVENT_TABLE(wxWindowMac, wxWindowBase)
-    EVT_NC_PAINT(wxWindowMac::OnNcPaint)
-    EVT_ERASE_BACKGROUND(wxWindowMac::OnEraseBackground)
     EVT_MOUSE_EVENTS(wxWindowMac::OnMouseEvent)
 END_EVENT_TABLE()
 
     EVT_MOUSE_EVENTS(wxWindowMac::OnMouseEvent)
 END_EVENT_TABLE()
 
@@ -244,7 +244,11 @@ bool wxWindowMac::Create(wxWindowMac *parent,
 
 #ifndef __WXUNIVERSAL__
     // Don't give scrollbars to wxControls unless they ask for them
 
 #ifndef __WXUNIVERSAL__
     // Don't give scrollbars to wxControls unless they ask for them
-    if ( (! IsKindOf(CLASSINFO(wxControl)) && ! IsKindOf(CLASSINFO(wxStatusBar)))
+    if ( (! IsKindOf(CLASSINFO(wxControl)) 
+#if wxUSE_STATUSBAR
+        && ! IsKindOf(CLASSINFO(wxStatusBar))
+#endif
+        )
          || (IsKindOf(CLASSINFO(wxControl)) && ((style & wxHSCROLL) || (style & wxVSCROLL))))
     {
         MacCreateScrollBars( style ) ;
          || (IsKindOf(CLASSINFO(wxControl)) && ((style & wxHSCROLL) || (style & wxVSCROLL))))
     {
         MacCreateScrollBars( style ) ;
@@ -259,10 +263,12 @@ bool wxWindowMac::Create(wxWindowMac *parent,
 
 void wxWindowMac::MacChildAdded()
 {
 
 void wxWindowMac::MacChildAdded()
 {
+#if wxUSE_SCROLLBAR
     if ( m_vScrollBar )
         m_vScrollBar->Raise() ;
     if ( m_hScrollBar )
         m_hScrollBar->Raise() ;
     if ( m_vScrollBar )
         m_vScrollBar->Raise() ;
     if ( m_hScrollBar )
         m_hScrollBar->Raise() ;
+#endif
 }
 
 void wxWindowMac::MacPostControlCreate(const wxPoint& WXUNUSED(pos), const wxSize& size)
 }
 
 void wxWindowMac::MacPostControlCreate(const wxPoint& WXUNUSED(pos), const wxSize& size)
@@ -327,7 +333,7 @@ void wxWindowMac::DoSetWindowVariant( wxWindowVariant variant )
             break ;
 
         default:
             break ;
 
         default:
-            wxFAIL_MSG(_T("unexpected window variant"));
+            wxFAIL_MSG(wxT("unexpected window variant"));
             break ;
     }
     m_peer->SetData<ControlSize>(kControlEntireControl, kControlSizeTag, &size ) ;
             break ;
     }
     m_peer->SetData<ControlSize>(kControlEntireControl, kControlSizeTag, &size ) ;
@@ -356,7 +362,7 @@ void wxWindowMac::DoSetWindowVariant( wxWindowVariant variant )
             break ;
 
         default:
             break ;
 
         default:
-            wxFAIL_MSG(_T("unexpected window variant"));
+            wxFAIL_MSG(wxT("unexpected window variant"));
             break ;
     }
 
             break ;
     }
 
@@ -405,11 +411,25 @@ bool wxWindowMac::SetBackgroundColour(const wxColour& col )
     return true ;
 }
 
     return true ;
 }
 
+static bool wxIsWindowOrParentDisabled(wxWindow* w)
+{
+    while (w && !w->IsTopLevel())
+    {
+        if (!w->IsEnabled())
+            return true;
+        w = w->GetParent();
+    }
+    return false;
+}
+
 void wxWindowMac::SetFocus()
 {
     if ( !AcceptsFocus() )
             return ;
 
 void wxWindowMac::SetFocus()
 {
     if ( !AcceptsFocus() )
             return ;
 
+    if (wxIsWindowOrParentDisabled((wxWindow*) this))
+        return;
+
     wxWindow* former = FindFocus() ;
     if ( former == this )
         return ;
     wxWindow* former = FindFocus() ;
     if ( former == this )
         return ;
@@ -468,8 +488,8 @@ bool wxWindowMac::MacGetBoundsForControl(
     x = (int)pos.x;
     y = (int)pos.y;
 
     x = (int)pos.x;
     y = (int)pos.y;
 
-    w = WidthDefault( size.x ); 
-    h = HeightDefault( size.y ); 
+    w = WidthDefault( size.x );
+    h = HeightDefault( size.y );
 
     x += MacGetLeftBorderSize() ;
     y += MacGetTopBorderSize() ;
 
     x += MacGetLeftBorderSize() ;
     y += MacGetTopBorderSize() ;
@@ -505,7 +525,7 @@ void wxWindowMac::DoGetSize(int *x, int *y) const
 void wxWindowMac::DoGetPosition(int *x, int *y) const
 {
     int x1, y1;
 void wxWindowMac::DoGetPosition(int *x, int *y) const
 {
     int x1, y1;
-    
+
     m_peer->GetPosition( x1, y1 ) ;
 
     // get the wx window position from the native one
     m_peer->GetPosition( x1, y1 ) ;
 
     // get the wx window position from the native one
@@ -634,13 +654,13 @@ wxSize wxWindowMac::DoGetSizeFromClientSize( const wxSize & size )  const
     int innerwidth, innerheight;
     int left, top;
     int outerwidth, outerheight;
     int innerwidth, innerheight;
     int left, top;
     int outerwidth, outerheight;
-    
+
     m_peer->GetContentArea( left, top, innerwidth, innerheight );
     m_peer->GetSize( outerwidth, outerheight );
     m_peer->GetContentArea( left, top, innerwidth, innerheight );
     m_peer->GetSize( outerwidth, outerheight );
-    
+
     sizeTotal.x += outerwidth-innerwidth;
     sizeTotal.y += outerheight-innerheight;
     sizeTotal.x += outerwidth-innerwidth;
     sizeTotal.y += outerheight-innerheight;
-    
+
     sizeTotal.x += MacGetLeftBorderSize() + MacGetRightBorderSize() ;
     sizeTotal.y += MacGetTopBorderSize() + MacGetBottomBorderSize() ;
 
     sizeTotal.x += MacGetLeftBorderSize() + MacGetRightBorderSize() ;
     sizeTotal.y += MacGetTopBorderSize() + MacGetBottomBorderSize() ;
 
@@ -653,15 +673,16 @@ void wxWindowMac::DoGetClientSize( int *x, int *y ) const
     int ww, hh;
 
     int left, top;
     int ww, hh;
 
     int left, top;
-    
-    m_peer->GetContentArea( left, top, ww, hh );
 
 
+    m_peer->GetContentArea( left, top, ww, hh );
+#if wxUSE_SCROLLBAR
     if (m_hScrollBar  && m_hScrollBar->IsShown() )
         hh -= m_hScrollBar->GetSize().y ;
 
     if (m_vScrollBar  && m_vScrollBar->IsShown() )
         ww -= m_vScrollBar->GetSize().x ;
 
     if (m_hScrollBar  && m_hScrollBar->IsShown() )
         hh -= m_hScrollBar->GetSize().y ;
 
     if (m_vScrollBar  && m_vScrollBar->IsShown() )
         ww -= m_vScrollBar->GetSize().x ;
 
+#endif
     if (x)
        *x = ww;
     if (y)
     if (x)
        *x = ww;
     if (y)
@@ -756,7 +777,7 @@ void wxWindowMac::MacInvalidateBorders()
     // now we know that we have something to do at all
 
     int tx,ty,tw,th;
     // now we know that we have something to do at all
 
     int tx,ty,tw,th;
-    
+
     m_peer->GetSize( tw, th );
     m_peer->GetPosition( tx, ty );
 
     m_peer->GetSize( tw, th );
     m_peer->GetPosition( tx, ty );
 
@@ -764,7 +785,7 @@ void wxWindowMac::MacInvalidateBorders()
     wxRect rightupdate( tx+tw, ty, outerBorder, th );
     wxRect topupdate( tx-outerBorder, ty-outerBorder, tw + 2 * outerBorder, outerBorder );
     wxRect bottomupdate( tx-outerBorder, ty + th, tw + 2 * outerBorder, outerBorder );
     wxRect rightupdate( tx+tw, ty, outerBorder, th );
     wxRect topupdate( tx-outerBorder, ty-outerBorder, tw + 2 * outerBorder, outerBorder );
     wxRect bottomupdate( tx-outerBorder, ty + th, tw + 2 * outerBorder, outerBorder );
-    
+
     if (GetParent()) {
         GetParent()->m_peer->SetNeedsDisplay(&leftupdate);
         GetParent()->m_peer->SetNeedsDisplay(&rightupdate);
     if (GetParent()) {
         GetParent()->m_peer->SetNeedsDisplay(&leftupdate);
         GetParent()->m_peer->SetNeedsDisplay(&rightupdate);
@@ -831,7 +852,7 @@ void wxWindowMac::DoMoveWindow(int x, int y, int width, int height)
         MacInvalidateBorders() ;
 
         m_cachedClippedRectValid = false ;
         MacInvalidateBorders() ;
 
         m_cachedClippedRectValid = false ;
-        
+
         m_peer->Move( bounds.x, bounds.y, bounds.width, bounds.height);
 
         wxWindowMac::MacSuperChangedPosition() ; // like this only children will be notified
         m_peer->Move( bounds.x, bounds.y, bounds.width, bounds.height);
 
         wxWindowMac::MacSuperChangedPosition() ; // like this only children will be notified
@@ -867,7 +888,7 @@ wxSize wxWindowMac::DoGetBestSize() const
     else
     {
         wxRect r ;
     else
     {
         wxRect r ;
-        
+
         m_peer->GetBestRect(&r);
 
         if ( r.GetWidth() == 0 && r.GetHeight() == 0 )
         m_peer->GetBestRect(&r);
 
         if ( r.GetWidth() == 0 && r.GetHeight() == 0 )
@@ -877,25 +898,30 @@ wxSize wxWindowMac::DoGetBestSize() const
             r.width =
             r.height = 16 ;
 
             r.width =
             r.height = 16 ;
 
-            if ( IsKindOf( CLASSINFO( wxScrollBar ) ) )
+            if ( 0 ) 
+            {
+            }
+#if wxUSE_SCROLLBAR
+            else if ( IsKindOf( CLASSINFO( wxScrollBar ) ) )
             {
                 r.height = 16 ;
             }
             {
                 r.height = 16 ;
             }
-    #if wxUSE_SPINBTN
+#endif
+#if wxUSE_SPINBTN
             else if ( IsKindOf( CLASSINFO( wxSpinButton ) ) )
             {
                 r.height = 24 ;
             }
             else if ( IsKindOf( CLASSINFO( wxSpinButton ) ) )
             {
                 r.height = 24 ;
             }
-    #endif
+#endif
             else
             {
                 // return wxWindowBase::DoGetBestSize() ;
             }
         }
 
             else
             {
                 // return wxWindowBase::DoGetBestSize() ;
             }
         }
 
-        int bestWidth = r.width + MacGetLeftBorderSize() + 
+        int bestWidth = r.width + MacGetLeftBorderSize() +
                     MacGetRightBorderSize();
                     MacGetRightBorderSize();
-        int bestHeight = r.height + MacGetTopBorderSize() + 
+        int bestHeight = r.height + MacGetTopBorderSize() +
                      MacGetBottomBorderSize();
         if ( bestHeight < 10 )
             bestHeight = 13 ;
                      MacGetBottomBorderSize();
         if ( bestHeight < 10 )
             bestHeight = 13 ;
@@ -1007,9 +1033,14 @@ void wxWindowMac::DoSetClientSize(int clientwidth, int clientheight)
 
 void wxWindowMac::SetLabel(const wxString& title)
 {
 
 void wxWindowMac::SetLabel(const wxString& title)
 {
+    if ( title == m_label )
+        return;
+
     m_label = title ;
 
     m_label = title ;
 
-    if ( m_peer && m_peer->IsOk() && !(IsKindOf( CLASSINFO(wxButton) ) && GetId() == wxID_HELP) )
+    InvalidateBestSize();
+
+    if ( m_peer && m_peer->IsOk() )
         m_peer->SetLabel( wxStripMenuCodes(m_label, wxStrip_Mnemonics), GetFont().GetEncoding() ) ;
 
     // do not trigger refreshes upon invisible and possible partly created objects
         m_peer->SetLabel( wxStripMenuCodes(m_label, wxStrip_Mnemonics), GetFont().GetEncoding() ) ;
 
     // do not trigger refreshes upon invisible and possible partly created objects
@@ -1089,8 +1120,11 @@ int wxWindowMac::GetCharWidth() const
     return width;
 }
 
     return width;
 }
 
-void wxWindowMac::GetTextExtent(const wxString& str, int *x, int *y,
-                           int *descent, int *externalLeading, const wxFont *theFont ) const
+void wxWindowMac::DoGetTextExtent(const wxString& str,
+                                  int *x, int *y,
+                                  int *descent,
+                                  int *externalLeading,
+                                  const wxFont *theFont) const
 {
     const wxFont *fontToUse = theFont;
     wxFont tempFont;
 {
     const wxFont *fontToUse = theFont;
     wxFont tempFont;
@@ -1105,9 +1139,9 @@ void wxWindowMac::GetTextExtent(const wxString& str, int *x, int *y,
 
     wxDouble h , d , e , w;
     ctx->GetTextExtent( str, &w, &h, &d, &e );
 
     wxDouble h , d , e , w;
     ctx->GetTextExtent( str, &w, &h, &d, &e );
-    
+
     delete ctx;
     delete ctx;
-    
+
     if ( externalLeading )
         *externalLeading = (wxCoord)(e+0.5);
     if ( descent )
     if ( externalLeading )
         *externalLeading = (wxCoord)(e+0.5);
     if ( descent )
@@ -1130,7 +1164,7 @@ void wxWindowMac::Refresh(bool WXUNUSED(eraseBack), const wxRect *rect)
 
     if ( !IsShownOnScreen() )
         return ;
 
     if ( !IsShownOnScreen() )
         return ;
-        
+
     m_peer->SetNeedsDisplay( rect ) ;
 }
 
     m_peer->SetNeedsDisplay( rect ) ;
 }
 
@@ -1165,41 +1199,9 @@ void wxWindowMac::WarpPointer(int WXUNUSED(x_pos), int WXUNUSED(y_pos))
     // We really don't move the mouse programmatically under Mac.
 }
 
     // We really don't move the mouse programmatically under Mac.
 }
 
-void wxWindowMac::OnEraseBackground(wxEraseEvent& event)
-{
-    if ( MacGetTopLevelWindow() == NULL )
-        return ;
-/*
-#if TARGET_API_MAC_OSX
-    if ( !m_backgroundColour.Ok() || GetBackgroundStyle() == wxBG_STYLE_TRANSPARENT )
-    {
-    }
-    else
-#endif
-*/
-    if ( GetBackgroundStyle() == wxBG_STYLE_COLOUR )
-    {
-        event.GetDC()->Clear() ;
-    }
-    else if ( GetBackgroundStyle() == wxBG_STYLE_CUSTOM )
-    {
-        // don't skip the event here, custom background means that the app
-        // is drawing it itself in its OnPaint(), so don't draw it at all
-        // now to avoid flicker
-    }
-    else
-    {
-        event.Skip() ;
-    }
-}
-
-void wxWindowMac::OnNcPaint( wxNcPaintEvent& event )
-{
-    event.Skip() ;
-}
-
 int wxWindowMac::GetScrollPos(int orient) const
 {
 int wxWindowMac::GetScrollPos(int orient) const
 {
+#if wxUSE_SCROLLBAR
     if ( orient == wxHORIZONTAL )
     {
        if ( m_hScrollBar )
     if ( orient == wxHORIZONTAL )
     {
        if ( m_hScrollBar )
@@ -1210,7 +1212,7 @@ int wxWindowMac::GetScrollPos(int orient) const
        if ( m_vScrollBar )
            return m_vScrollBar->GetThumbPosition() ;
     }
        if ( m_vScrollBar )
            return m_vScrollBar->GetThumbPosition() ;
     }
-
+#endif
     return 0;
 }
 
     return 0;
 }
 
@@ -1218,6 +1220,7 @@ int wxWindowMac::GetScrollPos(int orient) const
 // of positions that we can scroll.
 int wxWindowMac::GetScrollRange(int orient) const
 {
 // of positions that we can scroll.
 int wxWindowMac::GetScrollRange(int orient) const
 {
+#if wxUSE_SCROLLBAR
     if ( orient == wxHORIZONTAL )
     {
        if ( m_hScrollBar )
     if ( orient == wxHORIZONTAL )
     {
        if ( m_hScrollBar )
@@ -1228,12 +1231,13 @@ int wxWindowMac::GetScrollRange(int orient) const
        if ( m_vScrollBar )
            return m_vScrollBar->GetRange() ;
     }
        if ( m_vScrollBar )
            return m_vScrollBar->GetRange() ;
     }
-
+#endif
     return 0;
 }
 
 int wxWindowMac::GetScrollThumb(int orient) const
 {
     return 0;
 }
 
 int wxWindowMac::GetScrollThumb(int orient) const
 {
+#if wxUSE_SCROLLBAR
     if ( orient == wxHORIZONTAL )
     {
        if ( m_hScrollBar )
     if ( orient == wxHORIZONTAL )
     {
        if ( m_hScrollBar )
@@ -1244,12 +1248,13 @@ int wxWindowMac::GetScrollThumb(int orient) const
        if ( m_vScrollBar )
            return m_vScrollBar->GetThumbSize() ;
     }
        if ( m_vScrollBar )
            return m_vScrollBar->GetThumbSize() ;
     }
-
+#endif
     return 0;
 }
 
 void wxWindowMac::SetScrollPos(int orient, int pos, bool WXUNUSED(refresh))
 {
     return 0;
 }
 
 void wxWindowMac::SetScrollPos(int orient, int pos, bool WXUNUSED(refresh))
 {
+#if wxUSE_SCROLLBAR
     if ( orient == wxHORIZONTAL )
     {
        if ( m_hScrollBar )
     if ( orient == wxHORIZONTAL )
     {
        if ( m_hScrollBar )
@@ -1260,6 +1265,7 @@ void wxWindowMac::SetScrollPos(int orient, int pos, bool WXUNUSED(refresh))
        if ( m_vScrollBar )
            m_vScrollBar->SetThumbPosition( pos ) ;
     }
        if ( m_vScrollBar )
            m_vScrollBar->SetThumbPosition( pos ) ;
     }
+#endif
 }
 
 void
 }
 
 void
@@ -1293,13 +1299,14 @@ void  wxWindowMac::MacPaintGrowBox()
     if ( IsTopLevel() )
         return ;
 
     if ( IsTopLevel() )
         return ;
 
+#if wxUSE_SCROLLBAR
     if ( MacHasScrollBarCorner() )
     {
         CGContextRef cgContext = (CGContextRef) MacGetCGContextRef() ;
         wxASSERT( cgContext ) ;
 
         int tx,ty,tw,th;
     if ( MacHasScrollBarCorner() )
     {
         CGContextRef cgContext = (CGContextRef) MacGetCGContextRef() ;
         wxASSERT( cgContext ) ;
 
         int tx,ty,tw,th;
-    
+
         m_peer->GetSize( tw, th );
         m_peer->GetPosition( tx, ty );
 
         m_peer->GetSize( tw, th );
         m_peer->GetPosition( tx, ty );
 
@@ -1321,6 +1328,7 @@ void  wxWindowMac::MacPaintGrowBox()
         CGContextFillRect( cgContext, cgrect );
         CGContextRestoreGState( cgContext );
     }
         CGContextFillRect( cgContext, cgrect );
         CGContextRestoreGState( cgContext );
     }
+#endif
 }
 
 void wxWindowMac::MacPaintBorders( int WXUNUSED(leftOrigin) , int WXUNUSED(rightOrigin) )
 }
 
 void wxWindowMac::MacPaintBorders( int WXUNUSED(leftOrigin) , int WXUNUSED(rightOrigin) )
@@ -1332,7 +1340,7 @@ void wxWindowMac::MacPaintBorders( int WXUNUSED(leftOrigin) , int WXUNUSED(right
 
     // back to the surrounding frame rectangle
     int tx,ty,tw,th;
 
     // back to the surrounding frame rectangle
     int tx,ty,tw,th;
-    
+
     m_peer->GetSize( tw, th );
     m_peer->GetPosition( tx, ty );
 
     m_peer->GetSize( tw, th );
     m_peer->GetPosition( tx, ty );
 
@@ -1370,7 +1378,7 @@ void wxWindowMac::MacPaintBorders( int WXUNUSED(leftOrigin) , int WXUNUSED(right
                 HIThemeDrawFrame( &cgrect , &info , cgContext , kHIThemeOrientationNormal ) ;
             }
         }
                 HIThemeDrawFrame( &cgrect , &info , cgContext , kHIThemeOrientationNormal ) ;
             }
         }
-        
+
         if ( hasFocus )
         {
             HIThemeDrawFocusRect( &cgrect , true , cgContext , kHIThemeOrientationNormal ) ;
         if ( hasFocus )
         {
             HIThemeDrawFocusRect( &cgrect , true , cgContext , kHIThemeOrientationNormal ) ;
@@ -1381,16 +1389,18 @@ void wxWindowMac::MacPaintBorders( int WXUNUSED(leftOrigin) , int WXUNUSED(right
 
 void wxWindowMac::RemoveChild( wxWindowBase *child )
 {
 
 void wxWindowMac::RemoveChild( wxWindowBase *child )
 {
+#if wxUSE_SCROLLBAR
     if ( child == m_hScrollBar )
         m_hScrollBar = NULL ;
     if ( child == m_vScrollBar )
         m_vScrollBar = NULL ;
     if ( child == m_hScrollBar )
         m_hScrollBar = NULL ;
     if ( child == m_vScrollBar )
         m_vScrollBar = NULL ;
-
+#endif
     wxWindowBase::RemoveChild( child ) ;
 }
 
 void wxWindowMac::DoUpdateScrollbarVisibility()
 {
     wxWindowBase::RemoveChild( child ) ;
 }
 
 void wxWindowMac::DoUpdateScrollbarVisibility()
 {
+#if wxUSE_SCROLLBAR
     bool triggerSizeEvent = false;
 
     if ( m_hScrollBar )
     bool triggerSizeEvent = false;
 
     if ( m_hScrollBar )
@@ -1422,18 +1432,21 @@ void wxWindowMac::DoUpdateScrollbarVisibility()
         event.SetEventObject(this);
         HandleWindowEvent(event);
     }
         event.SetEventObject(this);
         HandleWindowEvent(event);
     }
+#endif
 }
 
 // New function that will replace some of the above.
 void wxWindowMac::SetScrollbar(int orient, int pos, int thumb,
                                int range, bool refresh)
 {
 }
 
 // New function that will replace some of the above.
 void wxWindowMac::SetScrollbar(int orient, int pos, int thumb,
                                int range, bool refresh)
 {
+#if wxUSE_SCROLLBAR
     if ( orient == wxHORIZONTAL && m_hScrollBar )
         m_hScrollBar->SetScrollbar(pos, thumb, range, thumb, refresh);
     else if ( orient == wxVERTICAL && m_vScrollBar )
         m_vScrollBar->SetScrollbar(pos, thumb, range, thumb, refresh);
 
     DoUpdateScrollbarVisibility();
     if ( orient == wxHORIZONTAL && m_hScrollBar )
         m_hScrollBar->SetScrollbar(pos, thumb, range, thumb, refresh);
     else if ( orient == wxVERTICAL && m_vScrollBar )
         m_vScrollBar->SetScrollbar(pos, thumb, range, thumb, refresh);
 
     DoUpdateScrollbarVisibility();
+#endif
 }
 
 // Does a physical scroll
 }
 
 // Does a physical scroll
@@ -1462,10 +1475,12 @@ void wxWindowMac::ScrollWindow(int dx, int dy, const wxRect *rect)
         child = node->GetData();
         if (child == NULL)
             continue;
         child = node->GetData();
         if (child == NULL)
             continue;
+#if wxUSE_SCROLLBAR
         if (child == m_vScrollBar)
             continue;
         if (child == m_hScrollBar)
             continue;
         if (child == m_vScrollBar)
             continue;
         if (child == m_hScrollBar)
             continue;
+#endif
         if (child->IsTopLevel())
             continue;
 
         if (child->IsTopLevel())
             continue;
 
@@ -1486,6 +1501,7 @@ void wxWindowMac::ScrollWindow(int dx, int dy, const wxRect *rect)
 
 void wxWindowMac::MacOnScroll( wxScrollEvent &event )
 {
 
 void wxWindowMac::MacOnScroll( wxScrollEvent &event )
 {
+#if wxUSE_SCROLLBAR
     if ( event.GetEventObject() == m_vScrollBar || event.GetEventObject() == m_hScrollBar )
     {
         wxScrollWinEvent wevent;
     if ( event.GetEventObject() == m_vScrollBar || event.GetEventObject() == m_hScrollBar )
     {
         wxScrollWinEvent wevent;
@@ -1512,6 +1528,7 @@ void wxWindowMac::MacOnScroll( wxScrollEvent &event )
 
         HandleWindowEvent(wevent);
     }
 
         HandleWindowEvent(wevent);
     }
+#endif
 }
 
 wxWindow *wxWindowBase::DoFindFocus()
 }
 
 wxWindow *wxWindowBase::DoFindFocus()
@@ -1676,7 +1693,7 @@ void wxWindowMac::MacUpdateClippedRects() const
     Rect rIncludingOuterStructures ;
 
     int tx,ty,tw,th;
     Rect rIncludingOuterStructures ;
 
     int tx,ty,tw,th;
-    
+
     m_peer->GetSize( tw, th );
     m_peer->GetPosition( tx, ty );
 
     m_peer->GetSize( tw, th );
     m_peer->GetPosition( tx, ty );
 
@@ -1763,37 +1780,61 @@ void wxWindowMac::MacUpdateClippedRects() const
 bool wxWindowMac::MacDoRedraw( long time )
 {
     bool handled = false ;
 bool wxWindowMac::MacDoRedraw( long time )
 {
     bool handled = false ;
-    
+
     wxRegion formerUpdateRgn = m_updateRegion;
     wxRegion clientUpdateRgn = formerUpdateRgn;
 
     wxRegion formerUpdateRgn = m_updateRegion;
     wxRegion clientUpdateRgn = formerUpdateRgn;
 
-    wxSize sz = GetClientSize() ;
-    wxPoint origin = GetClientAreaOrigin() ;
-    
-    clientUpdateRgn.Intersect(origin.x , origin.y , origin.x + sz.x , origin.y + sz.y);
-    
+    const wxRect clientRect = GetClientRect();
+
+    clientUpdateRgn.Intersect(clientRect);
+
     // first send an erase event to the entire update area
     // first send an erase event to the entire update area
+    const wxBackgroundStyle bgStyle = GetBackgroundStyle();
+    switch ( bgStyle )
     {
     {
-        // for the toplevel window this really is the entire area
-        // for all the others only their client area, otherwise they
-        // might be drawing with full alpha and eg put blue into
-        // the grow-box area of a scrolled window (scroll sample)
-        wxDC* dc = new wxWindowDC(this);
-        if ( IsTopLevel() )
-            dc->SetDeviceClippingRegion(formerUpdateRgn);
-        else
-            dc->SetDeviceClippingRegion(clientUpdateRgn);
+        case wxBG_STYLE_ERASE:
+        case wxBG_STYLE_SYSTEM:
+            {
+                // for the toplevel window this really is the entire area for
+                // all the others only their client area, otherwise they might
+                // be drawing with full alpha and eg put blue into the grow-box
+                // area of a scrolled window (scroll sample)
+                wxWindowDC dc(this);
+                if ( IsTopLevel() )
+                    dc.SetDeviceClippingRegion(formerUpdateRgn);
+                else
+                    dc.SetDeviceClippingRegion(clientUpdateRgn);
+
+                if ( bgStyle == wxBG_STYLE_ERASE )
+                {
+                    wxEraseEvent eevent( GetId(), &dc );
+                    eevent.SetEventObject( this );
+                    if ( ProcessWindowEvent( eevent ) )
+                        break;
+                }
+
+                if ( UseBgCol() )
+                {
+                    dc.SetBackground(GetBackgroundColour());
+                    dc.Clear();
+                }
+            }
+            break;
+
+        case wxBG_STYLE_PAINT:
+            // nothing to do, user-defined EVT_PAINT handler will overwrite the
+            // entire window client area
+            break;
 
 
-        wxEraseEvent eevent( GetId(), dc );
-        eevent.SetEventObject( this );
-        HandleWindowEvent( eevent );
-        delete dc ;
+        default:
+            wxFAIL_MSG( "unsupported background style" );
     }
 
     MacPaintGrowBox();
 
     }
 
     MacPaintGrowBox();
 
-    // calculate a client-origin version of the update rgn and set m_updateRegion to that
-    clientUpdateRgn.Offset( -origin.x , -origin.y );
+    // calculate a client-origin version of the update rgn and set
+    // m_updateRegion to that
+    clientUpdateRgn.Offset(-clientRect.GetPosition());
     m_updateRegion = clientUpdateRgn ;
 
     if ( !m_updateRegion.Empty() )
     m_updateRegion = clientUpdateRgn ;
 
     if ( !m_updateRegion.Empty() )
@@ -1825,10 +1866,12 @@ void wxWindowMac::MacPaintChildrenBorders()
         child = node->GetData();
         if (child == NULL)
             continue;
         child = node->GetData();
         if (child == NULL)
             continue;
+#if wxUSE_SCROLLBAR
         if (child == m_vScrollBar)
             continue;
         if (child == m_hScrollBar)
             continue;
         if (child == m_vScrollBar)
             continue;
         if (child == m_hScrollBar)
             continue;
+#endif
         if (child->IsTopLevel())
             continue;
         if (!child->IsShown())
         if (child->IsTopLevel())
             continue;
         if (!child->IsShown())
@@ -1838,7 +1881,7 @@ void wxWindowMac::MacPaintChildrenBorders()
 
         child->GetPosition( &x, &y );
         child->GetSize( &w, &h );
 
         child->GetPosition( &x, &y );
         child->GetSize( &w, &h );
-        
+
         if ( m_updateRegion.Contains(clientOrigin.x+x-10, clientOrigin.y+y-10, w+20, h+20) )
         {
             // paint custom borders
         if ( m_updateRegion.Contains(clientOrigin.x+x-10, clientOrigin.y+y-10, w+20, h+20) )
         {
             // paint custom borders
@@ -1855,12 +1898,13 @@ void wxWindowMac::MacPaintChildrenBorders()
 
 WXWindow wxWindowMac::MacGetTopLevelWindowRef() const
 {
 
 WXWindow wxWindowMac::MacGetTopLevelWindowRef() const
 {
-    wxNonOwnedWindow* tlw = MacGetTopLevelWindow(); 
+    wxNonOwnedWindow* tlw = MacGetTopLevelWindow();
     return tlw ? tlw->GetWXWindow() : NULL ;
 }
 
 bool wxWindowMac::MacHasScrollBarCorner() const
 {
     return tlw ? tlw->GetWXWindow() : NULL ;
 }
 
 bool wxWindowMac::MacHasScrollBarCorner() const
 {
+#if wxUSE_SCROLLBAR
     /* Returns whether the scroll bars in a wxScrolledWindow should be
      * shortened. Scroll bars should be shortened if either:
      *
     /* Returns whether the scroll bars in a wxScrolledWindow should be
      * shortened. Scroll bars should be shortened if either:
      *
@@ -1921,10 +1965,14 @@ bool wxWindowMac::MacHasScrollBarCorner() const
         // No parent frame found
         return false ;
     }
         // No parent frame found
         return false ;
     }
+#else
+    return false;
+#endif
 }
 
 void wxWindowMac::MacCreateScrollBars( long style )
 {
 }
 
 void wxWindowMac::MacCreateScrollBars( long style )
 {
+#if wxUSE_SCROLLBAR
     wxASSERT_MSG( m_vScrollBar == NULL && m_hScrollBar == NULL , wxT("attempt to create window twice") ) ;
 
     if ( style & ( wxVSCROLL | wxHSCROLL ) )
     wxASSERT_MSG( m_vScrollBar == NULL && m_hScrollBar == NULL , wxT("attempt to create window twice") ) ;
 
     if ( style & ( wxVSCROLL | wxHSCROLL ) )
@@ -1961,17 +2009,23 @@ void wxWindowMac::MacCreateScrollBars( long style )
     // because the create does not take into account the client area origin
     // we might have a real position shift
     MacRepositionScrollBars() ;
     // because the create does not take into account the client area origin
     // we might have a real position shift
     MacRepositionScrollBars() ;
+#endif
 }
 
 bool wxWindowMac::MacIsChildOfClientArea( const wxWindow* child ) const
 {
 }
 
 bool wxWindowMac::MacIsChildOfClientArea( const wxWindow* child ) const
 {
-    bool result = ((child == NULL) || ((child != m_hScrollBar) && (child != m_vScrollBar)));
+    bool result = ((child == NULL)
+#if wxUSE_SCROLLBAR
+     || ((child != m_hScrollBar) && (child != m_vScrollBar))
+#endif
+     );
 
     return result ;
 }
 
 void wxWindowMac::MacRepositionScrollBars()
 {
 
     return result ;
 }
 
 void wxWindowMac::MacRepositionScrollBars()
 {
+#if wxUSE_SCROLLBAR
     if ( !m_hScrollBar && !m_vScrollBar )
         return ;
 
     if ( !m_hScrollBar && !m_vScrollBar )
         return ;
 
@@ -1994,6 +2048,7 @@ void wxWindowMac::MacRepositionScrollBars()
         m_vScrollBar->SetSize( vPoint.x , vPoint.y, vSize.x, vSize.y , wxSIZE_ALLOW_MINUS_ONE );
     if ( m_hScrollBar )
         m_hScrollBar->SetSize( hPoint.x , hPoint.y, hSize.x, hSize.y, wxSIZE_ALLOW_MINUS_ONE );
         m_vScrollBar->SetSize( vPoint.x , vPoint.y, vSize.x, vSize.y , wxSIZE_ALLOW_MINUS_ONE );
     if ( m_hScrollBar )
         m_hScrollBar->SetSize( hPoint.x , hPoint.y, hSize.x, hSize.y, wxSIZE_ALLOW_MINUS_ONE );
+#endif
 }
 
 bool wxWindowMac::AcceptsFocus() const
 }
 
 bool wxWindowMac::AcceptsFocus() const
@@ -2163,7 +2218,7 @@ wxInt32 wxWindowMac::MacControlHit(WXEVENTHANDLERREF WXUNUSED(handler) , WXEVENT
 #if wxOSX_USE_COCOA_OR_CARBON
     if ( OSXHandleClicked( GetEventTime((EventRef)event) ) )
         return noErr;
 #if wxOSX_USE_COCOA_OR_CARBON
     if ( OSXHandleClicked( GetEventTime((EventRef)event) ) )
         return noErr;
-        
+
     return eventNotHandledErr ;
 #else
     return 0;
     return eventNotHandledErr ;
 #else
     return 0;
@@ -2269,7 +2324,7 @@ bool wxWindowMac::OSXHandleKeyEvent( wxKeyEvent& event )
 }
 
 //
 }
 
 //
-// wxWidgetImpl 
+// wxWidgetImpl
 //
 
 WX_DECLARE_HASH_MAP(WXWidget, wxWidgetImpl*, wxPointerHash, wxPointerEqual, MacControlMap);
 //
 
 WX_DECLARE_HASH_MAP(WXWidget, wxWidgetImpl*, wxPointerHash, wxPointerEqual, MacControlMap);
@@ -2281,7 +2336,7 @@ wxWindowMac *wxFindWindowFromWXWidget(WXWidget inControl )
     wxWidgetImpl* impl = wxWidgetImpl::FindFromWXWidget( inControl );
     if ( impl )
         return impl->GetWXPeer();
     wxWidgetImpl* impl = wxWidgetImpl::FindFromWXWidget( inControl );
     if ( impl )
         return impl->GetWXPeer();
-    
+
     return NULL;
 }
 
     return NULL;
 }