X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/76a5e5d21ee1a6230d777ce0209b2df4c6075f0f..d76240bfe106c10ca9a775448f712311fc5e1443:/src/mac/carbon/tooltip.cpp diff --git a/src/mac/carbon/tooltip.cpp b/src/mac/carbon/tooltip.cpp index 0655699087..2fbce9c667 100644 --- a/src/mac/carbon/tooltip.cpp +++ b/src/mac/carbon/tooltip.cpp @@ -11,7 +11,7 @@ #pragma implementation "tooltip.h" #endif -#include "wx/setup.h" +#include "wx/defs.h" #if wxUSE_TOOLTIPS @@ -52,21 +52,20 @@ class wxMacToolTip 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() ; - - } - + 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 ; }; //----------------------------------------------------------------------------- @@ -78,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; @@ -106,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 ) @@ -183,14 +185,17 @@ wxMacToolTip::wxMacToolTip() 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 ; if ( m_timer ) delete m_timer ; @@ -199,10 +204,12 @@ void wxMacToolTip::Setup( WindowRef window , wxString text , wxPoint localPosit 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 ; @@ -225,13 +232,22 @@ void wxMacToolTip::Draw() */ #endif { - wxMacPortStateHelper help( GetWindowPort( m_window ) ); - + wxMacPortStateHelper help( (GrafPtr) GetWindowPort( m_window ) ); +#if TARGET_CARBON + bool useDrawThemeText = ( DrawThemeTextBox != (void*) kUnresolvedCFragSymbolAddress ) ; +#endif m_shown = true ; - TextFont( kFontIDGeneva ) ; - TextSize( 10 ) ; - TextFace( 0 ) ; + 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; @@ -269,46 +285,130 @@ 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(); + SetGWorld( origPort , origDevice ) ; + DisposeGWorld( port ) ; + PenNormal() ; - ClosePicture(); - PenNormal() ; - SetThemeBackground(kThemeBrushNotificationWindowBackground,32,true) ; - SetThemeTextColor(kThemeTextColorNotification,32,true) ; - EraseRect( &m_rect ) ; + 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 ); +#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++ ; } - - ::DrawText( text , laststop , i - laststop ) ; +#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 ) ; - // DrawText( m_label , 0 , m_label.Length() ) ; - } + } } } @@ -323,12 +423,17 @@ void wxToolTip::NotifyWindowDelete( WXHWND 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 ) { - wxMacPortStateHelper help( GetWindowPort(m_window) ) ; + wxMacPortStateHelper help( (GrafPtr) GetWindowPort(m_window) ) ; m_shown = false ;