+ MemoryHDC hdc;
+ if ( !hdc )
+ {
+ wxLogLastError(wxT("CreateCompatibleDC(NULL)"));
+ }
+
+ if ( !SelectObject(hdc, hfont) )
+ {
+ wxLogLastError(wxT("SelectObject(hfont)"));
+ }
+
+ // find the width of the widest line
+ int maxWidth = 0;
+ wxStringTokenizer tokenizer(m_text, wxT("\n"));
+ while ( tokenizer.HasMoreTokens() )
+ {
+ const wxString token = tokenizer.GetNextToken();
+
+ SIZE sz;
+ if ( !::GetTextExtentPoint32(hdc, token.wx_str(),
+ token.length(), &sz) )
+ {
+ wxLogLastError(wxT("GetTextExtentPoint32"));
+ }
+
+ if ( sz.cx > maxWidth )
+ maxWidth = sz.cx;
+ }
+
+ // limit size to ms_maxWidth, if set
+ if ( ms_maxWidth == 0 )
+ {
+ // this is more or less arbitrary but seems to work well
+ static const int DEFAULT_MAX_WIDTH = 400;
+
+ ms_maxWidth = wxGetClientDisplayRect().width / 2;
+
+ if ( ms_maxWidth > DEFAULT_MAX_WIDTH )
+ ms_maxWidth = DEFAULT_MAX_WIDTH;
+ }
+
+ if ( ms_maxWidth != -1 && maxWidth > ms_maxWidth )
+ maxWidth = ms_maxWidth;
+
+ // only set a new width if it is bigger than the current setting:
+ // otherwise adding a tooltip with shorter line(s) than a previous
+ // one would result in breaking the longer lines unnecessarily as
+ // all our tooltips share the same maximal width
+ if ( maxWidth > SendTooltipMessage(GetToolTipCtrl(),
+ TTM_GETMAXTIPWIDTH, 0) )
+ {
+ SendTooltipMessage(GetToolTipCtrl(), TTM_SETMAXTIPWIDTH,
+ wxUIntToPtr(maxWidth));
+ }
+ }
+ else
+#endif // TTM_SETMAXTIPWIDTH
+ {
+ // replace the '\n's with spaces because otherwise they appear as
+ // unprintable characters in the tooltip string
+ m_text.Replace(wxT("\n"), wxT(" "));
+ ti.lpszText = const_cast<wxChar *>(m_text.wx_str());
+
+ if ( !SendTooltipMessage(GetToolTipCtrl(), TTM_ADDTOOL, &ti) )
+ {
+ wxLogDebug(wxT("Failed to create the tooltip '%s'"), m_text.c_str());