]> git.saurik.com Git - wxWidgets.git/blobdiff - src/osx/window_osx.cpp
adjust the toolbar tools bitmap size to fit the biggest bitmap used under wxOSX too...
[wxWidgets.git] / src / osx / window_osx.cpp
index bb4f4d691cb2cd8fb56af53036766d5907015c30..9e96180e7f7b065f8ed4fa50072d719c985a5f68 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()
 
@@ -200,10 +198,6 @@ WXWidget wxWindowMac::GetHandle() const
     return NULL;
 }
 
-//
-// TODO END move to window_osx.cpp
-//
-
 // ---------------------------------------------------------------------------
 // Utility Routines to move between different coordinate systems
 // ---------------------------------------------------------------------------
@@ -409,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 ;
@@ -472,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() ;
@@ -509,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
@@ -638,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() ;
 
@@ -657,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() )
@@ -760,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 );
 
@@ -768,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);
@@ -799,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))
@@ -807,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 ;
 
@@ -832,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
@@ -868,7 +879,7 @@ wxSize wxWindowMac::DoGetBestSize() const
     else
     {
         wxRect r ;
-        
+
         m_peer->GetBestRect(&r);
 
         if ( r.GetWidth() == 0 && r.GetHeight() == 0 )
@@ -894,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 ;
@@ -1008,9 +1019,14 @@ void wxWindowMac::DoSetClientSize(int clientwidth, int clientheight)
 
 void wxWindowMac::SetLabel(const wxString& title)
 {
+    if ( title == m_label )
+        return;
+
     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
@@ -1090,8 +1106,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;
@@ -1106,9 +1125,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 )
@@ -1131,7 +1150,7 @@ void wxWindowMac::Refresh(bool WXUNUSED(eraseBack), const wxRect *rect)
 
     if ( !IsShownOnScreen() )
         return ;
-        
+
     m_peer->SetNeedsDisplay( rect ) ;
 }
 
@@ -1166,39 +1185,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 )
@@ -1300,7 +1286,7 @@ void  wxWindowMac::MacPaintGrowBox()
         wxASSERT( cgContext ) ;
 
         int tx,ty,tw,th;
-    
+
         m_peer->GetSize( tw, th );
         m_peer->GetPosition( tx, ty );
 
@@ -1333,7 +1319,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 );
 
@@ -1371,7 +1357,7 @@ void wxWindowMac::MacPaintBorders( int WXUNUSED(leftOrigin) , int WXUNUSED(right
                 HIThemeDrawFrame( &cgrect , &info , cgContext , kHIThemeOrientationNormal ) ;
             }
         }
-        
+
         if ( hasFocus )
         {
             HIThemeDrawFocusRect( &cgrect , true , cgContext , kHIThemeOrientationNormal ) ;
@@ -1515,16 +1501,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()
@@ -1684,7 +1663,7 @@ void wxWindowMac::MacUpdateClippedRects() const
     Rect rIncludingOuterStructures ;
 
     int tx,ty,tw,th;
-    
+
     m_peer->GetSize( tw, th );
     m_peer->GetPosition( tx, ty );
 
@@ -1771,37 +1750,61 @@ 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();
+    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;
+                }
 
-        wxEraseEvent eevent( GetId(), dc );
-        eevent.SetEventObject( this );
-        HandleWindowEvent( eevent );
-        delete dc ;
+                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;
+
+        default:
+            wxFAIL_MSG( "unsupported background style" );
     }
 
     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() )
@@ -1846,7 +1849,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
@@ -1863,7 +1866,7 @@ void wxWindowMac::MacPaintChildrenBorders()
 
 WXWindow wxWindowMac::MacGetTopLevelWindowRef() const
 {
-    wxNonOwnedWindow* tlw = MacGetTopLevelWindow(); 
+    wxNonOwnedWindow* tlw = MacGetTopLevelWindow();
     return tlw ? tlw->GetWXWindow() : NULL ;
 }
 
@@ -2006,7 +2009,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()
@@ -2158,7 +2164,7 @@ Rect wxMacGetBoundsForControl( wxWindowMac* window , const wxPoint& pos , const
     return bounds ;
 }
 
-bool wxWindowMac::OSXHandleClicked( double timestampsec )
+bool wxWindowMac::OSXHandleClicked( double WXUNUSED(timestampsec) )
 {
     return false;
 }
@@ -2168,7 +2174,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;
@@ -2274,7 +2280,7 @@ bool wxWindowMac::OSXHandleKeyEvent( wxKeyEvent& event )
 }
 
 //
-// wxWidgetImpl 
+// wxWidgetImpl
 //
 
 WX_DECLARE_HASH_MAP(WXWidget, wxWidgetImpl*, wxPointerHash, wxPointerEqual, MacControlMap);
@@ -2286,7 +2292,7 @@ wxWindowMac *wxFindWindowFromWXWidget(WXWidget inControl )
     wxWidgetImpl* impl = wxWidgetImpl::FindFromWXWidget( inControl );
     if ( impl )
         return impl->GetWXPeer();
-    
+
     return NULL;
 }