+
+void
+wxRendererMac::DrawItemSelectionRect(wxWindow *win,
+ wxDC& dc,
+ const wxRect& rect,
+ int flags )
+{
+ if ( !(flags & wxCONTROL_SELECTED) )
+ return;
+
+ if (flags & wxCONTROL_FOCUSED)
+ {
+ if (!IsControlActive( (ControlRef)win->GetHandle() ))
+ flags = wxCONTROL_SELECTED;
+ }
+
+ RGBColor selColor;
+ GetThemeBrushAsColor(flags & wxCONTROL_FOCUSED
+ ? kThemeBrushAlternatePrimaryHighlightColor
+ : kThemeBrushSecondaryHighlightColor,
+ 32, true, &selColor);
+
+ wxBrush selBrush(selColor);
+
+ dc.SetPen( *wxTRANSPARENT_PEN );
+ dc.SetBrush( selBrush );
+ dc.DrawRectangle( rect );
+}
+
+
+void
+wxRendererMac::DrawMacThemeButton(wxWindow *win,
+ wxDC& dc,
+ const wxRect& rect,
+ int flags,
+ int kind,
+ int adornment)
+{
+#if !wxMAC_USE_CORE_GRAPHICS
+ const wxCoord x = dc.LogicalToDeviceX(rect.x);
+ const wxCoord y = dc.LogicalToDeviceY(rect.y);
+ const wxCoord w = dc.LogicalToDeviceXRel(rect.width);
+ const wxCoord h = dc.LogicalToDeviceYRel(rect.height);
+#else
+ // now the wxGCDC is using native transformations
+ const wxCoord x = rect.x;
+ const wxCoord y = rect.y;
+ const wxCoord w = rect.width;
+ const wxCoord h = rect.height;
+#endif
+
+ dc.SetBrush( *wxTRANSPARENT_BRUSH );
+
+ HIRect headerRect = CGRectMake( x, y, w, h );
+ if ( !dc.IsKindOf( CLASSINFO( wxPaintDC ) ) )
+ {
+ Rect r =
+ {
+ (short) headerRect.origin.y, (short) headerRect.origin.x,
+ (short) (headerRect.origin.y + headerRect.size.height),
+ (short) (headerRect.origin.x + headerRect.size.width)
+ };
+
+ RgnHandle updateRgn = NewRgn();
+ RectRgn( updateRgn, &r );
+ HIViewSetNeedsDisplayInRegion( (HIViewRef) win->GetHandle(), updateRgn, true );
+ DisposeRgn( updateRgn );
+ }
+ else
+ {
+ CGContextRef cgContext;
+
+#if wxMAC_USE_CORE_GRAPHICS
+ cgContext = (CGContextRef) dc.GetGraphicsContext()->GetNativeContext();
+#else
+ Rect bounds;
+
+ GetPortBounds( (CGrafPtr) dc.m_macPort, &bounds );
+ QDBeginCGContext( (CGrafPtr) dc.m_macPort, &cgContext );
+
+ CGContextTranslateCTM( cgContext, 0, bounds.bottom - bounds.top );
+ CGContextScaleCTM( cgContext, 1, -1 );
+
+ HIShapeReplacePathInCGContext( HIShapeCreateWithQDRgn( (RgnHandle) dc.m_macCurrentClipRgn ), cgContext );
+ CGContextClip( cgContext );
+ HIViewConvertRect( &headerRect, (HIViewRef) win->GetHandle(), (HIViewRef) win->MacGetTopLevelWindow()->GetHandle() );
+#endif
+
+ {
+ HIThemeButtonDrawInfo drawInfo;
+ HIRect labelRect;
+
+ memset( &drawInfo, 0, sizeof(drawInfo) );
+ drawInfo.version = 0;
+ drawInfo.kind = kind;
+ drawInfo.state = (flags & wxCONTROL_DISABLED) ? kThemeStateInactive : kThemeStateActive;
+ drawInfo.value = (flags & wxCONTROL_SELECTED) ? kThemeButtonOn : kThemeButtonOff;
+ if (flags & wxCONTROL_UNDETERMINED)
+ drawInfo.value = kThemeButtonMixed;
+ drawInfo.adornment = adornment;
+
+ HIThemeDrawButton( &headerRect, &drawInfo, cgContext, kHIThemeOrientationNormal, &labelRect );
+ }
+
+#if wxMAC_USE_CORE_GRAPHICS
+#else
+ QDEndCGContext( (CGrafPtr) dc.m_macPort, &cgContext );
+#endif
+ }
+}
+
+void
+wxRendererMac::DrawCheckBox(wxWindow *win,
+ wxDC& dc,
+ const wxRect& rect,
+ int flags)
+{
+ if (flags & wxCONTROL_CHECKED)
+ flags |= wxCONTROL_SELECTED;
+
+ DrawMacThemeButton(win, dc, rect, flags,
+ kThemeCheckBox, kThemeAdornmentNone);
+}
+
+void
+wxRendererMac::DrawComboBoxDropButton(wxWindow *win,
+ wxDC& dc,
+ const wxRect& rect,
+ int flags)
+{
+ int kind;
+ if (win->GetWindowVariant() == wxWINDOW_VARIANT_SMALL || (win->GetParent() && win->GetParent()->GetWindowVariant() == wxWINDOW_VARIANT_SMALL))
+ kind = kThemeArrowButtonSmall;
+ else if (win->GetWindowVariant() == wxWINDOW_VARIANT_MINI || (win->GetParent() && win->GetParent()->GetWindowVariant() == wxWINDOW_VARIANT_MINI))
+ kind = kThemeArrowButtonMini;
+ else
+ kind = kThemeArrowButton;
+
+ DrawMacThemeButton(win, dc, rect, flags,
+ kind, kThemeAdornmentArrowDownArrow);
+}
+
+void
+wxRendererMac::DrawPushButton(wxWindow *win,
+ wxDC& dc,
+ const wxRect& rect,
+ int flags)
+{
+ int kind;
+ if (win->GetWindowVariant() == wxWINDOW_VARIANT_SMALL || (win->GetParent() && win->GetParent()->GetWindowVariant() == wxWINDOW_VARIANT_SMALL))
+ kind = kThemeBevelButtonSmall;
+ // There is no kThemeBevelButtonMini, but in this case, use Small
+ else if (win->GetWindowVariant() == wxWINDOW_VARIANT_MINI || (win->GetParent() && win->GetParent()->GetWindowVariant() == wxWINDOW_VARIANT_MINI))
+ kind = kThemeBevelButtonSmall;
+ else
+ kind = kThemeBevelButton;
+
+ DrawMacThemeButton(win, dc, rect, flags,
+ kind, kThemeAdornmentNone);
+}
+
+void
+wxRendererMac::DrawFocusRect(wxWindow* win, wxDC& dc, const wxRect& rect, int flags)
+{
+ if (!win)
+ {
+ wxDelegateRendererNative::DrawFocusRect(win, dc, rect, flags);
+ return;
+ }
+
+#if wxMAC_USE_CORE_GRAPHICS
+ {
+ CGRect cgrect = CGRectMake( rect.x , rect.y , rect.width, rect.height ) ;
+
+ HIThemeFrameDrawInfo info ;
+ memset( &info, 0 , sizeof(info) ) ;
+
+ info.version = 0 ;
+ info.kind = 0 ;
+ info.state = kThemeStateActive;
+ info.isFocused = true ;
+
+ CGContextRef cgContext = (CGContextRef) win->MacGetCGContextRef() ;
+ wxASSERT( cgContext ) ;
+
+ HIThemeDrawFocusRect( &cgrect , true , cgContext , kHIThemeOrientationNormal ) ;
+ }
+#else
+ // FIXME: not yet working for !wxMAC_USE_CORE_GRAPHICS
+ {
+ Rect r;
+ r.left = rect.x; r.top = rect.y; r.right = rect.GetRight(); r.bottom = rect.GetBottom();
+ wxTopLevelWindowMac* top = win->MacGetTopLevelWindow();
+ if ( top )
+ {
+ wxPoint pt(0, 0) ;
+ wxMacControl::Convert( &pt , win->GetPeer() , top->GetPeer() ) ;
+ OffsetRect( &r , pt.x , pt.y ) ;
+ }
+
+ DrawThemeFocusRect( &r , true ) ;
+ }
+#endif
+}
+