X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/afb02ca57cf9c1e37732a4364c0fc26579067a31..e4315700228573d42a9afb1498fec4ee7b95ccb0:/src/common/cshelp.cpp?ds=sidebyside diff --git a/src/common/cshelp.cpp b/src/common/cshelp.cpp index 6c4975896c..cb9a8d895f 100644 --- a/src/common/cshelp.cpp +++ b/src/common/cshelp.cpp @@ -35,7 +35,7 @@ #include "wx/tipwin.h" #include "wx/app.h" - +#include "wx/module.h" #include "wx/cshelp.h" // ---------------------------------------------------------------------------- @@ -119,6 +119,15 @@ bool wxContextHelp::BeginContextHelp(wxWindow* win) { wxPoint pt; wxWindow* winAtPtr = wxFindWindowAtPointer(pt); + /* + if (winAtPtr) + { + wxString msg; + msg.Printf("Picked %s (%d)", (const char*) winAtPtr->GetName(), winAtPtr->GetId()); + cout << msg << '\n'; + } + */ + if (winAtPtr) DispatchEvent(winAtPtr, pt); } @@ -152,33 +161,28 @@ bool wxContextHelp::EventLoop() bool wxContextHelpEvtHandler::ProcessEvent(wxEvent& event) { - switch (event.GetEventType()) + if (event.GetEventType() == wxEVT_LEFT_DOWN) { - 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; - } + m_contextHelp->SetStatus(TRUE); + m_contextHelp->EndContextHelp(); + return TRUE; + } + + if ((event.GetEventType() == wxEVT_CHAR) || + (event.GetEventType() == wxEVT_KEY_DOWN) || + (event.GetEventType() == wxEVT_ACTIVATE) || + (event.GetEventType() == wxEVT_MOUSE_CAPTURE_CHANGED)) + { + m_contextHelp->SetStatus(FALSE); + m_contextHelp->EndContextHelp(); + return TRUE; + } + + if ((event.GetEventType() == wxEVT_PAINT) || + (event.GetEventType() == wxEVT_ERASE_BACKGROUND)) + { + event.Skip(); + return FALSE; } return TRUE; @@ -194,7 +198,7 @@ bool wxContextHelp::DispatchEvent(wxWindow* win, const wxPoint& pt) 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. @@ -247,7 +251,7 @@ wxContextHelpButton::wxContextHelpButton(wxWindow* parent, { } -void wxContextHelpButton::OnContextHelp(wxCommandEvent& event) +void wxContextHelpButton::OnContextHelp(wxCommandEvent& WXUNUSED(event)) { wxContextHelp contextHelp(GetParent()); } @@ -301,10 +305,21 @@ void wxSimpleHelpProvider::AddHelp(wxWindowID id, const wxString& text) bool wxSimpleHelpProvider::ShowHelp(wxWindowBase *window) { + 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; + wxString text = GetHelp(window); if ( !text.empty() ) { - new wxTipWindow((wxWindow *)window, text); + s_tipWindow = new wxTipWindow((wxWindow *)window, text, 100, & s_tipWindow); return TRUE; } @@ -312,4 +327,80 @@ bool wxSimpleHelpProvider::ShowHelp(wxWindowBase *window) return FALSE; } +// ---------------------------------------------------------------------------- +// wxHelpControllerHelpProvider +// ---------------------------------------------------------------------------- + +wxHelpControllerHelpProvider::wxHelpControllerHelpProvider(wxHelpControllerBase* hc) +{ + m_helpController = hc; +} + +bool wxHelpControllerHelpProvider::ShowHelp(wxWindowBase *window) +{ + wxString text = GetHelp(window); + if ( !text.empty() ) + { + if (m_helpController) + { + if (text.IsNumber()) + return m_helpController->DisplayContextPopup(wxAtoi(text)); + + // 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); + + } + + return FALSE; +} + +// Convenience function for turning context id into wxString +wxString wxContextId(int id) +{ + return wxString(IntToString(id)); +} + +// ---------------------------------------------------------------------------- +// wxHelpProviderModule: module responsible for cleaning up help provider. +// ---------------------------------------------------------------------------- + +class wxHelpProviderModule : public wxModule +{ +public: + bool OnInit(); + void OnExit(); + +private: + DECLARE_DYNAMIC_CLASS(wxHelpProviderModule) +}; + +IMPLEMENT_DYNAMIC_CLASS(wxHelpProviderModule, wxModule) + +bool wxHelpProviderModule::OnInit() +{ + // Probably we don't want to do anything by default, + // since it could pull in extra code + // wxHelpProvider::Set(new wxSimpleHelpProvider); + + return TRUE; +} + +void wxHelpProviderModule::OnExit() +{ + if (wxHelpProvider::Get()) + { + delete wxHelpProvider::Get(); + wxHelpProvider::Set(NULL); + } +} + #endif // wxUSE_HELP