From cb4b09661bfe477207529167e63be1781be7e4c7 Mon Sep 17 00:00:00 2001 From: Stefan Csomor Date: Sun, 13 Feb 2005 07:36:49 +0000 Subject: [PATCH] adding focus and border quartz support git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@31981 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/mac/carbon/window.h | 4 ++- src/mac/carbon/dccg.cpp | 52 +++++++++++++++++++++++++++------- src/mac/carbon/dcclient.cpp | 28 ++++++++++++++---- src/mac/carbon/window.cpp | 42 +++++++++++++++++++++++++++ 4 files changed, 109 insertions(+), 17 deletions(-) diff --git a/include/wx/mac/carbon/window.h b/include/wx/mac/carbon/window.h index 60d0652bd3..f571c91c0f 100644 --- a/include/wx/mac/carbon/window.h +++ b/include/wx/mac/carbon/window.h @@ -82,6 +82,9 @@ public: virtual void Freeze() ; virtual void Thaw() ; + virtual void Update() ; + virtual void ClearBackground() ; + virtual bool SetCursor( const wxCursor &cursor ); virtual bool SetFont( const wxFont &font ) ; virtual bool SetBackgroundColour( const wxColour &colour ); @@ -193,7 +196,6 @@ public: bool MacIsUserPane() { return m_macIsUserPane; } - virtual void Update() ; virtual bool MacSetupCursor( const wxPoint& pt ) ; virtual void MacSetBackgroundBrush( const wxBrush &brush ) ; diff --git a/src/mac/carbon/dccg.cpp b/src/mac/carbon/dccg.cpp index 0ccfcd24e6..8f6c15bea7 100755 --- a/src/mac/carbon/dccg.cpp +++ b/src/mac/carbon/dccg.cpp @@ -168,13 +168,7 @@ CGPathRef wxMacCGPath::GetPath() const wxMacCGContext::wxMacCGContext( CGrafPtr port ) { m_qdPort = port ; - Rect bounds ; - GetPortBounds( (CGrafPtr) port , &bounds ) ; - OSStatus status = QDBeginCGContext( (CGrafPtr) port , &m_cgContext ) ; - - wxASSERT_MSG( status == noErr , wxT("Cannot nest wxDCs on the same window") ) ; - CGContextTranslateCTM( m_cgContext , 0 , bounds.bottom - bounds.top ) ; - CGContextScaleCTM( m_cgContext , 1 , -1 ) ; + m_cgContext = NULL ; } wxMacCGContext::wxMacCGContext( CGContextRef cgcontext ) @@ -247,15 +241,47 @@ void wxMacCGContext::FillPath( const wxGraphicPath *p , const wxColor &fillColor CGContextRestoreGState( m_cgContext ) ; } -wxGraphicPath* wxMacCGContext::CreatePath() { return new wxMacCGPath() ; } -CGContextRef wxMacCGContext::GetNativeContext() { return m_cgContext ; } -void wxMacCGContext::SetNativeContext( CGContextRef cg ) { m_cgContext = cg ; } +wxGraphicPath* wxMacCGContext::CreatePath() +{ + CGContextRef cg = GetNativeContext() ; + // make sure that we now have a real cgref, before doing + // anything with paths + return new wxMacCGPath() ; +} + +// in case we only got a QDPort only create a cgref now + +CGContextRef wxMacCGContext::GetNativeContext() +{ + if( m_cgContext == NULL ) + { + Rect bounds ; + GetPortBounds( (CGrafPtr) m_qdPort , &bounds ) ; + OSStatus status = QDBeginCGContext( (CGrafPtr) m_qdPort , &m_cgContext ) ; + + wxASSERT_MSG( status == noErr , wxT("Cannot nest wxDCs on the same window") ) ; + CGContextTranslateCTM( m_cgContext , 0 , bounds.bottom - bounds.top ) ; + CGContextScaleCTM( m_cgContext , 1 , -1 ) ; + + SetPen( m_pen ) ; + SetBrush( m_brush ) ; + } + return m_cgContext ; +} + +void wxMacCGContext::SetNativeContext( CGContextRef cg ) +{ + m_cgContext = cg ; +} void wxMacCGContext::SetPen( const wxPen &pen ) { + m_pen = pen ; + if ( m_cgContext == NULL ) + return ; bool fill = m_brush.GetStyle() != wxTRANSPARENT ; bool stroke = pen.GetStyle() != wxTRANSPARENT ; - + #if 0 // we can benchmark performance, should go into a setting later CGContextSetShouldAntialias( m_cgContext , false ) ; @@ -373,6 +399,10 @@ void wxMacCGContext::SetPen( const wxPen &pen ) } void wxMacCGContext::SetBrush( const wxBrush &brush ) { + m_brush = brush ; + if ( m_cgContext == NULL ) + return ; + bool fill = brush.GetStyle() != wxTRANSPARENT ; bool stroke = m_pen.GetStyle() != wxTRANSPARENT ; diff --git a/src/mac/carbon/dcclient.cpp b/src/mac/carbon/dcclient.cpp index ac107c5cdf..027709b784 100644 --- a/src/mac/carbon/dcclient.cpp +++ b/src/mac/carbon/dcclient.cpp @@ -118,7 +118,26 @@ wxWindowDC::wxWindowDC(wxWindow *window) SetBackground(MacGetBackgroundBrush(window)); } else - m_graphicContext = NULL ; + { + // as out of order redraw is not supported under CQ, we have to create a qd port for these + // situations + wxTopLevelWindowMac* rootwindow = window->MacGetTopLevelWindow() ; + if (!rootwindow) + return; + WindowRef windowref = (WindowRef) rootwindow->MacGetWindowRef() ; + wxSize size = window->GetClientSize() ; + int x , y ; + x = y = 0 ; + window->MacWindowToRootWindow( &x , &y ) ; + m_macLocalOrigin.x = x ; + m_macLocalOrigin.y = y ; + CGrafPtr port = UMAGetWindowPort( windowref ) ; + + m_graphicContext = new wxMacCGContext( port ) ; + m_graphicContext->SetPen( m_pen ) ; + m_graphicContext->SetBrush( m_brush ) ; + SetBackground(MacGetBackgroundBrush(window)); + } // there is no out-of-order drawing on OSX #else wxTopLevelWindowMac* rootwindow = window->MacGetTopLevelWindow() ; @@ -172,7 +191,8 @@ wxClientDC::wxClientDC(wxWindow *window) } else { - /* + // as out of order redraw is not supported under CQ, we have to create a qd port for these + // situations wxTopLevelWindowMac* rootwindow = window->MacGetTopLevelWindow() ; if (!rootwindow) return; @@ -191,9 +211,7 @@ wxClientDC::wxClientDC(wxWindow *window) m_graphicContext->SetPen( m_pen ) ; m_graphicContext->SetBrush( m_brush ) ; SetBackground(MacGetBackgroundBrush(window)); - m_ok = TRUE ; - */ - } + } m_ok = TRUE ; #else wxTopLevelWindowMac* rootwindow = window->MacGetTopLevelWindow() ; diff --git a/src/mac/carbon/window.cpp b/src/mac/carbon/window.cpp index f963eb9beb..36a8b7544a 100644 --- a/src/mac/carbon/window.cpp +++ b/src/mac/carbon/window.cpp @@ -2692,6 +2692,12 @@ wxString wxWindowMac::MacGetToolTipString( wxPoint &pt ) return wxEmptyString ; } +void wxWindowMac::ClearBackground() +{ + Refresh() ; + Update() ; +} + void wxWindowMac::Update() { #if TARGET_API_MAC_OSX @@ -2906,6 +2912,34 @@ bool wxWindowMac::MacDoRedraw( WXHRGN updatergnr , long time ) if ( RectInRgn( &childRect , updatergn ) ) { #if wxMAC_USE_CORE_GRAPHICS +#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_3 + if ( HIThemeDrawFrame ) + { + Rect srect = childRect ; + HIThemeFrameDrawInfo info ; + info.version = 0 ; + info.kind = 0 ; + info.state = IsEnabled() ? kThemeStateActive : kThemeStateInactive ; + if (HasFlag(wxRAISED_BORDER) || HasFlag( wxSUNKEN_BORDER) || HasFlag(wxDOUBLE_BORDER) ) + { + SInt32 border = 0 ; + GetThemeMetric( kThemeMetricEditTextFrameOutset , &border ) ; + InsetRect( &srect , border , border ); + info.kind = kHIThemeFrameTextFieldSquare ; + } + else if (HasFlag(wxSIMPLE_BORDER)) + { + SInt32 border = 0 ; + GetThemeMetric( kThemeMetricListBoxFrameOutset , &border ) ; + InsetRect( &srect , border , border ); + info.kind = kHIThemeFrameListBox ; + } + + CGRect rect = CGRectMake( srect.left , srect.top , srect.right - srect.left , + srect.bottom - srect.top ) ; + HIThemeDrawFrame( &rect , &info , (CGContextRef) MacGetCGContextRef() , kHIThemeOrientationNormal ) ; + } +#endif #else // paint custom borders wxNcPaintEvent eventNc( child->GetId() ); @@ -2923,6 +2957,14 @@ bool wxWindowMac::MacDoRedraw( WXHRGN updatergnr , long time ) if ( child->m_peer->NeedsFocusRect() && child->m_peer->HasFocus() ) { #if wxMAC_USE_CORE_GRAPHICS +#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_3 + if ( HIThemeDrawFocusRect ) + { + CGRect rect = CGRectMake( childRect.left , childRect.top , childRect.right - childRect.left , + childRect.bottom - childRect.top ) ; + HIThemeDrawFocusRect( &rect , true , (CGContextRef) MacGetCGContextRef() , kHIThemeOrientationNormal ) ; + } +#endif #else wxWindowDC dc(this) ; dc.SetClippingRegion(wxRegion(updatergn)); -- 2.45.2