%% options copyright owner = Dirk Krause copyright year = 2015-xxxx license = bsd %% header /** @file Dk4WxHelpController.h Help controller class. */ #ifndef DK4CONF_H_INCLUDED #include "dk4conf.h" #endif #ifndef DK4TYPES_H_INCLUDED #include "dk4types.h" #endif #ifndef WX_WXPREC_H_INCLUDED #include #define WX_WXPREC_H_INCLUDED 1 #endif #ifdef __BORLANDC__ #pragma hdrstop #endif #ifndef WX_PRECOMP #ifndef WX_WX_H_INCLUDED #include #define WX_WX_H_INCLUDED 1 #endif #endif #ifndef WX_CONFIG_H_INCLUDED #include #define WX_CONFIG_H_INCLUDED 1 #endif #ifndef WX_FILENAME_H_INCLUDED #include #define WX_FILENAME_H_INCLUDED 1 #endif #ifndef WX_HELP_H_INCLUDED #include #define WX_HELP_H_INCLUDED 1 #endif #ifndef WX_FS_ZIP_H_INCLUDED #include #define WX_FS_ZIP_H_INCLUDED 1 #endif #ifndef WX_THREAD_H_INCLUDED #include #define WX_THREAD_H_INCLUDED 1 #endif #ifndef DK4WXAPPLICATIONHELPER_H_INCLUDED #include "Dk4WxApplicationHelper.h" #endif /** Help controller dealing with both CHM and HTB files. */ class Dk4WxHelpController { protected: /** Synchronized access. */ wxCriticalSection csProtect; #ifdef __WXMSW__ /** Help controller for CHM files used on Windows. */ wxCHMHelpController oHelpController; #else /** Help controller for HTB files used on non-Windows systems. */ wxHtmlHelpController oHelpController; #endif /** Application helper, used for for search. */ Dk4WxApplicationHelper *pAppHelp; /** Short file name of help file. */ dkChar *pdksShortFileName; /** Flag: Contents was already loaded. */ bool bLoaded; /** Flag: Help file was found. */ bool bFileFound; protected: /** Attempt to load the help file. */ void AttemptToLoadFile(void); /** Show error message. */ void ShowErrorMessage(size_t i_title = 0, size_t i_text = 1); public: /** Default constructor. Just set the pointers to NULL. */ Dk4WxHelpController(); /** Destructor. */ ~Dk4WxHelpController(); /** Initialize the controller (keep pointers). @param ahptr Application helper for file search. @param chmName CHM help file name for windows. @param htbName HTB help file name for other systems. @return True on success, false on error. */ bool Initialize( Dk4WxApplicationHelper *ahptr, const dkChar *chmName, const dkChar *htbName ); /** Clean up. */ void Cleanup(void); /** Open help system. */ void DisplayContents(void); /** Open help section specified by name. @param name Section name. */ void DisplaySection(wxString const & name); /** Open a help section specified by number. @param number Section number (context ID). */ void DisplaySection(int number); }; %% module #include "dk4strd.h" #include "dk4strx.h" #include "dk4fs.h" #include "dk4mem.h" #include "dk4mpl.h" #include "Dk4WxHelpController.h" $!trace-include static const wxChar * const dk4wxhc_kw_def[] = { $!string-table macro=wxT Help file not found The file containing online help text was not found on your computer! $!end }; Dk4WxHelpController::Dk4WxHelpController() #ifdef __WXMSW__ #else : oHelpController(wxHF_DEFAULT_STYLE | wxHF_MERGE_BOOKS) #endif { pAppHelp = NULL; pdksShortFileName = NULL; bLoaded = false; bFileFound = false; } Dk4WxHelpController::~Dk4WxHelpController() { dk4mem_release(pdksShortFileName); pAppHelp = NULL; bLoaded = false; bFileFound = false; } bool Dk4WxHelpController::Initialize( Dk4WxApplicationHelper *ahptr, const dkChar *chmName, const dkChar *htbName ) { const dkChar *fn = NULL; bool back = false; #ifdef __WXMSW__ fn = chmName; #else fn = htbName; #endif if ((NULL != ahptr) && (NULL != fn)) { pAppHelp = ahptr; bLoaded = false; bFileFound = false; pdksShortFileName = dk4str_dup(fn, NULL); if (NULL != pdksShortFileName) { back = true; } else { /* ERROR: Memory */ ShowErrorMessage(6, 7); } } else { /* ERROR: Illegal arguments to function */ ShowErrorMessage(6, 8); } return back; } void Dk4WxHelpController::Cleanup(void) { { wxCriticalSectionLocker lock(csProtect); dk4mem_release(pdksShortFileName); pAppHelp = NULL; bLoaded = false; bFileFound = false; } } void Dk4WxHelpController::AttemptToLoadFile(void) { wxChar fnb[DK4_MAX_PATH]; size_t szfnb = DK4_SIZEOF(fnb,wxChar); if (!bLoaded) { bLoaded = true; if ((NULL != pAppHelp) && (NULL != pdksShortFileName)) { if (pAppHelp->FindDataFile(fnb, szfnb, pdksShortFileName)) { bFileFound = true; #ifdef __WXMSW__ oHelpController.Initialize(fnb); #else oHelpController.AddBook(fnb); #endif } } } } void Dk4WxHelpController::ShowErrorMessage(size_t i_title, size_t i_text) { const wxChar *strTitle = NULL; const wxChar *strText = NULL; { wxCriticalSectionLocker lock(csProtect); if (NULL != pAppHelp) { strTitle = pAppHelp->GetBasicString(i_title); strText = pAppHelp->GetBasicString(i_text); } } if (NULL == strTitle) { strTitle = dk4wxhc_kw_def[i_title]; } if (NULL == strText) { strText = dk4wxhc_kw_def[i_text]; } wxMessageBox(strText, strTitle, (wxOK | wxCENTRE | wxICON_ERROR)); } void Dk4WxHelpController::DisplayContents() { bool canOpenHelp = false; { wxCriticalSectionLocker lock(csProtect); AttemptToLoadFile(); if (bLoaded) { if (bFileFound) { canOpenHelp = true; } } } if (canOpenHelp) { oHelpController.DisplayContents(); } else { ShowErrorMessage(); } } void Dk4WxHelpController::DisplaySection(wxString const & name) { bool canOpenHelp = false; { wxCriticalSectionLocker lock(csProtect); AttemptToLoadFile(); if (bLoaded) { if (bFileFound) { canOpenHelp = true; } } } if (canOpenHelp) { oHelpController.DisplaySection(name); } else { ShowErrorMessage(); } } void Dk4WxHelpController::DisplaySection(int number) { bool canOpenHelp = false; { wxCriticalSectionLocker lock(csProtect); AttemptToLoadFile(); if (bLoaded) { if (bFileFound) { canOpenHelp = true; } } } if (canOpenHelp) { oHelpController.DisplaySection(number); } else { ShowErrorMessage(); } }