]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/carbon/tooltip.cpp
fixed encoding handling in ANSI mode
[wxWidgets.git] / src / mac / carbon / tooltip.cpp
index ada78751e77358e00532c012bb364d23ed2f0480..2fbce9c667ec4c2f00a789b3cfedfd26e0120fff 100644 (file)
     #pragma implementation "tooltip.h"
 #endif
 
-#include "wx/setup.h"
+#include "wx/defs.h"
 
 #if wxUSE_TOOLTIPS
 
 #include "wx/app.h"
+#include "wx/dc.h"
 #include "wx/window.h"
 #include "wx/tooltip.h"
 #include "wx/timer.h"
 #include "wx/geometry.h"
-#include "wx/mac/aga.h"
 #include "wx/mac/uma.h"
 
 //-----------------------------------------------------------------------------
 // global data
 //-----------------------------------------------------------------------------
 
+class wxMacToolTipTimer ;
+
 class wxMacToolTip
 {
        public :
@@ -47,24 +49,23 @@ class wxMacToolTip
                PicHandle       m_backpict ;
                bool            m_shown ;
                long            m_mark ;
+               wxMacToolTipTimer* m_timer ;
 } ;
 
-class wxMacToolTipTimer : wxTimer
+class wxMacToolTipTimer : public wxTimer
 {
 public:
-       wxMacToolTipTimer(wxMacToolTip* tip, int iMilliseconds) ;
-
-       void Notify()
-       {
-               if ( m_mark == m_tip->GetMark() )
-                       m_tip->Draw() ;
-
-               delete this;
-       }
-       
+    wxMacToolTipTimer() {} ;
+    wxMacToolTipTimer(wxMacToolTip* tip, int iMilliseconds) ;
+    virtual ~wxMacToolTipTimer() {} ;
+    void Notify()
+    {
+        if ( m_mark == m_tip->GetMark() )
+            m_tip->Draw() ;    
+    }
 protected:
-       wxMacToolTip*   m_tip;
-       long                    m_mark ;
+    wxMacToolTip*      m_tip;
+    long               m_mark ;
 };
 
 //-----------------------------------------------------------------------------
@@ -76,6 +77,9 @@ static wxMacToolTip s_ToolTip ;
 static wxWindow* s_LastWindowEntered = NULL ;
 static wxRect2DInt s_ToolTipArea ;
 static WindowRef s_ToolTipWindowRef = NULL ;
+
+IMPLEMENT_ABSTRACT_CLASS(wxToolTip, wxObject)
+
 wxToolTip::wxToolTip( const wxString &tip )
 {
     m_text = tip;
@@ -104,7 +108,7 @@ void wxToolTip::SetTip( const wxString &tip )
 
 void wxToolTip::SetWindow( wxWindow *win )
 {
-    m_window = win;
+    m_window = win ;
 }
 
 void wxToolTip::Enable( bool flag )
@@ -147,7 +151,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 = win->GetMacRootWindow() ;
+                               WindowRef window = MAC_WXHWND( win->MacGetRootWindow() ) ;
                                int x = event.m_x ;
                                int y = event.m_y ;
                                wxPoint local( x , y ) ;
@@ -178,24 +182,34 @@ wxMacToolTip::wxMacToolTip()
        m_backpict = NULL ;
        m_mark = 0 ;
        m_shown = false ;
+    m_timer = NULL ;
 }
 
-void wxMacToolTip::Setup( WindowRef window  , wxString text , wxPoint localPosition ) 
+void wxMacToolTip::Setup( WindowRef win  , wxString text , wxPoint localPosition ) 
 {
        m_mark++ ;
        Clear() ;
-       m_position = localPosition ; 
-       m_label = wxMacMakeMacStringFromPC( text ) ;
-       m_window = window ;
-       s_ToolTipWindowRef = window ;
+       m_position = localPosition ;
+    if( wxApp::s_macDefaultEncodingIsPC )
+        m_label = wxMacMakeMacStringFromPC( text ) ;
+       else
+        m_label = text ;
+    m_window =win;
+       s_ToolTipWindowRef = m_window ;
        m_backpict = NULL ;
-       new wxMacToolTipTimer( this , s_ToolTipDelay ) ;
+       if ( m_timer )
+           delete m_timer ;
+       m_timer = new wxMacToolTipTimer( this , s_ToolTipDelay ) ;
 }
 
 wxMacToolTip::~wxMacToolTip() 
 {
-       if ( m_backpict ) 
-               Clear() ;
+    if ( m_timer ) {
+        delete m_timer ;
+        m_timer = NULL;
+    }
+    if ( m_backpict ) 
+        Clear() ;
 }
 
 const short kTipBorder = 2 ;
@@ -208,99 +222,197 @@ void wxMacToolTip::Draw()
                
        if ( m_window == s_ToolTipWindowRef )
        {
-               #if TARGET_CARBON
-               AGAPortHelper help( GetWindowPort( m_window ) );
-               #else
-               AGAPortHelper help( ( m_window ) );
-               #endif
-               m_shown = true ;
-
-               SetOrigin( 0 , 0 ) ;
-               TextFont( kFontIDGeneva ) ;
-               TextSize( 9 ) ;
-               TextFace( 0 ) ;
-               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 )
-               {
-                       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;
-               ClipRect( &m_rect ) ;
-               BackColor( whiteColor ) ;
-               ForeColor(blackColor ) ;
-               m_backpict = OpenPicture(&m_rect);
-
-               CopyBits(GetPortBitMapForCopyBits(GetWindowPort(m_window)), 
-                                  GetPortBitMapForCopyBits(GetWindowPort(m_window)), 
-                                  &m_rect, 
-                                  &m_rect, 
-                                  srcCopy, 
-                                  NULL);
-
-               ClosePicture();
-               RGBColor yellow = { 0xFFFF  , 0xFFFF , (153<<8)+153 } ;
-               RGBBackColor( &yellow ) ;
-               EraseRect( &m_rect ) ;
-               FrameRect( &m_rect ) ;
-               BackColor( whiteColor ) ;
-               ForeColor(blackColor ) ;
-               ::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 ;
-                       }
-                       i++ ;
-               }
-                                       
-               ::DrawText( text , laststop , i - laststop ) ;
-               ::TextMode( srcOr ) ;
-               
-       //      DrawText( m_label , 0 , m_label.Length() ) ;
+#if TARGET_CARBON
+/*
+         if ( HMDisplayTag != (void*) kUnresolvedCFragSymbolAddress )
+         {
+           HMDisplayTag( 
+         }
+         else
+*/
+#endif
+         {
+               wxMacPortStateHelper help( (GrafPtr) GetWindowPort( m_window ) );
+#if TARGET_CARBON      
+               bool useDrawThemeText =  ( DrawThemeTextBox != (void*) kUnresolvedCFragSymbolAddress ) ;
+#endif         
+               m_shown = true ;
+
+        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 )
+               {
+                       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;
+#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
+        {
+                   ::DrawText( text , laststop , i - laststop ) ;
+               }
+               ::TextMode( srcOr ) ;           
+        }
        }
 }
 
-void wxToolTip::NotifyWindowDelete( WindowRef win ) 
+void wxToolTip::NotifyWindowDelete( WXHWND win ) 
 {
        if ( win == s_ToolTipWindowRef )
        {
@@ -311,19 +423,20 @@ void wxToolTip::NotifyWindowDelete( WindowRef win )
 void wxMacToolTip::Clear()
 {
        m_mark++ ;
+       if ( m_timer )
+       {
+           delete m_timer ;
+           m_timer = NULL ;
+       }
        if ( !m_shown )
                return ;
                 
        if ( m_window == s_ToolTipWindowRef && m_backpict )
        {
-               #if TARGET_CARBON
-               AGAPortHelper help( GetWindowPort(m_window) ) ;
-               #else
-               AGAPortHelper help( (m_window) ) ;
-               #endif
+               wxMacPortStateHelper help( (GrafPtr) GetWindowPort(m_window) ) ;
+
                m_shown = false ;
 
-               SetOrigin( 0 , 0 ) ;
                BackColor( whiteColor ) ;
                ForeColor(blackColor ) ;
                DrawPicture(m_backpict, &m_rect);