X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/0316942268a5004c3d639fa1cd7df4ea42257dbd..94d0d21a15fa73ac426480d195d16ee04caf2de8:/src/msw/helpchm.cpp diff --git a/src/msw/helpchm.cpp b/src/msw/helpchm.cpp index c7090d0877..c991d47a3c 100644 --- a/src/msw/helpchm.cpp +++ b/src/msw/helpchm.cpp @@ -1,216 +1,190 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: helpchm.cpp +// Name: src/msw/helpchm.cpp // Purpose: Help system: MS HTML Help implementation // Author: Julian Smart -// Modified by: +// Modified by: Vadim Zeitlin at 2008-03-01: refactoring, simplification // Created: 16/04/2000 // RCS-ID: $Id$ // Copyright: (c) Julian Smart -// Licence: wxWindows licence +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#ifdef __GNUG__ -#pragma implementation "helpchm.h" -#endif - // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" #ifdef __BORLANDC__ -#pragma hdrstop + #pragma hdrstop #endif -#ifndef WX_PRECOMP -#include "wx/defs.h" -#endif +#if wxUSE_HELP && wxUSE_MS_HTML_HELP #include "wx/filefn.h" - -#if wxUSE_HELP && wxUSE_MS_HTML_HELP && defined(__WIN95__) #include "wx/msw/helpchm.h" -#include "wx/dynlib.h" +#include "wx/dynload.h" #ifndef WX_PRECOMP -#include + #include "wx/intl.h" + #include "wx/app.h" #endif -// This is found in the HTML Help Workshop installation, -// along with htmlhelp.lib. -#include - -#include - -#ifdef __WXMSW__ #include "wx/msw/private.h" -#endif - -#include +#include "wx/msw/htmlhelp.h" +// ---------------------------------------------------------------------------- // utility functions to manage the loading/unloading // of hhctrl.ocx +// ---------------------------------------------------------------------------- + #ifndef UNICODE -typedef HWND ( WINAPI * HTMLHELP )( HWND, LPCSTR, UINT, DWORD ); -#define HTMLHELP_NAME "HtmlHelpA" -#else -typedef HWND ( WINAPI * HTMLHELP )( HWND, LPCWSTR, UINT, DWORD ); -#define HTMLHELP_NAME "HtmlHelpW" + typedef HWND ( WINAPI * HTMLHELP )( HWND, LPCSTR, UINT, DWORD ); + #define HTMLHELP_NAME wxT("HtmlHelpA") +#else // ANSI + typedef HWND ( WINAPI * HTMLHELP )( HWND, LPCWSTR, UINT, DWORD ); + #define HTMLHELP_NAME wxT("HtmlHelpW") #endif -// dll handle/reference count -static HTMLHELP gs_htmlHelp = 0; -static wxDllType gs_dllHandle = 0; -static int gs_dllCount = 0; -static bool LoadHtmlHelpLibrary() +HTMLHELP GetHtmlHelpFunction() { - if( !gs_dllCount ) + static HTMLHELP s_htmlHelp = NULL; + + if ( !s_htmlHelp ) { - gs_dllHandle = wxDllLoader::LoadLibrary( "hhctrl.ocx" ); - if( !gs_dllHandle ) + static wxDynamicLibrary s_dllHtmlHelp(_T("HHCTRL.OCX"), wxDL_VERBATIM); + + if ( !s_dllHtmlHelp.IsLoaded() ) { 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 { - gs_dllCount = 1; - gs_htmlHelp = (HTMLHELP)wxDllLoader::GetSymbol( gs_dllHandle, HTMLHELP_NAME ); - - if( !gs_htmlHelp ) + s_htmlHelp = (HTMLHELP)s_dllHtmlHelp.GetSymbol(HTMLHELP_NAME); + if ( !s_htmlHelp ) { wxLogError(_("Failed to initialize MS HTML Help.")); - - wxDllLoader::UnloadLibrary(gs_dllHandle); - gs_dllHandle = 0; - gs_dllCount = 0; - - return FALSE ; } } } - else - { - ++gs_dllCount; - } - 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_dllCount != 0 && !--gs_dllCount ) - { - wxDllLoader::UnloadLibrary( gs_dllHandle ); - gs_dllHandle = 0; - gs_htmlHelp = 0; - } -} + if ( !win && wxTheApp ) + win = wxTheApp->GetTopWindow(); -static HWND GetSuitableHWND() -{ - if (wxTheApp->GetTopWindow()) - return (HWND) wxTheApp->GetTopWindow()->GetHWND(); - else - return GetDesktopWindow(); + return win ? GetHwndOf(win) : ::GetDesktopWindow(); } + 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() +/* static */ bool +wxCHMHelpController::CallHtmlHelp(wxWindow *win, + const wxChar *str, + unsigned cmd, + WXWPARAM param) { - if (m_helpFile.IsEmpty()) return FALSE; + HTMLHELP htmlHelp = GetHtmlHelpFunction(); + + return htmlHelp && htmlHelp(GetSuitableHWND(win), str, cmd, param); +} - wxString str = GetValidFilename(m_helpFile); +bool wxCHMHelpController::DisplayContents() +{ + if (m_helpFile.IsEmpty()) + return false; - gs_htmlHelp(GetSuitableHWND(), (const wxChar*) str, HH_HELP_FINDER, 0L); - return TRUE; + return CallHtmlHelp(HH_DISPLAY_TOPIC); } // Use topic or HTML filename bool wxCHMHelpController::DisplaySection(const wxString& section) { - if (m_helpFile.IsEmpty()) return FALSE; - - wxString str = GetValidFilename(m_helpFile); + if (m_helpFile.IsEmpty()) + return false; // 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 CallHtmlHelp(HH_DISPLAY_TOPIC, section.wx_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 CallHtmlHelp(HH_HELP_CONTEXT, section); } -bool wxCHMHelpController::DisplayContextPopup(int contextId) +/* static */ +bool +wxCHMHelpController::DoDisplayTextPopup(const wxChar *text, + const wxPoint& pos, + int contextId, + wxWindow *window) { - if (m_helpFile.IsEmpty()) return FALSE; - - wxString str = GetValidFilename(m_helpFile); - - // We also have to specify the popups file (default is cshelp.txt). - // str += wxT("::/cshelp.txt"); - HH_POPUP popup; popup.cbStruct = sizeof(popup); popup.hinst = (HINSTANCE) wxGetInstance(); - popup.idString = contextId ; - - GetCursorPos(& popup.pt); - popup.clrForeground = (COLORREF)-1; + popup.idString = contextId; + popup.pszText = text; + popup.pt.x = pos.x; + popup.pt.y = pos.y; + popup.clrForeground = popup.clrBackground = (COLORREF)-1; - popup.rcMargins.top = popup.rcMargins.left = popup.rcMargins.right = popup.rcMargins.bottom = -1; + popup.rcMargins.top = + popup.rcMargins.left = + popup.rcMargins.right = + popup.rcMargins.bottom = -1; popup.pszFont = NULL; - popup.pszText = NULL; - gs_htmlHelp(GetSuitableHWND(), (const wxChar*) str, HH_DISPLAY_TEXT_POPUP, (DWORD) & popup); - return TRUE; + return CallHtmlHelp(window, NULL, HH_DISPLAY_TEXT_POPUP, &popup); } -bool wxCHMHelpController::DisplayTextPopup(const wxString& text, const wxPoint& pos) +bool wxCHMHelpController::DisplayContextPopup(int contextId) { - HH_POPUP popup; - popup.cbStruct = sizeof(popup); - popup.hinst = (HINSTANCE) wxGetInstance(); - popup.idString = 0 ; - popup.pt.x = pos.x; popup.pt.y = pos.y; - popup.clrForeground = (COLORREF)-1; - 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; + return DoDisplayTextPopup(NULL, wxGetMousePosition(), contextId, + GetParentWindow()); +} - gs_htmlHelp(GetSuitableHWND(), NULL, HH_DISPLAY_TEXT_POPUP, (DWORD) & popup); - return TRUE; +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) +{ + return DoDisplayTextPopup(text.wx_str(), pos, 0, window); } bool wxCHMHelpController::DisplayBlock(long block) @@ -218,39 +192,34 @@ 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; - - wxString str = GetValidFilename(m_helpFile); + if (m_helpFile.IsEmpty()) + return false; HH_AKLINK link; - link.cbStruct = sizeof(HH_AKLINK) ; - link.fReserved = FALSE ; - link.pszKeywords = k.c_str() ; - link.pszUrl = NULL ; - link.pszMsgText = NULL ; - link.pszMsgTitle = NULL ; - link.pszWindow = NULL ; - link.fIndexOnFail = TRUE ; - - gs_htmlHelp(GetSuitableHWND(), (const wxChar*) str, HH_KEYWORD_LOOKUP, (DWORD)& link); - return TRUE; + link.cbStruct = sizeof(HH_AKLINK); + link.fReserved = FALSE; + link.pszKeywords = k.wx_str(); + link.pszUrl = NULL; + link.pszMsgText = NULL; + link.pszMsgTitle = NULL; + link.pszWindow = NULL; + link.fIndexOnFail = TRUE; + + return CallHtmlHelp(HH_KEYWORD_LOOKUP, &link); } bool wxCHMHelpController::Quit() { - gs_htmlHelp(GetSuitableHWND(), 0, HH_CLOSE_ALL, 0L); - UnloadHtmlHelpLibrary(); - - return TRUE; + return CallHtmlHelp(NULL, NULL, HH_CLOSE_ALL); } -// Append extension if necessary. -wxString wxCHMHelpController::GetValidFilename(const wxString& file) const +wxString wxCHMHelpController::GetValidFilename() const { wxString path, name, ext; - wxSplitPath(file, & path, & name, & ext); + wxSplitPath(m_helpFile, &path, &name, &ext); wxString fullName; if (path.IsEmpty())