X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/c801d85f158c4cba50b588807daabdcbd0ed3853..d134f1702e983b6588c5783b10a401e8bdb69314:/src/common/helpbase.cpp diff --git a/src/common/helpbase.cpp b/src/common/helpbase.cpp index b10db8b4c1..a99317ac72 100644 --- a/src/common/helpbase.cpp +++ b/src/common/helpbase.cpp @@ -25,11 +25,162 @@ #endif #include "wx/helpbase.h" +#include "wx/app.h" -#if USE_HELP +#if wxUSE_HELP -#if !USE_SHARED_LIBRARY IMPLEMENT_CLASS(wxHelpControllerBase, wxObject) + +/* + * Invokes context-sensitive help + */ + +// This class exists in order to eat events until the left mouse +// button is pressed +class wxContextHelpEvtHandler: public wxEvtHandler +{ +public: + wxContextHelpEvtHandler(wxContextHelp* contextHelp) + { + m_contextHelp = contextHelp; + } + + virtual bool ProcessEvent(wxEvent& event); + +//// Data + wxContextHelp* m_contextHelp; +}; + +IMPLEMENT_DYNAMIC_CLASS(wxContextHelp, wxObject) + +wxContextHelp::wxContextHelp(wxWindow* win, bool beginHelp) +{ + m_inHelp = FALSE; + + if (beginHelp) + BeginContextHelp(win); +} + +wxContextHelp::~wxContextHelp() +{ + if (m_inHelp) + EndContextHelp(); +} + +// Begin 'context help mode' +bool wxContextHelp::BeginContextHelp(wxWindow* win) +{ + if (!win) + win = wxTheApp->GetTopWindow(); + if (!win) + return FALSE; + + wxCursor cursor(wxCURSOR_QUESTION_ARROW); + wxCursor oldCursor = win->GetCursor(); + win->SetCursor(cursor); + +#ifdef __WXMSW__ + // wxSetCursor(cursor); #endif -#endif // USE_HELP + 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