//********************************************************************************
//* FileMangler - Version History                                                *
//*                                                                              *
//* Author  : Mahlon R. Smith                                                    *
//*           Copyright (c) 2005-2025 Mahlon R. Smith, The Software Samurai      *
//*               CSS definitions, source code, libraries and binaries           *
//*                 released under GNU GPL version 3.                            *
//*               Documentation released under GNU FDL version 1.3               *
//* Date    : 25-Jul-2025                                                        *
//*                                                                              *
//*  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -   *
//* Copyright Notice:                                                            *
//* This program is free software: you can redistribute it and/or modify it      *
//* under the terms of the GNU General Public License as published by the Free   *
//* Software Foundation, either version 3 of the License, or (at your option)    *
//* any later version.                                                           *
//*                                                                              *
//* This program is distributed in the hope that it will be useful, but          *
//* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY   *
//* or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License     *
//* for more details.                                                            *
//*                                                                              *
//* You should have received a copy of the GNU General Public License along      *
//* with this program.  If not, see <http://www.gnu.org/licenses/>.              *
//*                                                                              *
//*  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -   *
//* Description:                                                                 *
//* Please see the description of package components in the 'README' file        *
//*                                                                              *
//********************************************************************************

Version History (most recent first):
- - - - - - - - - - - - - - - - - -
v: 0.00.40 02-Apr-2025
  -- Update references to character/byte counts based upon updates to the 
     gString-class definitions v:0.0.37. This was done because the gString 
     class buffers can now be expanded beyond the range of 16-bit indices.
  -- Simplify the rKey class definition by removing a patch for an error 
     in an older version of the C standard library which couldn't handle 
     non-ASCII text in a shared-memory space.
  -- Remove some temporary debugging code and screenshot captures.
     No change in functionality.
  -- Bug Fix: In the NcDialog API, whenever a dialog or sub-dialog was 
     closed, the connection with the clipboard was lost. This was not a 
     problem with FileMangler itself, but a bug in the underlying NcDialog 
     code (v:0.0.37). Beginning with the NcDialog API, v:0.0.38, 
     disconnecting the application from the system clipboard is no longer 
     embedded within the NcDialog destructor, so the clipboard connection, 
     once established, remains active until explicity terminated.
  -- Update the sort algorithm for the find-files dialog. When display of 
     timestamp is active, the list is sorted by timestamp. See ffSortRecords.
  -- For display of '.eml' files, speed up the decoding.
  -- Increase threshold value for enabling the operation progress monitor 
     thread. In 2005, we set this to 5MB because the hardware of the time 
     started to seem unbearably slow at that size. Hardware is somewhat 
     faster in 2025, so the threshold has been increased to 20MB.
  -- Update the Tree-view Mode dialog and enhance scan of the directory tree 
     for both speed and more robust operation.
     -- A recursive scan from the root directory while in Tree-view Mode is 
        an exceptionally slow operation, which violates the spirit of the 
        Tree-view Mode's quick traversal of the directory tree; therefore 
        recursive scans from the root directory while in Tree-view mode have 
        been disabled. For File-view mode, enabling a recursive scan from root 
        directory is still available as an option in the "View" menu.
     -- A scan of "/proc" directory is now handled as a special case (see below).
  -- When allocating arrays of tnFName and TreeNode objects, allocate a 
     few extra records to the array. This was done to increase robustness 
     in the case where a new file or directory may be created _during_
     the scan of the directory tree.
     -- Handle the scan of the "/proc" directory as a special case.
        System processes create temporary files in this directory, so the 
        contents of the directory change rapidly.
  -- The widgets Pinwheel and Progbar were both originally developed 
     within the FileMangler application; however, since they are now stable, 
     they have been integrated into the NcDialog API library. 
     For this reason, the three source files Progbar.hpp, Progbar.cpp and 
     Pinwheel.hpp are no longer distributed as part of this package.
     Instead, they are copied from the NcDialog API source during the 
     build. See 'Makefile', specifically, '.PHONY: refreshlib' which 
     performs the fetch of the needed NcDialog API source files.
  -- For best results, upgrade the NcDialog API library (by the same author) 
     to version 0.0.38 or higher. Also upgrade the underlying 'ncurses' 
     development platform to v:6.2.20200212 or higher; v:6.5.20240629 recommended, 
     or v:6.5.20250125 if your OS supports it (e.g. Fedora 42).
  -- Documentation update.
  -- Posted to website 29-Jul-2025.

v: 0.00.39 01-Aug-2020
  -- Bug Fix: In FMgr class, for methods which allow the user to directly 
     set the target file's timestamp, the C library function occasionally 
     assumes the wrong timezone which caused the timestamp to be off in 
     the next/previous timezone.
  -- Bug Fix: In Dual-window Mode, when a filesystem is unmounted, be sure 
     that the window synch-lock is disengaged.
  -- Bug Fix: When exiting TreeView mode to the root directory, disable 
     the full-scan flag ('autoRecurse'). This causes the scan to read only 
     the top level of the root directory.
  -- When viewing contents of files, include "backup" copies of HTML files 
     (Example: Ratburger.html~) to be passed through the ANSI color filter.
  -- Bug Fix: When viewing the contents of HTML markup, the ANSI color 
     filter was not always handling HTML comments correctly. Valid HTML 
     markup within the comment was being processed as command tokens rather 
     than as comment data. Example: <!-- <h2>Howdy!</h2> -->"
  -- Add Windows(tm) bitmap files (".bmp") to the list of files handled 
     automatically by the 'open file' context menu.
  -- Add support for ".eml" email files in the ViewFileContents() method.
     This is not a sophisticated algorithm. It handles modern 
     MIME-compliant formats, but support for older email formats is 
     simplistic at best.
  -- Add support for reading and display of ".wma" audio and ".wmv" video 
     metadata.
     -- WMA/WMV streams are encapsulated within an "Advanced System Format" 
        (ASF) container object.
     -- Please note that WMA/WMV and ASF are proprietary Windows(tm) 
        standards (which are publicly documented). The current implementation 
        violates neither their f-ing patents nor their f-ing copyright.
  -- Bug Fix: When converting UTF-16 to UTF-8, if source value was two(2) 
     16-bit words, the upper-range-check value was incorrect. This error 
     (potentially) affected decoding of metadata from MP3 audio files.
     See id3v2_framehdr class, utf16Conv() method.
  -- In View File Contents dialog, add support for viewing metadata for 
     for WMA audio files.
  -- In View File Contents dialog, when user attempts to view the contents 
     of a binary file as if it were plain text, automatically set view to 
     'ASCII-hex-byte' format.
  -- In the View-File-Contents dialog, enable 'strict' test for Perl source 
     files. In earlier releases, we identified Perl source only by filename 
     extension; however, Perl mavens often omit the filename extension, so we 
     also test for the shebang and Perl invocation. Example: "#!/usr/bin/perl"
  -- In ViewFileContents(), add support for viewing Microsoft Word(tm) 
     1997, 2000, 2002, 2003, 2007 documents. These are the obsolete Word 
     binary file formats used before OpenXML(tm) was implemented.
     Decoding the text of these documents is experimental, and shortcuts 
     were taken rather than fully implementing the binary decoding 
     algorithm; however, this simple implementation works well for all 
     sample documents submitted for testing. Full decoding of the binary 
     structures may be implemented in a future release.
  -- In GrepFiles() add support for scan of Microsoft Word(tm) 1997, 2000, 
     2002, 2003, 2007 documents.
  -- Bug Fix: Dual-window Mode only: When a "resize dialog" is invoked, 
     both windows were being set to the current CWD instead of being set 
     to their previous target directories. Also, focus was always set to 
     left window after the resize. A "resize dialog" event now retains the 
     existing CWD and focus.
  -- Bug Fix: Dual-window synchlock:
     -- If selecting a new target directory from "Favorite Directories" 
        dialog, disable the synch-lock.
     -- If mounting or unmounting a filesystem from "Mount Filesystems" 
        dialog, disable the synch-lock.
     -- If synch-lock is engaged during a locate-file-by-name scan 
        (CmdLocateFile() method), the scan is now echoed in the inactive 
        directory window. Previously, the inactive window was not updated 
        during the by-filename scan.
  -- Bug Fix: When the Mount Filesystem dialog is first opened, the 
     mount/unmount toggle was sometimes initialized incorrectly. This in 
     turn caused the initial text of the mount/unmount pushbutton control 
     to be incorrect.
  -- Bug Fix: When displaying filesystem information, if the filesystem 
     label contained a space character, the label and mountpoint path were 
     being parsed incorrectly. See DisplayFilesystemInfo() method. This also 
     affects the "Select Attached Filesystem" dialog of the configuration utility.
  -- Bug Fix: The "ExFat" filesystem, which was until recently proprietary 
     to Microsoft is now being used in an array of new, high-capacity 
     (>32GiB) memory devices such as SD cards and USB flash memory devices.
     Microsoft, in it's infinite wisdom (i.e. arrogance) has set the 
     cluster size for these devices to 32KiB (131,072 bytes).
        (Most Microsoft engineers are not qualified to work as)
        (Walmart greeters, much less in a technical capacity. )
     The 32KiB size is too large for the 16-bit 'blockSize' and 
     'fblockSize' members of the fileSystemStats class. For this reason, 
     we have increased the size of these members to 32 bits.
     Because this class definition is used in a number of applications, 
     the increased size of these data members may affect the storage, 
     retrieval and formatting of these fields. Check your code!
  -- Bug Fix: In keycode help dialog, when a keycode was entered into the 
     search textbox, the textbox was not reinitialized prior to the next 
     search.
  -- Bug Fix: When mounting or unmounting a filesystem, the displayed 
     file list(s) were not always updated as they should be.
  -- Enhanced support for optical drives (DVD/CD/Blu-Ray) and for optical 
     media. This includes gathering additional filesystem information on 
     optical-media targets as well as the ability to open and close the 
     optical-drive tray for drives that support software control.
     See CmdOpticalMedia() method.
     -- Enhanced support for mount/unmount/eject of optical-drive media.
        See CmdMount() method.
  -- Enhance "File System Information" dialog to support information 
     specific to USB devices and optical-media.
   -- Bug Fix: When synch is engaged and user is scrolling through the file 
      list, then the highlight in the inactive window was not always 
      tracking matching filenames correctly.
  -- Add an option to the backup operation to simply _report_ the files 
     that need to be updated, but do not modify any target files.
     See Backup() method dialog and the FileDlg class BackupClipboardList() 
     method which directs the flow to the appropriate processing loop.
     Note that while the log file for Backup/Synch operations reports the 
     _source_ files backed up, the Scan-Only operation reports the targets 
     that would have been updated. Note also that because the Backup and 
     Scan-Only operations do not share code, no changes to the Backup/Synch 
     operation were made.
  -- Update the Help About dialog to include the version number of the 
     GVfs utility 'gio' (if installed).
     -- Also, add a message about the required ncursesw library version.
  -- When allocating shared memory during configuration, implement a 
     retry loop in case the initial allocation fails.
  -- For the mount/unmount-device dialog, the mounted devices are now 
     placed at the top of the list.
  -- Add the option for display of line numbers in the View-File dialog.
     Valid for viewing plain text files, HTML, XML and PERL.
  -- Bug Fix: If View-File target was one of the 'special' file types, the 
     error message was incorrectly formatted, causing a seg fault.
  -- Update copyright notices to reflect the new year.
  -- Documentation update.
  -- The folks who maintan the Texinfo project have made some design 
     decisions which have impacted our documentation; specifically: 
     1) The 'texi2any' processor now outputs an warning message if a 
        @xref, @pxref, @ref reference is inside a @w{} sequence.
        This does not affect the output; however, it does spew hundreds 
        of warning messages across our terminal window. This has cost us 
        several days to update our code.(Those guys are a laugh-a-minute.)
     2) The @kindex tag now causes a 'P' paragraph symbol in the HTML output 
        _unless_ it is preceeded by a blank line in the source.
     3) The syntax following the index table has changed which causes our 
        'idpp' post-processing utility sees a syntax error. This does not 
        affect the output, but again, it annoys our sense of order in the 
        universe.
  -- No public release.

v: 0.00.38 02-Jul-2020
  -- Implement improved support for access to files on MTP/GVFS virtual 
     filesystems:
     -- Bug Fix: If the 'gio' utility encountered an unknown filetype, it 
        would not report that field at all. To compensate, we now test for 
        a missing filetype field in the stat data.
     -- Gather more detained stat data for both individual files and for 
        the target filesystems.
        -- There is an interface bug between the Linux system and the 
           target device: The device reports the filesystem-type code 
           string as a decimal value rather than a hexidecimal value as it 
           should. We have compensated, but this is an active issue.
     -- Copy/cut/paste and rename functionality is now fully functional.
        Note that the underlying tools for MTP/GVFS do not support 
        recursive operations; therefore, operations on those filesystems 
        are limited to the files visible in the display window, NOT THE
        CONTENTS of subdirectories.
  -- Bug Fix: Integer size mismatch for three members of the ExpStats 
     class. This sometimes caused an incorrect narrowing of data reported.
  -- Bug Fix: Dual-window synchlock was not being released when switching 
     between Dual-window and Single-window mode.
  -- In the "Edit Mount Commands" section of the configuration utility, 
     add a pushbutton option to display a list of storage devices attached 
     to the system. This enables user to select a mountpoint or URI from 
     the list for inclusion in the mountpoint table.
     -- To make room for this enhancement, the partially-implemented 
        "Expert Mode" (fstab editor) has been discarded. We have never 
        been comfortable allowing the user to edit /etc/fstab from within 
        the application, so removing that functionality seemed the wise choice.
  -- Disabled the previous hack in EncodeEpochTime() which compensated 
     for an old compiler bug in the timelocal() function when calculating 
     the timezone. The compiler bug seems to have been corrected.
  -- Documentation update.
  -- Posted to website on 31-Jul-2020

v: 0.00.37 03-Nov-2018
  -- Significant performance enhancement in the way the directory tree is 
     scanned and formatted for display. This is accomplished by increasing 
     the number of execution threads used to scan the branches of the 
     directory tree. This is a major change in the directory-tree scan 
     algorithm, but little or no change in the user interface.
     Please see CaptureDirTree() method group in FMgr class.
     -- Included as part of this enhancement we have implemented a 
        single-threaded, non-recursive read of the smartphone (MTP/GVFS) 
        filesystem because "smartphones" aren't. This significantly reduces 
        the buffering requirements within the phone itself which reduces 
        the phone's response time for directory requests although 
        significant delays may still occur if the device is performing 
        other tasks. Individual files and small groups of files many be 
        safely and efficiently copied to and from the device; however, 
        because this algorithm is non-recursive, copy/paste of directory 
        trees is not supported at this time.
     -- Expand the number of threads used to scan the directory tree.
        -- Generalize the parameters for DirectoryCount() method 
           No change in functionality.
        -- Implement manager-thread target method, sdtMgrthread() to launch 
           the individual sub-threads. This allows the primary thread to 
           immediately return to the user-interface loop (although it 
           voluntarily blocks until all sub-threads signal scan completion.
        -- Redefine and simplify the thread-target method sdtSubthread().
           This gives the manager thread more flexibility in assigning 
           sub-threads to the tree scan.
        -- System exceptions for thread allocation and launch are now 
           explicitly "caught" and reported to the user. See DispData class 
           and sdtMgrthread() method.
        -- New data members to manage Intelligent Recursion through the 
           directory tree. See CaptureDirTree() method for details.
        -- Full root directory scan is now more stable and considerably faster; 
           however, by default a scan of the root directory, includes ONLY the 
           top layer of the directory tree.
           -- Add a command-line option, "-r" == root-scan, to enable a complete
              scan of the directory tree from the root downward.
           -- Add a "Root Scan" menu item to the View Menu. Selecting this menu 
              item toggles the full root-scan functionality.
           -- To fascilitate the enhanced tree scan, we now test for externally-
              mounted filesystems encountered during the scan and do not recurse
              into external filesystems (SD cards, USB memory devices, external 
              hard drives, etc.). Instead, these mountpoint directories are 
              identified by appending the "(extfs)" tag after the displayed 
              directory name. Tagging of external filesystems was previously 
              documented but was not fully implemented.
           -- IMPORTANT NOTE: The full-root-scan algorithm is still somewhat 
              unstable and may occasionally cause a system exception. No data 
              are affected by such an exception, but it would be necessary to 
              reset the terminal window and restart the application.
  -- Add audible alert if user tries to navigate to the parent of the 
     root directory (which doesn't exist). The action was already 
     disallowed, but now we audibly punish the attempt.
  -- Add a command-line switch to start app with hidden files visible.
     "-i" == invisible files
  -- Enhance the way the file backup algorithm handles symbolic link files.
     See BackupClipboardList() method.
  -- For setup of an "Archive" operation enhance and simplify testing for 
     automatic determination of the Create/Update/Expand sub-option.
     See Archive() method.
  -- Support for MS-Office (OOXML) documents which are structured as .ZIP 
     archive files.
     -- view document text
     -- view ZIP archive
     -- expand ZIP archive
     -- 'grep' the document's text data
  -- Completed implementation of user interruption of data backup 
     operation. User can now pause, and optionally abort a backup operation 
     in progress. This includes adding the pbarRefresh() method to the 
     WorkInProgress class.
  -- Implement ANSI color formatting for HTML source code. Tested with 
     pure HTML-5 source only. NOTE: Older, ad-hoc HTML command syntax may 
     not be colorized accurately.
  -- Simplify Tree-View mode. Use the directory-tree data from the normal 
     file-view mode to create the Tree-View display data. Previously, a 
     specialized tree-view scan was performed.
     -- Eliminated two data members: 'tRoot' and 'tRootPath'.
     -- Add context help (calls the 'info' reader).
     -- Overall, smaller, faster, and more robust.
     -- Bug Fix: If application started in Tree-View mode, the tree-view 
        flag was not being reset when Tree-View closed.
  -- Split FileDlgUtils.cpp. This module was growing beyond a manageable size. 
      See FileDlgUtil2.cpp.
  -- Make several instantiations of objects using the "new" keyword 
     (class Ptr = new class[n]) into "std::nothrow" instantiantions with 
     automatic retry in the case of instantiation failure.
     This is part of the effort to minimize the chance of the application 
     crashing due to a system exception.
  -- Bug Fix: In Paste-Special dialog, if source and target were different 
     filesystems, 'hard link' Radiobutton was not being disabled as it 
     should have been. (Hard links cannot be created across filesystems.)
  -- Implement filesystem scan to report all files that share a specified 
     Inode number. See FindInodes() method group in FileDlg class.
     -- Add "Inode Scan" menu item to Util Menu.
     -- Update Keymap.cfg with hotkey, increment file version to 0.01.01.
  -- Update the single-file and batch-mode rename methods to allow 
     filenames with Linux "special characters": ( \ ' " ? : ; & > < | * ).
     -- Test all calls to the shell to verify that these characters are 
        seen as text rather than as commands to the shell.
  -- Enhance functionality of SynchLock mode to keep highlight in active 
     and inactive windows in synch. See uiMonitor() method for details.
     -- Automatic disable of SynchLock mode when a file-operation keycode 
        is detected has been disabled _except_ in the case where user 
        enters a child directory for which there is no corresponding 
        subdirectory in the inactive window. Note: In the future, we may 
        reactivate the auto-disable; however, the recent functionality 
        enhancements have made it technically unnecessary.
  -- Implement multi-file comparison. See CmdCompareFiles() and the 
     FileDlg-class CompareFiles() methods. Previously, comparison could 
     only be performed between two files. This enhancement allows each 
     file in one group to be compared with the corresponding file in 
     another group. Available in Dual-window Mode only.
  -- Update a few places in the code to address some new warnings that
     arose in the transition from gcc v:4.8.3 to gcc v:9.2.1.
     --  -Wmaybe-unitialized
          In ecoEditCS_ControlUpdate(). It was actually was an error, but 
          it worked anyway because we weren't using the unitialized value.
     --  -Wdeprecated-declarations
          readdir64_r() is deprecated. Switch to readdir64() which is now 
          thread-safe under the GNU compiler.
     No functionality change.
  -- Bug Fix: In WorkInProgress class, protect against accessing ProgBar 
     if pBar has not been instantiated. Was causing occasional access 
     violation after display refresh in cowPrompt().
  -- In FindFiles dialog, for files that match the search criteria, along 
     with the pathspec optionally display the file's timestamp. We have 
     found this useful when trying to locate the newest version of a file.
  -- For all calls invoking the 'less' utility, add the '-c' (clearscreen) 
     option to force 'less' to clear the terminal window on startup.
     This is to compensate for the poor formatting used by 'less' when 
     displaying data that do not fill the page.
  -- Enhance the Mount/Unmount functionality to include mountpoints defined 
     in the '/proc/self/mountinfo' and '/etc/fstab' system files.
     In addition, scan for attached USB devices which use the MTP protocol 
     (GVFS filesystems) which are not listed in the kernel files.
     Add two Radiobutton controls to the Mount Filesystems dialog.
     -- Increase the number of possible 'Mountpoint' entries from 16 to 24 
        to accomodate mounting of additional storage devices.
  -- Add Systemcall() method to FileMangler class to consolidate top-level 
     system access.
  -- Enhance the GrepFiles() dialog:
     -- Optionally report the summary count of matching items rather than 
        the detailed report.
     -- Implement a secondary search filter which can either exclude items 
        which match the secondary criterion, OR report only items which 
        match both the primary and secondary criteria.
     -- Automatically escape spaces, single/double quotations and other 
        regexp "special" characters when used as ordinary filename characters.
     -- Change definition of manually-entered filename separator character 
        from space (' ') to comma (',').
  -- Enable GNOME/Wayland clipboard access for Textbox controls, IF the 
     external "wl-clipboard" utilities are installed. (Otherwise, NcDialog 
     local clipboard access only.) Connection established through the 
     NcDialog WaylandCB-class interface. NcDialogAPI v:0.0.32 or greater.
  -- When viewing file contents, if target file has ".epub" extension, 
     list the contents of the document. Note: This is a .ZIP file 
     containing a series of web pages. Support for ePub document archive 
     expansion is also supported.
  -- Implement support for reading MPEG-4 (m4a) audio file metadata.
     See FileDlgMedia.cpp for details.
  -- Implement ANSI color coding when viewing Perl source code files.
  -- Implement Scan_USB_Bus() method. Scans for MTP/GVFS (virtual) 
     filesystems attached to the USB bus. This scan is primarily for 
     locating attached smartphones and tablets, and enables reporting of 
     filesystem stats for MTP/GVFS devices.
     Optionally scan all USB devices (mouse, touchpad, camera, etc.).
  -- Update the 'fminstall.pl' installation script.
  -- Documentation update.
  -- Posted to website on 01-Jul-2020

v: 0.00.36 12-Oct-2018
  -- Update formatting of ViewFile text extracted from OpenDocument files.
     As a side-effect, the grep of OpenDocuments is now also more robust.
     See gfExtractOD_Text().
  -- Enhance ViewFile output for XML files by applying ANSI color commands 
     to highlight the elements of the source code.
  -- Implement support for viewing .ZIP archives. This already worked by 
     magic (external 'less' preprocessor), but now it works intentionally.
     See ArchiveTarget(), vfcDecodeArchive().
  -- Bug Fix: In Backup_Validate(), auto-rename for target archive file 
     was not fully functional (stupid programmers :-)
  -- Implement create/update/expand for ZIP archives.
     -- Add option for data backup to ZIP archive target.
     -- Create/Update/Expand for both Tar and Zip are now fully functional.
     -- Create/Update/Expand dialog redesigned to accomodate expanded 
        archiving functionality.
  -- "Set alt directory window" default key binding reassigned to 
     (ALT+SHIFT+W ) from (ALT+') This is more compatible with the ALT+W 
     (WinMode) toggle.
     between Single-win Mode and Dual-win Mode. See CmdAltCWD().
  -- "Synch-lock toggle" default key binding reassigned to 
     nckA_SING (ALT+') from (ALT+SHIFT+') More intuitive now that ALT+' 
     has been freed up.
  -- In the main user-interface loop (UserInterface()), when user presses 
     an invalid key, he/she will get an audible boink to indicate the 
     invalid keypress. This previously worked only for control-key 
     combinations.
  -- Viewing an OpenDocument file through the ViewFile context menu:
     In the previous release, user could view the text extracted from 
     supported OpenDocument files. However, because OD files are actually 
     'zip' archives, we now also enable the option to view an OD file's 
     contents as an archive. See ViewFileContents().
     -- As a convenience in development, OpenDocument files are now 
        recognized as zip archives by the Expand Archive dialog.
        OD files _are not_ recognized as archive targets for create/update.
  -- Documentation update.

v: 0.00.35 26-Jan-2017
   -- Bug Fix: In EncodeEpochTime(), the call to the C library function to 
      convert from human-readable time to epoch time is, for some timezones, 
      off by exactly one hour (related to DST). We have compensated, but the 
      fix is not bulletproof. See notes in the the EncodeEpochTime() header.
   -- Increase the number of possible 'Favorites' entries from 16 to 24 to 
      accomodate additional phones, memory sticks, external drives, etc.
   -- Add hotkeys to the ViewFile dialog controls. This was implemented 
      because we often view audio files as binary (hex) data, and hotkeys 
      speed up the process.
   -- Update code for extracting metadata from audio media files. This code 
      is adapted from the 'Taggit' application. Basic functionality is 
      unchanged, but with more robust parsing and error checking.
      Reporting of embedded images, Popularimeter and PlayCounter are now 
      also reported.
   -- Bug Fix: In ViewFileContents() escape single-quote characters in 
      filespec. Double-quote characters, backtics and backslashes in the 
      filespec will still cause the shell to parse the string incorrectly.
      On the other hand, users who name their files with these characters 
      deserve the error message they will get.
   -- Bug Fix: In FindFiles() the count of top-level directories was 
      incorrect if the top level contained "hidden" directories. This caused 
      the application to intermittently fail to find the searched-for item.
   -- Create new source module, FileDlgContext(), for code related to the 
      ViewFile context menu. This helps to reduce the size of the 
      FileDlgPrompt.cpp module which was getting much too large (700KB).
   -- Implement the "Execute External Program" functionality (ViewFile 
      context menu) which allows user to execute binaries and scripts as well 
      as invoking the system-default application for selected media files, 
      documents and other common data files. This had formerly been only a 
      stub program. The launch functionality was taken almost unmodified from 
      our Taggit application.
   -- Remove the 'Transaction Log' option from the configuration file.
      It seemed like a good idea ten years ago, but we have never used it.
      The functionality of the transaction log has been largely replaced by 
      the Backup/Synch/Archive log file.
   -- Place hooks for constructing a multi-language user interface.
      See ConfigOptions::appLang.
   -- Expand minimum application width from 78 columns to 80 columns.
      Limiting the application to 78 columns seemed like a good idea when 
      we were developing on an actual Cromemco 80-column terminal attached 
      to our homebrew system, but it seems a little out-of-step in the world 
      of emulators.
   -- Add the 'Resize Dialog' item to the View Menu. This allows the user to 
      re-size the application dialog when the size of the terminal window 
      has changed. Command key: ALT+CTRL+Resize.
      Formerly, it was necessary to toggle the Single/Dual-window mode to 
      resize the dialog.
   -- When reporting filesystem stats, explicity convert an 'fsType' string 
      of "fuseblk" to "ntfs". While there are multiple filesystem formats 
      associated with the FUSE protocol, by far the most common is the 
      Windoze NTFS format. This change makes the filesystem report less 
      techie, and more user friendly.
   -- Add the 'wr' (warning-message) member to the colorScheme class.
   -- Key-command remapping:
      -- Keymap configuration file format definition.
      -- Keymap display via menu option: Help Menu "Key Bindings" item.
      -- Interactive edit of keymap in the configuration utility.
   -- Bug Fix: For backup log, the updates-only log format was incorrectly 
      counting unmodified directory names as updated files, and was not 
      reporting created target directories as updates.
   -- Bug Fix: A click outside the application borders was inappropriately 
      activating the Menu Bar rather that being ignored as it should be.
   -- Updates required by switch to G++ v:5.4.0:
      -- New warning that library functions 'tempnam' and 'tmpnam_r are 
         dangerous. While this is technically true, this application uses 
         them in such a way that negates the danger. In any case, silence the 
         compiler warning by updating methods which create temporary files.
   -- Bug Fix: In FindFiles() method, processing mouse input had a logical 
      error. See note in that method.
   -- Widen the 'Util' menu to allow more easily understood menu items.
   -- FirstSelectedItem(), NextSelectedItem() and HilightItemByName() now 
      return either the index of the highlighted filename or 'ERR'.
      Previously, these were 'void' (no return value).
   -- In CmdLocateFile(), handle SPACE character as a special case because 
      it could be either a filename character or the 'select' command.
   -- First pass at implementing 'grep' functionality is complete. Simple 
      (only two user-accessible parameters), but functional, and includes 
      direct scan of text in OpenDocument files.
      In FileDlgUtils.cpp, see GrepFiles() and the gfxxx() method group.
   -- Add support for viewing the (unformatted) _text_ of an OpenDocument file 
      from the ViewFile context menu.
   -- In FMgr class, update FileSystemStats() method to include UUID, label, 
      device name and mountpoint. This provides additional information to 
      the user through the "File System Information" dialog.
   -- Split FmInterface.cpp creating FmCommand.cpp. The source module had 
      grown to over 200,000 bytes, making development inefficient.
   -- Complete the first iteration of the Mount Filesystem functionality.
      Because mounting a storage device often requires super-user privilege, 
      a child terminal window is opened from which the operation is launched.
   -- Add "Help Docs (HTML)" item to Help Menu. Opens HTML documentation 
      in the default browser.
   -- Rewrite Perl installation script to simplify user's installation process.
      See notes in fmginstall.pl.
   -- Modify configuration dialog for 'alt trashcan' so it doesn't complain 
      when the specified path is an empty string.
   -- Update all copyright notices to '2018'.
   -- Documentation update.

v: 0.00.34 19-Jan-2016
   -- Basic implementation of automatic Backup and Synchronize functionality.
      -- Add '-b=FILENAME' command-line option to allow user to specify a 
         Backup/Synch definition file.
      -- Implement Backup_xxx() method group to interact with user in setting 
         up the operation.
      -- See also the FileDlg class layer of Backup/Synch functionality.
   -- Implement Archive functionality to create, update and expand tar 
      archive files. Most archive-related functionality is in the FileDlg 
      class.
   -- Restructure and enhance trashcan functionality. Most trashcan-related 
      functionality is in the FileDlg class.
   -- Modify GetCommandLineArgs() method to allow arguments to be separate 
      tokens. We don't necessarily think this is a good idea, but most 
      command-line utilities do this, so we caved to peer pressure.
   -- Implement CmdMouse() to enable/disable mouse for current session only.
   -- Implement '-m' command-line option for enabling mouse support for 
      current session only.
   -- Finish implementation of file locator. Locate a filename displayed in 
      the current window by typing in part or all of its name.
   -- Implement 'Find Files' functionality to scan the directory tree for 
      filenames which match the user-specified pattern.
   -- Bug Fix: in 'GetCommandLineArgs' method: 'grey' color scheme was being 
      misinterpreted as 'green'.
   -- Implement 'compare-files'. This is an enhanced and user-friendly 
      implementation of the 'diff' utility's basic functionality.
   -- When moving to parent directory, the highlight is now positioned on 
      the name of the previous subdirectory.
   -- The path textbox now shows the progress of reading a new CWD.
      This is functional but not elegant. Needs improvement. See Progress 
      Bar implementation.
   -- Implement the synch-lock for Dual-window Mode. See CmdSynchLock().
   -- Assign command key to:
      -- Display user info
      -- Display filesystem info
      -- Show/hide hidden files
      While this is neither necessary nor particularly useful, it does 
      provide symmetry.
   -- Simpify the HelpAbout subdialog and provide user with an option to 
      save the displayed data to a file for submitting a tech support 
      request.
   -- Implement reporting of media file metadata for MP3 and OGG audio files.
      This is under the 'View File Contents' context menu.
   -- Define the mechanism for setup and operation of a Progress Bar. 
      Most of this functionality is in the FileDlg class.
   -- Create the basic structure for command-key remapping functionality.
   -- Update all copyright notices to '2017'.
   -- Documentation update.

v: 0.00.33 08-Jan-2014
   -- Trashcan access is now fully functional.
   -- Update control definitions for dctTEXTBOX and dctPUSHBUTTON controls 
      because NcDialog API now allow multiple lines for these controls.
      This primarily affects the ModifyFileStats() method where we previously 
      made some assumptions about these control types.
   -- Move primary development platform from 32-bit to 64-bit system, and 
      update primary compiler from G++ v:4.8.0 to G++ v:4.8.2.
      No transition issues.
      -- Also updated from Fedora 16 to Fedora 20. F20 has some bugs, but 
         no serious effect on FileMangler functionality.
   -- Swap elements 0 and 1 in 'View File' context menu. 'View Contents' is 
      now the first item in the menu because it is by far the most 
      commonly-used item.
   -- Bug Fix: ViewFile context menu display was corrupted by incorrect 
      display-item width.
   -- Implement 'Find Link Target' in ViewFile context menu.
      See FindLinkTarget() method.
   -- Update call to nc.GetTermnalColorSupport() to match new NcDialog 
      definition.
   -- Update get/set selection to match new NcDialog naming convention.
   -- Add nckAC_J (ALT+ENTER) key to interface loop to access the ViewFile 
      context menu for the highlighted file, even if it is a directory name.
   -- Update all instances of the gString 'formatInt' call to match changes 
      in the gString class.
   -- Redefine location of temp file which indicates the optional exit 
      directory. Was in the application directory; now in the system's 
      temporary storage directory. This was done in anticipation of moving 
      all temporary files to the system's temp directory.
   -- Redefine location for creating application's temporary files.
      Formerly they lived in the installation directory for ease of 
      debugging. However, the algorithm is now stable, so temp files are 
      created in the system's defined temp-file directory.
      -- This includes removing the configuration option for specifying 
         a temp-file directory.
      -- New method CreateTemppath() now does the setup for temporary files, 
         and the application will not open unless this setup is successful. 
      -- New method DeleteTemppath() is called by the destructor to clean up 
         any temp files which were not removed by the code that created them.
   -- Tweak the color schemes to take advantage of 16-color terminals.
   -- Minor updates to TreeView Mode to prevent recursion into external 
      filesystems. This had caused a noticeable performance hit.
   -- Basic implementation of the 'stable mouse' interface. The mouse 
      interface is clunky, as predicted, but better than expected.
      The MenuBar and sub-dialogs work smoothly, but selection of items for 
      processing is still easier via keyboard. Most of the changes required 
      for mouse support were minor; however, there were over 100 of them, 
      so be alert for new user-interface bugs.
      -- Add mouse option to configuration file.
      -- Add mouse enable/disable option to Utility menu.
      -- Add interactive configuration method to set/reset the mouse flag.
      -- Update primary user-interface loop to be aware of converted mouse 
         events for item selection, and to interpret non-converted mouse 
         events related to enabling the menu system, shifting the input focus 
         and moving to parent directory.
      -- Update all subdialogs to recognize hotkey user-input.
      -- In TreeView Mode, convert mouse events to keycodes.
      -- Update documentation.
   -- Consolidate all output of copyright-year range, so it only needs to 
      be updated in one place. (see 'copyrightYears' constant)

v: 0.00.32 24-Dec-2013
   -- Sending files to Trashcan is now basically functional.
   -- Empty/Restore Trashcan under construction.
   -- Update instances of dtbmData class usage to reflect changes in 
      NcDialog API library.

v: 0.00.31 25-Aug-2013
   -- Update compiler to GNU G++ 4.8.0. Minor changes needed to eliminate 
      warning messages due to updated C++11 specifications.
   -- Continue implementation of 'Trashcan' functionality which uses the 
      Gnome Trashcan directory and syntax. (Handling of error conditions not 
      fully vetted.)
   -- Enhance application exit code to allow for optional exit to current 
      working directory rather than original invocation directory.
      See also enhancement to 'fmg.sh' invocation script.
   -- Create placeholder 'filemangler.info' Texinfo file to be invoked when 
      user requests Help. Most of the help text is not yet written.
   -- Enhance MenuBarAccess() and DialogTitle() to allow user to specify 
      which menu will be opened when the Menu Bar becomes visible.
      -- Also implemented the ability to lock the Menu Bar in the visible state.                                                               *
   -- Implement Shift+UpArrow and Shift+DownArrow for selecting a group of 
      adjacent files. See CmdSelect() method.
   -- Basic implementation of the '-T' command-line option to start the 
      application in Tree View.
      Note that if user starts in TreeView Mode, then CWD contents are not 
      read until return from TreeView.
   -- Add a 'refresh display' command and corresponing menu item.
      See CmdRefresh().
   -- Add CmdAltCWD() method to set alternate window to same CWD as active 
      window. Applies to DualWin Mode only.
   -- Add a visual indication if user == 'superuser'. See Display_SU_Flag().

v: 0.00.30 23-Mar-2013
   -- Begin design of the 'Backup' and 'Synchronize' functionality.
      Added the FmBackup.cpp module for this purpose.
   -- Additional clean-up of color scheme enhancement.

v: 0.00.29 19-Jul-2012
   -- Convert main application code to the FileMangler class.
      It's just nicer that way...
   -- Implement key mapping for the main loop rather than static key 
      assignments (conversion incomplete).
   -- Create FmConfig.hpp and the FmConfig class. Define a shared-memory 
      area for inter-process communications and implement all configuration 
      operations as a seperate sub-program. See Configure().
   -- Implement undocumented switch to display verbose start-up diagnostics. 
      See GetCommandLineArgs().

v: 0.00.28 14-May-2012
   -- Implement application's user-selectable color scheme based on 
      enhancements in NcDialog/NcWindow/NCurses classes.
      (see FileDlg.hpp, class ColorScheme)

v: 0.00.27 03-Oct-2011
   -- Continue recursive re-design.
   -- Consolidate single-win and dual-win modules into FmInterface.cpp.
   -- Redesign gathering of command-line args.
   -- Now links with the UTF-8-aware NcDialog.a link library and with 
      ncursesw, the 'wide' version of the ncurses library.

v: 0.00.26 25-Jul-2010
   -- Massive design revision in the way file data are captured and stored. 
      This is necessary to support recursive copy/cut/paste/sync/backup, etc. 
   -- Add config option for path specification where temporary files are to 
      be written.
   -- Add config options for Trashcan management.

v: 0.00.25 14-Feb-2010
   -- Change development platform and compiler version.
              Fedora 12 and GNU G++ (Gcc v: 4.4.2)
      This neccessitated several syntax changes in class and method 
      definitions to accomodate changes in the C++ definition and the GCC 
      compiler's warning and error messages.
      Code basically re-integrated with the test programs, Cb and Dialog1.
      Header files now interchangeable, and FileMangler having the active 
      copy of each .cpp source file.
   -- Update all methods that use the NcDialog class. This class has 
      undergone significant enhancement since the previous version.
   -- Begin conversion of FileWin class FMgr class and FileMangler from 
      NcWindow primitives to NcDialog class objects.

v: 0.00.24 29-Mar-2007
   -- Add configuration option to specify the operation when copying symbolic 
      links. Add new sub-menu, SymLinkCopyMenu() for user to select option.
    -- Add ViewClassVersions() method.

v: 0.00.23 05-Feb-2007
   -- Implementation of PasteSpecial in FileWin object.
   -- Major overhaul of PasteClipboardList() in FileWin class.

v: 0.00.22 26-Dec-2006
   -- Implement Touch Files functionality.
      See FileWin class for details.

v: 0.00.21 22-Dec-2006
   -- Integrate new version of NcDialog class family.

v: 0.00.20 24-Sep-2006
   -- Integrate completed version of NcDialog class.

v: 0.00.10 07-Jan-2006
   -- Base code is from the ncurses test application, Cd.
      Created using GNU G++ (Gcc v: 3.2.2)
      under RedHat Linux, kernel 2.4.20-31.9

