#ifndef WX_PRECOMP
#include "wx/app.h"
+ #include "wx/module.h"
#endif
#include "wx/tipwin.h"
-#include "wx/module.h"
#include "wx/cshelp.h"
+#if wxUSE_MS_HTML_HELP
+ #include "wx/msw/helpchm.h" // for ShowContextHelpPopup
+ #include "wx/utils.h" // for wxGetMousePosition()
+#endif
+
// ----------------------------------------------------------------------------
// wxContextHelpEvtHandler private class
// ----------------------------------------------------------------------------
// Dispatch the help event to the relevant window
bool wxContextHelp::DispatchEvent(wxWindow* win, const wxPoint& pt)
{
- wxWindow* subjectOfHelp = win;
- bool eventProcessed = false;
- while (subjectOfHelp && !eventProcessed)
- {
- wxHelpEvent helpEvent(wxEVT_HELP, subjectOfHelp->GetId(), pt,
- wxHelpEvent::Origin_HelpButton);
- helpEvent.SetEventObject(subjectOfHelp);
+ wxCHECK_MSG( win, false, _T("win parameter can't be NULL") );
- eventProcessed = win->GetEventHandler()->ProcessEvent(helpEvent);
+ wxHelpEvent helpEvent(wxEVT_HELP, win->GetId(), pt,
+ wxHelpEvent::Origin_HelpButton);
+ helpEvent.SetEventObject(win);
- // Go up the window hierarchy until the event is handled (or not).
- // I.e. keep submitting ancestor windows until one is recognised
- // by the app code that processes the ids and displays help.
- subjectOfHelp = subjectOfHelp->GetParent();
- }
- return eventProcessed;
+ return win->GetEventHandler()->ProcessEvent(helpEvent);
}
// ----------------------------------------------------------------------------
bool wxSimpleHelpProvider::ShowHelp(wxWindowBase *window)
{
-#if wxUSE_TIPWINDOW
- static wxTipWindow* s_tipWindow = NULL;
-
- if (s_tipWindow)
- {
- // Prevent s_tipWindow being nulled in OnIdle,
- // thereby removing the chance for the window to be closed by ShowHelp
- s_tipWindow->SetTipWindowPtr(NULL);
- s_tipWindow->Close();
- }
- s_tipWindow = NULL;
-
+#if wxUSE_MS_HTML_HELP || wxUSE_TIPWINDOW
const wxString text = GetHelpTextMaybeAtPoint(window);
+
if ( !text.empty() )
{
- s_tipWindow = new wxTipWindow((wxWindow *)window, text,
- 100, &s_tipWindow);
+ // use the native help popup style if it's available
+#if wxUSE_MS_HTML_HELP
+ if ( !wxCHMHelpController::ShowContextHelpPopup
+ (
+ text,
+ wxGetMousePosition(),
+ (wxWindow *)window
+ ) )
+#endif // wxUSE_MS_HTML_HELP
+ {
+#if wxUSE_TIPWINDOW
+ static wxTipWindow* s_tipWindow = NULL;
+
+ if ( s_tipWindow )
+ {
+ // Prevent s_tipWindow being nulled in OnIdle, thereby removing
+ // the chance for the window to be closed by ShowHelp
+ s_tipWindow->SetTipWindowPtr(NULL);
+ s_tipWindow->Close();
+ }
+
+ s_tipWindow = new wxTipWindow((wxWindow *)window, text,
+ 100, &s_tipWindow);
+#else // !wxUSE_TIPWINDOW
+ // we tried wxCHMHelpController but it failed and we don't have
+ // wxTipWindow to fall back on, so
+ return false;
+#endif // wxUSE_TIPWINDOW
+ }
return true;
}
-#else
+#else // !wxUSE_MS_HTML_HELP && !wxUSE_TIPWINDOW
wxUnusedVar(window);
-#endif // wxUSE_TIPWINDOW
+#endif // wxUSE_MS_HTML_HELP || wxUSE_TIPWINDOW
return false;
}