// Author: Vadim Zeitlin
// Modified by:
// Created: 31.01.99
-// RCS-ID: $Id$
// Copyright: (c) 1999 Vadim Zeitlin
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
#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
void wxToolTip::SetMaxWidth(int width)
{
- wxASSERT_MSG( width == -1 || width >= 0, _T("invalid width value") );
+ wxASSERT_MSG( width == -1 || width >= 0, wxT("invalid width value") );
ms_maxWidth = width;
}
: 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::Add(WXHWND hWnd)
+void wxToolTip::Remove()
+{
+ DoForAllWindows(&wxToolTip::DoRemove);
+}
+
+void wxToolTip::AddOtherWindow(WXHWND hWnd)
+{
+ if ( !m_others )
+ m_others = new wxToolTipOtherWindows;
+
+ m_others->push_back(hWnd);
+
+ DoAddHWND(hWnd);
+}
+
+void wxToolTip::DoAddHWND(WXHWND hWnd)
{
HWND hwnd = (HWND)hWnd;
// 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());
+ ti.lpszText = wxMSW_CONV_LPTSTR(m_text);
if ( !SendTooltipMessage(GetToolTipCtrl(), TTM_ADDTOOL, &ti) )
{
- wxLogDebug(_T("Failed to create the tooltip '%s'"), m_text.c_str());
+ wxLogDebug(wxT("Failed to create the tooltip '%s'"), m_text.c_str());
return;
}
// find the width of the widest line
int maxWidth = 0;
- wxStringTokenizer tokenizer(m_text, _T("\n"));
+ wxStringTokenizer tokenizer(m_text, wxT("\n"));
while ( tokenizer.HasMoreTokens() )
{
const wxString token = tokenizer.GetNextToken();
SIZE sz;
- if ( !::GetTextExtentPoint32(hdc, token.wx_str(),
+ if ( !::GetTextExtentPoint32(hdc, token.t_str(),
token.length(), &sz) )
{
wxLogLastError(wxT("GetTextExtentPoint32"));
{
// replace the '\n's with spaces because otherwise they appear as
// unprintable characters in the tooltip string
- m_text.Replace(_T("\n"), _T(" "));
- ti.lpszText = const_cast<wxChar *>(m_text.wx_str());
+ m_text.Replace(wxT("\n"), wxT(" "));
+ ti.lpszText = wxMSW_CONV_LPTSTR(m_text);
if ( !SendTooltipMessage(GetToolTipCtrl(), TTM_ADDTOOL, &ti) )
{
- wxLogDebug(_T("Failed to create the tooltip '%s'"), m_text.c_str());
+ wxLogDebug(wxT("Failed to create the tooltip '%s'"), m_text.c_str());
}
}
}
// add the window itself
if ( m_window )
{
- Add(m_window->GetHWND());
+ DoAddHWND(m_window->GetHWND());
}
#if !defined(__WXUNIVERSAL__)
// and all of its subcontrols (e.g. radio buttons in a radiobox) as well
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);
}
// must have it by now!
- wxASSERT_MSG( hwnd, _T("no hwnd for subcontrol?") );
+ wxASSERT_MSG( hwnd, wxT("no hwnd for subcontrol?") );
- Add((WXHWND)hwnd);
+ AddOtherWindow((WXHWND)hwnd);
}
}
#endif // !defined(__WXUNIVERSAL__)
{
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 = wxMSW_CONV_LPTSTR(m_text);
+ (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 *>(_T(""));
- (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);
+ }
}
}