+ win->PushEventHandler(new wxContextHelpEvtHandler(this));
+
+ win->CaptureMouse();
+
+ EventLoop();
+
+ win->ReleaseMouse();
+
+ win->PopEventHandler(TRUE);
+
+ win->SetCursor(oldCursor);
+
+ if (m_status)
+ {
+ wxPoint pt;
+ wxWindow* winAtPtr = wxFindWindowAtPointer(pt);
+ if (winAtPtr)
+ DispatchEvent(winAtPtr, pt);
+ }
+
+ return TRUE;
+}
+
+bool wxContextHelp::EndContextHelp()
+{
+ m_inHelp = FALSE;
+
+ return TRUE;
+}
+
+bool wxContextHelp::EventLoop()
+{
+ m_inHelp = TRUE;
+ while ( m_inHelp )
+ {
+ if (wxTheApp->Pending())
+ {
+ wxTheApp->Dispatch();
+ }
+ else
+ {
+ wxTheApp->ProcessIdle();
+ }
+ }
+ return TRUE;
+}
+
+bool wxContextHelpEvtHandler::ProcessEvent(wxEvent& event)
+{
+ switch (event.GetEventType())
+ {
+ case wxEVT_LEFT_DOWN:
+ {
+ //wxMouseEvent& mouseEvent = (wxMouseEvent&) event;
+ m_contextHelp->SetStatus(TRUE);
+ m_contextHelp->EndContextHelp();
+ return TRUE;
+ break;
+ }
+ case wxEVT_CHAR:
+ case wxEVT_KEY_DOWN:
+ case wxEVT_ACTIVATE:
+ case wxEVT_MOUSE_CAPTURE_CHANGED:
+ {
+ m_contextHelp->SetStatus(FALSE);
+ m_contextHelp->EndContextHelp();
+ return TRUE;
+ break;
+ }
+ case wxEVT_PAINT:
+ case wxEVT_ERASE_BACKGROUND:
+ {
+ event.Skip();
+ return FALSE;
+ break;
+ }
+ }
+
+ return TRUE;
+}
+
+// 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) ;
+ helpEvent.SetEventObject(this);
+ eventProcessed = win->GetEventHandler()->ProcessEvent(helpEvent);
+
+ // 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;
+}
+
+#endif // wxUSE_HELP