]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/carbon/tooltip.cpp
mouse-capture fix
[wxWidgets.git] / src / mac / carbon / tooltip.cpp
index 4b00c6f7500684f1761436796ea04c56cd0ca717..0c16019c4745148ac7a4ddbbaa3cf461152990ff 100644 (file)
@@ -1,17 +1,17 @@
 /////////////////////////////////////////////////////////////////////////////
 // Name:        tooltip.cpp
 // Purpose:     wxToolTip implementation
-// Author:      Robert Roebling
+// Author:      Stefan Csomor
 // Id:          $Id$
-// Copyright:   (c) 1998 Robert Roebling
+// Copyright:   (c) Stefan Csomor
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
-#ifdef __GNUG__
+#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
     #pragma implementation "tooltip.h"
 #endif
 
-#include "wx/defs.h"
+#include "wx/wxprec.h"
 
 #if wxUSE_TOOLTIPS
 
@@ -35,7 +35,7 @@ class wxMacToolTip
         wxMacToolTip( ) ;
         ~wxMacToolTip() ;
         
-        void            Setup( WindowRef window  , wxString text , wxPoint localPosition ) ;
+        void            Setup( WindowRef window  , const wxString& text , wxPoint localPosition ) ;
         long            GetMark() { return m_mark ; }
         void             Draw() ;
         void            Clear() ;
@@ -50,8 +50,8 @@ class wxMacToolTip
         bool        m_shown ;
         long        m_mark ;
         wxMacToolTipTimer* m_timer ;
-#ifdef TARGET_CARBON
-        CFStringRef m_helpTextRef ;
+#if TARGET_CARBON
+        wxMacCFStringHolder m_helpTextRef ;
 #endif
 } ;
 
@@ -154,7 +154,7 @@ void wxToolTip::RelayEvent( wxWindow *win , wxMouseEvent &event )
                 s_ToolTipArea = wxRect2DInt( event.m_x - 2 , event.m_y - 2 , 4 , 4 ) ;
                 s_LastWindowEntered = win ;
                 
-                WindowRef window = MAC_WXHWND( win->MacGetRootWindow() ) ;
+                WindowRef window = MAC_WXHWND( win->MacGetTopLevelWindowRef() ) ;
                 int x = event.m_x ;
                 int y = event.m_y ;
                 wxPoint local( x , y ) ;
@@ -186,18 +186,14 @@ wxMacToolTip::wxMacToolTip()
     m_mark = 0 ;
     m_shown = false ;
     m_timer = NULL ;
-    m_helpTextRef = NULL ;
 }
 
-void wxMacToolTip::Setup( WindowRef win  , wxString text , wxPoint localPosition ) 
+void wxMacToolTip::Setup( WindowRef win  , const wxString& text , wxPoint localPosition ) 
 {
     m_mark++ ;
     Clear() ;
     m_position = localPosition ;
-    if( wxApp::s_macDefaultEncodingIsPC )
-        m_label = wxMacMakeMacStringFromPC( text ) ;
-     else
-        m_label = text ;
+    m_label = text ;
     m_window =win;
     s_ToolTipWindowRef = m_window ;
     m_backpict = NULL ;
@@ -228,209 +224,143 @@ void wxMacToolTip::Draw()
     {
         m_shown = true ;
 #if TARGET_CARBON
-        if ( HMDisplayTag != (void*) kUnresolvedCFragSymbolAddress )
-        {
-            HMHelpContentRec tag ;
-            tag.version = kMacHelpVersion;
-            SetRect( &tag.absHotRect , m_position.x - 2 , m_position.y - 2 , m_position.x + 2 , m_position.y + 2 ) ;
-            GrafPtr port ;
-            GetPort( &port ) ;
-            SetPortWindowPort(m_window) ;
-            LocalToGlobal( (Point *) &tag.absHotRect.top );
-            LocalToGlobal( (Point *) &tag.absHotRect.bottom );
-            SetPort( port );
-            if( m_helpTextRef )
-            {
-                CFRelease( m_helpTextRef ) ;
-                m_helpTextRef = NULL ;
-            }
-            m_helpTextRef = wxMacCreateCFString(m_label) ;
-            tag.content[kHMMinimumContentIndex].contentType = kHMCFStringContent ;
-            tag.content[kHMMinimumContentIndex].u.tagCFString = m_helpTextRef ;
-            tag.content[kHMMaximumContentIndex].contentType = kHMCFStringContent ;
-            tag.content[kHMMaximumContentIndex].u.tagCFString = m_helpTextRef ;
-            tag.tagSide = kHMDefaultSide;
-            HMDisplayTag( &tag );
-        }
-        else
-#endif
+        HMHelpContentRec tag ;
+        tag.version = kMacHelpVersion;
+        SetRect( &tag.absHotRect , m_position.x - 2 , m_position.y - 2 , m_position.x + 2 , m_position.y + 2 ) ;
+
+        QDLocalToGlobalRect( GetWindowPort( m_window ) , &tag.absHotRect ) ;
+
+        m_helpTextRef.Assign( m_label  , wxFONTENCODING_DEFAULT ) ;
+        tag.content[kHMMinimumContentIndex].contentType = kHMCFStringContent ;
+        tag.content[kHMMinimumContentIndex].u.tagCFString = m_helpTextRef ;
+        tag.content[kHMMaximumContentIndex].contentType = kHMCFStringContent ;
+        tag.content[kHMMaximumContentIndex].u.tagCFString = m_helpTextRef ;
+        tag.tagSide = kHMDefaultSide;
+        HMDisplayTag( &tag );
+#else
+        wxMacPortStateHelper help( (GrafPtr) GetWindowPort( m_window ) );
+        FontFamilyID fontId ;
+        Str255 fontName ;
+        SInt16 fontSize ;
+        Style fontStyle ;
+        GetThemeFont(kThemeSmallSystemFont , GetApplicationScript() , fontName , &fontSize , &fontStyle ) ;
+        GetFNum( fontName, &fontId );
+        
+        TextFont( fontId ) ;
+        TextSize( fontSize ) ;
+        TextFace( fontStyle ) ;
+        FontInfo fontInfo;
+        ::GetFontInfo(&fontInfo);
+        short lineh = fontInfo.ascent + fontInfo.descent + fontInfo.leading;
+        short height = 0 ;
+        
+        int i = 0 ;
+        int length = m_label.Length() ;
+        int width = 0 ;
+        int thiswidth = 0 ;
+        int laststop = 0 ;
+        wxCharBuffer text = m_label.mb_str( wxConvLocal)  ;
+
+        while( i < length )
         {
-            wxMacPortStateHelper help( (GrafPtr) GetWindowPort( m_window ) );
-#if TARGET_CARBON    
-            bool useDrawThemeText =  ( DrawThemeTextBox != (void*) kUnresolvedCFragSymbolAddress ) ;
-#endif        
-            
-            FontFamilyID fontId ;
-            Str255 fontName ;
-            SInt16 fontSize ;
-            Style fontStyle ;
-            GetThemeFont(kThemeSmallSystemFont , GetApplicationScript() , fontName , &fontSize , &fontStyle ) ;
-            GetFNum( fontName, &fontId );
-            
-            TextFont( fontId ) ;
-            TextSize( fontSize ) ;
-            TextFace( fontStyle ) ;
-            FontInfo fontInfo;
-            ::GetFontInfo(&fontInfo);
-            short lineh = fontInfo.ascent + fontInfo.descent + fontInfo.leading;
-            short height = 0 ;
-            //    short width = TextWidth( m_label , 0 ,m_label.Length() ) ;
-            
-            int i = 0 ;
-            int length = m_label.Length() ;
-            int width = 0 ;
-            int thiswidth = 0 ;
-            int laststop = 0 ;
-            const char *text = m_label ;
-            while( i < length )
-            {
-                if( text[i] == 13 || text[i] == 10)
-                {
-                    thiswidth = ::TextWidth( text , laststop , i - laststop ) ;
-                    if ( thiswidth > width )
-                        width = thiswidth ;
-                    
-                    height += lineh ;
-                    laststop = i+1 ;
-                }
-                i++ ;
-            }
-            if ( i - laststop > 0 )
+            if( text[i] == 13 || text[i] == 10)
             {
                 thiswidth = ::TextWidth( text , laststop , i - laststop ) ;
                 if ( thiswidth > width )
                     width = thiswidth ;
+                
                 height += lineh ;
+                laststop = i+1 ;
             }
-            
-            
-            m_rect.left = m_position.x + kTipOffset;
-            m_rect.top = m_position.y + kTipOffset;
-            m_rect.right = m_rect.left + width + 2 * kTipBorder;
-#if TARGET_CARBON    
-            if ( useDrawThemeText )
-                m_rect.right += kTipBorder ;
-#endif
-            m_rect.bottom = m_rect.top + height + 2 * kTipBorder;
-            Rect r ;
-            GetPortBounds( GetWindowPort( m_window ) , &r ) ;
-            if ( m_rect.top < 0 )
-            {
-                m_rect.bottom += -m_rect.top ;
-                m_rect.top = 0 ;
-            }
-            if ( m_rect.left < 0 )
-            {
-                m_rect.right += -m_rect.left ;
-                m_rect.left = 0 ;
-            }
-            if ( m_rect.right > r.right )
-            {
-                m_rect.left -= (m_rect.right - r.right ) ;
-                m_rect.right = r.right ;
-            }
-            if ( m_rect.bottom > r.bottom )
-            {
-                m_rect.top -= (m_rect.bottom - r.bottom) ;
-                m_rect.bottom = r.bottom ;
-            }
-            ClipRect( &m_rect ) ;
-            BackColor( whiteColor ) ;
-            ForeColor(blackColor ) ;
-            GWorldPtr port ;            
-            NewGWorld( &port , wxDisplayDepth() , &m_rect , NULL , NULL , 0 ) ;
-            CGrafPtr    origPort ;
-            GDHandle    origDevice ;
-            
-            GetGWorld( &origPort , &origDevice ) ;
-            SetGWorld( port , NULL ) ;
-            
-            m_backpict = OpenPicture(&m_rect);
-            
-            CopyBits(GetPortBitMapForCopyBits(GetWindowPort(m_window)), 
-                GetPortBitMapForCopyBits(port), 
-                &m_rect, 
-                &m_rect, 
-                srcCopy, 
-                NULL);
-            ClosePicture();
-            SetGWorld( origPort , origDevice ) ;
-            DisposeGWorld( port ) ;
-            PenNormal() ;
-            
-            RGBColor tooltipbackground = { 0xFFFF , 0xFFFF , 0xC000 } ;
-            BackColor( whiteColor ) ;
-            RGBForeColor( &tooltipbackground ) ;
-            
-            PaintRect( &m_rect ) ;
-            ForeColor(blackColor ) ;
-            FrameRect( &m_rect ) ;
-            SetThemeTextColor(kThemeTextColorNotification,wxDisplayDepth(),true) ;
-            ::MoveTo( m_rect.left + kTipBorder , m_rect.top + fontInfo.ascent + kTipBorder);
-            
-            i = 0 ;
-            laststop = 0 ;
-            height = 0 ;
-            
-            while( i < length )
-            {
-                if( text[i] == 13 || text[i] == 10)
-                {
-#if TARGET_CARBON
-                    if ( useDrawThemeText )
-                    {
-                        Rect frame ;
-                        frame.top = m_rect.top + kTipBorder + height ;
-                        frame.left = m_rect.left + kTipBorder ;
-                        frame.bottom = frame.top + 1000 ;
-                        frame.right = frame.left + 1000 ;
-                        CFStringRef mString = CFStringCreateWithBytes( NULL , (UInt8*) text + laststop , i - laststop , CFStringGetSystemEncoding(), false ) ;
-                        ::DrawThemeTextBox( mString,
-                            kThemeCurrentPortFont,
-                            kThemeStateActive,
-                            true,
-                            &frame,
-                            teJustLeft,
-                            nil );
-                        CFRelease( mString ) ;
-                        height += lineh ;
-                    }
-                    else
-#endif
-                    {
-                        ::DrawText( text , laststop , i - laststop ) ;
-                        height += lineh ;
-                        ::MoveTo( m_rect.left + kTipBorder , m_rect.top + fontInfo.ascent + kTipBorder + height );
-                    }
-                    laststop = i+1 ;
-                }
-                i++ ;
-            }
-#if TARGET_CARBON
-            if ( useDrawThemeText )
-            {
-                Rect frame ;
-                frame.top = m_rect.top + kTipBorder + height ;
-                frame.left = m_rect.left + kTipBorder ;
-                frame.bottom = frame.top + 1000 ;
-                frame.right = frame.left + 1000 ;
-                CFStringRef mString = CFStringCreateWithCString( NULL , text + laststop , kCFStringEncodingMacRoman ) ;
-                ::DrawThemeTextBox( mString,
-                    kThemeCurrentPortFont,
-                    kThemeStateActive,
-                    true,
-                    &frame,
-                    teJustLeft,
-                    nil );
-                CFRelease( mString ) ;
-            }
-            else
-#endif
+            i++ ;
+        }
+        if ( i - laststop > 0 )
+        {
+            thiswidth = ::TextWidth( text , laststop , i - laststop ) ;
+            if ( thiswidth > width )
+                width = thiswidth ;
+            height += lineh ;
+        }
+        
+        m_rect.left = m_position.x + kTipOffset;
+        m_rect.top = m_position.y + kTipOffset;
+        m_rect.right = m_rect.left + width + 2 * kTipBorder;
+
+        m_rect.bottom = m_rect.top + height + 2 * kTipBorder;
+        Rect r ;
+        GetPortBounds( GetWindowPort( m_window ) , &r ) ;
+        if ( m_rect.top < 0 )
+        {
+            m_rect.bottom += -m_rect.top ;
+            m_rect.top = 0 ;
+        }
+        if ( m_rect.left < 0 )
+        {
+            m_rect.right += -m_rect.left ;
+            m_rect.left = 0 ;
+        }
+        if ( m_rect.right > r.right )
+        {
+            m_rect.left -= (m_rect.right - r.right ) ;
+            m_rect.right = r.right ;
+        }
+        if ( m_rect.bottom > r.bottom )
+        {
+            m_rect.top -= (m_rect.bottom - r.bottom) ;
+            m_rect.bottom = r.bottom ;
+        }
+        ClipRect( &m_rect ) ;
+        BackColor( whiteColor ) ;
+        ForeColor(blackColor ) ;
+        GWorldPtr port ;            
+        NewGWorld( &port , wxDisplayDepth() , &m_rect , NULL , NULL , 0 ) ;
+        CGrafPtr    origPort ;
+        GDHandle    origDevice ;
+        
+        GetGWorld( &origPort , &origDevice ) ;
+        SetGWorld( port , NULL ) ;
+        
+        m_backpict = OpenPicture(&m_rect);
+        
+        CopyBits(GetPortBitMapForCopyBits(GetWindowPort(m_window)), 
+            GetPortBitMapForCopyBits(port), 
+            &m_rect, 
+            &m_rect, 
+            srcCopy, 
+            NULL);
+        ClosePicture();
+        SetGWorld( origPort , origDevice ) ;
+        DisposeGWorld( port ) ;
+        PenNormal() ;
+        
+        RGBColor tooltipbackground = { 0xFFFF , 0xFFFF , 0xC000 } ;
+        BackColor( whiteColor ) ;
+        RGBForeColor( &tooltipbackground ) ;
+        
+        PaintRect( &m_rect ) ;
+        ForeColor(blackColor ) ;
+        FrameRect( &m_rect ) ;
+        SetThemeTextColor(kThemeTextColorNotification,wxDisplayDepth(),true) ;
+        ::MoveTo( m_rect.left + kTipBorder , m_rect.top + fontInfo.ascent + kTipBorder);
+        
+        i = 0 ;
+        laststop = 0 ;
+        height = 0 ;
+        
+        while( i < length )
+        {
+            if( text[i] == 13 || text[i] == 10)
             {
                 ::DrawText( text , laststop , i - laststop ) ;
+                height += lineh ;
+                ::MoveTo( m_rect.left + kTipBorder , m_rect.top + fontInfo.ascent + kTipBorder + height );
+                laststop = i+1 ;
             }
-            ::TextMode( srcOr ) ;        
-       }
+            i++ ;
+        }
+        ::DrawText( text , laststop , i - laststop ) ;
+        ::TextMode( srcOr ) ;        
+#endif
     }
 }
 
@@ -454,11 +384,7 @@ void wxMacToolTip::Clear()
         return ;
 #if TARGET_CARBON
     HMHideTag() ;
-    if( m_helpTextRef )
-    {
-        CFRelease( m_helpTextRef ) ;
-        m_helpTextRef = NULL ;
-    }
+    m_helpTextRef.Release() ;
 #else         
     if ( m_window == s_ToolTipWindowRef && m_backpict )
     {