+
+ // 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))
+{
+ SInt32 standardHeight;
+ OSStatus errStatus;
+
+ errStatus = GetThemeMetric( kThemeMetricListHeaderHeight, &standardHeight );
+ if (errStatus == noErr)
+ {
+ return standardHeight;
+ }
+ return -1;
+}
+
+void wxRendererMac::DrawTreeItemButton( wxWindow *win,
+ wxDC& dc,
+ const wxRect& rect,
+ int flags )
+{
+ // 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;
+
+ 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;
+
+ cgContext = (CGContextRef) dc.GetGraphicsContext()->GetNativeContext();
+
+ HIThemeButtonDrawInfo drawInfo;
+ HIRect labelRect;
+
+ memset( &drawInfo, 0, sizeof(drawInfo) );
+ drawInfo.version = 0;
+ drawInfo.kind = kThemeDisclosureButton;
+ drawInfo.state = (flags & wxCONTROL_DISABLED) ? kThemeStateInactive : kThemeStateActive;
+ // Apple mailing list posts say to use the arrow adornment constants, but those don't work.
+ // We need to set the value using the 'old' DrawThemeButton constants instead.
+ drawInfo.value = (flags & wxCONTROL_EXPANDED) ? kThemeDisclosureDown : kThemeDisclosureRight;
+ drawInfo.adornment = kThemeAdornmentNone;
+
+ HIThemeDrawButton( &headerRect, &drawInfo, cgContext, kHIThemeOrientationNormal, &labelRect );
+ }
+}
+
+void wxRendererMac::DrawSplitterSash( wxWindow *win,
+ wxDC& dc,
+ const wxSize& size,
+ wxCoord position,
+ wxOrientation orient,
+ int WXUNUSED(flags) )
+{
+ bool hasMetal = win->MacGetTopLevelWindow()->MacGetMetalAppearance();
+ SInt32 height;
+ GetThemeMetric( kThemeMetricSmallPaneSplitterHeight, &height );
+ HIRect splitterRect;
+ if (orient == wxVERTICAL)
+ splitterRect = CGRectMake( position, 0, height, size.y );
+ else
+ splitterRect = CGRectMake( 0, position, size.x, height );
+
+ // under compositing we should only draw when called by the OS, otherwise just issue a redraw command
+ // strange redraw errors occur if we don't do this
+
+ if ( !dc.IsKindOf( CLASSINFO( wxPaintDC ) ) )
+ {
+ Rect r =
+ {
+ (short) splitterRect.origin.y,
+ (short) splitterRect.origin.x,
+ (short) (splitterRect.origin.y + splitterRect.size.height),
+ (short) (splitterRect.origin.x + splitterRect.size.width)
+ };
+
+ RgnHandle updateRgn = NewRgn();
+ RectRgn( updateRgn, &r );
+ HIViewSetNeedsDisplayInRegion( (HIViewRef) win->GetHandle(), updateRgn, true );
+ DisposeRgn( updateRgn );
+ }