X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/e40298d54ecd5b109222a7c60aa2ef084a304d69..abbcdf3ff7a6d33ff09cbbbf7dbf3aa53d60972b:/src/mac/carbon/tooltip.cpp diff --git a/src/mac/carbon/tooltip.cpp b/src/mac/carbon/tooltip.cpp index 4b00c6f750..0c16019c47 100644 --- a/src/mac/carbon/tooltip.cpp +++ b/src/mac/carbon/tooltip.cpp @@ -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 ) {