1 /////////////////////////////////////////////////////////////////////////////
3 // Purpose: wxToolTip implementation
4 // Author: Robert Roebling
6 // Copyright: (c) 1998 Robert Roebling
7 // Licence: wxWindows licence
8 /////////////////////////////////////////////////////////////////////////////
11 #pragma implementation "tooltip.h"
20 #include "wx/window.h"
21 #include "wx/tooltip.h"
23 #include "wx/geometry.h"
24 #include "wx/mac/uma.h"
26 //-----------------------------------------------------------------------------
28 //-----------------------------------------------------------------------------
30 class wxMacToolTipTimer
;
38 void Setup( WindowRef window
, wxString text
, wxPoint localPosition
) ;
39 long GetMark() { return m_mark
; }
42 bool IsShown() { return m_shown
; }
49 PicHandle m_backpict
;
52 wxMacToolTipTimer
* m_timer
;
55 class wxMacToolTipTimer
: public wxTimer
58 wxMacToolTipTimer() {} ;
59 wxMacToolTipTimer(wxMacToolTip
* tip
, int iMilliseconds
) ;
60 virtual ~wxMacToolTipTimer() {} ;
63 if ( m_mark
== m_tip
->GetMark() )
71 //-----------------------------------------------------------------------------
73 //-----------------------------------------------------------------------------
74 static long s_ToolTipDelay
= 500 ;
75 static bool s_ShowToolTips
= true ;
76 static wxMacToolTip s_ToolTip
;
77 static wxWindow
* s_LastWindowEntered
= NULL
;
78 static wxRect2DInt s_ToolTipArea
;
79 static WindowRef s_ToolTipWindowRef
= NULL
;
81 IMPLEMENT_ABSTRACT_CLASS(wxToolTip
, wxObject
)
83 wxToolTip::wxToolTip( const wxString
&tip
)
86 m_window
= (wxWindow
*) NULL
;
89 wxToolTip::~wxToolTip()
93 void wxToolTip::SetTip( const wxString
&tip
)
100 // update it immediately
101 wxToolInfo ti(GetHwndOf(m_window));
102 ti.lpszText = (wxChar *)m_text.c_str();
104 (void)SendTooltipMessage(GetToolTipCtrl(), TTM_UPDATETIPTEXT, 0, &ti);
109 void wxToolTip::SetWindow( wxWindow
*win
)
114 void wxToolTip::Enable( bool flag
)
116 if ( s_ShowToolTips
!= flag
)
118 s_ShowToolTips
= flag
;
119 if ( s_ShowToolTips
)
129 void wxToolTip::SetDelay( long msecs
)
131 s_ToolTipDelay
= msecs
;
134 void wxToolTip::RelayEvent( wxWindow
*win
, wxMouseEvent
&event
)
136 if ( s_ShowToolTips
)
138 if ( event
.GetEventType() == wxEVT_LEAVE_WINDOW
)
142 else if (event
.GetEventType() == wxEVT_ENTER_WINDOW
|| event
.GetEventType() == wxEVT_MOTION
)
144 wxPoint2DInt
where( event
.m_x
, event
.m_y
) ;
145 if ( s_LastWindowEntered
== win
&& s_ToolTipArea
.Contains( where
) )
151 s_ToolTipArea
= wxRect2DInt( event
.m_x
- 2 , event
.m_y
- 2 , 4 , 4 ) ;
152 s_LastWindowEntered
= win
;
154 WindowRef window
= MAC_WXHWND( win
->MacGetRootWindow() ) ;
157 wxPoint
local( x
, y
) ;
158 win
->MacClientToRootWindow( &x
, &y
) ;
159 wxPoint
windowlocal( x
, y
) ;
160 s_ToolTip
.Setup( window
, win
->MacGetToolTipString( local
) , windowlocal
) ;
166 void wxToolTip::RemoveToolTips()
172 wxMacToolTipTimer::wxMacToolTipTimer( wxMacToolTip
*tip
, int msec
)
175 m_mark
= tip
->GetMark() ;
179 wxMacToolTip::wxMacToolTip()
188 void wxMacToolTip::Setup( WindowRef win
, wxString text
, wxPoint localPosition
)
192 m_position
= localPosition
;
193 m_label
= wxMacMakeMacStringFromPC( text
) ;
195 s_ToolTipWindowRef
= m_window
;
199 m_timer
= new wxMacToolTipTimer( this , s_ToolTipDelay
) ;
202 wxMacToolTip::~wxMacToolTip()
210 const short kTipBorder
= 2 ;
211 const short kTipOffset
= 5 ;
213 void wxMacToolTip::Draw()
215 if ( m_label
.Length() == 0 )
218 if ( m_window
== s_ToolTipWindowRef
)
222 if ( HMDisplayTag != (void*) kUnresolvedCFragSymbolAddress )
230 wxMacPortStateHelper
help( (GrafPtr
) GetWindowPort( m_window
) );
232 bool useDrawThemeText
= ( DrawThemeTextBox
!= (void*) kUnresolvedCFragSymbolAddress
) ;
236 FontFamilyID fontId
;
240 GetThemeFont(kThemeSmallSystemFont
, GetApplicationScript() , fontName
, &fontSize
, &fontStyle
) ;
241 GetFNum( fontName
, &fontId
);
244 TextSize( fontSize
) ;
245 TextFace( fontStyle
) ;
247 ::GetFontInfo(&fontInfo
);
248 short lineh
= fontInfo
.ascent
+ fontInfo
.descent
+ fontInfo
.leading
;
250 // short width = TextWidth( m_label , 0 ,m_label.Length() ) ;
253 int length
= m_label
.Length() ;
257 const char *text
= m_label
;
260 if( text
[i
] == 13 || text
[i
] == 10)
262 thiswidth
= ::TextWidth( text
, laststop
, i
- laststop
) ;
263 if ( thiswidth
> width
)
271 if ( i
- laststop
> 0 )
273 thiswidth
= ::TextWidth( text
, laststop
, i
- laststop
) ;
274 if ( thiswidth
> width
)
280 m_rect
.left
= m_position
.x
+ kTipOffset
;
281 m_rect
.top
= m_position
.y
+ kTipOffset
;
282 m_rect
.right
= m_rect
.left
+ width
+ 2 * kTipBorder
;
283 if ( useDrawThemeText
)
284 m_rect
.right
+= kTipBorder
;
285 m_rect
.bottom
= m_rect
.top
+ height
+ 2 * kTipBorder
;
286 ClipRect( &m_rect
) ;
287 BackColor( whiteColor
) ;
288 ForeColor(blackColor
) ;
289 m_backpict
= OpenPicture(&m_rect
);
291 CopyBits(GetPortBitMapForCopyBits(GetWindowPort(m_window
)),
292 GetPortBitMapForCopyBits(GetWindowPort(m_window
)),
301 RGBColor tooltipbackground
= { 0xFFFF , 0xFFFF , 0xC000 } ;
302 BackColor( whiteColor
) ;
303 RGBForeColor( &tooltipbackground
) ;
305 PaintRect( &m_rect
) ;
306 ForeColor(blackColor
) ;
307 FrameRect( &m_rect
) ;
308 SetThemeTextColor(kThemeTextColorNotification
,wxDisplayDepth(),true) ;
309 ::MoveTo( m_rect
.left
+ kTipBorder
, m_rect
.top
+ fontInfo
.ascent
+ kTipBorder
);
317 if( text
[i
] == 13 || text
[i
] == 10)
319 if ( useDrawThemeText
)
322 frame
.top
= m_rect
.top
+ kTipBorder
+ height
;
323 frame
.left
= m_rect
.left
+ kTipBorder
;
324 frame
.bottom
= frame
.top
+ 1000 ;
325 frame
.right
= frame
.left
+ 1000 ;
326 CFStringRef mString
= CFStringCreateWithBytes( NULL
, (UInt8
*) text
+ laststop
, i
- laststop
, CFStringGetSystemEncoding(), false ) ;
327 ::DrawThemeTextBox( mString
,
328 kThemeCurrentPortFont
,
334 CFRelease( mString
) ;
339 ::DrawText( text
, laststop
, i
- laststop
) ;
341 ::MoveTo( m_rect
.left
+ kTipBorder
, m_rect
.top
+ fontInfo
.ascent
+ kTipBorder
+ height
);
347 if ( useDrawThemeText
)
350 frame
.top
= m_rect
.top
+ kTipBorder
+ height
;
351 frame
.left
= m_rect
.left
+ kTipBorder
;
352 frame
.bottom
= frame
.top
+ 1000 ;
353 frame
.right
= frame
.left
+ 1000 ;
354 CFStringRef mString
= CFStringCreateWithCString( NULL
, text
+ laststop
, kCFStringEncodingMacRoman
) ;
355 ::DrawThemeTextBox( mString
,
356 kThemeCurrentPortFont
,
362 CFRelease( mString
) ;
366 ::DrawText( text
, laststop
, i
- laststop
) ;
368 ::TextMode( srcOr
) ;
373 void wxToolTip::NotifyWindowDelete( WXHWND win
)
375 if ( win
== s_ToolTipWindowRef
)
377 s_ToolTipWindowRef
= NULL
;
381 void wxMacToolTip::Clear()
392 if ( m_window
== s_ToolTipWindowRef
&& m_backpict
)
394 wxMacPortStateHelper
help( (GrafPtr
) GetWindowPort(m_window
) ) ;
398 BackColor( whiteColor
) ;
399 ForeColor(blackColor
) ;
400 DrawPicture(m_backpict
, &m_rect
);
401 KillPicture(m_backpict
);