X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/ec20a753b99f318de3bccf86a741a867717e6a92..05e66a7002abbc726d3aa53fc5cb42ebaf8748e8:/src/osx/carbon/renderer.cpp diff --git a/src/osx/carbon/renderer.cpp b/src/osx/carbon/renderer.cpp index c8d11afd5d..2dad815345 100644 --- a/src/osx/carbon/renderer.cpp +++ b/src/osx/carbon/renderer.cpp @@ -6,12 +6,14 @@ // Created: 20.07.2003 // RCS-ID: $Id$ // Copyright: (c) 2003 Vadim Zeitlin -// License: wxWindows licence +// Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// // for compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" +#if wxOSX_USE_COCOA_OR_CARBON + #ifdef __BORLANDC__ #pragma hdrstop #endif @@ -22,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 @@ -35,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; } @@ -57,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, @@ -111,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, @@ -151,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 ); } @@ -220,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, @@ -234,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 ); } @@ -261,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, @@ -270,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 ); @@ -280,23 +334,39 @@ 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 ); - win->Refresh( &rect ); - } + win->RefreshRect( rect ); + } else { CGContextRef cgContext; wxGCDCImpl *impl = (wxGCDCImpl*) dc.GetImpl(); cgContext = (CGContextRef) impl->GetGraphicsContext()->GetNativeContext(); - HIThemeSplitterDrawInfo drawInfo; - drawInfo.version = 0; - drawInfo.state = kThemeStateActive; - drawInfo.adornment = hasMetal ? kHIThemeSplitterAdornmentMetal : kHIThemeSplitterAdornmentNone; - HIThemeDrawPaneSplitter( &splitterRect, &drawInfo, cgContext, kHIThemeOrientationNormal ); + HIThemeBackgroundDrawInfo bgdrawInfo; + bgdrawInfo.version = 0; + bgdrawInfo.state = kThemeStateActive; + bgdrawInfo.kind = hasMetal ? kThemeBackgroundMetal : kThemeBackgroundPlacard; + + if ( hasMetal ) + HIThemeDrawBackground(&splitterRect, &bgdrawInfo, cgContext, kHIThemeOrientationNormal); + else + { + CGContextSetFillColorWithColor(cgContext,win->GetBackgroundColour().GetCGColor()); + CGContextFillRect(cgContext,splitterRect); + } + + if ( win->HasFlag(wxSP_3DSASH) ) + { + HIThemeSplitterDrawInfo drawInfo; + drawInfo.version = 0; + drawInfo.state = kThemeStateActive; + drawInfo.adornment = hasMetal ? kHIThemeSplitterAdornmentMetal : kHIThemeSplitterAdornmentNone; + HIThemeDrawPaneSplitter( &splitterRect, &drawInfo, cgContext, kHIThemeOrientationNormal ); + } } } @@ -337,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 ); } @@ -545,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 ); } @@ -793,3 +863,5 @@ void wxRendererMac::DrawTitleBarBitmap(wxWindow *win, } #endif // wxHAS_DRAW_TITLE_BAR_BITMAP + +#endif