]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/tooltip.cpp
added hints from QA 1061
[wxWidgets.git] / src / mac / tooltip.cpp
index 64ea19f58cbf29f9077e9716ae5a89f361e5bb92..1957c58db6be8cf2391953074dc9840c6bfa05b3 100644 (file)
@@ -190,7 +190,10 @@ void wxMacToolTip::Setup( WindowRef win  , wxString text , wxPoint localPosition
        m_mark++ ;
        Clear() ;
        m_position = localPosition ;
-       m_label = wxMacMakeMacStringFromPC( text ) ;
+    if( wxApp::s_macDefaultEncodingIsPC )
+        m_label = wxMacMakeMacStringFromPC( text ) ;
+       else
+        m_label = text ;
     m_window =win;
        s_ToolTipWindowRef = m_window ;
        m_backpict = NULL ;
@@ -201,10 +204,12 @@ void wxMacToolTip::Setup( WindowRef win  , wxString text , wxPoint localPosition
 
 wxMacToolTip::~wxMacToolTip() 
 {
-    if ( m_timer )
+    if ( m_timer ) {
         delete m_timer ;
-       if ( m_backpict ) 
-               Clear() ;
+        m_timer = NULL;
+    }
+    if ( m_backpict ) 
+        Clear() ;
 }
 
 const short kTipBorder = 2 ;
@@ -217,21 +222,35 @@ void wxMacToolTip::Draw()
                
        if ( m_window == s_ToolTipWindowRef )
        {
+               m_shown = true ;
 #if TARGET_CARBON
-/*
          if ( HMDisplayTag != (void*) kUnresolvedCFragSymbolAddress )
          {
-           HMDisplayTag( 
+               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 );
+               CFStringRef text = wxMacCreateCFString(m_label) ;
+               tag.content[kHMMinimumContentIndex].contentType = kHMCFStringContent ;
+               tag.content[kHMMinimumContentIndex].u.tagCFString = text ;
+               tag.content[kHMMaximumContentIndex].contentType = kHMCFStringContent ;
+               tag.content[kHMMaximumContentIndex].u.tagCFString = text ;
+               tag.tagSide = kHMDefaultSide;
+               HMDisplayTag( &tag );
+               CFRelease( text ) ;             
          }
          else
-*/
 #endif
          {
                wxMacPortStateHelper help( (GrafPtr) GetWindowPort( m_window ) );
+#if TARGET_CARBON      
                bool useDrawThemeText =  ( DrawThemeTextBox != (void*) kUnresolvedCFragSymbolAddress ) ;
-               
-               m_shown = true ;
+#endif         
 
         FontFamilyID fontId ;
         Str255 fontName ;
@@ -280,27 +299,60 @@ void wxMacToolTip::Draw()
                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(GetWindowPort(m_window)), 
+                                  GetPortBitMapForCopyBits(port), 
                                   &m_rect, 
                                   &m_rect, 
                                   srcCopy, 
                                   NULL);
-
-               ClosePicture();
-        PenNormal() ;
+                ClosePicture();
+                SetGWorld( origPort , origDevice ) ;
+               DisposeGWorld( port ) ;
+                PenNormal() ;
 
                RGBColor tooltipbackground = { 0xFFFF , 0xFFFF , 0xC000 } ;
                BackColor( whiteColor ) ;
-        RGBForeColor( &tooltipbackground ) ;
+                RGBForeColor( &tooltipbackground ) ;
 
                PaintRect( &m_rect ) ;
                ForeColor(blackColor ) ;
@@ -316,6 +368,7 @@ void wxMacToolTip::Draw()
                {
                        if( text[i] == 13 || text[i] == 10)
                        {
+#if TARGET_CARBON
                if ( useDrawThemeText )
                {
                    Rect frame ;
@@ -335,6 +388,7 @@ void wxMacToolTip::Draw()
                                    height += lineh ;
                }
                 else
+#endif
                 {
                                    ::DrawText( text , laststop , i - laststop ) ;
                                    height += lineh ;
@@ -344,6 +398,7 @@ void wxMacToolTip::Draw()
                        }
                        i++ ;
                }
+#if TARGET_CARBON
         if ( useDrawThemeText )
         {
             Rect frame ;
@@ -362,6 +417,7 @@ void wxMacToolTip::Draw()
             CFRelease( mString ) ;
         }
         else
+#endif
         {
                    ::DrawText( text , laststop , i - laststop ) ;
                }
@@ -388,7 +444,9 @@ void wxMacToolTip::Clear()
        }
        if ( !m_shown )
                return ;
-                
+#if TARGET_CARBON
+       HMHideTag() ;
+#else           
        if ( m_window == s_ToolTipWindowRef && m_backpict )
        {
                wxMacPortStateHelper help( (GrafPtr) GetWindowPort(m_window) ) ;
@@ -401,6 +459,7 @@ void wxMacToolTip::Clear()
                KillPicture(m_backpict);
                m_backpict = NULL ;
        }
+#endif
 }
 
 #endif