%% options copyright owner = Dirk Krause copyright year = 2011-xxxx SPDX-License-Identifier: BSD-3-Clause %% header /** Application class for dkwxtrace. */ class DkWxTraceApp : public wxApp { protected: /** Helper object. */ DkWxAppHelper *pHelper; /** Help controller. */ DkWxHelpController *helpController; protected: /** Show error message if not sufficient memory available. */ void ShowMemoryErrorMessage(void); public: /** Initialize application. */ virtual bool OnInit(); /** Clean up after running. */ virtual int OnExit(); }; #if wxCHECK_VERSION(3,0,0) wxDECLARE_APP(DkWxTraceApp); #else DECLARE_APP(DkWxTraceApp) #endif %% module #include "dk3conf.h" #include "dkwxtrace.h" $!trace-include /** Implementation of DkWxTraceApp. */ #if wxCHECK_VERSION(3,0,0) wxIMPLEMENT_APP(DkWxTraceApp); #else IMPLEMENT_APP(DkWxTraceApp) #endif /** Default texts, replace by localized texts if available. */ wxChar const * const defaultTexts[] = { $!string-table macro=wxT # # 0: Program name # wxdkct # # 1: Application group name # dktools # # 2: Software vendor name # Dirk Krause # # 3: Menu: File # &File # # 4: Menu: Help # &Help # # 5: Menu: File / Exit # E&xit Alt-X # # 6: Menu: Help / About # &About... Alt-A # # 7: Tip text for menu entry File / Exit # Exit the program # # 8: Tip text for menu entry Help / About # Show version information # # 9: Menu Help / Contents # &Contents F1 # # 10: Menu tool tip: Show online help contents # Show online help contents # # 11: Label text: Directory # Directory: # # 12: Menu text: Choose Directory # &Directory Alt-D # # 13: Menu tool tip: Choose source directory # Choose source directory # # 14: Menu text: Setup # &Setup Alt-S # # 15: Menu tool tip: Set conversion options # Set conversion options # # 16 Label text: yes, to stdout # yes, to stdout # # 17: Toolbar button text: Directory # Directory # # 18: Toolbar button text: Options # Options # # 19: Toolbar button text: Run # Run # # 20: Toolbar button text: Exit # Exit # # 21: Toolbar button tooltip: Choose directory # Choose directory # # 22: Toolbar button tooltip: Set options. # Set options # # 23: Toolbar button tooltip: Run conversion # Run conversion # # 24: Toolbar button tooltip: Exit the application # Exit the application # # 25: Current directory. # . # # 26: Button text: OK # OK # # 27: Button text: Cancel # Cancel # # 28: Button tool tip for OK button. # Close dialog and apply settings # # 29: Button tool tip for cancel button. # Close dialog and discard settings # # 30: Dialog title: Options # Options # # 31: Checkbox label: Use make mode # Use make mode # # 32: Checkbox tool tip: Run conversions only if necessary. # Run conversions only if necessary. # # 33: Static box title: General options # General options # # 34: Static box title: Output # Output # # 35: Checkbox label: Line numbers # Line numbers # # 36: Static box title: Debug # Debug # # 37: Checkbox label: Create debug output # Create debug output # # 38: Checkbox label: Debug to standard output # Debug to standard output # # 39: Checkbox label: Include timestamp # Include timestamp # # 40: Checkbox label: Use trace keyword # Use "trace" keyword # # 41: Checkbox label: Wide character support # Wide-character support # # 42: Checkbox tool tip: Create line number directives # Create line number directives # # 43: Checkbox tool tip: Generate code for debug messages # Generate code for trace/debug messages # # 44: Checkbox tool tip: Write trace/debug messages to standard output # Write trace/debug messages to standard output # # 45: Checkbox tool tip: Include a timestamp into debug messages # Include a timestamp into trace/debug messages # # 46: Checkbox tool tip: Include "trace" keyword into debug messages # Include the "trace" keyword into debug messages # # 47: Checkbox tool tip: Add support for TRACE_WIDE # Add support for TRACE_WIDE (debug messages in wide characters) # # 48: Dialog title: Conversion progress # Conversion progress # # 49: File name (empty string) # # # 50: Button text: Cancel # Cancel # # 51: Button tool tip: Abort conversion after finishing current file # Abort conversion after finishing current file # # 52: Notification text: Cancel command scheduled... Wait, please! # Cancel command scheduled... Wait, please! # # 53: Directory dialog title: Choose directory # Choose directory # # 54: Message text: Directory: # Directory: # # 55: Message text: Destination files up to date. # Destination files up to date. # # 56: Message text: Processing succeeded. # Processing succeeded. # # 57: Message text:Processing failed! # Processing failed! # # 58: Error: Can not handle directory name! # ERROR: Can not handle directory name! # # 59/60: Error: Failed to open directory "..."! # ERROR: Failed to open directory " "! # # 61/62: Error: File name is not plain ASCII text: "..."! # ERROR: File name is not plain ASCII text: " "! # # 63: Error: Not enough memory! # ERROR: Not enough memory (RAM/swap space)! # # 64: Menu item: Run # &Run Alt-R # # 65: Menut tool tip: Start conversion # Start conversion # # 66: About dialog box title. # About wxdkct # # 67: Empty text (initial status text). # # # 68: Run result: Processing succeeded # Processing succeeded # # 69: Run result: Warnings occured # Warnings occured # # 70: Run result: Errors occured # Errors occured # # 71: ERROR: Automatic run cancelled due to errors. # Automatic run cancelled due to errors! # # 72: Autorun result: Processing succeeded, application will exit. # Processing succeeded, application will exit. # # 73: Newline # \n # # 74: This program uses libraries from the following projects: # This program uses libraries from the following projects:\n # # 75: See # See:\n # # 76-93: Special character candidates for splint. # @ ^ ° ! " § $ % & ? ~ \# | , ; . : _ # # 94-95: Comments for splint # Comments for splint Write comments for splint # # 96: Choose comment character for splint # Choose the comment character for splint # # 97 98 Check box: Portable debug code and tool tip # Portable debug code Produce portable code for trace messages $!end }; /** Constant texts, not localized. */ static wxChar const * const wxdkct_nl_wx[] = { $!string-table macro=wxT Error Not enough memory (RAM)! $!end }; /** Application group name. */ static dkChar const dkwxtraceapp_groupname[] = { dkT("dktools") }; /** String table file name. */ static dkChar const dkwxtrace_string_table_name[] = { dkT("wxdkct.str") }; /** Help file for use on Windows systems. */ static wxChar const dkwxtrace_chm_helpfile[] = { wxT("wxdkct.chm") }; /** Help file for use on non-Windows systems. */ static wxChar const dkwxtrace_htb_helpfile[] = { wxT("wxdkct.htb") }; bool DkWxTraceApp::OnInit() { bool back = false; wxChar const * const *localizedTexts = defaultTexts; dkChar const * const *msg = NULL; DkWxTraceFrame *frame = NULL; wxPNGHandler *phPng = NULL; wxXPMHandler *phXpm = NULL; wxICOHandler *phIco = NULL; wxArchiveFSHandler *phArchFs = NULL; /* Initialize elements. */ pHelper = NULL; helpController = NULL; /* Create application helper. */ pHelper = new DkWxAppHelper(argv[0], defaultTexts[2], dkwxtraceapp_groupname); if (NULL == pHelper) { ShowMemoryErrorMessage(); goto finished; } if (!(pHelper->checkSetup())) { goto finished; } /* Get message texts. */ msg = dk3app_messages( pHelper->getApp(), dkct_str_get_string_table_file_name(), (dkChar const **)dkct_str_get_message_texts() ); if (NULL == msg) { ShowMemoryErrorMessage(); goto finished; } localizedTexts = pHelper->getStringTable(defaultTexts, dkwxtrace_string_table_name); if (NULL == localizedTexts) { ShowMemoryErrorMessage(); goto finished; } /* Initialize image handlers and zip fs handler. */ 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. */ /* Get help controller. */ helpController = new DkWxHelpController(pHelper,dkwxtrace_chm_helpfile,dkwxtrace_htb_helpfile); if (NULL == helpController) { ShowMemoryErrorMessage(); goto finished; } /* Create main frame. */ frame = new DkWxTraceFrame( defaultTexts[0], localizedTexts, msg, pHelper, DkWxTrace_MainWindow, helpController, argc, argv ); if (NULL == frame) { ShowMemoryErrorMessage(); goto finished; } /* Show frame and indicate success. */ frame->restorePosition(); frame->Show(); back = true; /* Clean up on errors. */ finished: if (!(back)) { if (NULL != helpController) { delete(helpController); helpController = NULL; } if (NULL != pHelper) { delete(pHelper); pHelper = NULL; } } return back; } int DkWxTraceApp::OnExit() { int back = 0; /* Release elements. */ if(helpController) { delete(helpController); helpController = NULL; } if(pHelper) { delete(pHelper); pHelper = NULL; } return back; } void DkWxTraceApp::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 = wxdkct_nl_wx[0]; } if (NULL == s_text) { s_text = wxdkct_nl_wx[1]; } wxMessageBox(s_text, s_title, (wxOK | wxCENTRE | wxICON_ERROR)); }