+ DoForAllWindows(&wxToolTip::DoRemove);
+}
+
+void wxToolTip::Add(WXHWND hWnd)
+{
+ if ( !m_others )
+ m_others = new wxToolTipOtherWindows;
+
+ m_others->push_back(hWnd);
+
+ DoAddOtherWindow(hWnd);
+}
+
+void wxToolTip::DoAddOtherWindow(WXHWND hWnd)
+{
+ HWND hwnd = (HWND)hWnd;
+
+ wxToolInfo ti(hwnd, m_id, m_rect);
+
+ // another possibility would be to specify LPSTR_TEXTCALLBACK here as we
+ // store the tooltip text ourselves anyhow, and provide it in response to
+ // TTN_NEEDTEXT (sent via WM_NOTIFY), but then we would be limited to 79
+ // character tooltips as this is the size of the szText buffer in
+ // NMTTDISPINFO struct -- and setting the tooltip here we can have tooltips
+ // of any length
+ ti.hwnd = hwnd;
+ 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());
+
+ return;
+ }
+
+#ifdef TTM_SETMAXTIPWIDTH
+ if ( wxApp::GetComCtl32Version() >= 470 )
+ {
+ // use TTM_SETMAXTIPWIDTH to make tooltip multiline using the
+ // extent of its first line as max value
+ HFONT hfont = (HFONT)
+ SendTooltipMessage(GetToolTipCtrl(), WM_GETFONT, 0);
+
+ if ( !hfont )
+ {
+ hfont = (HFONT)GetStockObject(DEFAULT_GUI_FONT);
+ if ( !hfont )
+ {
+ wxLogLastError(wxT("GetStockObject(DEFAULT_GUI_FONT)"));
+ }
+ }
+
+ 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