X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/cf511e872e3c4b7b6550bdd548aa1e1c3becef0a..6e1609b1e0784f299933742e02c58462df809acc:/src/mac/carbon/renderer.cpp diff --git a/src/mac/carbon/renderer.cpp b/src/mac/carbon/renderer.cpp index bf271a27bb..182ee90912 100644 --- a/src/mac/carbon/renderer.cpp +++ b/src/mac/carbon/renderer.cpp @@ -34,7 +34,7 @@ class WXDLLEXPORT wxRendererMac : public wxDelegateRendererNative { public: // draw the header control button (used by wxListCtrl) - virtual void DrawHeaderButton( wxWindow *win, + virtual int DrawHeaderButton( wxWindow *win, wxDC& dc, const wxRect& rect, int flags = 0, @@ -42,7 +42,7 @@ public: wxHeaderButtonParams* params = NULL ); virtual int GetHeaderButtonHeight(wxWindow *win); - + // draw the expanded/collapsed icon for a tree control item virtual void DrawTreeItemButton( wxWindow *win, wxDC& dc, @@ -57,21 +57,28 @@ public: wxOrientation orient, int flags = 0 ); + virtual void DrawCheckBox(wxWindow *win, + wxDC& dc, + const wxRect& rect, + int flags = 0); + virtual void DrawComboBoxDropButton(wxWindow *win, wxDC& dc, const wxRect& rect, int flags = 0); - + virtual void DrawPushButton(wxWindow *win, wxDC& dc, const wxRect& rect, int flags = 0); - + virtual void DrawItemSelectionRect(wxWindow *win, wxDC& dc, const wxRect& rect, int flags = 0); + virtual void DrawFocusRect(wxWindow* win, wxDC& dc, const wxRect& rect, int flags = 0); + private: void DrawMacThemeButton(wxWindow *win, wxDC& dc, @@ -79,7 +86,7 @@ private: int flags, int kind, int adornment); - + // the tree buttons wxBitmap m_bmpTreeExpanded; wxBitmap m_bmpTreeCollapsed; @@ -97,7 +104,7 @@ wxRendererNative& wxRendererNative::GetDefault() return s_rendererMac; } -void wxRendererMac::DrawHeaderButton( wxWindow *win, +int wxRendererMac::DrawHeaderButton( wxWindow *win, wxDC& dc, const wxRect& rect, int flags, @@ -149,8 +156,13 @@ void wxRendererMac::DrawHeaderButton( wxWindow *win, CGContextTranslateCTM( cgContext, 0, bounds.bottom - bounds.top ); CGContextScaleCTM( cgContext, 1, -1 ); - HIShapeReplacePathInCGContext( HIShapeCreateWithQDRgn( (RgnHandle) dc.m_macCurrentClipRgn ), cgContext ); - CGContextClip( cgContext ); + 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 @@ -168,7 +180,7 @@ void wxRendererMac::DrawHeaderButton( wxWindow *win, // 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 @@ -181,7 +193,7 @@ void wxRendererMac::DrawHeaderButton( wxWindow *win, headerRect.size.width += 25; HIThemeDrawButton( &headerRect, &drawInfo, cgContext, kHIThemeOrientationNormal, &labelRect ); CGContextRestoreGState( cgContext ); - } + } } #if wxMAC_USE_CORE_GRAPHICS @@ -200,14 +212,14 @@ void wxRendererMac::DrawHeaderButton( wxWindow *win, } flags &= ~wxCONTROL_SELECTED; - DrawHeaderButtonContents(win, dc, newRect, flags, sortArrow, params); + return DrawHeaderButtonContents(win, dc, newRect, flags, sortArrow, params); } int wxRendererMac::GetHeaderButtonHeight(wxWindow* WXUNUSED(win)) { - SInt32 standardHeight; - OSStatus errStatus; + SInt32 standardHeight; + OSStatus errStatus; errStatus = GetThemeMetric( kThemeMetricListHeaderHeight, &standardHeight ); if (errStatus == noErr) @@ -233,7 +245,7 @@ void wxRendererMac::DrawTreeItemButton( wxWindow *win, const wxCoord y = rect.y; const wxCoord w = rect.width; const wxCoord h = rect.height; -#endif +#endif dc.SetBrush( *wxTRANSPARENT_BRUSH ); @@ -283,10 +295,10 @@ void wxRendererMac::DrawTreeItemButton( wxWindow *win, // 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; + drawInfo.adornment = kThemeAdornmentNone; HIThemeDrawButton( &headerRect, &drawInfo, cgContext, kHIThemeOrientationNormal, &labelRect ); - + } #if wxMAC_USE_CORE_GRAPHICS @@ -370,16 +382,22 @@ wxRendererMac::DrawItemSelectionRect(wxWindow *win, const wxRect& rect, int flags ) { - RGBColor selColor; - if (flags & wxCONTROL_SELECTED) + if ( !(flags & wxCONTROL_SELECTED) ) + return; + + if (flags & wxCONTROL_FOCUSED) { - if (flags & wxCONTROL_FOCUSED) - GetThemeBrushAsColor(kThemeBrushAlternatePrimaryHighlightColor, 32, true, &selColor); - else - GetThemeBrushAsColor(kThemeBrushSecondaryHighlightColor, 32, true, &selColor); + if (!IsControlActive( (ControlRef)win->GetHandle() )) + flags = wxCONTROL_SELECTED; } - - wxBrush selBrush = wxBrush( wxColour( selColor.red, selColor.green, selColor.blue ), wxSOLID ); + + RGBColor selColor; + GetThemeBrushAsColor(flags & wxCONTROL_FOCUSED + ? kThemeBrushAlternatePrimaryHighlightColor + : kThemeBrushSecondaryHighlightColor, + 32, true, &selColor); + + wxBrush selBrush(selColor); dc.SetPen( *wxTRANSPARENT_PEN ); dc.SetBrush( selBrush ); @@ -454,6 +472,8 @@ wxRendererMac::DrawMacThemeButton(wxWindow *win, 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 ); @@ -466,6 +486,18 @@ wxRendererMac::DrawMacThemeButton(wxWindow *win, } } +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, @@ -473,17 +505,78 @@ wxRendererMac::DrawComboBoxDropButton(wxWindow *win, 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, - kThemeArrowButton, kThemeAdornmentArrowDownArrow); + 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, - kThemeBevelButton, kThemeAdornmentNone); + 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 +} +