X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/ddc80eb4eb7e96ff23ebe329283bb2b940dd1df2..e6a99197fb89047a88f72da519b8fee18a316a7c:/src/common/cshelp.cpp diff --git a/src/common/cshelp.cpp b/src/common/cshelp.cpp index 31af18593e..2a16628047 100644 --- a/src/common/cshelp.cpp +++ b/src/common/cshelp.cpp @@ -13,10 +13,6 @@ // declarations // ============================================================================ -#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) - #pragma implementation "cshelp.h" -#endif - // ---------------------------------------------------------------------------- // headers // ---------------------------------------------------------------------------- @@ -31,10 +27,10 @@ #if wxUSE_HELP #ifndef WX_PRECOMP + #include "wx/app.h" #endif #include "wx/tipwin.h" -#include "wx/app.h" #include "wx/module.h" #include "wx/cshelp.h" @@ -227,21 +223,13 @@ bool wxContextHelpEvtHandler::ProcessEvent(wxEvent& event) // 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(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); } // ---------------------------------------------------------------------------- @@ -254,6 +242,8 @@ bool wxContextHelp::DispatchEvent(wxWindow* win, const wxPoint& pt) * to put the application into context help mode. */ +#ifndef __WXPM__ + static const char * csquery_xpm[] = { "12 11 2 1", " c None", @@ -270,6 +260,8 @@ static const char * csquery_xpm[] = { " .. ", " "}; +#endif + IMPLEMENT_CLASS(wxContextHelpButton, wxBitmapButton) BEGIN_EVENT_TABLE(wxContextHelpButton, wxBitmapButton) @@ -326,13 +318,34 @@ wxHelpProvider::~wxHelpProvider() { } +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 // ---------------------------------------------------------------------------- +#define WINHASH_KEY(w) wxPtrToUInt(w) + wxString wxSimpleHelpProvider::GetHelp(const wxWindowBase *window) { - wxLongToStringHashMap::iterator it = m_hashWindows.find((long)window); + wxSimpleHelpProviderHashMap::iterator it = m_hashWindows.find(WINHASH_KEY(window)); if ( it == m_hashWindows.end() ) { @@ -346,13 +359,13 @@ wxString wxSimpleHelpProvider::GetHelp(const wxWindowBase *window) void wxSimpleHelpProvider::AddHelp(wxWindowBase *window, const wxString& text) { - m_hashWindows.erase((long)window); - m_hashWindows[(long)window] = text; + m_hashWindows.erase(WINHASH_KEY(window)); + m_hashWindows[WINHASH_KEY(window)] = text; } void wxSimpleHelpProvider::AddHelp(wxWindowID id, const wxString& text) { - wxLongToStringHashMap::key_type key = (wxLongToStringHashMap::key_type)id; + wxSimpleHelpProviderHashMap::key_type key = (wxSimpleHelpProviderHashMap::key_type)id; m_hashIds.erase(key); m_hashIds[key] = text; } @@ -360,7 +373,7 @@ void wxSimpleHelpProvider::AddHelp(wxWindowID id, const wxString& text) // removes the association void wxSimpleHelpProvider::RemoveHelp(wxWindowBase* window) { - m_hashWindows.erase((long)window); + m_hashWindows.erase(WINHASH_KEY(window)); } bool wxSimpleHelpProvider::ShowHelp(wxWindowBase *window) @@ -377,10 +390,11 @@ bool wxSimpleHelpProvider::ShowHelp(wxWindowBase *window) } s_tipWindow = NULL; - wxString text = GetHelp(window); + const wxString text = GetHelpTextMaybeAtPoint(window); if ( !text.empty() ) { - s_tipWindow = new wxTipWindow((wxWindow *)window, text, 100, & s_tipWindow); + s_tipWindow = new wxTipWindow((wxWindow *)window, text, + 100, &s_tipWindow); return true; } @@ -402,29 +416,26 @@ wxHelpControllerHelpProvider::wxHelpControllerHelpProvider(wxHelpControllerBase* 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); + const wxString text = GetHelpTextMaybeAtPoint(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