]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/carbon/dc.cpp
mouse handling fixed, skipping if we have no native control handling
[wxWidgets.git] / src / mac / carbon / dc.cpp
index 7b95aef88a1d2587d0397555a2e07657f5d0b964..005e7d54ea6d210f840bdd256d81f97f6880bd7c 100644 (file)
@@ -28,10 +28,10 @@ using namespace std ;
 #endif
 
 #include "wx/mac/private.h"
 #endif
 
 #include "wx/mac/private.h"
-#include "ATSUnicode.h"
-#include "TextCommon.h"
-#include "TextEncodingConverter.h"
-#include "FixMath.h"
+#include <ATSUnicode.h>
+#include <TextCommon.h>
+#include <TextEncodingConverter.h>
+#include <FixMath.h>
 #if !USE_SHARED_LIBRARY
 IMPLEMENT_ABSTRACT_CLASS(wxDC, wxObject)
 #endif
 #if !USE_SHARED_LIBRARY
 IMPLEMENT_ABSTRACT_CLASS(wxDC, wxObject)
 #endif
@@ -104,31 +104,8 @@ private :
 typedef wxMacPortSetter wxMacFastPortSetter ;
 #endif
 
 typedef wxMacPortSetter wxMacFastPortSetter ;
 #endif
 
-#if 0
-
-// start moving to a dual implementation for QD and CGContextRef
-
-class wxMacGraphicsContext
-{
-public :
-    void DrawBitmap( const wxBitmap &bmp, wxCoord x, wxCoord y, bool useMask ) = 0 ;
-    void SetClippingRegion( wxCoord x, wxCoord y, wxCoord width, wxCoord height ) = 0 ;
-    void SetClippingRegion( const wxRegion &region  ) = 0 ;
-    void DestroyClippingRegion() = 0 ;
-    void SetTextForeground( const wxColour &col ) = 0 ;
-    void SetTextBackground( const wxColour &col ) = 0 ;
-    void SetLogicalScale( double x , double y ) = 0 ;
-    void SetUserScale( double x , double y ) = 0;
-} ;
-
-class wxMacQuickDrawContext : public wxMacGraphicsContext
-{
-public :
-} ;
-
-#endif
-
-wxMacWindowClipper::wxMacWindowClipper( const wxWindow* win ) 
+wxMacWindowClipper::wxMacWindowClipper( const wxWindow* win ) :
+    wxMacPortSaver( (GrafPtr) GetWindowPort((WindowRef) win->MacGetTopLevelWindowRef()) )
 {
     m_formerClip = NewRgn() ;
     m_newClip = NewRgn() ;
 {
     m_formerClip = NewRgn() ;
     m_newClip = NewRgn() ;
@@ -136,29 +113,14 @@ wxMacWindowClipper::wxMacWindowClipper( const wxWindow* win )
     
     if ( win )
     {
     
     if ( win )
     {
-#if 0
-        // this clipping area was set to the parent window's drawing area, lead to problems
-        // with MacOSX controls drawing outside their wx' rectangle
-        RgnHandle insidergn = NewRgn() ;
-        int x = 0 , y = 0;
-        wxWindow *parent = win->GetParent() ;
-        parent->MacWindowToRootWindow( &x,&y ) ;
-        wxSize size = parent->GetSize() ;
-        SetRectRgn( insidergn , parent->MacGetLeftBorderSize() , parent->MacGetTopBorderSize() , 
-            size.x - parent->MacGetRightBorderSize(), 
-            size.y - parent->MacGetBottomBorderSize()) ;
-        CopyRgn( (RgnHandle) parent->MacGetVisibleRegion(false).GetWXHRGN() , m_newClip ) ;
-        SectRgn( m_newClip , insidergn , m_newClip ) ;
-        OffsetRgn( m_newClip , x , y ) ;
-        SetClip( m_newClip ) ;
-        DisposeRgn( insidergn ) ;
-#else
         int x = 0 , y = 0;
         win->MacWindowToRootWindow( &x,&y ) ;
         int x = 0 , y = 0;
         win->MacWindowToRootWindow( &x,&y ) ;
-        CopyRgn( (RgnHandle) ((wxWindow*)win)->MacGetVisibleRegion().GetWXHRGN() , m_newClip ) ;
-        OffsetRgn( m_newClip , x , y ) ;
+        // get area including focus rect
+        CopyRgn( (RgnHandle) ((wxWindow*)win)->MacGetVisibleRegion(true).GetWXHRGN() , m_newClip ) ;
+        if ( !EmptyRgn( m_newClip ) )
+            OffsetRgn( m_newClip , x , y ) ;
+
         SetClip( m_newClip ) ;
         SetClip( m_newClip ) ;
-#endif  
     }
 }
 
     }
 }
 
@@ -617,20 +579,6 @@ void wxDC::SetDeviceOrigin( wxCoord x, wxCoord y )
     ComputeScaleAndOrigin();
 }
 
     ComputeScaleAndOrigin();
 }
 
-#if 0
-void wxDC::SetInternalDeviceOrigin( long x, long y )
-{
-    m_internalDeviceOriginX = x;
-    m_internalDeviceOriginY = y;
-    ComputeScaleAndOrigin();
-}
-void wxDC::GetInternalDeviceOrigin( long *x, long *y )
-{
-    if (x) *x = m_internalDeviceOriginX;
-    if (y) *y = m_internalDeviceOriginY;
-}
-#endif
-
 void wxDC::SetAxisOrientation( bool xLeftRight, bool yBottomUp )
 {
     m_signX = (xLeftRight ?  1 : -1);
 void wxDC::SetAxisOrientation( bool xLeftRight, bool yBottomUp )
 {
     m_signX = (xLeftRight ?  1 : -1);
@@ -1358,7 +1306,7 @@ void  wxDC::DoDrawRotatedText(const wxString& str, wxCoord x, wxCoord y,
                               double angle)
 {
     wxCHECK_RET( Ok(), wxT("wxDC::DoDrawRotatedText  Invalid window dc") );
                               double angle)
 {
     wxCHECK_RET( Ok(), wxT("wxDC::DoDrawRotatedText  Invalid window dc") );
-
+/*
     if (angle == 0.0 )
     {
         DrawText(str, x, y);
     if (angle == 0.0 )
     {
         DrawText(str, x, y);
@@ -1367,14 +1315,14 @@ void  wxDC::DoDrawRotatedText(const wxString& str, wxCoord x, wxCoord y,
 
     if ( str.Length() == 0 )
         return ;
 
     if ( str.Length() == 0 )
         return ;
-        
+*/      
     wxMacFastPortSetter helper(this) ;
     MacInstallFont() ;
 
     if ( 0 )
     {
         m_macFormerAliasState = IsAntiAliasedTextEnabled(&m_macFormerAliasSize);
     wxMacFastPortSetter helper(this) ;
     MacInstallFont() ;
 
     if ( 0 )
     {
         m_macFormerAliasState = IsAntiAliasedTextEnabled(&m_macFormerAliasSize);
-        SetAntiAliasedTextEnabled(true, SInt16(m_scaleY * m_font.GetMacFontSize()));
+        SetAntiAliasedTextEnabled(true, SInt16(m_scaleY * m_font.MacGetFontSize()));
         m_macAliasWasEnabled = true ;
     }
     OSStatus status = noErr ;
         m_macAliasWasEnabled = true ;
     }
     OSStatus status = noErr ;
@@ -1470,59 +1418,9 @@ void  wxDC::DoDrawText(const wxString& strtext, wxCoord x, wxCoord y)
     {
         ::TextMode( srcCopy ) ;
     }
     {
         ::TextMode( srcCopy ) ;
     }
-    int length = strtext.Length() ;
-
-    int laststop = 0 ;
-    int i = 0 ;
     int line = 0 ;
     {
     int line = 0 ;
     {
-        while( i < length )
-        {
-            if( strtext[i] == 13 || strtext[i] == 10)
-            {
-                wxString linetext = strtext.Mid( laststop , i - laststop ) ;
-#if TARGET_CARBON
-                if ( useDrawThemeText )
-                {
-                    Rect frame = { yy + line*(fi.descent + fi.ascent + fi.leading)  ,xx , yy + (line+1)*(fi.descent + fi.ascent + fi.leading) , xx + 10000 } ;
-                    wxMacCFStringHolder mString( linetext , m_font.GetEncoding() ) ;
-                    if ( m_backgroundMode != wxTRANSPARENT )
-                    {
-                        Point bounds={0,0} ;
-                        Rect background = frame ;
-                        SInt16 baseline ;
-                        ::GetThemeTextDimensions( mString,
-                            kThemeCurrentPortFont,
-                            kThemeStateActive,
-                            false,
-                            &bounds,
-                            &baseline );
-                        background.right = background.left + bounds.h ;
-                        background.bottom = background.top + bounds.v ;
-                        ::EraseRect( &background ) ;
-                    }
-                    ::DrawThemeTextBox( mString,
-                        kThemeCurrentPortFont,
-                        kThemeStateActive,
-                        false,
-                        &frame,
-                        teJustLeft,
-                        nil );
-                    line++ ;
-                }
-                else
-#endif
-                {
-                    wxCharBuffer text = linetext.mb_str(wxConvLocal) ; 
-                    ::DrawText( text , 0 , strlen(text) ) ;
-                    line++ ;
-                    ::MoveTo( xx , yy + line*(fi.descent + fi.ascent + fi.leading) );
-                }
-                laststop = i+1 ;
-            }
-            i++ ;
-        }
-        wxString linetext = strtext.Mid( laststop , i - laststop ) ;
+        wxString linetext = strtext ;
 #if TARGET_CARBON
         if ( useDrawThemeText )
         {
 #if TARGET_CARBON
         if ( useDrawThemeText )
         {
@@ -1535,7 +1433,7 @@ void  wxDC::DoDrawText(const wxString& strtext, wxCoord x, wxCoord y)
                 Rect background = frame ;
                 SInt16 baseline ;
                 ::GetThemeTextDimensions( mString,
                 Rect background = frame ;
                 SInt16 baseline ;
                 ::GetThemeTextDimensions( mString,
-                    kThemeCurrentPortFont,
+                    m_font.MacGetThemeFontID() ,
                     kThemeStateActive,
                     false,
                     &bounds,
                     kThemeStateActive,
                     false,
                     &bounds,
@@ -1545,7 +1443,7 @@ void  wxDC::DoDrawText(const wxString& strtext, wxCoord x, wxCoord y)
                 ::EraseRect( &background ) ;
             }
             ::DrawThemeTextBox( mString,
                 ::EraseRect( &background ) ;
             }
             ::DrawThemeTextBox( mString,
-                kThemeCurrentPortFont,
+                m_font.MacGetThemeFontID() ,
                 kThemeStateActive,
                 false,
                 &frame,
                 kThemeStateActive,
                 false,
                 &frame,
@@ -1556,6 +1454,14 @@ void  wxDC::DoDrawText(const wxString& strtext, wxCoord x, wxCoord y)
 #endif
         {
             wxCharBuffer text = linetext.mb_str(wxConvLocal) ; 
 #endif
         {
             wxCharBuffer text = linetext.mb_str(wxConvLocal) ; 
+            if ( m_backgroundMode != wxTRANSPARENT )
+            {
+                Rect frame = { yy - fi.ascent + line*(fi.descent + fi.ascent + fi.leading)  ,xx , yy - fi.ascent + (line+1)*(fi.descent + fi.ascent + fi.leading) , xx + 10000 } ;
+                short width = ::TextWidth( text , 0 , strlen(text) ) ;
+                frame.right = frame.left + width ;
+
+                ::EraseRect( &frame ) ;
+            }
             ::DrawText( text , 0 , strlen(text) ) ;
          }
     }
             ::DrawText( text , 0 , strlen(text) ) ;
          }
     }
@@ -1594,57 +1500,21 @@ void  wxDC::DoGetTextExtent( const wxString &strtext, wxCoord *width, wxCoord *h
         *descent =YDEV2LOGREL( fi.descent );
     if ( externalLeading )
         *externalLeading = YDEV2LOGREL( fi.leading ) ;
         *descent =YDEV2LOGREL( fi.descent );
     if ( externalLeading )
         *externalLeading = YDEV2LOGREL( fi.leading ) ;
-    int length = strtext.Length() ;
 
 
-    int laststop = 0 ;
-    int i = 0 ;
     int curwidth = 0 ;
     if ( width )
     {
         *width = 0 ;
     int curwidth = 0 ;
     if ( width )
     {
         *width = 0 ;
-        while( i < length )
-        {
-            if( strtext[i] == 13 || strtext[i] == 10)
-            {
-                wxString linetext = strtext.Mid( laststop , i - laststop ) ;
-                if ( height )
-                    *height += YDEV2LOGREL( fi.descent + fi.ascent + fi.leading ) ;
-#if TARGET_CARBON
-                if ( useGetThemeText )
-                {
-                    Point bounds={0,0} ;
-                    SInt16 baseline ;
-                    wxMacCFStringHolder mString( linetext , m_font.GetEncoding() ) ;
-                    ::GetThemeTextDimensions( mString,
-                        kThemeCurrentPortFont,
-                        kThemeStateActive,
-                        false,
-                        &bounds,
-                        &baseline );
-                    curwidth = bounds.h ;
-                }
-                else
-#endif
-                {
-                    wxCharBuffer text = linetext.mb_str(wxConvLocal) ; 
-                    curwidth = ::TextWidth( text , 0 , strlen(text) ) ;
-                }
-                if ( curwidth > *width )
-                    *width = XDEV2LOGREL( curwidth ) ;
-                laststop = i+1 ;
-            }
-            i++ ;
-        }
-        
-        wxString linetext = strtext.Mid( laststop , i - laststop ) ;
-#if TARGET_CARBON
+        wxString linetext = strtext ;
+
         if ( useGetThemeText )
         {
             Point bounds={0,0} ;
             SInt16 baseline ;
             wxMacCFStringHolder mString( linetext , m_font.GetEncoding() ) ;
         if ( useGetThemeText )
         {
             Point bounds={0,0} ;
             SInt16 baseline ;
             wxMacCFStringHolder mString( linetext , m_font.GetEncoding() ) ;
+            ThemeFontID themeFont = m_font.MacGetThemeFontID() ;
             ::GetThemeTextDimensions( mString,
             ::GetThemeTextDimensions( mString,
-                kThemeCurrentPortFont,
+                themeFont ,
                 kThemeStateActive,
                 false,
                 &bounds,
                 kThemeStateActive,
                 false,
                 &bounds,
@@ -1652,7 +1522,6 @@ void  wxDC::DoGetTextExtent( const wxString &strtext, wxCoord *width, wxCoord *h
             curwidth = bounds.h ;
         }
         else
             curwidth = bounds.h ;
         }
         else
-#endif
         {
             wxCharBuffer text = linetext.mb_str(wxConvLocal) ;  
             curwidth = ::TextWidth( text , 0 , strlen(text) ) ;
         {
             wxCharBuffer text = linetext.mb_str(wxConvLocal) ;  
             curwidth = ::TextWidth( text , 0 , strlen(text) ) ;
@@ -1668,6 +1537,68 @@ void  wxDC::DoGetTextExtent( const wxString &strtext, wxCoord *width, wxCoord *h
     }
 }
 
     }
 }
 
+
+bool wxDC::DoGetPartialTextExtents(const wxString& text, wxArrayInt& widths) const
+{
+    wxCHECK_MSG(Ok(), false, wxT("Invalid DC"));
+
+    widths.Empty();
+    widths.Add(0, text.Length());
+
+    if (text.Length() == 0)
+        return false;
+    
+    wxMacFastPortSetter helper(this) ;
+    MacInstallFont() ;
+#if TARGET_CARBON    
+    bool useGetThemeText = ( GetThemeTextDimensions != (void*) kUnresolvedCFragSymbolAddress ) ;
+    if ( UMAGetSystemVersion() < 0x1000 || IsKindOf(CLASSINFO( wxPrinterDC ) ) || ((wxFont*)&m_font)->GetNoAntiAliasing() )
+        useGetThemeText = false ;
+
+    if ( useGetThemeText )
+    {
+        // If anybody knows how to do this more efficiently yet still handle
+        // the fractional glyph widths that may be present when using AA
+        // fonts, please change it.  Currently it is measuring from the
+        // begining of the string for each succeding substring, which is much
+        // slower than this should be.
+        for (size_t i=0; i<text.Length(); i++)
+        {
+            wxString str(text.Left(i+1));
+            Point bounds = {0,0};
+            SInt16 baseline ;
+            wxMacCFStringHolder mString(str, m_font.GetEncoding());
+            ::GetThemeTextDimensions( mString,
+                                      m_font.MacGetThemeFontID(),
+                                      kThemeStateActive,
+                                      false,
+                                      &bounds,
+                                      &baseline );
+            widths[i] = XDEV2LOGREL(bounds.h);
+        }
+    }
+    else        
+#endif
+    {
+        wxCharBuffer buff = text.mb_str(wxConvLocal);
+        size_t len = strlen(buff);
+        short* measurements = new short[len+1];
+        MeasureText(len, buff.data(), measurements);
+
+        // Copy to widths, starting at measurements[1]
+        // NOTE: this doesn't take into account any multi-byte characters
+        // in buff, it probabkly should...
+        for (size_t i=0; i<text.Length(); i++)
+            widths[i] = XDEV2LOGREL(measurements[i+1]);
+
+        delete [] measurements;        
+    }
+
+    return true;
+}
+
+
+
 wxCoord   wxDC::GetCharWidth(void) const
 {
     wxCHECK_MSG(Ok(), 1, wxT("Invalid DC"));
 wxCoord   wxDC::GetCharWidth(void) const
 {
     wxCHECK_MSG(Ok(), 1, wxT("Invalid DC"));
@@ -1687,7 +1618,7 @@ wxCoord   wxDC::GetCharWidth(void) const
         SInt16 baseline ;
         CFStringRef mString = CFStringCreateWithBytes( NULL , (UInt8*) text , 1 , CFStringGetSystemEncoding(), false ) ;
         ::GetThemeTextDimensions( mString,
         SInt16 baseline ;
         CFStringRef mString = CFStringCreateWithBytes( NULL , (UInt8*) text , 1 , CFStringGetSystemEncoding(), false ) ;
         ::GetThemeTextDimensions( mString,
-            kThemeCurrentPortFont,
+            m_font.MacGetThemeFontID(),
             kThemeStateActive,
             false,
             &bounds,
             kThemeStateActive,
             false,
             &bounds,
@@ -1736,9 +1667,9 @@ void wxDC::MacInstallFont() const
     MacSetupBackgroundForCurrentPort(m_backgroundBrush) ;
     if ( m_font.Ok() )
     {
     MacSetupBackgroundForCurrentPort(m_backgroundBrush) ;
     if ( m_font.Ok() )
     {
-        ::TextFont( m_font.GetMacFontNum() ) ;
-        ::TextSize( (short)(m_scaleY * m_font.GetMacFontSize()) ) ;
-        ::TextFace( m_font.GetMacFontStyle() ) ;
+        ::TextFont( m_font.MacGetFontNum() ) ;
+        ::TextSize( (short)(m_scaleY * m_font.MacGetFontSize()) ) ;
+        ::TextFace( m_font.MacGetFontStyle() ) ;
         m_macFontInstalled = true ;
         m_macBrushInstalled = false ;
         m_macPenInstalled = false ;
         m_macFontInstalled = true ;
         m_macBrushInstalled = false ;
         m_macPenInstalled = false ;
@@ -1807,9 +1738,9 @@ void wxDC::MacInstallFont() const
     }
     ::PenMode( mode ) ;
     OSStatus status = noErr ;
     }
     ::PenMode( mode ) ;
     OSStatus status = noErr ;
-    Fixed atsuSize = IntToFixed( int(m_scaleY * m_font.GetMacFontSize()) ) ;
-    Style qdStyle = m_font.GetMacFontStyle() ;
-    ATSUFontID    atsuFont = m_font.GetMacATSUFontID() ;
+    Fixed atsuSize = IntToFixed( int(m_scaleY * m_font.MacGetFontSize()) ) ;
+    Style qdStyle = m_font.MacGetATSUAdditionalQDStyles() ;
+    ATSUFontID    atsuFont = m_font.MacGetATSUFontID() ;
     status = ::ATSUCreateStyle((ATSUStyle *)&m_macATSUIStyle) ;
     wxASSERT_MSG( status == noErr , wxT("couldn't create ATSU style") ) ;
     ATSUAttributeTag atsuTags[] =
     status = ::ATSUCreateStyle((ATSUStyle *)&m_macATSUIStyle) ;
     wxASSERT_MSG( status == noErr , wxT("couldn't create ATSU style") ) ;
     ATSUAttributeTag atsuTags[] =
@@ -1986,13 +1917,13 @@ void wxDC::MacSetupBackgroundForCurrentPort(const wxBrush& background )
     {
         case kwxMacBrushTheme :
         {
     {
         case kwxMacBrushTheme :
         {
-            ::SetThemeBackground( background.GetMacTheme() , wxDisplayDepth() , true ) ;
+            ::SetThemeBackground( background.MacGetTheme() , wxDisplayDepth() , true ) ;
             break ;
         }
         case kwxMacBrushThemeBackground :
         {
             Rect extent ;
             break ;
         }
         case kwxMacBrushThemeBackground :
         {
             Rect extent ;
-            ThemeBackgroundKind bg = background.GetMacThemeBackground( &extent ) ;
+            ThemeBackgroundKind bg = background.MacGetThemeBackground( &extent ) ;
             ::ApplyThemeBackground( bg , &extent ,kThemeStateActive , wxDisplayDepth() , true ) ;
             break ;
         }
             ::ApplyThemeBackground( bg , &extent ,kThemeStateActive , wxDisplayDepth() , true ) ;
             break ;
         }