X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/5100cabffa34c38db26884577113d01f21cda446..88a01064f05bea04682cfde8d82b110d4c80299b:/src/msw/helpchm.cpp diff --git a/src/msw/helpchm.cpp b/src/msw/helpchm.cpp index 71356d4f6f..2d964b0011 100644 --- a/src/msw/helpchm.cpp +++ b/src/msw/helpchm.cpp @@ -1,49 +1,91 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: helpchm.cpp +// Name: src/msw/helpchm.cpp // Purpose: Help system: MS HTML Help implementation // Author: Julian Smart // Modified by: // 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" -// This is found in the HTML Help Workshop installation, -// along with htmlhelp.lib. -#include +#include "wx/dynload.h" -#include +#ifndef WX_PRECOMP + #include "wx/intl.h" + #include "wx/app.h" +#endif -#ifdef __WXMSW__ #include "wx/msw/private.h" +#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 wxT("HtmlHelpA") +#else // ANSI + typedef HWND ( WINAPI * HTMLHELP )( HWND, LPCWSTR, UINT, DWORD ); + #define HTMLHELP_NAME wxT("HtmlHelpW") #endif -#include +// dll symbol handle +static HTMLHELP gs_htmlHelp = 0; + +static bool LoadHtmlHelpLibrary() +{ + wxPluginLibrary *lib = wxPluginManager::LoadLibrary( _T("HHCTRL.OCX"), wxDL_DEFAULT | wxDL_VERBATIM ); + + if( !lib ) + { + 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_htmlHelp = (HTMLHELP)lib->GetSymbol( HTMLHELP_NAME ); + + if( !gs_htmlHelp ) + { + wxLogError(_("Failed to initialize MS HTML Help.")); -static HWND GetSuitableHWND() + lib->UnrefLib(); + return false ; + } + } + + return true; +} + +static void UnloadHtmlHelpLibrary() +{ + if ( gs_htmlHelp ) + { + if (wxPluginManager::UnloadLibrary( _T("HHCTRL.OCX") )) + gs_htmlHelp = 0; + } +} + +static HWND GetSuitableHWND(wxCHMHelpController* controller) { - if (wxTheApp->GetTopWindow()) + if (controller->GetParentWindow()) + return (HWND) controller->GetParentWindow()->GetHWND(); + else if (wxTheApp->GetTopWindow()) return (HWND) wxTheApp->GetTopWindow()->GetHWND(); else return GetDesktopWindow(); @@ -53,77 +95,82 @@ IMPLEMENT_DYNAMIC_CLASS(wxCHMHelpController, wxHelpControllerBase) bool wxCHMHelpController::Initialize(const wxString& filename) { + // warn on failure + if( !LoadHtmlHelpLibrary() ) + 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); - HtmlHelp(GetSuitableHWND(), (const wxChar*) str, HH_HELP_FINDER, 0L); - return TRUE; + gs_htmlHelp(GetSuitableHWND(this), (const wxChar*) str, HH_DISPLAY_TOPIC, 0L); + return true; } // 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); + bool isFilename = (section.Find(wxT(".htm")) != wxNOT_FOUND); if (isFilename) - HtmlHelp(GetSuitableHWND(), (const wxChar*) str, HH_DISPLAY_TOPIC, (DWORD) (const wxChar*) section); + gs_htmlHelp(GetSuitableHWND(this), (const wxChar*) str, HH_DISPLAY_TOPIC, (DWORD) (const wxChar*) section); else KeywordSearch(section); - return TRUE; + return true; } // 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); - HtmlHelp(GetSuitableHWND(), (const wxChar*) str, HH_HELP_CONTEXT, (DWORD)section); - return TRUE; + gs_htmlHelp(GetSuitableHWND(this), (const wxChar*) str, HH_HELP_CONTEXT, (DWORD)section); + return true; } bool wxCHMHelpController::DisplayContextPopup(int contextId) { - if (m_helpFile.IsEmpty()) return FALSE; + if (m_helpFile.IsEmpty()) return false; wxString str = GetValidFilename(m_helpFile); - // TODO: what should this be? - //HtmlHelp(GetSuitableHWND(), (const wxChar*) str, HH_HELP_CONTEXT, (DWORD)contextId); + // 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 = -1; - popup.clrBackground = -1; + 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 = NULL; - HtmlHelp(GetSuitableHWND(), (const wxChar*) str, HH_DISPLAY_TEXT_POPUP, (DWORD) & popup); - return TRUE; + gs_htmlHelp(GetSuitableHWND(this), (const wxChar*) str, HH_DISPLAY_TEXT_POPUP, (DWORD) & popup); + return true; } bool wxCHMHelpController::DisplayTextPopup(const wxString& text, const wxPoint& pos) @@ -133,14 +180,14 @@ bool wxCHMHelpController::DisplayTextPopup(const wxString& text, const wxPoint& popup.hinst = (HINSTANCE) wxGetInstance(); popup.idString = 0 ; popup.pt.x = pos.x; popup.pt.y = pos.y; - popup.clrForeground = -1; - popup.clrBackground = -1; + 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; - HtmlHelp(GetSuitableHWND(), NULL, HH_DISPLAY_TEXT_POPUP, (DWORD) & popup); - return TRUE; + gs_htmlHelp(GetSuitableHWND(this), NULL, HH_DISPLAY_TEXT_POPUP, (DWORD) & popup); + return true; } bool wxCHMHelpController::DisplayBlock(long block) @@ -148,9 +195,10 @@ 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); @@ -164,14 +212,15 @@ bool wxCHMHelpController::KeywordSearch(const wxString& k) link.pszWindow = NULL ; link.fIndexOnFail = TRUE ; - HtmlHelp(GetSuitableHWND(), (const wxChar*) str, HH_KEYWORD_LOOKUP, (DWORD)& link); - return TRUE; + gs_htmlHelp(GetSuitableHWND(this), (const wxChar*) str, HH_KEYWORD_LOOKUP, (DWORD)& link); + return true; } bool wxCHMHelpController::Quit() { - HtmlHelp(GetSuitableHWND(), 0, HH_CLOSE_ALL, 0L); - return TRUE; + gs_htmlHelp(GetSuitableHWND(this), 0, HH_CLOSE_ALL, 0L); + + return true; } // Append extension if necessary. @@ -190,4 +239,9 @@ wxString wxCHMHelpController::GetValidFilename(const wxString& file) const return fullName; } +wxCHMHelpController::~wxCHMHelpController() +{ + UnloadHtmlHelpLibrary(); +} + #endif // wxUSE_HELP