%% options copyright owner = Dirk Krause copyright year = 2013-xxxx SPDX-License-Identifier: BSD-3-Clause %% header /** Application class, derived from wxApp, one instance per program. */ class DkClockApp : public wxApp { protected: /** Helper object. */ DkWxAppHelper *pHelper; /** Controller fr online help. */ DkWxHelpController *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(DkClockApp); #else DECLARE_APP(DkClockApp) #endif %% module #include "dk3conf.h" #include "wxdkclock.h" $!trace-include /** Localized wxChar texts. */ static wxChar const * wxdkclock_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: Check box in options dialog # Alert # # 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: __CHANGE__ 015: Text for dummy label, can be reused if lDummy removed. # Options # # 14 15: Menu item: Options # Alert Enable/disable alert, set alert time # # 16: Dialog box title # Options # # 17 18: OK button # OK Apply settings and close dialog box. # # 19 20: Cancel button # Cancel Close dialog box and discard settings # # 21: Minute # Minute: # # 22: Hour # Hour: # # 23: Tool tip "Enable or disable alert" # Enable or disable alert # # 24 25: Tool tips Choose alert time. # Choose alert time (hour) Choose alert time (minute) # # 26 27: Task bar icon popup menu entries # Restore window Exit application # # 28 29 Menu item: Hide # Hide Hide main window # # 30 Menu: Colour # Colour # # 31 32 Menu item: Normal state # Normal Clock colour in normal state # # 33 34 Menu item: Alert state # Alert Clock colour in alert state $!end }; /** Non-localized wxChar texts. */ static wxChar const * wxdkclock_nl_wx[] = { $!string-table macro=wxT # # 0: Program name. # WxDkClock # # 1: Program version. # 3.0.6 # # 2: Copyright owner name. # Dirk Krause # # 3: Software vendor name. # DKrause # # 4: Resource name of Windows icon # aaaaa # # 5: Windows chm help file name # wxdkclock.chm # # 6: non-Windows htb help file name # wxdkclock.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 # # 16 17 # Error Not enough memory (RAM)! $!end }; /** Non-localized dkChar texts. */ static dkChar const * wxdkclock_nl_dk[] = { $!string-table macro=dkT # # 0: Program group name. # dktools # # 1: String table name. # wxdkclock.str $!end }; /** Implementation of the wxApp functionality. */ #if wxCHECK_VERSION(3,0,0) wxIMPLEMENT_APP(DkClockApp); #else IMPLEMENT_APP(DkClockApp) #endif bool DkClockApp::OnInit() { DkClockFrame *frame = NULL; wxChar const * const *localizedTexts = NULL; wxPNGHandler *phPng = NULL; wxXPMHandler *phXpm = NULL; wxICOHandler *phIco = NULL; wxArchiveFSHandler *phArchiveFs = NULL; bool back = false; #if USE_WXAPP_ONINIT if(wxApp::OnInit()) { #endif $!trace-init wxdkclock.deb $? "+ DkClockApp::OnInit" /* Initialize members. */ pHelper = NULL; helpController = NULL; /* Set up helper object. */ pHelper = new DkWxAppHelper( argv[0], wxdkclock_nl_wx[3], wxdkclock_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. */ phArchiveFs = new wxArchiveFSHandler(); if (NULL != phArchiveFs) { wxFileSystem::AddHandler(phArchiveFs); } else { ShowMemoryErrorMessage(); goto finished; } /* CLANG STATIC ANALYSIS COMPLAINS ABOUT A POTENTIAL MEMORY LEAK, because phArchiveFs 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( wxdkclock_texts, wxdkclock_nl_dk[1] ); if(!(localizedTexts)) { localizedTexts = wxdkclock_texts; } /* Set up online help controller. */ helpController = new DkWxHelpController( pHelper, wxdkclock_nl_wx[5], wxdkclock_nl_wx[6] ); if(!(helpController)) { ShowMemoryErrorMessage(); goto finished; } /* Create and show frame. */ frame = new DkClockFrame( DkClockFrame_MainWindow, pHelper, helpController, argc, argv, localizedTexts, wxdkclock_nl_wx, wxdkclock_nl_dk ); 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; } } $? "- DkClockApp::OnInit %d", ((back) ? 1 : 0) #if USE_WXAPP_ONINIT } #endif return back; } int DkClockApp::OnExit() { int back = 0; $? "+ DkClockApp::OnExit" /* Release resources. */ if(helpController) { delete(helpController); helpController = NULL; } if(pHelper) { delete(pHelper); pHelper = NULL; } $? "- DkClockApp::OnExit %d", back $!trace-end return back; } void DkClockApp::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 = wxdkclock_nl_wx[16]; } if (NULL == s_text) { s_text = wxdkclock_nl_wx[17]; } wxMessageBox(s_text, s_title, (wxOK | wxCENTRE | wxICON_ERROR)); }