X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/526954c5968baa29218c994ec48e476ae2bd4b9f..06e56e62b9ab3a4ee66d7013c978128e5021f4e2:/src/osx/carbon/renderer.cpp diff --git a/src/osx/carbon/renderer.cpp b/src/osx/carbon/renderer.cpp index 38642f8a86..343cf63f44 100644 --- a/src/osx/carbon/renderer.cpp +++ b/src/osx/carbon/renderer.cpp @@ -24,12 +24,14 @@ #include "wx/bitmap.h" #include "wx/settings.h" #include "wx/dcclient.h" + #include "wx/dcmemory.h" #include "wx/toplevel.h" #endif #include "wx/renderer.h" #include "wx/graphics.h" #include "wx/dcgraph.h" +#include "wx/splitter.h" #include "wx/osx/private.h" #ifdef wxHAS_DRAW_TITLE_BAR_BITMAP @@ -37,11 +39,18 @@ #include "wx/mstream.h" #endif // wxHAS_DRAW_TITLE_BAR_BITMAP -// check if we're currently in a paint event -inline bool wxInPaintEvent(wxWindow* win, wxDC& dc) + +// check if we're having a CGContext we can draw into +inline bool wxHasCGContext(wxWindow* WXUNUSED(win), wxDC& dc) { - wxUnusedVar(dc); - return ( win->MacGetCGContextRef() != NULL ); + wxGCDCImpl* gcdc = wxDynamicCast( dc.GetImpl() , wxGCDCImpl); + + if ( gcdc ) + { + if ( gcdc->GetGraphicsContext()->GetNativeContext() ) + return true; + } + return false; } @@ -59,6 +68,8 @@ public: virtual int GetHeaderButtonHeight(wxWindow *win); + virtual int GetHeaderButtonMargin(wxWindow *win); + // draw the expanded/collapsed icon for a tree control item virtual void DrawTreeItemButton( wxWindow *win, wxDC& dc, @@ -113,6 +124,8 @@ public: int flags = 0); #endif // wxHAS_DRAW_TITLE_BAR_BITMAP + virtual wxSplitterRenderParams GetSplitterParams(const wxWindow *win); + private: void DrawMacThemeButton(wxWindow *win, wxDC& dc, @@ -153,7 +166,7 @@ int wxRendererMac::DrawHeaderButton( wxWindow *win, dc.SetBrush( *wxTRANSPARENT_BRUSH ); HIRect headerRect = CGRectMake( x, y, w, h ); - if ( !wxInPaintEvent(win, dc) ) + if ( !wxHasCGContext(win, dc) ) { win->Refresh( &rect ); } @@ -172,7 +185,7 @@ int wxRendererMac::DrawHeaderButton( wxWindow *win, drawInfo.version = 0; drawInfo.kind = kThemeListHeaderButton; drawInfo.state = (flags & wxCONTROL_DISABLED) ? kThemeStateInactive : kThemeStateActive; - drawInfo.value = (flags & wxCONTROL_SELECTED) ? kThemeButtonOn : kThemeButtonOff; + drawInfo.value = (flags & wxCONTROL_PRESSED) ? kThemeButtonOn : kThemeButtonOff; drawInfo.adornment = kThemeAdornmentNone; // The down arrow is drawn automatically, change it to an up arrow if needed. @@ -182,7 +195,7 @@ int wxRendererMac::DrawHeaderButton( wxWindow *win, 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) ) + if ( (flags & wxCONTROL_PRESSED) && (sortArrow == wxHDR_SORT_ICON_NONE) ) { // clip to the header rectangle CGContextSaveGState( cgContext ); @@ -198,12 +211,12 @@ int wxRendererMac::DrawHeaderButton( wxWindow *win, // 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) ) + if ( (flags & wxCONTROL_PRESSED) && (sortArrow != wxHDR_SORT_ICON_NONE) ) { newRect.width -= 12; sortArrow = wxHDR_SORT_ICON_NONE; } - flags &= ~wxCONTROL_SELECTED; + flags &= ~wxCONTROL_PRESSED; return DrawHeaderButtonContents(win, dc, newRect, flags, sortArrow, params); } @@ -222,6 +235,12 @@ int wxRendererMac::GetHeaderButtonHeight(wxWindow* WXUNUSED(win)) return -1; } +int wxRendererMac::GetHeaderButtonMargin(wxWindow *WXUNUSED(win)) +{ + wxFAIL_MSG( "GetHeaderButtonMargin() not implemented" ); + return -1; +} + void wxRendererMac::DrawTreeItemButton( wxWindow *win, wxDC& dc, const wxRect& rect, @@ -236,7 +255,7 @@ void wxRendererMac::DrawTreeItemButton( wxWindow *win, dc.SetBrush( *wxTRANSPARENT_BRUSH ); HIRect headerRect = CGRectMake( x, y, w, h ); - if ( !wxInPaintEvent(win, dc) ) + if ( !wxHasCGContext(win, dc) ) { win->Refresh( &rect ); } @@ -263,6 +282,37 @@ void wxRendererMac::DrawTreeItemButton( wxWindow *win, } } +wxSplitterRenderParams +wxRendererMac::GetSplitterParams(const wxWindow *win) +{ + // see below + SInt32 sashWidth, + border; +#if wxOSX_USE_COCOA + if ( win->HasFlag(wxSP_3DSASH) ) + GetThemeMetric( kThemeMetricPaneSplitterHeight, &sashWidth ); // Cocoa == Carbon == 7 + else if ( win->HasFlag(wxSP_NOSASH) ) // actually Cocoa doesn't allow 0 + sashWidth = 0; + else // no 3D effect - Cocoa [NSSplitView dividerThickNess] for NSSplitViewDividerStyleThin + sashWidth = 1; +#else // Carbon + if ( win->HasFlag(wxSP_3DSASH) ) + GetThemeMetric( kThemeMetricPaneSplitterHeight, &sashWidth ); + else if ( win->HasFlag(wxSP_NOSASH) ) + sashWidth = 0; + else // no 3D effect + GetThemeMetric( kThemeMetricSmallPaneSplitterHeight, &sashWidth ); +#endif // Cocoa/Carbon + + if ( win->HasFlag(wxSP_3DBORDER) ) + border = 2; + else // no 3D effect + border = 0; + + return wxSplitterRenderParams(sashWidth, border, false); +} + + void wxRendererMac::DrawSplitterSash( wxWindow *win, wxDC& dc, const wxSize& size, @@ -272,7 +322,9 @@ void wxRendererMac::DrawSplitterSash( wxWindow *win, { bool hasMetal = win->MacGetTopLevelWindow()->GetExtraStyle() & wxFRAME_EX_METAL; SInt32 height; - GetThemeMetric( kThemeMetricSmallPaneSplitterHeight, &height ); + + height = wxRendererNative::Get().GetSplitterParams(win).widthSash; + HIRect splitterRect; if (orient == wxVERTICAL) splitterRect = CGRectMake( position, 0, height, size.y ); @@ -282,7 +334,7 @@ void wxRendererMac::DrawSplitterSash( wxWindow *win, // 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 ( !wxInPaintEvent(win, dc) ) + if ( !wxHasCGContext(win, dc) ) { wxRect rect( (int) splitterRect.origin.x, (int) splitterRect.origin.y, (int) splitterRect.size.width, (int) splitterRect.size.height ); @@ -301,17 +353,20 @@ void wxRendererMac::DrawSplitterSash( wxWindow *win, if ( hasMetal ) HIThemeDrawBackground(&splitterRect, &bgdrawInfo, cgContext, kHIThemeOrientationNormal); - else + else { CGContextSetFillColorWithColor(cgContext,win->GetBackgroundColour().GetCGColor()); CGContextFillRect(cgContext,splitterRect); } - - HIThemeSplitterDrawInfo drawInfo; - drawInfo.version = 0; - drawInfo.state = kThemeStateActive; - drawInfo.adornment = hasMetal ? kHIThemeSplitterAdornmentMetal : kHIThemeSplitterAdornmentNone; - HIThemeDrawPaneSplitter( &splitterRect, &drawInfo, cgContext, kHIThemeOrientationNormal ); + + if ( win->HasFlag(wxSP_3DSASH) ) + { + HIThemeSplitterDrawInfo drawInfo; + drawInfo.version = 0; + drawInfo.state = kThemeStateActive; + drawInfo.adornment = hasMetal ? kHIThemeSplitterAdornmentMetal : kHIThemeSplitterAdornmentNone; + HIThemeDrawPaneSplitter( &splitterRect, &drawInfo, cgContext, kHIThemeOrientationNormal ); + } } } @@ -352,7 +407,7 @@ wxRendererMac::DrawMacThemeButton(wxWindow *win, dc.SetBrush( *wxTRANSPARENT_BRUSH ); HIRect headerRect = CGRectMake( x, y, w, h ); - if ( !wxInPaintEvent(win, dc) ) + if ( !wxHasCGContext(win, dc) ) { win->Refresh( &rect ); } @@ -369,7 +424,7 @@ wxRendererMac::DrawMacThemeButton(wxWindow *win, drawInfo.version = 0; drawInfo.kind = kind; drawInfo.state = (flags & wxCONTROL_DISABLED) ? kThemeStateInactive : kThemeStateActive; - drawInfo.value = (flags & wxCONTROL_SELECTED) ? kThemeButtonOn : kThemeButtonOff; + drawInfo.value = (flags & wxCONTROL_PRESSED) ? kThemeButtonOn : kThemeButtonOff; if (flags & wxCONTROL_UNDETERMINED) drawInfo.value = kThemeButtonMixed; drawInfo.adornment = adornment; @@ -387,7 +442,7 @@ wxRendererMac::DrawCheckBox(wxWindow *win, int flags) { if (flags & wxCONTROL_CHECKED) - flags |= wxCONTROL_SELECTED; + flags |= wxCONTROL_PRESSED; int kind; @@ -539,7 +594,7 @@ void wxRendererMac::DrawRadioBitmap(wxWindow* win, wxDC& dc, kind = kThemeRadioButton; if (flags & wxCONTROL_CHECKED) - flags |= wxCONTROL_SELECTED; + flags |= wxCONTROL_PRESSED; DrawMacThemeButton(win, dc, rect, flags, kind, kThemeAdornmentNone); @@ -560,7 +615,7 @@ void wxRendererMac::DrawTextCtrl(wxWindow* win, wxDC& dc, dc.SetBrush( *wxTRANSPARENT_BRUSH ); HIRect hiRect = CGRectMake( x, y, w, h ); - if ( !wxInPaintEvent(win, dc) ) + if ( !wxHasCGContext(win, dc) ) { win->Refresh( &rect ); } @@ -809,4 +864,4 @@ void wxRendererMac::DrawTitleBarBitmap(wxWindow *win, #endif // wxHAS_DRAW_TITLE_BAR_BITMAP -#endif \ No newline at end of file +#endif