X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/3295e23873ab52d5be80c52b8647909546936ae2..950905affdfa9041316f82308e1a11e82c783070:/src/msw/helpchm.cpp diff --git a/src/msw/helpchm.cpp b/src/msw/helpchm.cpp index 88dff23aab..1114decbd0 100644 --- a/src/msw/helpchm.cpp +++ b/src/msw/helpchm.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: helpchm.cpp +// Name: src/msw/helpchm.cpp // Purpose: Help system: MS HTML Help implementation // Author: Julian Smart // Modified by: @@ -9,10 +9,6 @@ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#ifdef __GNUG__ - #pragma implementation "helpchm.h" -#endif - // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" @@ -20,71 +16,20 @@ #pragma hdrstop #endif -#if wxUSE_HELP && wxUSE_MS_HTML_HELP && defined(__WIN95__) +#if wxUSE_HELP && wxUSE_MS_HTML_HELP #include "wx/filefn.h" #include "wx/msw/helpchm.h" -#include "wx/dynlib.h" - -#include "wx/msw/private.h" +#include "wx/dynload.h" -// instead of including htmlhelp.h, duplicate the things from it we need here +#ifndef WX_PRECOMP + #include "wx/intl.h" + #include "wx/app.h" +#endif -enum -{ - HH_DISPLAY_TOPIC, - HH_DISPLAY_TOC, - HH_DISPLAY_INDEX, - HH_DISPLAY_SEARCH, - HH_SET_WIN_TYPE, - HH_GET_WIN_TYPE, - HH_GET_WIN_HANDLE, - HH_ENUM_INFO_TYPE, - HH_SET_INFO_TYPE, - HH_SYNC, - HH_RESERVED1, - HH_RESERVED2, - HH_RESERVED3, - HH_KEYWORD_LOOKUP, - HH_DISPLAY_TEXT_POPUP, - HH_HELP_CONTEXT, - HH_TP_HELP_CONTEXTMENU, - HH_TP_HELP_WM_HELP, - HH_CLOSE_ALL, - HH_ALINK_LOOKUP, - HH_GET_LAST_ERROR, - HH_ENUM_CATEGORY, - HH_ENUM_CATEGORY_IT, - HH_RESET_IT_FILTER, - HH_SET_INCLUSIVE_FILTER, - HH_SET_EXCLUSIVE_FILTER -}; - -struct HH_POPUP -{ - int cbStruct; - HINSTANCE hinst; - UINT idString; - LPCTSTR pszText; - POINT pt; - COLORREF clrForeground; - COLORREF clrBackground; - RECT rcMargins; - LPCTSTR pszFont; -}; - -struct HH_AKLINK -{ - int cbStruct; - BOOL fReserved; - LPCTSTR pszKeywords; - LPCTSTR pszUrl; - LPCTSTR pszMsgText; - LPCTSTR pszMsgTitle; - LPCTSTR pszWindow; - BOOL fIndexOnFail; -}; +#include "wx/msw/private.h" +#include "wx/msw/htmlhelp.h" // ---------------------------------------------------------------------------- // utility functions to manage the loading/unloading @@ -93,120 +38,124 @@ struct HH_AKLINK #ifndef UNICODE typedef HWND ( WINAPI * HTMLHELP )( HWND, LPCSTR, UINT, DWORD ); - #define HTMLHELP_NAME "HtmlHelpA" + #define HTMLHELP_NAME wxT("HtmlHelpA") #else // ANSI typedef HWND ( WINAPI * HTMLHELP )( HWND, LPCWSTR, UINT, DWORD ); - #define HTMLHELP_NAME "HtmlHelpW" + #define HTMLHELP_NAME wxT("HtmlHelpW") #endif -// dll symbol handle -static HTMLHELP gs_htmlHelp = 0; -static wxPluginLibrary *gs_libHtmlHelp = NULL; - -static bool LoadHtmlHelpLibrary() +HTMLHELP GetHtmlHelpFunction() { - gs_libHtmlHelp = wxPluginManager::LoadLibrary( _T("HHCTRL.OCX"), wxDL_DEFAULT | wxDL_VERBATIM ); + static HTMLHELP s_htmlHelp = NULL; - if( !gs_libHtmlHelp ) - { - wxLogError(_("MS HTML Help functions are unavailable because the MS HTML Help library is not installed on this machine. Please install it.")); - return FALSE; - } - else + if ( !s_htmlHelp ) { - gs_htmlHelp = (HTMLHELP)gs_libHtmlHelp->GetSymbol( HTMLHELP_NAME ); + static wxDynamicLibrary s_dllHtmlHelp(_T("HHCTRL.OCX"), wxDL_VERBATIM); - if( !gs_htmlHelp ) + if ( !s_dllHtmlHelp.IsLoaded() ) { - wxLogError(_("Failed to initialize MS HTML Help.")); - - gs_libHtmlHelp->UnrefLib(); - return FALSE ; + wxLogError(_("MS HTML Help functions are unavailable because the MS HTML Help library is not installed on this machine. Please install it.")); + } + else + { + s_htmlHelp = (HTMLHELP)s_dllHtmlHelp.GetSymbol(HTMLHELP_NAME); + if ( !s_htmlHelp ) + { + wxLogError(_("Failed to initialize MS HTML Help.")); + } } } - return TRUE; + return s_htmlHelp; } -static void UnloadHtmlHelpLibrary() +// find the window to use in HtmlHelp() call: use the given one by default but +// fall back to the top level app window and then the desktop if it's NULL +static HWND GetSuitableHWND(wxWindow *win) { - if( gs_htmlHelp ) - { - wxPluginManager::UnloadLibrary( _T("HHCTRL.OCX") ); - gs_libHtmlHelp->UnrefLib(); + if ( !win && wxTheApp ) + win = wxTheApp->GetTopWindow(); - gs_htmlHelp = 0; - } + return win ? GetHwndOf(win) : ::GetDesktopWindow(); } -static HWND GetSuitableHWND() +// wrap the real HtmlHelp() but just return false (and not crash) if it +// couldn't be loaded +// +// it also takes a wxWindow instead of HWND +static bool +CallHtmlHelpFunction(wxWindow *win, const wxChar *str, UINT uint, DWORD dword) { - if (wxTheApp->GetTopWindow()) - return (HWND) wxTheApp->GetTopWindow()->GetHWND(); - else - return GetDesktopWindow(); + HTMLHELP htmlHelp = GetHtmlHelpFunction(); + + return htmlHelp && + htmlHelp(GetSuitableHWND(win), str, uint, dword); } IMPLEMENT_DYNAMIC_CLASS(wxCHMHelpController, wxHelpControllerBase) bool wxCHMHelpController::Initialize(const wxString& filename) { - // warn on failure - if( !LoadHtmlHelpLibrary() ) - return FALSE; + if ( !GetHtmlHelpFunction() ) + return false; m_helpFile = filename; - return TRUE; + return true; } bool wxCHMHelpController::LoadFile(const wxString& file) { if (!file.IsEmpty()) m_helpFile = file; - return TRUE; + return true; } bool wxCHMHelpController::DisplayContents() { - if (m_helpFile.IsEmpty()) return FALSE; + if (m_helpFile.IsEmpty()) + return false; wxString str = GetValidFilename(m_helpFile); - gs_htmlHelp(GetSuitableHWND(), (const wxChar*) str, HH_DISPLAY_TOPIC, 0L); - return TRUE; + return CallHtmlHelpFunction(GetParentWindow(), + str.wx_str(), HH_DISPLAY_TOPIC, 0L); } // Use topic or HTML filename bool wxCHMHelpController::DisplaySection(const wxString& section) { - if (m_helpFile.IsEmpty()) return FALSE; + if (m_helpFile.IsEmpty()) + return false; wxString str = GetValidFilename(m_helpFile); // Is this an HTML file or a keyword? - bool isFilename = (section.Find(wxT(".htm")) != -1); + if ( section.Find(wxT(".htm")) != wxNOT_FOUND ) + { + // interpret as a file name + return CallHtmlHelpFunction(GetParentWindow(), + str.wx_str(), HH_DISPLAY_TOPIC, + wxPtrToUInt(section.c_str())); + } - if (isFilename) - gs_htmlHelp(GetSuitableHWND(), (const wxChar*) str, HH_DISPLAY_TOPIC, (DWORD) (const wxChar*) section); - else - KeywordSearch(section); - return TRUE; + return KeywordSearch(section); } // Use context number bool wxCHMHelpController::DisplaySection(int section) { - if (m_helpFile.IsEmpty()) return FALSE; + if (m_helpFile.IsEmpty()) + return false; wxString str = GetValidFilename(m_helpFile); - gs_htmlHelp(GetSuitableHWND(), (const wxChar*) str, HH_HELP_CONTEXT, (DWORD)section); - return TRUE; + return CallHtmlHelpFunction(GetParentWindow(), + str.wx_str(), HH_HELP_CONTEXT, (DWORD)section); } bool wxCHMHelpController::DisplayContextPopup(int contextId) { - if (m_helpFile.IsEmpty()) return FALSE; + if (m_helpFile.IsEmpty()) return false; wxString str = GetValidFilename(m_helpFile); @@ -225,11 +174,21 @@ bool wxCHMHelpController::DisplayContextPopup(int contextId) popup.pszFont = NULL; popup.pszText = NULL; - gs_htmlHelp(GetSuitableHWND(), (const wxChar*) str, HH_DISPLAY_TEXT_POPUP, (DWORD) & popup); - return TRUE; + return CallHtmlHelpFunction(GetParentWindow(), + str.wx_str(), HH_DISPLAY_TEXT_POPUP, + wxPtrToUInt(&popup)); } -bool wxCHMHelpController::DisplayTextPopup(const wxString& text, const wxPoint& pos) +bool +wxCHMHelpController::DisplayTextPopup(const wxString& text, const wxPoint& pos) +{ + return ShowContextHelpPopup(text, pos, GetParentWindow()); +} + +/* static */ +bool wxCHMHelpController::ShowContextHelpPopup(const wxString& text, + const wxPoint& pos, + wxWindow *window) { HH_POPUP popup; popup.cbStruct = sizeof(popup); @@ -240,10 +199,10 @@ bool wxCHMHelpController::DisplayTextPopup(const wxString& text, const wxPoint& popup.clrBackground = (COLORREF)-1; popup.rcMargins.top = popup.rcMargins.left = popup.rcMargins.right = popup.rcMargins.bottom = -1; popup.pszFont = NULL; - popup.pszText = (const wxChar*) text; + popup.pszText = text.wx_str(); - gs_htmlHelp(GetSuitableHWND(), NULL, HH_DISPLAY_TEXT_POPUP, (DWORD) & popup); - return TRUE; + return CallHtmlHelpFunction(window, NULL, HH_DISPLAY_TEXT_POPUP, + wxPtrToUInt(&popup)); } bool wxCHMHelpController::DisplayBlock(long block) @@ -251,9 +210,11 @@ bool wxCHMHelpController::DisplayBlock(long block) return DisplaySection(block); } -bool wxCHMHelpController::KeywordSearch(const wxString& k) +bool wxCHMHelpController::KeywordSearch(const wxString& k, + wxHelpSearchMode WXUNUSED(mode)) { - if (m_helpFile.IsEmpty()) return FALSE; + if (m_helpFile.IsEmpty()) + return false; wxString str = GetValidFilename(m_helpFile); @@ -267,15 +228,14 @@ bool wxCHMHelpController::KeywordSearch(const wxString& k) link.pszWindow = NULL ; link.fIndexOnFail = TRUE ; - gs_htmlHelp(GetSuitableHWND(), (const wxChar*) str, HH_KEYWORD_LOOKUP, (DWORD)& link); - return TRUE; + return CallHtmlHelpFunction(GetParentWindow(), + str.wx_str(), HH_KEYWORD_LOOKUP, + wxPtrToUInt(&link)); } bool wxCHMHelpController::Quit() { - gs_htmlHelp(GetSuitableHWND(), 0, HH_CLOSE_ALL, 0L); - - return TRUE; + return CallHtmlHelpFunction(GetParentWindow(), NULL, HH_CLOSE_ALL, 0L); } // Append extension if necessary. @@ -294,10 +254,4 @@ wxString wxCHMHelpController::GetValidFilename(const wxString& file) const return fullName; } -wxCHMHelpController::~wxCHMHelpController() -{ - UnloadHtmlHelpLibrary(); -} - #endif // wxUSE_HELP -