#include "wx/module.h"
#include "wx/cshelp.h"
+// wxUSE_MS_HTML_HELP is not defined under platforms other than MSW
+#ifndef wxUSE_MS_HTML_HELP
+ #define wxUSE_MS_HTML_HELP 0
+#endif
+
+#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);
}
// ----------------------------------------------------------------------------
{
}
+wxString wxHelpProvider::GetHelpTextMaybeAtPoint(wxWindowBase *window)
+{
+ if ( m_helptextAtPoint != wxDefaultPosition ||
+ m_helptextOrigin != wxHelpEvent::Origin_Unknown )
+ {
+ wxCHECK_MSG( window, wxEmptyString, _T("window must not be NULL") );
+
+ wxPoint pt = m_helptextAtPoint;
+ wxHelpEvent::Origin origin = m_helptextOrigin;
+
+ m_helptextAtPoint = wxDefaultPosition;
+ m_helptextOrigin = wxHelpEvent::Origin_Unknown;
+
+ return window->GetHelpTextAtPoint(pt, origin);
+ }
+
+ return GetHelp(window);
+}
+
// ----------------------------------------------------------------------------
// wxSimpleHelpProvider
// ----------------------------------------------------------------------------
bool wxSimpleHelpProvider::ShowHelp(wxWindowBase *window)
{
-#if wxUSE_TIPWINDOW
- static wxTipWindow* s_tipWindow = NULL;
+#if wxUSE_MS_HTML_HELP || wxUSE_TIPWINDOW
+ const wxString text = GetHelpTextMaybeAtPoint(window);
- 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;
-
- wxString text = GetHelp(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;
}
bool wxHelpControllerHelpProvider::ShowHelp(wxWindowBase *window)
{
- wxString text = GetHelp(window);
- if ( !text.empty() )
- {
- if (m_helpController)
- {
- if (text.IsNumber())
- return m_helpController->DisplayContextPopup(wxAtoi(text));
+ const wxString text = GetHelpTextMaybeAtPoint(window);
- // If the help controller is capable of popping up the text...
- else if (m_helpController->DisplayTextPopup(text, wxGetMousePosition()))
- {
- return true;
- }
- else
- // ...else use the default method.
- return wxSimpleHelpProvider::ShowHelp(window);
- }
- else
- return wxSimpleHelpProvider::ShowHelp(window);
+ if ( text.empty() )
+ return false;
+ if ( m_helpController )
+ {
+ // if it's a numeric topic, show it
+ long topic;
+ if ( text.ToLong(&topic) )
+ return m_helpController->DisplayContextPopup(topic);
+
+ // otherwise show the text directly
+ if ( m_helpController->DisplayTextPopup(text, wxGetMousePosition()) )
+ return true;
}
- return false;
+ // if there is no help controller or it's not capable of showing the help,
+ // fallback to the default method
+ return wxSimpleHelpProvider::ShowHelp(window);
}
// Convenience function for turning context id into wxString