]> git.saurik.com Git - wxWidgets.git/commitdiff
adding focus and border quartz support
authorStefan Csomor <csomor@advancedconcepts.ch>
Sun, 13 Feb 2005 07:36:49 +0000 (07:36 +0000)
committerStefan Csomor <csomor@advancedconcepts.ch>
Sun, 13 Feb 2005 07:36:49 +0000 (07:36 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@31981 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/mac/carbon/window.h
src/mac/carbon/dccg.cpp
src/mac/carbon/dcclient.cpp
src/mac/carbon/window.cpp

index 60d0652bd3c9e5dbe60d994e52e5b8f6223e1fb4..f571c91c0fca5099380fd64a02a4e4fc121f3071 100644 (file)
@@ -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 ) ;
index 0ccfcd24e6695f7fed8a85c15321542df41f0700..8f6c15bea7c340c20d0c8d39753b48a958935ac2 100755 (executable)
@@ -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 ;
 
index ac107c5cdfbcbb7a013de47f86b3e4f39cb398f3..027709b784e4fb25a51a7db618ed288afd1ed684 100644 (file)
@@ -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() ;
index f963eb9bebcbc531b28a6cea21215bc4d56734b5..36a8b7544adea8ae1cc4557b5ad47dbe23981af2 100644 (file)
@@ -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));