]> git.saurik.com Git - wxWidgets.git/blobdiff - src/osx/window_osx.cpp
Patch wxGTK1 for recent changes in bmpbuttn
[wxWidgets.git] / src / osx / window_osx.cpp
index 6c3433c72389fae8db2a7d2d574ecc0dc0a85f6d..50b3bc90e93a7f48252c57b3d0765279da27fe19 100644 (file)
@@ -83,8 +83,6 @@
 #endif
 
 BEGIN_EVENT_TABLE(wxWindowMac, wxWindowBase)
-    EVT_NC_PAINT(wxWindowMac::OnNcPaint)
-    EVT_ERASE_BACKGROUND(wxWindowMac::OnEraseBackground)
     EVT_MOUSE_EVENTS(wxWindowMac::OnMouseEvent)
 END_EVENT_TABLE()
 
@@ -195,13 +193,11 @@ wxWindowMac::~wxWindowMac()
 
 WXWidget wxWindowMac::GetHandle() const
 {
-    return (WXWidget) m_peer->GetWXWidget() ;
+    if ( m_peer )
+        return (WXWidget) m_peer->GetWXWidget() ;
+    return NULL;
 }
 
-//
-// TODO END move to window_osx.cpp
-//
-
 // ---------------------------------------------------------------------------
 // Utility Routines to move between different coordinate systems
 // ---------------------------------------------------------------------------
@@ -407,11 +403,25 @@ bool wxWindowMac::SetBackgroundColour(const wxColour& col )
     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 ;
 
+    if (wxIsWindowOrParentDisabled((wxWindow*) this))
+        return;
+
     wxWindow* former = FindFocus() ;
     if ( former == this )
         return ;
@@ -470,8 +480,8 @@ bool wxWindowMac::MacGetBoundsForControl(
     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() ;
@@ -507,7 +517,7 @@ void wxWindowMac::DoGetSize(int *x, int *y) const
 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
@@ -636,13 +646,13 @@ wxSize wxWindowMac::DoGetSizeFromClientSize( const wxSize & size )  const
     int innerwidth, innerheight;
     int left, top;
     int outerwidth, outerheight;
-    
+
     m_peer->GetContentArea( left, top, innerwidth, innerheight );
     m_peer->GetSize( outerwidth, outerheight );
-    
+
     sizeTotal.x += outerwidth-innerwidth;
     sizeTotal.y += outerheight-innerheight;
-    
+
     sizeTotal.x += MacGetLeftBorderSize() + MacGetRightBorderSize() ;
     sizeTotal.y += MacGetTopBorderSize() + MacGetBottomBorderSize() ;
 
@@ -655,7 +665,7 @@ void wxWindowMac::DoGetClientSize( int *x, int *y ) const
     int ww, hh;
 
     int left, top;
-    
+
     m_peer->GetContentArea( left, top, ww, hh );
 
     if (m_hScrollBar  && m_hScrollBar->IsShown() )
@@ -758,7 +768,7 @@ void wxWindowMac::MacInvalidateBorders()
     // 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 );
 
@@ -766,7 +776,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 );
-    
+
     if (GetParent()) {
         GetParent()->m_peer->SetNeedsDisplay(&leftupdate);
         GetParent()->m_peer->SetNeedsDisplay(&rightupdate);
@@ -797,6 +807,8 @@ void wxWindowMac::DoMoveWindow(int x, int y, int width, int height)
     int actualX = x;
     int actualY = y;
 
+#if 0
+    // min and max sizes are only for sizers, not for explicit size setting
     if ((m_minWidth != -1) && (actualWidth < m_minWidth))
         actualWidth = m_minWidth;
     if ((m_minHeight != -1) && (actualHeight < m_minHeight))
@@ -805,6 +817,7 @@ void wxWindowMac::DoMoveWindow(int x, int y, int width, int height)
         actualWidth = m_maxWidth;
     if ((m_maxHeight != -1) && (actualHeight > m_maxHeight))
         actualHeight = m_maxHeight;
+#endif
 
     bool doMove = false, doResize = false ;
 
@@ -830,7 +843,7 @@ void wxWindowMac::DoMoveWindow(int x, int y, int width, int height)
         MacInvalidateBorders() ;
 
         m_cachedClippedRectValid = false ;
-        
+
         m_peer->Move( bounds.x, bounds.y, bounds.width, bounds.height);
 
         wxWindowMac::MacSuperChangedPosition() ; // like this only children will be notified
@@ -866,7 +879,7 @@ wxSize wxWindowMac::DoGetBestSize() const
     else
     {
         wxRect r ;
-        
+
         m_peer->GetBestRect(&r);
 
         if ( r.GetWidth() == 0 && r.GetHeight() == 0 )
@@ -892,9 +905,9 @@ wxSize wxWindowMac::DoGetBestSize() const
             }
         }
 
-        int bestWidth = r.width + MacGetLeftBorderSize() + 
+        int bestWidth = r.width + MacGetLeftBorderSize() +
                     MacGetRightBorderSize();
-        int bestHeight = r.height + MacGetTopBorderSize() + 
+        int bestHeight = r.height + MacGetTopBorderSize() +
                      MacGetBottomBorderSize();
         if ( bestHeight < 10 )
             bestHeight = 13 ;
@@ -1088,8 +1101,11 @@ int wxWindowMac::GetCharWidth() const
     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;
@@ -1104,9 +1120,9 @@ void wxWindowMac::GetTextExtent(const wxString& str, int *x, int *y,
 
     wxDouble h , d , e , w;
     ctx->GetTextExtent( str, &w, &h, &d, &e );
-    
+
     delete ctx;
-    
+
     if ( externalLeading )
         *externalLeading = (wxCoord)(e+0.5);
     if ( descent )
@@ -1129,7 +1145,7 @@ void wxWindowMac::Refresh(bool WXUNUSED(eraseBack), const wxRect *rect)
 
     if ( !IsShownOnScreen() )
         return ;
-        
+
     m_peer->SetNeedsDisplay( rect ) ;
 }
 
@@ -1164,39 +1180,6 @@ void wxWindowMac::WarpPointer(int WXUNUSED(x_pos), int WXUNUSED(y_pos))
     // 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
 {
     if ( orient == wxHORIZONTAL )
@@ -1298,7 +1281,7 @@ void  wxWindowMac::MacPaintGrowBox()
         wxASSERT( cgContext ) ;
 
         int tx,ty,tw,th;
-    
+
         m_peer->GetSize( tw, th );
         m_peer->GetPosition( tx, ty );
 
@@ -1331,7 +1314,7 @@ void wxWindowMac::MacPaintBorders( int WXUNUSED(leftOrigin) , int WXUNUSED(right
 
     // back to the surrounding frame rectangle
     int tx,ty,tw,th;
-    
+
     m_peer->GetSize( tw, th );
     m_peer->GetPosition( tx, ty );
 
@@ -1369,7 +1352,7 @@ void wxWindowMac::MacPaintBorders( int WXUNUSED(leftOrigin) , int WXUNUSED(right
                 HIThemeDrawFrame( &cgrect , &info , cgContext , kHIThemeOrientationNormal ) ;
             }
         }
-        
+
         if ( hasFocus )
         {
             HIThemeDrawFocusRect( &cgrect , true , cgContext , kHIThemeOrientationNormal ) ;
@@ -1513,16 +1496,9 @@ void wxWindowMac::MacOnScroll( wxScrollEvent &event )
     }
 }
 
-// Get the window with the focus
 wxWindow *wxWindowBase::DoFindFocus()
 {
-#if wxOSX_USE_CARBON
-    ControlRef control ;
-    GetKeyboardFocus( GetUserFocusWindow() , &control ) ;
-    return wxFindWindowFromWXWidget( (WXWidget) control ) ;
-#else
-    return NULL;
-#endif
+    return wxFindWindowFromWXWidget(wxWidgetImpl::FindFocus());
 }
 
 void wxWindowMac::OnInternalIdle()
@@ -1682,7 +1658,7 @@ void wxWindowMac::MacUpdateClippedRects() const
     Rect rIncludingOuterStructures ;
 
     int tx,ty,tw,th;
-    
+
     m_peer->GetSize( tw, th );
     m_peer->GetPosition( tx, ty );
 
@@ -1769,37 +1745,44 @@ void wxWindowMac::MacUpdateClippedRects() const
 bool wxWindowMac::MacDoRedraw( long time )
 {
     bool handled = false ;
-    
+
     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
+    const wxBackgroundStyle bgStyle = GetBackgroundStyle();
+    if ( bgStyle == wxBG_STYLE_ERASE )
     {
         // 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);
+        wxWindowDC dc(this);
         if ( IsTopLevel() )
-            dc->SetDeviceClippingRegion(formerUpdateRgn);
+            dc.SetDeviceClippingRegion(formerUpdateRgn);
         else
-            dc->SetDeviceClippingRegion(clientUpdateRgn);
+            dc.SetDeviceClippingRegion(clientUpdateRgn);
 
-        wxEraseEvent eevent( GetId(), dc );
+        wxEraseEvent eevent( GetId(), &dc );
         eevent.SetEventObject( this );
-        HandleWindowEvent( eevent );
-        delete dc ;
+        if ( !ProcessWindowEvent( eevent ) )
+        {
+            if ( bgStyle == wxBG_STYLE_SYSTEM && MacGetTopLevelWindow() )
+            {
+                dc.Clear();
+            }
+        }
     }
 
     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() )
@@ -1844,7 +1827,7 @@ void wxWindowMac::MacPaintChildrenBorders()
 
         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
@@ -1861,7 +1844,7 @@ void wxWindowMac::MacPaintChildrenBorders()
 
 WXWindow wxWindowMac::MacGetTopLevelWindowRef() const
 {
-    wxNonOwnedWindow* tlw = MacGetTopLevelWindow(); 
+    wxNonOwnedWindow* tlw = MacGetTopLevelWindow();
     return tlw ? tlw->GetWXWindow() : NULL ;
 }
 
@@ -2004,7 +1987,10 @@ void wxWindowMac::MacRepositionScrollBars()
 
 bool wxWindowMac::AcceptsFocus() const
 {
-    return m_peer->CanFocus() && wxWindowBase::AcceptsFocus();
+    if ( MacIsUserPane() )
+        return wxWindowBase::AcceptsFocus();
+    else
+        return m_peer->CanFocus();
 }
 
 void wxWindowMac::MacSuperChangedPosition()
@@ -2156,7 +2142,7 @@ Rect wxMacGetBoundsForControl( wxWindowMac* window , const wxPoint& pos , const
     return bounds ;
 }
 
-bool wxWindowMac::OSXHandleClicked( double timestampsec )
+bool wxWindowMac::OSXHandleClicked( double WXUNUSED(timestampsec) )
 {
     return false;
 }
@@ -2166,7 +2152,7 @@ wxInt32 wxWindowMac::MacControlHit(WXEVENTHANDLERREF WXUNUSED(handler) , WXEVENT
 #if wxOSX_USE_COCOA_OR_CARBON
     if ( OSXHandleClicked( GetEventTime((EventRef)event) ) )
         return noErr;
-        
+
     return eventNotHandledErr ;
 #else
     return 0;
@@ -2272,7 +2258,7 @@ bool wxWindowMac::OSXHandleKeyEvent( wxKeyEvent& event )
 }
 
 //
-// wxWidgetImpl 
+// wxWidgetImpl
 //
 
 WX_DECLARE_HASH_MAP(WXWidget, wxWidgetImpl*, wxPointerHash, wxPointerEqual, MacControlMap);
@@ -2284,7 +2270,7 @@ wxWindowMac *wxFindWindowFromWXWidget(WXWidget inControl )
     wxWidgetImpl* impl = wxWidgetImpl::FindFromWXWidget( inControl );
     if ( impl )
         return impl->GetWXPeer();
-    
+
     return NULL;
 }