#endif
#include "wx/tokenzr.h"
+#include "wx/vector.h"
#include "wx/msw/private.h"
#ifndef TTTOOLINFO_V1_SIZE
// private classes
// ----------------------------------------------------------------------------
+// This is simply a wrapper for vector<HWND> but defined as a class to hide the
+// details from the public header.
+class wxToolTipOtherWindows : public wxVector<WXHWND>
+{
+};
+
// a wrapper around TOOLINFO Win32 structure
#ifdef __VISUALC__
#pragma warning( disable : 4097 ) // we inherit from a typedef - so what?
{
// this tooltip must be shown only if the mouse hovers a specific rect
// of the hwnd parameter!
- rect.left = rc.GetLeft();
- rect.right = rc.GetRight();
- rect.top = rc.GetTop();
- rect.bottom = rc.GetBottom();
+ rect.left = rc.GetLeft();
+ rect.right = rc.GetRight();
+ rect.top = rc.GetTop();
+ rect.bottom = rc.GetBottom();
// note that not setting TTF_IDISHWND from the uFlags member means that the
// ti.uId field should not contain the HWND but rather as MSDN says an
: m_text(tip)
{
m_window = NULL;
+ m_others = NULL;
// make sure m_rect.IsEmpty() == true
m_rect.SetWidth(0);
: m_text(tip), m_rect(rc), m_id(id)
{
m_window = NULL;
+ m_others = NULL;
SetWindow(win);
}
// the tooltip has to be removed before deleting. Otherwise, if it is visible
// while being deleted, there will be a delay before it goes away.
Remove();
+
+ delete m_others;
}
// ----------------------------------------------------------------------------
(void)SendTooltipMessage(GetToolTipCtrl(), TTM_DELTOOL, &ti);
}
-void wxToolTip::Remove()
+void wxToolTip::DoRemove(WXHWND hWnd)
{
- // remove this tool from the tooltip control
- if ( m_window )
+ if ( m_window && hWnd == m_window->GetHWND() )
+ {
+ // Remove the tooltip from the main window.
+ Remove(hWnd, m_id, m_rect);
+ }
+ else
{
- Remove(m_window->GetHWND(), m_id, m_rect);
+ // Not really sure what to pass to remove in this case...
+ Remove(hWnd, 0, wxRect());
}
}
+void wxToolTip::Remove()
+{
+ 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;
HWND hwnd = GetDlgItem(GetHwndOf(m_window), id);
if ( !hwnd )
{
- // may be it's a child of parent of the control, in fact?
+ // maybe it's a child of parent of the control, in fact?
// (radiobuttons are subcontrols, i.e. children of the radiobox
// for wxWidgets but are its siblings at Windows level)
hwnd = GetDlgItem(GetHwndOf(m_window->GetParent()), id);
{
m_text = tip;
+ DoForAllWindows(&wxToolTip::DoSetTip);
+}
+
+void wxToolTip::DoSetTip(WXHWND hWnd)
+{
+ // update the tip text shown by the control
+ wxToolInfo ti((HWND)hWnd, m_id, m_rect);
+
+ // for some reason, changing the tooltip text directly results in
+ // repaint of the controls under it, see #10520 -- but this doesn't
+ // happen if we reset it first
+ ti.lpszText = const_cast<wxChar *>(wxT(""));
+ (void)SendTooltipMessage(GetToolTipCtrl(), TTM_UPDATETIPTEXT, &ti);
+
+ ti.lpszText = const_cast<wxChar *>(m_text.wx_str());
+ (void)SendTooltipMessage(GetToolTipCtrl(), TTM_UPDATETIPTEXT, &ti);
+}
+
+void wxToolTip::DoForAllWindows(void (wxToolTip::*func)(WXHWND))
+{
if ( m_window )
{
- // update the tip text shown by the control
- wxToolInfo ti(GetHwndOf(m_window), m_id, m_rect);
-
- // for some reason, changing the tooltip text directly results in
- // repaint of the controls under it, see #10520 -- but this doesn't
- // happen if we reset it first
- ti.lpszText = const_cast<wxChar *>(wxT(""));
- (void)SendTooltipMessage(GetToolTipCtrl(), TTM_UPDATETIPTEXT, &ti);
+ (this->*func)(m_window->GetHWND());
+ }
- ti.lpszText = const_cast<wxChar *>(m_text.wx_str());
- (void)SendTooltipMessage(GetToolTipCtrl(), TTM_UPDATETIPTEXT, &ti);
+ if ( m_others )
+ {
+ for ( wxToolTipOtherWindows::const_iterator it = m_others->begin();
+ it != m_others->end();
+ ++it )
+ {
+ (this->*func)(*it);
+ }
}
}