+int wxRendererMac::DrawHeaderButton( wxWindow *win,
+ wxDC& dc,
+ const wxRect& rect,
+ int flags,
+ wxHeaderSortIconType sortArrow,
+ wxHeaderButtonParams* params )
+{
+#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 );
+
+ HIShapeRef shape = HIShapeCreateWithQDRgn( (RgnHandle) dc.m_macCurrentClipRgn );
+ if ( shape != 0 )
+ {
+ HIShapeReplacePathInCGContext( shape , cgContext );
+ CFRelease( shape );
+ 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 = kThemeListHeaderButton;
+ drawInfo.state = (flags & wxCONTROL_DISABLED) ? kThemeStateInactive : kThemeStateActive;
+ drawInfo.value = (flags & wxCONTROL_SELECTED) ? kThemeButtonOn : kThemeButtonOff;
+ drawInfo.adornment = kThemeAdornmentNone;
+
+ // The down arrow is drawn automatically, change it to an up arrow if needed.
+ if ( sortArrow == wxHDR_SORT_ICON_UP )
+ drawInfo.adornment = kThemeAdornmentHeaderButtonSortUp;
+
+ HIThemeDrawButton( &headerRect, &drawInfo, cgContext, kHIThemeOrientationNormal, &labelRect );
+
+ // If we don't want any arrows we need to draw over the one already there
+ if ( (flags & wxCONTROL_SELECTED) && (sortArrow == wxHDR_SORT_ICON_NONE) )
+ {
+ // clip to the header rectangle
+ CGContextSaveGState( cgContext );
+ CGContextClipToRect( cgContext, headerRect );
+ // but draw bigger than that so the arrow will get clipped off
+ headerRect.size.width += 25;
+ HIThemeDrawButton( &headerRect, &drawInfo, cgContext, kHIThemeOrientationNormal, &labelRect );
+ CGContextRestoreGState( cgContext );
+ }
+ }
+
+#if wxMAC_USE_CORE_GRAPHICS
+#else
+ QDEndCGContext( (CGrafPtr) dc.m_macPort, &cgContext );
+#endif
+ }
+
+ // Reserve room for the arrows before writing the label, and turn off the
+ // flags we've already handled
+ wxRect newRect(rect);
+ if ( (flags & wxCONTROL_SELECTED) && (sortArrow != wxHDR_SORT_ICON_NONE) )
+ {
+ newRect.width -= 12;
+ sortArrow = wxHDR_SORT_ICON_NONE;
+ }
+ flags &= ~wxCONTROL_SELECTED;
+
+ return DrawHeaderButtonContents(win, dc, newRect, flags, sortArrow, params);
+}
+
+
+int wxRendererMac::GetHeaderButtonHeight(wxWindow* WXUNUSED(win))