X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/ee6b1d97e741fda8d579fa21cbc89f0c91615cef..b6f4144e596cdf8e862e513b7f7c09022a664137:/src/mac/tooltip.cpp

diff --git a/src/mac/tooltip.cpp b/src/mac/tooltip.cpp
index 583bd9b892..ba6de8cc8a 100644
--- a/src/mac/tooltip.cpp
+++ b/src/mac/tooltip.cpp
@@ -11,20 +11,24 @@
     #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 :
@@ -45,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 ;
 };
 
 //-----------------------------------------------------------------------------
@@ -74,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;
@@ -102,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 )
@@ -145,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 ) ;
@@ -176,24 +182,31 @@ 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_position = localPosition ;
 	m_label = wxMacMakeMacStringFromPC( text ) ;
-	m_window = window ;
-	s_ToolTipWindowRef = window ;
+    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 ;
@@ -206,99 +219,166 @@ 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;
+  		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();
+        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 )
 	{
@@ -309,19 +389,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);