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/aga.h"
25 #include "wx/mac/uma.h"
27 //-----------------------------------------------------------------------------
29 //-----------------------------------------------------------------------------
37 void Setup( WindowRef window
, wxString text
, wxPoint localPosition
) ;
38 long GetMark() { return m_mark
; }
41 bool IsShown() { return m_shown
; }
48 PicHandle m_backpict
;
53 class wxMacToolTipTimer
: wxTimer
56 wxMacToolTipTimer(wxMacToolTip
* tip
, int iMilliseconds
) ;
60 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
;
80 wxToolTip::wxToolTip( const wxString
&tip
)
83 m_window
= (wxWindow
*) NULL
;
86 wxToolTip::~wxToolTip()
90 void wxToolTip::SetTip( const wxString
&tip
)
97 // update it immediately
98 wxToolInfo ti(GetHwndOf(m_window));
99 ti.lpszText = (wxChar *)m_text.c_str();
101 (void)SendTooltipMessage(GetToolTipCtrl(), TTM_UPDATETIPTEXT, 0, &ti);
106 void wxToolTip::SetWindow( wxWindow
*win
)
111 void wxToolTip::Enable( bool flag
)
113 if ( s_ShowToolTips
!= flag
)
115 s_ShowToolTips
= flag
;
116 if ( s_ShowToolTips
)
126 void wxToolTip::SetDelay( long msecs
)
128 s_ToolTipDelay
= msecs
;
131 void wxToolTip::RelayEvent( wxWindow
*win
, wxMouseEvent
&event
)
133 if ( s_ShowToolTips
)
135 if ( event
.GetEventType() == wxEVT_LEAVE_WINDOW
)
139 else if (event
.GetEventType() == wxEVT_ENTER_WINDOW
|| event
.GetEventType() == wxEVT_MOTION
)
141 wxPoint2DInt
where( event
.m_x
, event
.m_y
) ;
142 if ( s_LastWindowEntered
== win
&& s_ToolTipArea
.Contains( where
) )
148 s_ToolTipArea
= wxRect2DInt( event
.m_x
- 2 , event
.m_y
- 2 , 4 , 4 ) ;
149 s_LastWindowEntered
= win
;
151 WindowRef window
= win
->MacGetRootWindow() ;
154 wxPoint
local( x
, y
) ;
155 win
->MacClientToRootWindow( &x
, &y
) ;
156 wxPoint
windowlocal( x
, y
) ;
157 s_ToolTip
.Setup( window
, win
->MacGetToolTipString( local
) , windowlocal
) ;
163 void wxToolTip::RemoveToolTips()
169 wxMacToolTipTimer::wxMacToolTipTimer( wxMacToolTip
*tip
, int msec
)
172 m_mark
= tip
->GetMark() ;
176 wxMacToolTip::wxMacToolTip()
184 void wxMacToolTip::Setup( WindowRef window
, wxString text
, wxPoint localPosition
)
188 m_position
= localPosition
;
189 m_label
= wxMacMakeMacStringFromPC( text
) ;
191 s_ToolTipWindowRef
= window
;
193 new wxMacToolTipTimer( this , s_ToolTipDelay
) ;
196 wxMacToolTip::~wxMacToolTip()
202 const short kTipBorder
= 2 ;
203 const short kTipOffset
= 5 ;
205 void wxMacToolTip::Draw()
207 if ( m_label
.Length() == 0 )
210 if ( m_window
== s_ToolTipWindowRef
)
214 if ( HMDisplayTag != (void*) kUnresolvedCFragSymbolAddress )
223 AGAPortHelper
help( GetWindowPort( m_window
) );
225 AGAPortHelper
help( ( m_window
) );
229 TextFont( kFontIDGeneva
) ;
233 ::GetFontInfo(&fontInfo
);
234 short lineh
= fontInfo
.ascent
+ fontInfo
.descent
+ fontInfo
.leading
;
236 // short width = TextWidth( m_label , 0 ,m_label.Length() ) ;
239 int length
= m_label
.Length() ;
243 const char *text
= m_label
;
246 if( text
[i
] == 13 || text
[i
] == 10)
248 thiswidth
= ::TextWidth( text
, laststop
, i
- laststop
) ;
249 if ( thiswidth
> width
)
257 if ( i
- laststop
> 0 )
259 thiswidth
= ::TextWidth( text
, laststop
, i
- laststop
) ;
260 if ( thiswidth
> width
)
266 m_rect
.left
= m_position
.x
+ kTipOffset
;
267 m_rect
.top
= m_position
.y
+ kTipOffset
;
268 m_rect
.right
= m_rect
.left
+ width
+ 2 * kTipBorder
;
269 m_rect
.bottom
= m_rect
.top
+ height
+ 2 * kTipBorder
;
270 ClipRect( &m_rect
) ;
271 BackColor( whiteColor
) ;
272 ForeColor(blackColor
) ;
273 m_backpict
= OpenPicture(&m_rect
);
275 CopyBits(GetPortBitMapForCopyBits(GetWindowPort(m_window
)),
276 GetPortBitMapForCopyBits(GetWindowPort(m_window
)),
284 SetThemeBackground(kThemeBrushNotificationWindowBackground
,32,true) ;
285 SetThemeTextColor(kThemeTextColorNotification
,32,true) ;
286 EraseRect( &m_rect
) ;
287 FrameRect( &m_rect
) ;
288 ::MoveTo( m_rect
.left
+ kTipBorder
, m_rect
.top
+ fontInfo
.ascent
+ kTipBorder
);
295 if( text
[i
] == 13 || text
[i
] == 10)
297 ::DrawText( text
, laststop
, i
- laststop
) ;
299 ::MoveTo( m_rect
.left
+ kTipBorder
, m_rect
.top
+ fontInfo
.ascent
+ kTipBorder
+ height
);
305 ::DrawText( text
, laststop
, i
- laststop
) ;
306 ::TextMode( srcOr
) ;
307 // DrawText( m_label , 0 , m_label.Length() ) ;
312 void wxToolTip::NotifyWindowDelete( WindowRef win
)
314 if ( win
== s_ToolTipWindowRef
)
316 s_ToolTipWindowRef
= NULL
;
320 void wxMacToolTip::Clear()
326 if ( m_window
== s_ToolTipWindowRef
&& m_backpict
)
329 AGAPortHelper
help( GetWindowPort(m_window
) ) ;
331 AGAPortHelper
help( (m_window
) ) ;
335 BackColor( whiteColor
) ;
336 ForeColor(blackColor
) ;
337 DrawPicture(m_backpict
, &m_rect
);
338 KillPicture(m_backpict
);