]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/carbon/window.cpp
avoid system pop-up menu commands being handled by wxApp, bug was shown in printing...
[wxWidgets.git] / src / mac / carbon / window.cpp
index 179b2ecc926254856afa5ed37efaebcfa0f71c66..22d291df2af99e651c0f7f6c95967ebba1e22e68 100644 (file)
@@ -9,10 +9,6 @@
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
-#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
-#pragma implementation "window.h"
-#endif
-
 #include "wx/wxprec.h"
 
 #include "wx/menu.h"
 #include "wx/wxprec.h"
 
 #include "wx/menu.h"
@@ -76,8 +72,6 @@ extern wxList wxPendingDelete;
     IMPLEMENT_DYNAMIC_CLASS(wxWindow, wxWindowBase)
 #endif // __WXUNIVERSAL__/__WXMAC__
 
     IMPLEMENT_DYNAMIC_CLASS(wxWindow, wxWindowBase)
 #endif // __WXUNIVERSAL__/__WXMAC__
 
-#if !USE_SHARED_LIBRARY
-
 BEGIN_EVENT_TABLE(wxWindowMac, wxWindowBase)
     EVT_NC_PAINT(wxWindowMac::OnNcPaint)
     EVT_ERASE_BACKGROUND(wxWindowMac::OnEraseBackground)
 BEGIN_EVENT_TABLE(wxWindowMac, wxWindowBase)
     EVT_NC_PAINT(wxWindowMac::OnNcPaint)
     EVT_ERASE_BACKGROUND(wxWindowMac::OnEraseBackground)
@@ -89,8 +83,6 @@ BEGIN_EVENT_TABLE(wxWindowMac, wxWindowBase)
     EVT_MOUSE_EVENTS(wxWindowMac::OnMouseEvent)
 END_EVENT_TABLE()
 
     EVT_MOUSE_EVENTS(wxWindowMac::OnMouseEvent)
 END_EVENT_TABLE()
 
-#endif
-
 #define wxMAC_DEBUG_REDRAW 0
 #ifndef wxMAC_DEBUG_REDRAW
 #define wxMAC_DEBUG_REDRAW 0
 #define wxMAC_DEBUG_REDRAW 0
 #ifndef wxMAC_DEBUG_REDRAW
 #define wxMAC_DEBUG_REDRAW 0
@@ -213,7 +205,7 @@ static pascal OSStatus wxMacWindowControlEventHandler( EventHandlerCallRef handl
                         thisWindow->GetPeer()->GetRect( &controlBounds ) ;
                     }
                 }
                         thisWindow->GetPeer()->GetRect( &controlBounds ) ;
                     }
                 }
-                
+
                 if ( cEvent.GetParameter<RgnHandle>(kEventParamRgnHandle, &updateRgn) != noErr )
                 {
                     updateRgn = (RgnHandle) visRegion.GetWXHRGN() ;
                 if ( cEvent.GetParameter<RgnHandle>(kEventParamRgnHandle, &updateRgn) != noErr )
                 {
                     updateRgn = (RgnHandle) visRegion.GetWXHRGN() ;
@@ -222,22 +214,12 @@ static pascal OSStatus wxMacWindowControlEventHandler( EventHandlerCallRef handl
                 {
                     if ( thisWindow->GetPeer()->IsCompositing() == false )
                     {
                 {
                     if ( thisWindow->GetPeer()->IsCompositing() == false )
                     {
-/*
-                        if ( thisWindow->GetPeer()->IsRootControl() == false )
-                        {
-                            GetControlBounds( thisWindow->GetPeer()->GetControlRef() , &controlBounds ) ;
-                        }
-                        else
-                        {
-                            thisWindow->GetPeer()->GetRect( &controlBounds ) ;
-                        }
-*/ 
                         allocatedRgn = NewRgn() ;
                         CopyRgn( updateRgn , allocatedRgn ) ;
                         OffsetRgn( allocatedRgn , -controlBounds.left , -controlBounds.top ) ;
                         // hide the given region by the new region that must be shifted
                         wxMacNativeToWindow( thisWindow , allocatedRgn ) ;
                         allocatedRgn = NewRgn() ;
                         CopyRgn( updateRgn , allocatedRgn ) ;
                         OffsetRgn( allocatedRgn , -controlBounds.left , -controlBounds.top ) ;
                         // hide the given region by the new region that must be shifted
                         wxMacNativeToWindow( thisWindow , allocatedRgn ) ;
-                        updateRgn = allocatedRgn ;                            
+                        updateRgn = allocatedRgn ;
                     }
                     else
                     {
                     }
                     else
                     {
@@ -282,10 +264,10 @@ static pascal OSStatus wxMacWindowControlEventHandler( EventHandlerCallRef handl
                     if ( cEvent.GetParameter<CGContextRef>(kEventParamCGContextRef, &cgContext) != noErr )
                     {
                         wxASSERT( thisWindow->GetPeer()->IsCompositing() == false ) ;
                     if ( cEvent.GetParameter<CGContextRef>(kEventParamCGContextRef, &cgContext) != noErr )
                     {
                         wxASSERT( thisWindow->GetPeer()->IsCompositing() == false ) ;
-                        
+
                         // this parameter is not provided on non-composited windows
                         created = true ;
                         // this parameter is not provided on non-composited windows
                         created = true ;
-                        // rest of the code expects this to be already transformed and clipped for local 
+                        // rest of the code expects this to be already transformed and clipped for local
                         CGrafPtr port = GetWindowPort( (WindowRef) thisWindow->MacGetTopLevelWindowRef() ) ;
                         Rect bounds ;
                         GetPortBounds( port , &bounds ) ;
                         CGrafPtr port = GetWindowPort( (WindowRef) thisWindow->MacGetTopLevelWindowRef() ) ;
                         Rect bounds ;
                         GetPortBounds( port , &bounds ) ;
@@ -299,13 +281,13 @@ static pascal OSStatus wxMacWindowControlEventHandler( EventHandlerCallRef handl
 
                         CGContextTranslateCTM( cgContext , 0 , bounds.bottom - bounds.top ) ;
                         CGContextScaleCTM( cgContext , 1 , -1 ) ;
 
                         CGContextTranslateCTM( cgContext , 0 , bounds.bottom - bounds.top ) ;
                         CGContextScaleCTM( cgContext , 1 , -1 ) ;
-                        
+
                         CGContextTranslateCTM( cgContext , controlBounds.left , controlBounds.top ) ;
                         CGContextTranslateCTM( cgContext , controlBounds.left , controlBounds.top ) ;
-                        
+
                         /*
                         CGContextSetRGBFillColor( cgContext , 1.0 , 1.0 , 1.0 , 1.0 ) ;
                         /*
                         CGContextSetRGBFillColor( cgContext , 1.0 , 1.0 , 1.0 , 1.0 ) ;
-                        CGContextFillRect(cgContext , CGRectMake( 0 , 0 , 
-                            controlBounds.right - controlBounds.left , 
+                        CGContextFillRect(cgContext , CGRectMake( 0 , 0 ,
+                            controlBounds.right - controlBounds.left ,
                             controlBounds.bottom - controlBounds.top ) );
                         */
 
                             controlBounds.bottom - controlBounds.top ) );
                         */
 
@@ -357,9 +339,15 @@ static pascal OSStatus wxMacWindowControlEventHandler( EventHandlerCallRef handl
                         thisWindow->GetCaret()->OnKillFocus();
                     }
         #endif // wxUSE_CARET
                         thisWindow->GetCaret()->OnKillFocus();
                     }
         #endif // wxUSE_CARET
-                    wxFocusEvent event( wxEVT_KILL_FOCUS, thisWindow->GetId());
-                    event.SetEventObject(thisWindow);
-                    thisWindow->GetEventHandler()->ProcessEvent(event) ;
+                    static bool inKillFocusEvent = false ;
+                    if ( !inKillFocusEvent )
+                    {
+                        inKillFocusEvent = true ;
+                        wxFocusEvent event( wxEVT_KILL_FOCUS, thisWindow->GetId());
+                        event.SetEventObject(thisWindow);
+                        thisWindow->GetEventHandler()->ProcessEvent(event) ;
+                        inKillFocusEvent = false ;
+                    }
                 }
                 else
                 {
                 }
                 else
                 {
@@ -485,6 +473,7 @@ pascal OSStatus wxMacWindowEventHandler( EventHandlerCallRef handler , EventRef
             break ;
         case kEventClassService :
             result = wxMacWindowServiceEventHandler( handler, event , data ) ;
             break ;
         case kEventClassService :
             result = wxMacWindowServiceEventHandler( handler, event , data ) ;
+            break ;
         default :
             break ;
     }
         default :
             break ;
     }
@@ -576,6 +565,9 @@ void wxWindowMac::MacControlUserPaneDrawProc(wxInt16 part)
 {
     RgnHandle rgn = NewRgn() ;
     GetClip( rgn ) ;
 {
     RgnHandle rgn = NewRgn() ;
     GetClip( rgn ) ;
+    int x = 0 , y = 0;
+    MacWindowToRootWindow( &x,&y ) ;
+    OffsetRgn( rgn , -x , -y ) ;
     wxMacWindowStateSaver sv( this ) ;
     SectRgn( rgn , (RgnHandle) MacGetVisibleRegion().GetWXHRGN() , rgn ) ;
     MacDoRedraw( rgn , 0 ) ;
     wxMacWindowStateSaver sv( this ) ;
     SectRgn( rgn , (RgnHandle) MacGetVisibleRegion().GetWXHRGN() , rgn ) ;
     MacDoRedraw( rgn , 0 ) ;
@@ -607,7 +599,10 @@ void wxWindowMac::MacControlUserPaneActivateProc(bool activating)
 
 wxInt16 wxWindowMac::MacControlUserPaneFocusProc(wxInt16 action)
 {
 
 wxInt16 wxWindowMac::MacControlUserPaneFocusProc(wxInt16 action)
 {
-    return kControlNoPart ;
+       if ( AcceptsFocus() )
+               return 1 ;
+       else
+       return kControlNoPart ;
 }
 
 void wxWindowMac::MacControlUserPaneBackgroundProc(void* info)
 }
 
 void wxWindowMac::MacControlUserPaneBackgroundProc(void* info)
@@ -638,35 +633,6 @@ wxMAC_DEFINE_PROC_GETTER( ControlActionUPP , wxMacLiveScrollbarActionProc ) ;
 // implementation
 // ===========================================================================
 
 // implementation
 // ===========================================================================
 
-#if KEY_wxList_DEPRECATED
-wxList wxWinMacControlList(wxKEY_INTEGER);
-
-wxWindow *wxFindControlFromMacControl(ControlRef inControl )
-{
-    wxNode *node = wxWinMacControlList.Find((long)inControl);
-    if (!node)
-        return NULL;
-    return (wxControl *)node->GetData();
-}
-
-void wxAssociateControlWithMacControl(ControlRef inControl, wxWindow *control)
-{
-    // adding NULL ControlRef is (first) surely a result of an error and
-    // (secondly) breaks native event processing
-    wxCHECK_RET( inControl != (ControlRef) NULL, wxT("attempt to add a NULL WindowRef to window list") );
-
-    if ( !wxWinMacControlList.Find((long)inControl) )
-        wxWinMacControlList.Append((long)inControl, control);
-}
-
-void wxRemoveMacControlAssociation(wxWindow *control)
-{
-    // remove all associations pointing to us
-    while ( wxWinMacControlList.DeleteObject(control) )
-        {}
-}
-#else
-
 WX_DECLARE_HASH_MAP(ControlRef, wxWindow*, wxPointerHash, wxPointerEqual, MacControlMap);
 
 static MacControlMap wxWinMacControlList;
 WX_DECLARE_HASH_MAP(ControlRef, wxWindow*, wxPointerHash, wxPointerEqual, MacControlMap);
 
 static MacControlMap wxWinMacControlList;
@@ -709,7 +675,6 @@ void wxRemoveMacControlAssociation(wxWindow *control)
         }
     }
 }
         }
     }
 }
-#endif // deprecated wxList
 
 // ----------------------------------------------------------------------------
  // constructors and such
 
 // ----------------------------------------------------------------------------
  // constructors and such
@@ -736,17 +701,17 @@ void wxWindowMac::Init()
     m_peer = NULL ;
     m_frozenness = 0 ;
 #if WXWIN_COMPATIBILITY_2_4
     m_peer = NULL ;
     m_frozenness = 0 ;
 #if WXWIN_COMPATIBILITY_2_4
-    m_backgroundTransparent = FALSE;
+    m_backgroundTransparent = false;
 #endif
 
     // as all windows are created with WS_VISIBLE style...
 #endif
 
     // as all windows are created with WS_VISIBLE style...
-    m_isShown = TRUE;
+    m_isShown = true;
 
     m_hScrollBar = NULL ;
     m_vScrollBar = NULL ;
     m_macBackgroundBrush = wxNullBrush ;
 
 
     m_hScrollBar = NULL ;
     m_vScrollBar = NULL ;
     m_macBackgroundBrush = wxNullBrush ;
 
-    m_macIsUserPane = TRUE;
+    m_macIsUserPane = true;
 #if wxMAC_USE_CORE_GRAPHICS
     m_cgContextRef = NULL ;
 #endif
 #if wxMAC_USE_CORE_GRAPHICS
     m_cgContextRef = NULL ;
 #endif
@@ -761,7 +726,7 @@ wxWindowMac::~wxWindowMac()
 {
     SendDestroyEvent();
 
 {
     SendDestroyEvent();
 
-    m_isBeingDeleted = TRUE;
+    m_isBeingDeleted = true;
 
     MacInvalidateBorders() ;
 
 
     MacInvalidateBorders() ;
 
@@ -797,6 +762,7 @@ wxWindowMac::~wxWindowMac()
     {
         // in case the callback might be called during destruction
         wxRemoveMacControlAssociation( this) ;
     {
         // in case the callback might be called during destruction
         wxRemoveMacControlAssociation( this) ;
+        ::RemoveEventHandler( (EventHandlerRef ) m_macControlEventHandler ) ;
         // we currently are not using this hook
         // ::SetControlColorProc( *m_peer , NULL ) ;
         m_peer->Dispose() ;
         // we currently are not using this hook
         // ::SetControlColorProc( *m_peer , NULL ) ;
         m_peer->Dispose() ;
@@ -860,10 +826,10 @@ bool wxWindowMac::Create(wxWindowMac *parent, wxWindowID id,
            long style,
            const wxString& name)
 {
            long style,
            const wxString& name)
 {
-    wxCHECK_MSG( parent, FALSE, wxT("can't create wxWindowMac without parent") );
+    wxCHECK_MSG( parent, false, wxT("can't create wxWindowMac without parent") );
 
     if ( !CreateBase(parent, id, pos, size, style, wxDefaultValidator, name) )
 
     if ( !CreateBase(parent, id, pos, size, style, wxDefaultValidator, name) )
-        return FALSE;
+        return false;
 
     m_windowVariant = parent->GetWindowVariant() ;
 
 
     m_windowVariant = parent->GetWindowVariant() ;
 
@@ -901,10 +867,10 @@ bool wxWindowMac::Create(wxWindowMac *parent, wxWindowID id,
     wxWindowCreateEvent event(this);
     GetEventHandler()->AddPendingEvent(event);
 
     wxWindowCreateEvent event(this);
     GetEventHandler()->AddPendingEvent(event);
 
-    return TRUE;
+    return true;
 }
 
 }
 
-void wxWindowMac::MacChildAdded() 
+void wxWindowMac::MacChildAdded()
 {
     if ( m_vScrollBar )
     {
 {
     if ( m_vScrollBar )
     {
@@ -1172,7 +1138,7 @@ bool wxWindowMac::MacGetBoundsForControl(const wxPoint& pos,
                                        int& w, int& h , bool adjustOrigin ) const
 {
     bool isCompositing = MacGetTopLevelWindow()->MacUsesCompositing() ;
                                        int& w, int& h , bool adjustOrigin ) const
 {
     bool isCompositing = MacGetTopLevelWindow()->MacUsesCompositing() ;
-    
+
     // the desired size, minus the border pixels gives the correct size of the control
 
     x = (int)pos.x;
     // the desired size, minus the border pixels gives the correct size of the control
 
     x = (int)pos.x;
@@ -1217,7 +1183,7 @@ void wxWindowMac::DoGetPosition(int *x, int *y) const
 {
     Rect bounds ;
     m_peer->GetRect( &bounds ) ;
 {
     Rect bounds ;
     m_peer->GetRect( &bounds ) ;
-    
+
     int x1 = bounds.left ;
     int y1 = bounds.top ;
 
     int x1 = bounds.left ;
     int y1 = bounds.top ;
 
@@ -1378,7 +1344,7 @@ void wxWindowMac::MacGetContentAreaInset( int &left , int &top , int &right , in
         GetRegionBounds( rgn , &content ) ;
         m_peer->GetRect( &structure ) ;
         OffsetRect( &structure, -structure.left , -structure.top ) ;
         GetRegionBounds( rgn , &content ) ;
         m_peer->GetRect( &structure ) ;
         OffsetRect( &structure, -structure.left , -structure.top ) ;
-        
+
         left = content.left - structure.left ;
         top = content.top  - structure.top ;
         right = structure.right - content.right ;
         left = content.left - structure.left ;
         top = content.top  - structure.top ;
         right = structure.right - content.right ;
@@ -1440,11 +1406,11 @@ void wxWindowMac::DoGetClientSize(int *x, int *y) const
 
     if (m_hScrollBar  && m_hScrollBar->IsShown() )
     {
 
     if (m_hScrollBar  && m_hScrollBar->IsShown() )
     {
-        hh -= m_hScrollBar->GetSize().y ; // MAC_SCROLLBAR_SIZE ;
+        hh -= m_hScrollBar->GetSize().y ;
     }
     if (m_vScrollBar  && m_vScrollBar->IsShown() )
     {
     }
     if (m_vScrollBar  && m_vScrollBar->IsShown() )
     {
-        ww -= m_vScrollBar->GetSize().x ; // MAC_SCROLLBAR_SIZE;
+        ww -= m_vScrollBar->GetSize().x ;
     }
     if(x)   *x = ww;
     if(y)   *y = hh;
     }
     if(x)   *x = ww;
     if(y)   *y = hh;
@@ -1454,17 +1420,17 @@ void wxWindowMac::DoGetClientSize(int *x, int *y) const
 bool wxWindowMac::SetCursor(const wxCursor& cursor)
 {
     if (m_cursor == cursor)
 bool wxWindowMac::SetCursor(const wxCursor& cursor)
 {
     if (m_cursor == cursor)
-        return FALSE;
+        return false;
 
     if (wxNullCursor == cursor)
     {
         if ( ! wxWindowBase::SetCursor( *wxSTANDARD_CURSOR ) )
 
     if (wxNullCursor == cursor)
     {
         if ( ! wxWindowBase::SetCursor( *wxSTANDARD_CURSOR ) )
-            return FALSE ;
+            return false ;
     }
     else
     {
         if ( ! wxWindowBase::SetCursor( cursor ) )
     }
     else
     {
         if ( ! wxWindowBase::SetCursor( cursor ) )
-            return FALSE ;
+            return false ;
     }
 
     wxASSERT_MSG( m_cursor.Ok(),
     }
 
     wxASSERT_MSG( m_cursor.Ok(),
@@ -1498,7 +1464,7 @@ bool wxWindowMac::SetCursor(const wxCursor& cursor)
         m_cursor.MacInstall() ;
     }
 
         m_cursor.MacInstall() ;
     }
 
-    return TRUE ;
+    return true ;
 }
 
 #if wxUSE_MENUS
 }
 
 #if wxUSE_MENUS
@@ -1536,7 +1502,7 @@ bool wxWindowMac::DoPopupMenu(wxMenu *menu, int x, int y)
 
     menu->SetInvokingWindow(NULL);
 
 
     menu->SetInvokingWindow(NULL);
 
-  return TRUE;
+  return true;
 }
 #endif
 
 }
 #endif
 
@@ -1556,7 +1522,7 @@ void wxWindowMac::DoSetToolTip(wxToolTip *tooltip)
 
 #endif // wxUSE_TOOLTIPS
 
 
 #endif // wxUSE_TOOLTIPS
 
-void wxWindowMac::MacInvalidateBorders() 
+void wxWindowMac::MacInvalidateBorders()
 {
     if ( m_peer == NULL )
         return ;
 {
     if ( m_peer == NULL )
         return ;
@@ -1564,18 +1530,18 @@ void wxWindowMac::MacInvalidateBorders()
     bool vis = MacIsReallyShown() ;
     if ( !vis )
         return ;
     bool vis = MacIsReallyShown() ;
     if ( !vis )
         return ;
-        
+
     int outerBorder = MacGetLeftBorderSize() ;
     if ( m_peer->NeedsFocusRect() && m_peer->HasFocus() )
         outerBorder += 4 ;
 
     if ( outerBorder == 0 )
         return ;
     int outerBorder = MacGetLeftBorderSize() ;
     if ( m_peer->NeedsFocusRect() && m_peer->HasFocus() )
         outerBorder += 4 ;
 
     if ( outerBorder == 0 )
         return ;
-        
-    // now we know that we have something to do at all    
+
+    // now we know that we have something to do at all
 
     // as the borders are drawn on the parent we have to properly invalidate all these areas
 
     // as the borders are drawn on the parent we have to properly invalidate all these areas
-    RgnHandle   updateInner = NewRgn() , 
+    RgnHandle   updateInner = NewRgn() ,
                 updateOuter = NewRgn() ;
 
     // this rectangle is in HIViewCoordinates under OSX and in Window Coordinates under Carbon
                 updateOuter = NewRgn() ;
 
     // this rectangle is in HIViewCoordinates under OSX and in Window Coordinates under Carbon
@@ -1717,7 +1683,7 @@ void wxWindowMac::DoMoveWindow(int x, int y, int width, int height)
     if ((m_maxWidth != -1) && (actualWidth > m_maxWidth))
         actualWidth = m_maxWidth;
     if ((m_maxHeight != -1) && (actualHeight > m_maxHeight))
     if ((m_maxWidth != -1) && (actualWidth > m_maxWidth))
         actualWidth = m_maxWidth;
     if ((m_maxHeight != -1) && (actualHeight > m_maxHeight))
-        actualHeight = m_maxHeight;    
+        actualHeight = m_maxHeight;
 
     bool doMove = false ;
     bool doResize = false ;
 
     bool doMove = false ;
     bool doResize = false ;
@@ -1733,10 +1699,10 @@ void wxWindowMac::DoMoveWindow(int x, int y, int width, int height)
 
     if ( doMove || doResize )
     {
 
     if ( doMove || doResize )
     {
-        // as the borders are drawn outside the native control, we adjust now    
+        // as the borders are drawn outside the native control, we adjust now
 
 
-        wxRect bounds( wxPoint( actualX + MacGetLeftBorderSize() ,actualY + MacGetTopBorderSize() ), 
-            wxSize( actualWidth - (MacGetLeftBorderSize() + MacGetRightBorderSize()) , 
+        wxRect bounds( wxPoint( actualX + MacGetLeftBorderSize() ,actualY + MacGetTopBorderSize() ),
+            wxSize( actualWidth - (MacGetLeftBorderSize() + MacGetRightBorderSize()) ,
                 actualHeight - (MacGetTopBorderSize() + MacGetBottomBorderSize()) ) ) ;
 
         Rect r ;
                 actualHeight - (MacGetTopBorderSize() + MacGetBottomBorderSize()) ) ) ;
 
         Rect r ;
@@ -1748,12 +1714,11 @@ void wxWindowMac::DoMoveWindow(int x, int y, int width, int height)
         }
 
         MacInvalidateBorders() ;
         }
 
         MacInvalidateBorders() ;
-        
+
         m_cachedClippedRectValid = false ;
         m_peer->SetRect( &r ) ;
         m_cachedClippedRectValid = false ;
         m_peer->SetRect( &r ) ;
-        
-        if ( doMove )
-            wxWindowMac::MacSuperChangedPosition() ; // like this only children will be notified
+
+        wxWindowMac::MacSuperChangedPosition() ; // like this only children will be notified
 
         MacInvalidateBorders() ;
 
 
         MacInvalidateBorders() ;
 
@@ -1795,12 +1760,12 @@ wxSize wxWindowMac::DoGetBestSize() const
         {
             bestsize.bottom = 16 ;
         }
         {
             bestsize.bottom = 16 ;
         }
-#if wxUSE_SPINBTN 
+#if wxUSE_SPINBTN
         else if ( IsKindOf( CLASSINFO( wxSpinButton ) ) )
         {
             bestsize.bottom = 24 ;
         }
         else if ( IsKindOf( CLASSINFO( wxSpinButton ) ) )
         {
             bestsize.bottom = 24 ;
         }
-#endif // wxUSE_SPINBTN 
+#endif // wxUSE_SPINBTN
         else
         {
             // return wxWindowBase::DoGetBestSize() ;
         else
         {
             // return wxWindowBase::DoGetBestSize() ;
@@ -1842,15 +1807,15 @@ void wxWindowMac::DoSetSize(int x, int y, int width, int height, int sizeFlags)
         return;
     }
 
         return;
     }
 
-    if ( x == -1 && !(sizeFlags & wxSIZE_ALLOW_MINUS_ONE) )
+    if ( x == wxDefaultCoord && !(sizeFlags & wxSIZE_ALLOW_MINUS_ONE) )
         x = currentX;
         x = currentX;
-    if ( y == -1 && !(sizeFlags & wxSIZE_ALLOW_MINUS_ONE) )
+    if ( y == wxDefaultCoord && !(sizeFlags & wxSIZE_ALLOW_MINUS_ONE) )
         y = currentY;
 
     AdjustForParentClientOrigin(x, y, sizeFlags);
 
         y = currentY;
 
     AdjustForParentClientOrigin(x, y, sizeFlags);
 
-    wxSize size(-1, -1);
-    if ( width == -1 )
+    wxSize size = wxDefaultSize;
+    if ( width == wxDefaultCoord )
     {
         if ( sizeFlags & wxSIZE_AUTO_WIDTH )
         {
     {
         if ( sizeFlags & wxSIZE_AUTO_WIDTH )
         {
@@ -1864,11 +1829,11 @@ void wxWindowMac::DoSetSize(int x, int y, int width, int height, int sizeFlags)
         }
     }
 
         }
     }
 
-    if ( height == -1 )
+    if ( height == wxDefaultCoord )
     {
         if ( sizeFlags & wxSIZE_AUTO_HEIGHT )
         {
     {
         if ( sizeFlags & wxSIZE_AUTO_HEIGHT )
         {
-            if ( size.x == -1 )
+            if ( size.x == wxDefaultCoord )
             {
                 size = DoGetBestSize();
             }
             {
                 size = DoGetBestSize();
             }
@@ -1905,7 +1870,7 @@ wxPoint wxWindowMac::GetClientAreaOrigin() const
 
 void wxWindowMac::DoSetClientSize(int clientwidth, int clientheight)
 {
 
 void wxWindowMac::DoSetClientSize(int clientwidth, int clientheight)
 {
-    if ( clientheight != -1 || clientheight != -1 )
+    if ( clientheight != wxDefaultCoord || clientheight != wxDefaultCoord )
     {
         int currentclientwidth , currentclientheight ;
         int currentwidth , currentheight ;
     {
         int currentclientwidth , currentclientheight ;
         int currentwidth , currentheight ;
@@ -1913,7 +1878,7 @@ void wxWindowMac::DoSetClientSize(int clientwidth, int clientheight)
         GetClientSize( &currentclientwidth , &currentclientheight ) ;
         GetSize( &currentwidth , &currentheight ) ;
 
         GetClientSize( &currentclientwidth , &currentclientheight ) ;
         GetSize( &currentwidth , &currentheight ) ;
 
-        DoSetSize( -1 , -1 , currentwidth + clientwidth - currentclientwidth ,
+        DoSetSize( wxDefaultCoord , wxDefaultCoord , currentwidth + clientwidth - currentclientwidth ,
             currentheight + clientheight - currentclientheight , wxSIZE_USE_EXISTING ) ;
     }
 }
             currentheight + clientheight - currentclientheight , wxSIZE_USE_EXISTING ) ;
     }
 }
@@ -1938,7 +1903,7 @@ bool wxWindowMac::Show(bool show)
 {
     bool former = MacIsReallyShown() ;
     if ( !wxWindowBase::Show(show) )
 {
     bool former = MacIsReallyShown() ;
     if ( !wxWindowBase::Show(show) )
-        return FALSE;
+        return false;
 
     // TODO use visibilityChanged Carbon Event for OSX
     if ( m_peer )
 
     // TODO use visibilityChanged Carbon Event for OSX
     if ( m_peer )
@@ -1947,7 +1912,7 @@ bool wxWindowMac::Show(bool show)
     }
     if ( former != MacIsReallyShown() )
         MacPropagateVisibilityChanged() ;
     }
     if ( former != MacIsReallyShown() )
         MacPropagateVisibilityChanged() ;
-    return TRUE;
+    return true;
 }
 
 bool wxWindowMac::Enable(bool enable)
 }
 
 bool wxWindowMac::Enable(bool enable)
@@ -1955,13 +1920,13 @@ bool wxWindowMac::Enable(bool enable)
     wxASSERT( m_peer->Ok() ) ;
     bool former = MacIsReallyEnabled() ;
     if ( !wxWindowBase::Enable(enable) )
     wxASSERT( m_peer->Ok() ) ;
     bool former = MacIsReallyEnabled() ;
     if ( !wxWindowBase::Enable(enable) )
-        return FALSE;
+        return false;
 
     m_peer->Enable( enable ) ;
 
     if ( former != MacIsReallyEnabled() )
         MacPropagateEnabledStateChanged() ;
 
     m_peer->Enable( enable ) ;
 
     if ( former != MacIsReallyEnabled() )
         MacPropagateEnabledStateChanged() ;
-    return TRUE;
+    return true;
 }
 
 //
 }
 
 //
@@ -2041,7 +2006,7 @@ bool wxWindowMac::MacIsReallyShown()
     // only under OSX the visibility of the TLW is taken into account
     if ( m_isBeingDeleted )
         return false ;
     // only under OSX the visibility of the TLW is taken into account
     if ( m_isBeingDeleted )
         return false ;
-        
+
 #if TARGET_API_MAC_OSX
     if ( m_peer && m_peer->Ok() )
         return m_peer->IsVisible();
 #if TARGET_API_MAC_OSX
     if ( m_peer && m_peer->Ok() )
         return m_peer->IsVisible();
@@ -2180,6 +2145,8 @@ void wxWindowMac::WarpPointer (int x_pos, int y_pos)
 
 void wxWindowMac::OnEraseBackground(wxEraseEvent& event)
 {
 
 void wxWindowMac::OnEraseBackground(wxEraseEvent& event)
 {
+    if ( MacGetTopLevelWindow() == NULL )
+        return ;
 #if TARGET_API_MAC_OSX
     if ( MacGetTopLevelWindow()->MacUsesCompositing() && (m_macBackgroundBrush.Ok() == false || m_macBackgroundBrush.GetStyle() == wxTRANSPARENT ) )
     {
 #if TARGET_API_MAC_OSX
     if ( MacGetTopLevelWindow()->MacUsesCompositing() && (m_macBackgroundBrush.Ok() == false || m_macBackgroundBrush.GetStyle() == wxTRANSPARENT ) )
     {
@@ -2284,7 +2251,7 @@ void wxWindowMac::MacPaintBorders( int leftOrigin , int rightOrigin )
 
         HIThemeFrameDrawInfo info ;
         memset( &info, 0 , sizeof( info ) ) ;
 
         HIThemeFrameDrawInfo info ;
         memset( &info, 0 , sizeof( info ) ) ;
-        
+
         info.version = 0 ;
         info.kind = 0 ;
         info.state = IsEnabled() ? kThemeStateActive : kThemeStateInactive ;
         info.version = 0 ;
         info.kind = 0 ;
         info.state = IsEnabled() ? kThemeStateActive : kThemeStateInactive ;
@@ -2292,7 +2259,7 @@ void wxWindowMac::MacPaintBorders( int leftOrigin , int rightOrigin )
 
         CGContextRef cgContext = (CGContextRef) GetParent()->MacGetCGContextRef() ;
         wxASSERT( cgContext ) ;
 
         CGContextRef cgContext = (CGContextRef) GetParent()->MacGetCGContextRef() ;
         wxASSERT( cgContext ) ;
-         
+
         if (HasFlag(wxRAISED_BORDER) || HasFlag( wxSUNKEN_BORDER) || HasFlag(wxDOUBLE_BORDER) )
         {
             info.kind = kHIThemeFrameTextFieldSquare ;
         if (HasFlag(wxRAISED_BORDER) || HasFlag( wxSUNKEN_BORDER) || HasFlag(wxDOUBLE_BORDER) )
         {
             info.kind = kHIThemeFrameTextFieldSquare ;
@@ -2307,14 +2274,14 @@ void wxWindowMac::MacPaintBorders( int leftOrigin , int rightOrigin )
         {
             HIThemeDrawFocusRect( &cgrect , true , cgContext , kHIThemeOrientationNormal ) ;
         }
         {
             HIThemeDrawFocusRect( &cgrect , true , cgContext , kHIThemeOrientationNormal ) ;
         }
-        
+
         m_peer->GetRect( &rect ) ;
         if ( hasBothScrollbars )
         {
             int size = m_hScrollBar->GetWindowVariant() == wxWINDOW_VARIANT_NORMAL ? 16 : 12 ;
             CGRect cgrect = CGRectMake( rect.right - size , rect.bottom - size , size , size ) ;
             CGPoint cgpoint = CGPointMake( rect.right - size , rect.bottom - size ) ;
         m_peer->GetRect( &rect ) ;
         if ( hasBothScrollbars )
         {
             int size = m_hScrollBar->GetWindowVariant() == wxWINDOW_VARIANT_NORMAL ? 16 : 12 ;
             CGRect cgrect = CGRectMake( rect.right - size , rect.bottom - size , size , size ) ;
             CGPoint cgpoint = CGPointMake( rect.right - size , rect.bottom - size ) ;
-            HIThemeGrowBoxDrawInfo info ; 
+            HIThemeGrowBoxDrawInfo info ;
             memset( &info, 0 , sizeof( info ) ) ;
             info.version = 0 ;
             info.state = IsEnabled() ? kThemeStateActive : kThemeStateInactive ;
             memset( &info, 0 , sizeof( info ) ) ;
             info.version = 0 ;
             info.state = IsEnabled() ? kThemeStateActive : kThemeStateInactive ;
@@ -2343,7 +2310,7 @@ void wxWindowMac::MacPaintBorders( int leftOrigin , int rightOrigin )
         {
             DrawThemeListBoxFrame(&rect,IsEnabled() ? kThemeStateActive : kThemeStateInactive) ;
         }
         {
             DrawThemeListBoxFrame(&rect,IsEnabled() ? kThemeStateActive : kThemeStateInactive) ;
         }
-        
+
         if ( hasFocus )
         {
             DrawThemeFocusRect( &rect , true ) ;
         if ( hasFocus )
         {
             DrawThemeFocusRect( &rect , true ) ;
@@ -2351,7 +2318,7 @@ void wxWindowMac::MacPaintBorders( int leftOrigin , int rightOrigin )
 
         if ( hasBothScrollbars )
         {
 
         if ( hasBothScrollbars )
         {
-            // GetThemeStandaloneGrowBoxBounds    
+            // GetThemeStandaloneGrowBoxBounds
                         //DrawThemeStandaloneNoGrowBox
         }
     }
                         //DrawThemeStandaloneNoGrowBox
         }
     }
@@ -2414,11 +2381,11 @@ void wxWindowMac::ScrollWindow(int dx, int dy, const wxRect *rect)
     if( dx == 0 && dy ==0 )
         return ;
 
     if( dx == 0 && dy ==0 )
         return ;
 
-        int width , height ;
-        GetClientSize( &width , &height ) ;
+    int width , height ;
+    GetClientSize( &width , &height ) ;
 #if TARGET_API_MAC_OSX
 #if TARGET_API_MAC_OSX
-       if ( 1 /* m_peer->IsCompositing() */ )
-       {
+    if ( 1 /* m_peer->IsCompositing() */ )
+    {
         // note there currently is a bug in OSX which makes inefficient refreshes in case an entire control
         // area is scrolled, this does not occur if width and height are 2 pixels less,
         // TODO write optimal workaround
         // note there currently is a bug in OSX which makes inefficient refreshes in case an entire control
         // area is scrolled, this does not occur if width and height are 2 pixels less,
         // TODO write optimal workaround
@@ -2455,7 +2422,7 @@ void wxWindowMac::ScrollWindow(int dx, int dy, const wxRect *rect)
         // is the better overall solution, as it does not slow down scrolling
         m_peer->SetNeedsDisplay() ;
 #else
         // is the better overall solution, as it does not slow down scrolling
         m_peer->SetNeedsDisplay() ;
 #else
-        // this would be the preferred version for fast drawing controls       
+        // this would be the preferred version for fast drawing controls
 
 #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_3
             if( UMAGetSystemVersion() >= 0x1030 && m_peer->IsCompositing() )
 
 #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_3
             if( UMAGetSystemVersion() >= 0x1030 && m_peer->IsCompositing() )
@@ -2465,10 +2432,10 @@ void wxWindowMac::ScrollWindow(int dx, int dy, const wxRect *rect)
                 Update() ;
 
 #endif
                 Update() ;
 
 #endif
-       }
-       else
+    }
+    else
 #endif
 #endif
-       {
+    {
 
         wxPoint pos;
         pos.x = pos.y = 0;
 
         wxPoint pos;
         pos.x = pos.y = 0;
@@ -2476,7 +2443,7 @@ void wxWindowMac::ScrollWindow(int dx, int dy, const wxRect *rect)
         Rect scrollrect;
         RgnHandle updateRgn = NewRgn() ;
 
         Rect scrollrect;
         RgnHandle updateRgn = NewRgn() ;
 
-       {
+        {
             wxClientDC dc(this) ;
             wxMacPortSetter helper(&dc) ;
 
             wxClientDC dc(this) ;
             wxMacPortSetter helper(&dc) ;
 
@@ -2495,7 +2462,7 @@ void wxWindowMac::ScrollWindow(int dx, int dy, const wxRect *rect)
             ScrollRect( &scrollrect , dx , dy , updateRgn ) ;
 
             // now scroll the former update region as well and add the new update region
             ScrollRect( &scrollrect , dx , dy , updateRgn ) ;
 
             // now scroll the former update region as well and add the new update region
-            
+
             WindowRef rootWindow = (WindowRef) MacGetTopLevelWindowRef() ;
             RgnHandle formerUpdateRgn = NewRgn() ;
             RgnHandle scrollRgn = NewRgn() ;
             WindowRef rootWindow = (WindowRef) MacGetTopLevelWindowRef() ;
             RgnHandle formerUpdateRgn = NewRgn() ;
             RgnHandle scrollRgn = NewRgn() ;
@@ -2718,7 +2685,7 @@ void wxWindowMac::ClearBackground()
 void wxWindowMac::Update()
 {
 #if TARGET_API_MAC_OSX
 void wxWindowMac::Update()
 {
 #if TARGET_API_MAC_OSX
-       MacGetTopLevelWindow()->MacPerformUpdates() ;
+    MacGetTopLevelWindow()->MacPerformUpdates() ;
 #else
     ::Draw1Control( m_peer->GetControlRef() ) ;
 #endif
 #else
     ::Draw1Control( m_peer->GetControlRef() ) ;
 #endif
@@ -2735,13 +2702,19 @@ wxTopLevelWindowMac* wxWindowMac::MacGetTopLevelWindow() const
     return win ;
 }
 
     return win ;
 }
 
-const wxRect& wxWindowMac::MacGetClippedRect() const 
+const wxRect& wxWindowMac::MacGetClippedClientRect() const
+{
+    MacUpdateClippedRects() ;
+    return m_cachedClippedClientRect ;
+}
+
+const wxRect& wxWindowMac::MacGetClippedRect() const
 {
     MacUpdateClippedRects() ;
     return m_cachedClippedRect ;
 }
 
 {
     MacUpdateClippedRects() ;
     return m_cachedClippedRect ;
 }
 
-const wxRect&wxWindowMac:: MacGetClippedRectWithOuterStructure() const 
+const wxRect&wxWindowMac:: MacGetClippedRectWithOuterStructure() const
 {
     MacUpdateClippedRects() ;
     return m_cachedClippedRectWithOuterStructure ;
 {
     MacUpdateClippedRects() ;
     return m_cachedClippedRectWithOuterStructure ;
@@ -2790,63 +2763,64 @@ void wxWindowMac::MacUpdateClippedRects() const
 
     rIncludingOuterStructures = r ;
     InsetRect( &rIncludingOuterStructures , -4 , -4 ) ;
 
     rIncludingOuterStructures = r ;
     InsetRect( &rIncludingOuterStructures , -4 , -4 ) ;
-    if ( !IsTopLevel() )
+
+    wxRect cl = GetClientRect() ;
+    Rect rClient = { cl.y , cl.x , cl.y + cl.height , cl.x + cl.width } ;
+
+    const wxWindow* child = this ;
+    const wxWindow* parent = NULL ;
+    while( !child->IsTopLevel() && ( parent = child->GetParent() ) != NULL )
     {
     {
-        const wxWindow* child = this ;
-        const wxWindow* parent = child->GetParent() ;
-        while( parent )
+        int x , y ;
+        wxSize size ;
+
+        if ( parent->MacIsChildOfClientArea(child) )
         {
         {
-            int x , y ;
-            wxSize size ;
-            // we have to find a better clipping algorithm here, in order not to clip things
-            // positioned like status and toolbar
-            if ( 1 /* parent->IsTopLevel() && child->IsKindOf( CLASSINFO( wxToolBar ) ) */ )
-            {
-                size = parent->GetSize() ;
-                x = y = 0 ;
-            }
-            else
-            {
-                size = parent->GetClientSize() ;
-                wxPoint origin = parent->GetClientAreaOrigin() ;
-                x = origin.x ;
-                y = origin.y ;
-            }
-            parent->MacWindowToRootWindow( &x, &y ) ;
-            MacRootWindowToWindow( &x , &y ) ;
+            size = parent->GetClientSize() ;
+            wxPoint origin = parent->GetClientAreaOrigin() ;
+            x = origin.x ;
+            y = origin.y ;
+        }
+        else
+        {
+            // this will be true for scrollbars, toolbars etc.
+            size = parent->GetSize() ;
+            y = parent->MacGetTopBorderSize() ;
+            x = parent->MacGetLeftBorderSize() ;
+            size.x -= parent->MacGetLeftBorderSize() + parent->MacGetRightBorderSize() ;
+            size.y -= parent->MacGetTopBorderSize() + parent->MacGetBottomBorderSize() ;
+        }
 
 
-            Rect rparent = { 
-                y + parent->MacGetTopBorderSize() , x + parent->MacGetLeftBorderSize() , 
-                y + size.y - parent->MacGetBottomBorderSize() ,
-                x + size.x - parent->MacGetRightBorderSize() } ;
+        parent->MacWindowToRootWindow( &x, &y ) ;
+        MacRootWindowToWindow( &x , &y ) ;
 
 
-            // the content will always be clipped
-            SectRect( &r , &rparent , &r ) ;
+        Rect rparent = { y , x , y + size.y , x + size.x } ;
 
 
-            // the structure only at 'hard' borders
-            if ( parent->MacClipChildren() ||
-                ( parent->GetParent() && parent->GetParent()->MacClipGrandChildren() ) )
-            {
-                SectRect( &rIncludingOuterStructures , &rparent , &rIncludingOuterStructures ) ;
-            }
+        // the wxwindow and client rects will always be clipped
+        SectRect( &r , &rparent , &r ) ;
+        SectRect( &rClient , &rparent , &rClient ) ;
 
 
-            if ( parent->IsTopLevel() )
-                break ;
-            child = parent ;
-            parent = child->GetParent() ;
+        // the structure only at 'hard' borders
+        if ( parent->MacClipChildren() ||
+            ( parent->GetParent() && parent->GetParent()->MacClipGrandChildren() ) )
+        {
+            SectRect( &rIncludingOuterStructures , &rparent , &rIncludingOuterStructures ) ;
         }
         }
+        child = parent ;
     }
     }
-    
+
     m_cachedClippedRect = wxRect( r.left , r.top , r.right - r.left , r.bottom - r.top ) ;
     m_cachedClippedRect = wxRect( r.left , r.top , r.right - r.left , r.bottom - r.top ) ;
-    m_cachedClippedRectWithOuterStructure = wxRect( 
-        rIncludingOuterStructures.left , rIncludingOuterStructures.top , 
-        rIncludingOuterStructures.right - rIncludingOuterStructures.left , 
+    m_cachedClippedClientRect = wxRect( rClient.left , rClient.top ,
+        rClient.right - rClient.left , rClient.bottom - rClient.top ) ;
+    m_cachedClippedRectWithOuterStructure = wxRect(
+        rIncludingOuterStructures.left , rIncludingOuterStructures.top ,
+        rIncludingOuterStructures.right - rIncludingOuterStructures.left ,
         rIncludingOuterStructures.bottom - rIncludingOuterStructures.top ) ;
         rIncludingOuterStructures.bottom - rIncludingOuterStructures.top ) ;
-    
+
     m_cachedClippedRegionWithOuterStructure = wxRegion( m_cachedClippedRectWithOuterStructure ) ;
     m_cachedClippedRegion = wxRegion( m_cachedClippedRect ) ;
     m_cachedClippedRegionWithOuterStructure = wxRegion( m_cachedClippedRectWithOuterStructure ) ;
     m_cachedClippedRegion = wxRegion( m_cachedClippedRect ) ;
-    
+    m_cachedClippedClientRegion = wxRegion( m_cachedClippedClientRect ) ;
+
     m_cachedClippedRectValid = true ;
 }
 
     m_cachedClippedRectValid = true ;
 }
 
@@ -2862,7 +2836,7 @@ bool wxWindowMac::MacDoRedraw( WXHRGN updatergnr , long time )
 
     // wxLogDebug(wxT("update for %s bounds %d , %d , %d , %d"),wxString(GetClassInfo()->GetClassName()).c_str(), updatebounds.left , updatebounds.top , updatebounds.right , updatebounds.bottom ) ;
 
 
     // wxLogDebug(wxT("update for %s bounds %d , %d , %d , %d"),wxString(GetClassInfo()->GetClassName()).c_str(), updatebounds.left , updatebounds.top , updatebounds.right , updatebounds.bottom ) ;
 
-    if ( !EmptyRgn(updatergn) )  
+    if ( !EmptyRgn(updatergn) )
     {
         RgnHandle newupdate = NewRgn() ;
         wxSize point = GetClientSize() ;
     {
         RgnHandle newupdate = NewRgn() ;
         wxSize point = GetClientSize() ;
@@ -2881,7 +2855,7 @@ bool wxWindowMac::MacDoRedraw( WXHRGN updatergnr , long time )
                 dc->SetClippingRegion(wxRegion(updatergn));
             else
                 dc->SetClippingRegion(wxRegion(newupdate));
                 dc->SetClippingRegion(wxRegion(updatergn));
             else
                 dc->SetClippingRegion(wxRegion(newupdate));
-                
+
             wxEraseEvent eevent( GetId(), dc );
             eevent.SetEventObject( this );
             GetEventHandler()->ProcessEvent( eevent );
             wxEraseEvent eevent( GetId(), dc );
             eevent.SetEventObject( this );
             GetEventHandler()->ProcessEvent( eevent );
@@ -3015,6 +2989,14 @@ void wxWindowMac::MacCreateScrollBars( long style )
     MacRepositionScrollBars() ; // we might have a real position shift
 }
 
     MacRepositionScrollBars() ; // we might have a real position shift
 }
 
+bool wxWindowMac::MacIsChildOfClientArea( const wxWindow* child ) const
+{
+    if ( child != NULL && ( child == m_hScrollBar || child == m_vScrollBar ) )
+        return false ;
+    else
+        return true ;
+}
+
 void wxWindowMac::MacRepositionScrollBars()
 {
     if ( !m_hScrollBar && !m_vScrollBar )
 void wxWindowMac::MacRepositionScrollBars()
 {
     if ( !m_hScrollBar && !m_vScrollBar )
@@ -3132,7 +3114,7 @@ long wxWindowMac::MacGetLeftBorderSize( ) const
         return 0 ;
 
     SInt32 border = 0 ;
         return 0 ;
 
     SInt32 border = 0 ;
-    
+
     if (HasFlag(wxRAISED_BORDER) || HasFlag( wxSUNKEN_BORDER) || HasFlag(wxDOUBLE_BORDER) )
     {
         GetThemeMetric( kThemeMetricEditTextFrameOutset , &border ) ;
     if (HasFlag(wxRAISED_BORDER) || HasFlag( wxSUNKEN_BORDER) || HasFlag(wxDOUBLE_BORDER) )
     {
         GetThemeMetric( kThemeMetricEditTextFrameOutset , &border ) ;
@@ -3235,4 +3217,17 @@ wxInt32 wxWindowMac::MacControlHit(WXEVENTHANDLERREF WXUNUSED(handler) , WXEVENT
     return eventNotHandledErr ;
 }
 
     return eventNotHandledErr ;
 }
 
+bool wxWindowMac::Reparent(wxWindowBase *newParentBase)
+{
+    wxWindowMac *newParent = (wxWindowMac *)newParentBase;
+
+    if ( !wxWindowBase::Reparent(newParent) )
+        return false;
+
+    //copied from MacPostControlCreate
+    ControlRef container = (ControlRef) GetParent()->GetHandle() ;
+    wxASSERT_MSG( container != NULL , wxT("No valid mac container control") ) ;
+    ::EmbedControl( m_peer->GetControlRef() , container ) ;
 
 
+    return true;
+}