%% options copyright owner = Dirk Krause copyright year = 2014-xxxx SPDX-License-Identifier: BSD-3-Clause %% header /** Application class, derived from wxApp, one instance per program. */ class DkWxHtbApp : public wxApp { protected: /** Helper object. */ DkWxAppHelper *pHelper; /** Controller fr online help. */ wxHtmlHelpController *helpController; protected: /** Show error message if there is not sufficient memory available. */ void ShowMemoryErrorMessage(void); public: /** Application initialization. @return true on success, false on error. */ virtual bool OnInit(); /** Application shutdown. @return 0 on success, any other value indicates an error. */ virtual int OnExit(); }; /** Declaration as the wxApp object. */ #if wxCHECK_VERSION(3,0,0) wxDECLARE_APP(DkWxHtbApp); #else DECLARE_APP(DkWxHtbApp) #endif %% module #include "dk3conf.h" #include "wxdkhtb.h" $!trace-include /** Localized wxChar texts. */ static wxChar const * wxdkhtb_texts[] = { $!string-table macro=wxT # # 0: Menu "File" # File # # 1: Menu item "File/Exit" # Exit # # 2: Tool tip text for menu item "File/Exit" # Exit the application # # 3: Menu "Help" # Help # # 4: Menu item "Help/About" # About # # 5: Tooltip text for menu item "Help/About" # Show version information # # 6: Menu item "Help/Contents" # Contents # # 7: Tooltip text for menu item "Help/Contents" # Open table of contents # # 8: Initial status text # Ready # # 9: Copyright notice. # Copyright (c) # # 10: Dialog box title "About ..." # About # # 11: This program uses the following libraries # This program uses the following libraries: # # 12: See # See: # # 13: Text for dummy label, can be reused if lDummy removed. # HTB viewer main window # # 14: No help controller created # No help controller was created! # # 15: Error # Error # # 16 # No *.htb file name was specified on the command line! # # 17 # The specified file does not exist! # # 18 # Failed to create help controller, resources/memory problem! $!end }; /** Non-localized wxChar texts. */ static wxChar const * wxdkhtb_nl_wx[] = { $!string-table macro=wxT # # 0: Program name. # wxdkhtb # # 1: Program version. # 1.0.0 # # 2: Copyright owner name. # Dirk Krause # # 3: Software vendor name. # DirkKrause # # 4: Resource name of Windows icon # aaaaa # # 5: Windows chm help file name # wxdkhtb.chm # # 6: non-Windows htb help file name # wxdkhtb.htb # # 7: Space # # # 8: Newline # \n # # 9 10 11 12 13 14 15: List of libraries used. # DK tools, wxWidgets, libpng, libjpeg, libtiff, zlib. http://sourceforge.net/p/dktools/wiki/Home/ http://www.wxwidgets.org http://www.libpng.org/pub/png/libpng.html http://www.ijg.org http://www.remotesensing.org/libtiff http://www.zlib.net # # # Error Not enough memory (RAM)! $!end }; /** Non-localized dkChar texts. */ static dkChar const * wxdkhtb_nl_dk[] = { $!string-table macro=dkT # # 0: Program group name. # dktools # # 1: String table name. # wxdkhtb.str $!end }; /** Implementation of the wxApp functionality. */ #if wxCHECK_VERSION(3,0,0) wxIMPLEMENT_APP(DkWxHtbApp); #else IMPLEMENT_APP(DkWxHtbApp) #endif bool DkWxHtbApp::OnInit() { DkWxHtbFrame *frame = NULL; wxChar const * const *localizedTexts = NULL; wxPNGHandler *phPng = NULL; wxXPMHandler *phXpm = NULL; wxICOHandler *phIco = NULL; wxArchiveFSHandler *phArchFs = NULL; bool back = false; int iStatus = 0; /* 0 No file name 1 File does not exist 2 Not enough memory to create controller 3 Everything ok */ /* Initialize members. */ pHelper = NULL; helpController = NULL; /* Set up helper object. */ pHelper = new DkWxAppHelper( argv[0], wxdkhtb_nl_wx[3], wxdkhtb_nl_dk[0] ); if(!(pHelper)) { ShowMemoryErrorMessage(); goto finished; } if(!(pHelper->checkSetup())) { goto finished; } /* Add image and file system handlers for online help. */ phPng = new wxPNGHandler(); if (NULL != phPng) { wxImage::AddHandler(phPng); } else { ShowMemoryErrorMessage(); goto finished; } /* CLANG STATIC ANALYSIS COMPLAINS ABOUT A POTENTIAL MEMORY LEAK, because phPng is set using the new operator but there is no matching delete. The handler object is deleted from within wxImage destructor, there is no memory leak. */ phXpm = new wxXPMHandler(); if (NULL != phXpm) { wxImage::AddHandler(phXpm); } else { ShowMemoryErrorMessage(); goto finished; } /* CLANG STATIC ANALYSIS COMPLAINS ABOUT A POTENTIAL MEMORY LEAK, because phXpm is set using the new operator but there is no matching delete. The handler object is deleted from within wxImage destructor, there is no memory leak. */ phIco = new wxICOHandler(); if (NULL != phIco) { wxImage::AddHandler(phIco); } else { ShowMemoryErrorMessage(); goto finished; } /* CLANG STATIC ANALYSIS COMPLAINS ABOUT A POTENTIAL MEMORY LEAK, because phIco is set using the new operator but there is no matching delete. The handler object is deleted from within wxImage destructor, there is no memory leak. */ phArchFs = new wxArchiveFSHandler(); if (NULL != phArchFs) { wxFileSystem::AddHandler(phArchFs); } else { ShowMemoryErrorMessage(); goto finished; } /* CLANG STATIC ANALYSIS COMPLAINS ABOUT A POTENTIAL MEMORY LEAK, because phArchFs is set using the new operator but there is no matching delete. The handler object is deleted from within wxFileSystem destructor, there is no memory leak. */ localizedTexts = pHelper->getStringTable(wxdkhtb_texts, wxdkhtb_nl_dk[1]); if(!(localizedTexts)) { localizedTexts = wxdkhtb_texts; } /* Set up online help controller. */ if (1 < argc) { wxString fullPath; wxFileName fn(argv[1]); iStatus = 1; fn.Normalize( wxPATH_NORM_LONG | wxPATH_NORM_DOTS | wxPATH_NORM_TILDE | wxPATH_NORM_ABSOLUTE ); if (fn.FileExists()) { iStatus = 2; fullPath = fn.GetFullPath(); helpController = new wxHtmlHelpController( wxHF_DEFAULT_STYLE | wxHF_MERGE_BOOKS ); if (helpController) { helpController->Initialize(fullPath); iStatus = 3; } } } /* Create and show frame. */ frame = new DkWxHtbFrame( DkWxHtbFrame_MainWindow, pHelper, helpController, argc, argv, localizedTexts, wxdkhtb_nl_wx, wxdkhtb_nl_dk, iStatus ); if(!(frame)) { ShowMemoryErrorMessage(); goto finished; } frame->restorePosition(); frame->Show(); back = true; /* Release resources if initialization failed. */ finished: if(!(back)) { if(helpController) { delete(helpController); helpController = NULL; } if(pHelper) { delete(pHelper); pHelper = NULL; } } return back; } int DkWxHtbApp::OnExit() { int back = 0; /* Release resources. */ if(helpController) { delete(helpController); helpController = NULL; } if(pHelper) { delete(pHelper); pHelper = NULL; } return back; } void DkWxHtbApp::ShowMemoryErrorMessage(void) { const wxChar *s_title = NULL; const wxChar *s_text = NULL; if (NULL != pHelper) { s_title = pHelper->getBasicString(3); s_text = pHelper->getBasicString(9); } if (NULL == s_title) { s_title = wxdkhtb_nl_wx[16]; } if (NULL == s_text) { s_text = wxdkhtb_nl_wx[17]; } wxMessageBox(s_text, s_title, (wxOK | wxCENTRE | wxICON_ERROR)); }