-*- mode: text; coding: utf-8; fill-column: 78; -*-

Prior changes belong to the FGo! program by Robert 'erobo' Leda and are listed
in the file 'ChangeLog.FGo'. For more details about any change listed below,
you may want to consult the Git repository log.

******************************************************************************

1.0.0
[FEATURE] Import the code from FGo! 1.5.5 onwards (Python 2 at that time)
          into a Git repository. (Florent Rougon)
[FEATURE] Port the code to Python 3. (Robert)
[FEATURE] Add the file docs/INSTALL/INSTALL_en to guide users through the
          process of installing the dependencies. (Florent Rougon)
[BUGFIX]  Fix typo in "help_it" file. (Philip Lacroix)
[FEATURE] Add conditional config based on CondConfigParser. This is
          documented for FGo! users in docs/README.conditional-config/.
          (Florent Rougon)
[BUGFIX]  Fix logic behind the Reset button. (Robert)
[FEATURE] Add keyboard shortcuts for "Run FG" (Ctrl-f), "Reset" (Ctrl-r) and
          "Save & Quit" (Ctrl-q). (Florent Rougon)
[FEATURE] Move the "FG is running..." message from the separate "info" window
          to the main window. (Florent Rougon)

    * The separate window was annoying, because when switching from a
    workspace with FlightGear on top and FGo! below, to another workspace and
    back to the initial workspace, the "FG is running..." little window
    appeared on top of FlightGear, which prevented the user from controlling
    it until he explicitely switched to FlightGear's window.

    * The "FG is running..." message is now displayed in red in FGo!'s main
    window (in a Label widget) instead of the separate InfoWindow. When
    FlightGear is not running, this message is replaced by a "Ready"
    indication in green.

    * This new behaviour allows to interact with FGo! while FlightGear is
    running, except for the things that rely on stuff started in
    App.startLoops(). Among others, it makes it possible to modify the
    configuration before the fgfs process is completely terminated. It would
    be possible to keep the loops running even after FlightGear has been
    started, but that would sacrifice a small amount of performance, for IMHO
    very little benefit. I prefer freeing the CPU as much as possible for
    FlightGear.

    * As a bonus, the new Label widget indicates the exit status of the last
    FlightGear run, or the signal number in case the fgfs process was
    terminated by a signal.

    * While FlightGear is running, the "Run FG" button is now greyed out.

[FEATURE] Add preview of FlightGear command. (Robert & Florent Rougon)
[FEATURE] Add FlightGear output window and log saving.
          (Robert & Florent Rougon)
[USABILITY] Remove everything related to running a standalone TerraSync
          program in the background. As TerraSync has been integrated into
          FlightGear several years ago, this feature was probably more
          confusing than useful to users nowadays. (Robert & Florent Rougon)
[FEATURE] Allow the command preview and FG output windows to be detached,
          reattached and hidden. Store their geometry when reattaching,
          closing them or choosing "Save & Quit" to be able to restore it when
          they are later shown again. (Florent Rougon)
[FEATURE] Improve initialization of locales and translations at application
          startup. (Florent Rougon)
[FEATURE] Change USER_DATA_DIR to ~/.ffgo on Unix, %APPDATA%/FFGo on Windows.
          (Florent Rougon)
[FEATURE] New dialogs at application startup to offer to copy FGo!'s config
          file to USER_DATA_DIR when this is safe, start with "factory
          defaults", or abort. (Florent Rougon)
[FEATURE] Rename the 'fgo' script to 'ffgo' in order to avoid confusing users
          concerning the FGo! program distributed by Robert Leda.
          (Florent Rougon)
[USABILITY] Allow closing the Preferences window with the Escape key.
          (Florent Rougon)
[USABILITY] Rename the 'Reset' button to 'Reload config', which is more
          self-explanatory in my opinion. Add a tooltip to this button that
          indicates the config file path. (Florent Rougon)
[USABILITY] Add menu entries in the File menu to reload the config file and to
          run FlightGear. These entries show the new keyboard shortcuts.
[FEATURE] Help files: update installation instructions, add description of new
          features and add a tip about config file reloading.
          (Robert & Florent Rougon)
[FEATURE] Add top-level README.rst and move first sections of
          data/help/help_en to it. (Florent Rougon)
[FEATURE] Update data/config/config_en: slightly reorder, improve wording
          (IMHO), remove reference to now-invalid URL (list of callsigns in
          use), introduce new options, give hint about
          'fgfs --help --verbose'. (Florent Rougon)
[FEATURE] New ffgo.svg icon and new thumbnail.jpg (with xcf source).
          (Florent Rougon)
[FEATURE] Add Makefiles to automate generation of many files
          (messages.pot, *.po and *.mo files, ffgo.png in all sizes from
          ffgo.svg, HTML rendering of docs/README.conditional-config.source,
          release tarball...). (Florent Rougon)
[FEATURE] Rename messages.{pot,po,mo} to FFGo.{pot,po,mo}. This will make it
          much easier for downstream distributors to create FHS-compliant
          packages with .mo files in /usr/share/locale/<locale>/LC_MESSAGES/
          (which is shared by all programs on a given system, therefore using
          such a generic name as 'messages' is unacceptable there).
          (Florent Rougon)
[FEATURE] Improve the thumbnail situation. cf. the Git log for
          6bf65f453ba28920397371d932b3b2ef491827bc for details (information
          maybe relevant to packagers but not users; in short,
          data/pics/thumbnail.ppm is replaced by
          data/pics/thumbnail-no-Pillow.gif and data/pics/thumbnail.jpg by
          data/pics/thumbnail-not-avail.png, and the two new files are both
          automatically generated from their respective sources).
          ImageMagick's convert program is now required by the Makefiles when
          installing from the Git repository. (Florent Rougon)
[BUGFIX]  Fix a bug introduced in 1.0.0b2 that would prevent FFGo from working
          properly when Pillow is not installed. (Florent Rougon)
[BUGFIX]  Include FFGo.pot in release tarballs. It is not needed by FFGo, but
          may be useful for people wanting to add new translations.
          (Florent Rougon)
[FEATURE] Add Setuptools packaging. This will make it easier (once you have
          learnt how to use pip) to install, upgrade, remove, or check when
          FFGo or one of its dependencies has a newer upstream version. Please
          read docs/INSTALL/INSTALL_en for user-level details and the Git log
          for developer-level details. This change impacts a lot of files.
          The top-level 'src' directory is renamed to 'ffgo' (necessary to be
          able to install FFGo with 'pip install --editable'). The 'data'
          top-level directory is not top-level anymore: moved under the
          top-level 'ffgo' directory. This should improve FFGo's portability
          to non-Linux platforms with a minimum of platform-specific code.
          (Florent Rougon)
[BUGFIX]  Fix missing import for a Windows-specific code path (this prevented
          FFGo from starting under Windows; I hope that is the last remaining
          problem of this kind on Windows. I definitely need testers for this
          platform. Please report on your experiences!). (Florent Rougon)
[USABILITY] Improve tooltips of the Preferences dialog. (Florent Rougon)
[USABILITY] Use CRLF line endings for the top-level README.rst file as well as
            for docs/INSTALL/INSTALL_* because the Windows Notepad program
            used not to be able to read LF line endings (ahem). Is it still
            the case in 2015? These files should be enough to get users
            started. (Florent Rougon)

1.1.0
[USABILITY] Show the FlightGear arguments and output in the default
          configuration (i.e., the Command Window and the Output Window). This
          will hopefully improve the first-time user experience.
          (Florent Rougon)
[FEATURE] Slightly better algorithm for preparing the fgfs command line.
          Mostly: order of the UI-exposed options such as airport, aircraft,
          parking, etc. as well as avoid passing empty '--fg-root=' or
          '--fg-scenery=' options unless they are written as is in the Command
          Line Options Window. In other words: an empty field in the
          Preferences dialog for FG_ROOT or FG_SCENERY will not by itself
          cause an empty '--fg-root=' or '--fg-scenery=' option to be passed
          to 'fgfs'. (Florent Rougon)
[USABILITY] Document the following new parameters in the 'presets' file:
          SHOW_FG_COMMAND, SHOW_FG_COMMAND_IN_SEPARATE_WINDOW,
          FG_COMMAND_GEOMETRY, SHOW_FG_OUTPUT,
          SHOW_FG_OUTPUT_IN_SEPARATE_WINDOW and FG_OUTPUT_GEOMETRY. These
          parameters were already present in FFGo 1.0.0 but not in FGo! 1.5.5.
          (Florent Rougon)
[“BUGFIX”] Distribute images derived from the CC0 helicopter image under the
          CC0 license too. The original intent was to distribute the images
          under the same license as the rest of FFGo for unity, i.e. WTFPL
          version 2. I think it was, and is still legal to do under most
          juridictions. However, legal matters being what they are, the safest
          course of action IMHO is to publish the derived images under the
          same license as the original image, i.e. CC0 1.0 Universal.
          (Florent Rougon)
[BUGFIX]  Improve restoring of geometry upon reset (“reload config”). Before
          this change, and contrary to the Command Window and Output Window,
          the dimensions of the main window were not restored when using the
          “Reload config” button; they were only restored at program startup.
          Of course, something can only be restored if it has been previously
          saved! (Florent Rougon)
[FEATURE] New option to save the main window position. For user convenience,
          as well as consistency with the Command Window and Output Window,
          add a new check box in the Miscellaneous tab of the Preferences
          dialog to tell FFGo to “Remember the main window position” whenever
          saving to a configuration file or using “Save & Quit”. This option
          is enabled by default in FFGo. This means that the whole geometry of
          the main window 'widthxheight+x+y' is saved as WINDOW_GEOMETRY into
          the configuration file, instead of its size only ('widthxheight').
          To revert to the previous behavior, simply uncheck “Remember the
          main window position” in the Preferences dialog. This option
          corresponds to SAVE_WINDOW_POSITION in the configuration file.
          (Florent Rougon)
[USABILITY] Mention the FG_BIN name in the tooltip for the fgfs executable
          path. This is likely to be helpful to new users, because FG_BIN is
          used in the hint displayed when fgfs can't be executed, but new
          users might not know what this refers to. (Florent Rougon)
[USABILITY] Improve installation instructions. Most notably, make the suitable
          changes now that Debian packages are available for FFGo and
          CondConfigParser. (Florent Rougon)

1.2.0
[FEATURE] New logging system. Automatically write a log file containing the
          start and end date, OS, FFGo and Python versions, and all other
          usual messages (including exceptions and FlightGear messages). The
          log file is ~/.ffgo/Logs/FFGo.log (%APPDATA%/FFGo/Logs/FFGo.log on
          Windows). It is automatically rotated at application startup,
          keeping at most ten log files (FFGo.log, FFGo_1.log,
          FFGo_2.log, ..., FFGo_9.log). (Florent Rougon)
[FEATURE] Support command line options --help and --verbose. (Florent Rougon)
[FEATURE] New command line option --log-level to choose the log level for
          terminal output (defaults to 'notice', which makes the terminal less
          verbose than the log file by default). Run 'ffgo --help' to see the
          available log levels. (Florent Rougon)
[FEATURE] Add logging calls in a few key places to help debug problems. FFGo
          logs things such as XML parking/groundnet files about to be parsed
          (among others) with level 'info' or above to make it easy to spot
          the culprit in case there is a problem. Thus, in such a case, you
          can either look into the log file or rerun FFGo in a terminal, like
          this: 'ffgo --log-level=info' or 'ffgo --log-level=debug' (also
          possible with ffgo-launcher.py, of course). (Florent Rougon)
[BUGFIX]  Exceptions raised from a Tkinter callback cause an error window to
          appear, not only a traceback on the terminal. (Florent Rougon)
[FEATURE] New command line option --test-mode for developers, useful for
          running test code from the FFGo GUI. (Florent Rougon)
[BUGFIX]  Improve parsing of XML files (parking/groundnet and scenario files).
          This should work better in a few cases and make it clear there is an
          error when one of these files is really invalid. (Florent Rougon)
[BUGFIX]  Small fixes with respect to file operations (be explicit about the
          encoding... this notably affects USER_DATA_DIR/apt, which can have a
          few non-ASCII airport names such as EDRZ = Zweibrücken; properly
          use writelines() in Config.makeInstalledAptList() too...).
          (Florent Rougon)
[BUGFIX]  Improve parsing of directory names under <scenery_dir>/Terrain for
          those using the 'Show installed airports only' option. Some custom
          scenery directories may have subdirs such as
          'Scenery/Terrain/e020n50/e020n52.old'. Ignore them instead of
          raising an exception because "52.old" is not an integer.
          (Florent Rougon)
[USABILITY] Display an explanation when building airport lists. The operation
          may be a bit long and freezes the interface. Display a window so
          that the user knows what is happening and patiently waits.
          (Florent Rougon)
[FEATURE] Update the French translation of the interface. (Florent Rougon)

1.2.1
[BUGFIX]  Fix crash at initialization when Pillow is not installed (bug
          introduced in 1.2.0). (Florent Rougon)

1.3.0
[FEATURE] Improve gathering and handling of parking data. All of the parking
          metadata is available internally through a Parking class. Errors in
          groundnet files generate warnings on the terminal and a popup window
          if particularly serious. Refactoring of this part of FFGo.
          (Florent Rougon)
[FEATURE] Better sorting of parking positions in the parking popup menu (by
          flight type first, then by name using a better algorithm than before,
          so that A9 comes before A10, which itself comes before A10a, A10b,
          A11, etc.). Here, "flight type" corresponds to the 'type' attribute
          value of Parking elements in groundnet files: ga, cargo, gate,
          mil-fighter, mil-cargo, vtol. (Florent Rougon)
[BUGFIX]  Change the default for “Airport data source” to “Scenery”.
          This reflects FlightGear's current behavior when processing
          --parkpos and should provide much better parking data for people
          using TerraSync. The old default didn't make use of the TerraSync
          data, which was a pity.

          As indicated in ffgo/data/help/help_en, it is necessary to have
          downloaded data for the desired airport in one of the FG_SCENERY
          components before parking positions can be shown for this airport
          with the new default setting.

          Actually, “Airport data source” is a misnomer. What it really means
          is “Parking data source”. But since it corresponds to the
          APT_DATA_SOURCE parameter in the config file, and has been so for
          years (in FGo!), I'll leave it as is for now and just try to
          describe the effects as clearly as possible in the associated
          tooltip. (Florent Rougon)
[BUGFIX]  When “Airport data source” is set to “Scenery”, stop at the first
          groundnet file found in FG_SCENERY for the selected airport, even if
          it doesn't declare any parking position. This is what FlightGear
          (3.7) does, therefore doing otherwise and offer, in case of
          redundant FG_SCENERY components, parking positions that FlightGear
          won't find is not a good idea IMHO. (Florent Rougon)
[BUGFIX]  For the same reason, don't attempt to read parking data from
          FG_SCENERY/Airports/I/C/A/ICAO.parking.xml. This was used when
          "Airport data source" was set to Scenery, but FlightGear doesn't
          read these files. (Florent Rougon)
[USABILITY] Change the default for “Airport database update” to “Automatic”. I
          think this is more likely to improve user experience than to degrade
          it. (Florent Rougon)
[FEATURE] Interactive dialogs proposing to change the “Airport data source”
          and “Airport database update” settings to their new defaults. Each
          question is asked only once (if applicable). Give an empty value to
          ALREADY_PROPOSED_CHANGES in the config file if you want to see the
          questions again. (Florent Rougon)
[BUGFIX]  Don't special-case FILTER_APT_LIST in Config.update(). It seems
          counter-intuitive to me that the “Reload config” button reloads
          everything from the config file, except the FILTER_APT_LIST setting
          (which corresponds to the “Show installed airports only” entry of
          the Settings menu). Remove this special case. (Florent Rougon)
[USABILITY] Enabled/disabled state for the “Update list of installed airports”
          menu entry. Since this menu entry is only applicable when “Show
          installed airports only” is selected, enable or disable it as
          appropriate. (Florent Rougon)
[BUGFIX]  Fix button size (“Reload config” & Co). In non-English translations,
          some buttons were too narrow for the text to fit. This should be
          better now. (Florent Rougon)
[FEATURE] Print the Python and CondConfigParser versions in the About dialog
          box. This should make it easier to help users or even to help them
          help themselves. :-) (Florent Rougon)
[FEATURE] Update the French translation of the interface. (Florent Rougon)

1.4.0
[BUGFIX]  Don't hardcode ':' as path list separator for FG_AIRCRAFT and
          FG_SCENERY. Use os.pathsep instead, which should work better on
          Windows a least (normally uses ';' since ':' appears in things suchs
          as 'C:\path\to\foobar'). Having received no single report from users
          using FFGo to run FlightGear under a non-Linux OS, the only way I
          can find such portability issues is via code analysis.
          (Florent Rougon)
[BUGFIX]  Support use of the FG_AIRCRAFT environment variable. Mix its
          contents with that of the 'Additional aircraft path(s)' setting from
          the Preferences dialog, which is mapped to --fg-aircraft. This
          better reflects what FlightGear does. (Florent Rougon)
[FEATURE] Detect, log and display in Help → About the FlightGear version that
          FFGo is going to run based on the FG_bin setting from the
          Preferences dialog. Nicer display of the Python version too.
          (Florent Rougon)
[BUGFIX]  Hide tooltips when the mouse pointer is moved. (Florent Rougon)
[FEATURE] Tooltip refactoring. New ListBoxToolTip allowing to have a tooltip
          that depends on the ListBox item under the mouse pointer, using a
          function of the item index. (Florent Rougon)
[FEATURE] Distinguish between identically-named aircrafts; aircraft tooltips.
          FFGo stops using only the aircraft name to identify an aircraft.
          From now on, it uses the aircraft name in combination with the
          directory containing its -set.xml file. This directory is stored in
          a new config file parameter (AIRCRAFT_DIR) to allow reliably using
          the same aircraft between sessions even if there are other aircrafts
          with the same name in the aircraft paths. The aircraft list now has
          tooltips showing the aircraft directory, i.e. the directory
          containing the -set.xml file for the aircraft under the mouse
          pointer.

          Pass the --aircraft-dir option to fgfs (FlightGear) according to the
          selected aircraft. If the FlightGear version is lower than 3.8, use
          os.path.realpath() on its value (workaround for the FlightGear bug
          fixed in commit 7198dec355144fbb0eaccb39f0c241dd07ebaee0, dated
          October 6, 2015).

          New 'aircraftDir' external variable that can be used in the
          configuration processed by CondConfigParser. This variable contains
          the selected aircraft's directory. (Florent Rougon)
[BUGFIX]  Slightly more efficient aircraft search. Make sure there is always a
          selected item in the aircraft list except when it is empty, in
          particular after doing a search (an aircraft could previously be
          selected for FFGo but not highlighted in the aircraft list).
          (Florent Rougon)

1.5.0
[FEATURE] Add support for context-sensitive translations. (Florent Rougon)
[MAINT]   Clean up handling of airport, parking, runway and carrier settings.
          (Florent Rougon)
[MAINT]   Cleaner handling of runway and parking changes. Most notably,
          replace old code checking for runway and parking changes every
          250 ms by event handlers (observers in Tkinter-speak). This
          increases the interface responsiveness and reduces FFGo's CPU usage.
          (Florent Rougon)
[MAINT]   Simplify and accelerate the airport list build process. Rewrite the
          airport and aircraft search code using Tkinter observers to make the
          interface more reactive and reduce CPU usage at the same time.
          (Florent Rougon)
[USABILITY] When clicking on the Clear button for the aircraft or airport
          search, set focus to the corresponding entry widget to allow
          immediate typing of the search text. (Florent Rougon)
[FEATURE] New function, under the Tools menu, to copy a POSIX shell command
          equivalent to the current FG command to the clipboard. Due to
          limitations in Tk/Tkinter as it seems, this new function can only
          copy FG commands that can be encoded to ISO 8859-1 (which should be
          sufficient in most cases). An error dialog is displayed if this is
          not possible. On X11, the Tkinter clipboard functions used here seem
          to use the PRIMARY selection. (Florent Rougon)
[USABILITY] Use a lighter background color for the FlightGear Command Window.
[MAINT]   Overhaul of the tooltip infrastructure. New tooltip class:
          MenuToolTip. (Florent Rougon)
[BUGFIX]  Tooltips could be displayed outside their master widget due to the
          fact that (at least with Tk 8.6 and Python 3.4.3) Tkinter sometimes
          sends Motion events even though the mouse pointer is largely out of
          the master widget. Work around this problem. (Florent Rougon)
[FEATURE] Add airport parking tooltips in the parking popup. The newly-added
          tooltips contain most of the metadata available for parking
          positions (i.e., everything pilots are likely to be concerned about,
          but not FlightGear implementation details such as the parking
          'index' or its 'pushBackRoute'). The parking name/number and its
          associated flight type are not repeated in the tooltip since they
          are already displayed in the parking popup. (Florent Rougon)
[MAINT]   Remove polling for:
            - comments highlighting in the Option Window;
            - the code that updates various elements when a different aircraft
              is selected in the aircraft list;
            - the code that updates various elements when a different airport
              is selected in the airport list.

          Again, replace this mechanism by Tkinter observers that are called
          immediately after the relevant change without causing unjustified
          overhead. Together with the previous optimizations, this causes the
          FFGo CPU load when idle to drop from about 2-3 % in version 1.4.0 to
          0.0 % in this version on my computer.

          Note: in previous versions, the FFGo CPU load was already very low
                while FlightGear was running because certain functions were
                disabled in this case to save CPU time for FlightGear.
          (Florent Rougon)
[BUGFIX]  Thanks to the previously-mentioned changes, changing the aircraft or
          airport in FFGo, or comment out/decommenting text in the Options
          Window while FlightGear is running should work perfectly now,
          without leaving related fields unchanged (such as the aircraft
          thumbnail when selecting a different aircraft). All this should now
          work exactly the same as when FlightGear is not running.
          (Florent Rougon)

1.6.0
[FEATURE] New parser for apt.dat/apt.dat.gz. Should be compliant with the
          v1000 spec. Currently, it is only used to lookup fallback parking
          positions for a given airport as described below. (Florent Rougon)
[FEATURE] Read parking positions from apt.dat.gz as a fallback. If the
          standard lookup from the groundnet files gives no result, look up
          the parking data in apt.dat.gz. This is slow, but the last 50
          results are cached in memory to mitigate the inconvenience.

          With the apt.dat.gz file distributed with current FlightGear 3.7
          (which is identical to the latest file distributed on
          <http://data.x-plane.com/get_data.html> [and very outdated with
          respect to contributions by FlightGear users]), the number of
          airports having at least one startup location declared in apt.dat.gz
          is 3437. This means that FFGo can offer parking positions/startup
          locations for at least this number of airports (the parking data
          from FlightGear groundnet files is used preferentially to this data
          from apt.dat.gz, but it is maybe possible that some airports have
          parking positions declared in a groundnet file but not in
          apt.dat.gz). (Florent Rougon; thanks to pommesschranke/d-laser for
          the suggestion)
[USABILITY] Small color changes. (Florent Rougon)
[MAINT]   Cleanup of code related to the METAR widget (most notably, threading
          code). Apart from possible more or less random crashes which should
          not happen anymore, the most user-visible result of these changes is
          that the widget contents is automatically updated whenever the state
          of the “Decoded” checkbox is changed (and every such update is the
          result of a new HTTP request). (Florent Rougon)
[MAINT]   Various InfoWindow improvements. (Florent Rougon)
[FEATURE] Update the German translation. (chris_blues)

1.6.1
[BUGFIX]  Apparently, the HOME environment variable is not always defined on
          Windows. This prevents FFGo from starting in such a case
          (<https://sourceforge.net/p/flightgear/mailman/message/34584497/>).
          Remove FG_HOME and DEFAULT_TERRASYNC_DIR from ffgo/constants.py as
          well as the default setting to DEFAULT_TERRASYNC_DIR for
          Config.FG_scenery. The default value for Config.FG_scenery is now
          empty, as it used to be some time ago... (Florent Rougon)
[MAINT]   Small changes to the AptDat and ToolTip classes. (Florent Rougon)
[FEATURE] Update the German translation. (chris_blues)

1.7.0
[FEATURE] New apt.dat parser; new apt digest file format with an index for
          very fast access to all the data present in apt.dat.gz.

          * Replace the old apt.dat parser with a new parser. This new parser
            should be compliant with the APT1000 specification[1], provide
            better error reporting and fix a few small bugs (see below). It
            also extracts more information about airports and runways, unifies
            recently added extraction of parking metadata from apt.dat.gz with
            this airport metadata, and generates an “apt digest file”[2] in a
            new format bringing the following improvements:

                - more robust (proper header including magic number, encoding
                  declaration and format version; fields separated by the NUL
                  char ('\0') instead of '=');

                - contains only the information FFGo must read on startup in
                  order to make this startup as fast as possible; in
                  particular, runway names for *all* airports are not read
                  anymore on startup and held into memory, they are loaded on
                  demand when needed for the selected airport;

                - since runway and parking metadata are loaded on demand from
                  apt.dat (after trying the groundnet file in the case of
                  parkings), the new format includes an index for each airport
                  allowing to quickly find its data in apt.dat.gz. Of course,
                  this requires keeping the apt digest file in sync with
                  apt.dat.gz, which should not be much of a problem since the
                  default for “Airport database update” is “Automatic” since
                  version 1.3.0.

                [1] See <http://data.x-plane.com/file_specs/>.

                [2] Also known as “airport database”: ~/.ffgo/apt everywhere
                    except on Windows, where it is %APPDATA%/FFGo/apt.

          * The creation of the apt digest file is a bit slower than before
            (about 25 seconds on my system, as opposed to 10 or 11 before),
            but this should only be necessary when apt.dat.gz changes---which
            does not happen very often, the current version in FG 3.7 dating
            from 2013---or if I have to again change the format of the apt
            digest file.

            Note: the slowdown is essentially caused by gzip.GzipFile.tell()
                  being slow, however this is necessary to create an efficient
                  index. So, it's a bit slower once in a while when rebuilding
                  the airport database, but pays off the rest of the time when
                  using FFGo and looking at the airport, runway or parking
                  tooltips, or simply choosing among the newly-available
                  startup locations read (since version 1.6.0) from
                  apt.dat.gz.

          * Startup and config reloading should now be significantly faster
          when the airport list is “filtered” (the configuration option that
          causes FFGo to only show the airports you already have scenery for).
          (Florent Rougon)
[USABILITY] Add a colored, disabled (i.e., not clickable) and empty header to
          the runway popup menu. This makes it more visible, visually similar
          to the parking popup, and avoids it disappearing in a flash with the
          first entry being accidentally selected if the user just clicked
          without holding the button down. (Florent Rougon)
[FEATURE] Add tooltips to the airport list giving basic information about the
          airport under the mouse pointer (type of airport [land airport,
          seaplane base or heliport], latitude, longitude, elevation and, if
          applicable, the lists of land runways, water runways and helipads).

          The magnetic variation (also called magnetic declination) at the
          airport is also displayed in the airport tooltip if GeographicLib's
          MagneticField program is available. If this program is not in your
          PATH, you can indicate its location using the Preferences dialog.

          Note: MagneticField requires a particular dataset to be installed in
                order to work properly. In Debian, it is part of the
                geographiclib-tools package, which also provides a script
                called 'geographiclib-get-magnetic'. Running a command such as
                '/usr/sbin/geographiclib-get-magnetic minimal' with root
                privileges will automatically download and install a minimal
                dataset under /usr/share/GeographicLib/magnetic, where it can
                be found by MagneticField (not registering the added files
                with dpkg, which is a bit ugly, cf.
                <https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=687253>).
          (Florent Rougon)
[BUGFIX]  Fix slightly incorrect calculations of v810 airport coordinates (two
          opposite runway ends counted as one). This bugfix comes with the new
          apt.dat parser. (Florent Rougon)
[BUGFIX]  Fix computation of runway names from v810 data (“6” instead of “06”
          for the “other runway” opposed to “24”). This also comes with the
          new apt.dat parser.

          Note: these fixes are untested, as there is no single runway in v810
                format in my apt.dat 2013.10, build 20131335. (Florent Rougon)
[FEATURE] Display magnetic heading in parking tooltips when 'MagneticField' is
          available (see above for details concerning 'MagneticField').
          (Florent Rougon)
[FEATURE] Tooltip for each runway in the runway popup menu, giving: latitude,
          longitude (of the runway end), heading (true and magnetic if
          'MagneticField' is available, otherwise only the true heading),
          length, width, surface type, shoulder surface type, type of
          markings, smoothness.

          Helipads also have a line specifying whether they have edge
          lighting. Water runways have less fields because things such as
          shoulder surface type and smoothness are obviously not applicable.
          They have all the data that is present for them in apt.dat.gz,
          except for the “perimeter buoys” flag. The code to handle this flag
          is ready, but the way it is used in apt.dat.gz is completely bogus
          and in contradiction with the APT1000 spec. I'll activate the code
          when this is fixed.

          Since they are not directly available in apt.dat.gz, the length and
          heading of runways are computed from the latitude and longitude of
          opposite runway ends. FFGo ships with an implementation of
          Vincenty's formula to do this with better than 1 mm precision
          (assuming the coordinates of the runway ends are that accurate in
          apt.dat.gz!), as well as a few more things to deal with the cases
          that Vincenty's formula doesn't handle well.

          If GeographicLib's Python implementation is installed, it will be
          used in preference to these methods, because it is even more
          accurate (about 5 nanometers according to its website), was written
          by an expert in geodetic calculations (Charles F. F. Karney), and
          apparently handles all cases of the geodetic inverse problem,
          contrary to Vincenty's formula. (Florent Rougon)
[BUGFIX]  Correct calculation to find the nearest METAR station. The previous
          code didn't behave properly for points located on either side of the
          ±180° meridian, or close to one of the poles. Use a fast method
          (GeodCalc.modifiedFccDistance()) that gives reasonably correct
          results to find the best 15 candidates for the title of “closest
          station”, then find the closest among these using GeodCalc.inverse()
          (which is an FFGo abstraction layer for the algorithms mentioned
          above: Karney's algorithm from GeographicLib if available, otherwise
          Vincenty's formula plus a few others for the cases that Vincenty's
          formula doesn't handle well). (Florent Rougon)
[BUGFIX]  Always write the timestamp file after rebuilding the apt digest file
          (i.e., after “rebuilding the airport database”). With the previous
          code, if the airport database was manually rebuilt and afterwards
          the “Airport database update” setting was changed from Manual to
          Automatic, then the database would be unnecessarily rebuilt. This
          should be fixed now. (Florent Rougon)
[USABILITY] Improve some tooltips of the Preferences dialog. (Florent Rougon)
[FEATURE] Update the German translation. (chris_blues)

1.8.0
[FEATURE] New “Airport Finder” dialog. This dialog, accessible under the Tools
          menu, allows one to easily find airports using various criteria:
          distance to a chosen, “reference airport”; number of land runways,
          water runways, or helipads; length of the longest or shortest runway
          in the airport, etc. Results are listed in a table giving these
          criteria for each airport as well as the initial and final bearings
          for the shortest path from or to the reference airport. The table of
          results can be sorted according to airport ICAO code, name or any of
          the aforementioned criteria (click on a column header to sort
          according to the corresponding field; click a second time on the
          same column header to reverse the sort order).

          The Airport Finder dialog uses a new widget set for airport
          selection, that is mainly based on Ttk's Treeview widget. See
          <http://forum.flightgear.org/viewtopic.php?f=18&t=27054&p=269261#p268159>
          and the following message for more details. (Florent Rougon)
[FEATURE] Add the number of land runways, water runways, helipads, plus the
          minimum and maximum runway lengths for each airport to the apt
          digest file (aka “airport database”). This allows to perform quick
          searches over all airports known from apt.dat using these criteria
          (used in the Airport Finder dialog). The format version of the apt
          digest file changed from 1 to 2 to reflect this change. Migration
          for users should be completely automatic. (Florent Rougon)
[USABILITY] Previously, when in carrier mode, clicking on a different airport
          in the airport list didn't really select it, as it didn't leave
          carrier mode. This is not the case anymore. (Florent Rougon)
[USABILITY] Allow resizing the main parts of FFGo's main window by dragging
          with the mouse (this uses a Ttk PanedWindow). (Florent Rougon)
[BUGFIX]  More tolerant parsing of apt.dat, in order to make it possible to
          use current apt.dat files distributed at
          <http://gateway.x-plane.com/NOTAMs>. (Florent Rougon)
[MAINT]   Tolerate invalid smoothness values in apt.dat. This is not really
          needed, since invalid values only cause an error when looking up
          buggy runway metadata, but this will allow users to access the rest
          of these particular runway metadata... Change mainly motivated by
          <http://gatewaybugs.x-plane.com/browse/XSG-1218>. (Florent Rougon)
[BUGFIX]  Fix calculation of airport centroid coordinates. Use n-vectors to
          compute the latitude and longitude of the centroid of each airport.
          The previous method, a simple arithmetic mean, could give incorrect
          results with airports having runway ends located on either side of
          the 180° meridian or very close to the North or South pole (not that
          I encountered any such problem, but I prefer a correct method, all
          the more since the performance impact is negligible).
          (Florent Rougon)
[BUGFIX]  Fix wrong unit for runway width in apt.dat v850 and later data. In
          v850 format, runway widths and helipad lengths and widths are given
          in meters, whereas in v810 format, they were given in feet. This led
          to confusion and before this version, runway widths were wrongly
          converted as if they had been given in feet (for > v810 data). This
          is now fixed.

          In runway tooltips, print the length and width first in meters, then
          in feet, instead of the other way around (since this is how they are
          specified in the primary source...). (Florent Rougon)
[MAINT]   Behind-the-scenes tooltip improvements. Most notably, the new
          TreeviewToolTip class allows to have dynamic tooltips in the
          Treeview widgets used in the new Airport Finder dialog.
          (Florent Rougon)
[FEATURE] Update the German translation. (chris_blues)

1.8.1
[BUGFIX]  Support MagneticField from GeographicLib versions < 1.39. In these
          versions, the MagneticField program doesn't support the special
          string "now" for the time field. Use the current date in order to
          support these versions (i.e., released before 2014-11-11).
          (Florent Rougon)
[BUGFIX]  Layout improvements: make sure that the most important widgets in
          FFGo's main window are the last to be shrunk when the window is too
          small to display all of its widgets at their natural size. Most
          notably, the frame containing the "Run FG" button could be
          completely invisible in version 1.8.0 if started with a main window
          that is not very tall. With this change, the text and list widgets,
          as well as the aircraft thumbnail, are all shrunk before starting to
          “touch” to any of the buttons or labels. (Florent Rougon)
[BUGFIX]  Fix wrong line numbers in error reports for index-based apt.dat
          requests. AptDat.readAirportDataUsingIndex() used to seek into the
          apt.dat.gz file using the specified index, but it did not modify
          AptDat.lineNb accordingly. As a consequence, the line numbers for
          error reports concerning apt.dat parsing raised by this method were
          usually wrong. In order to properly fix this, it has been necessary
          to modify be the apt digest file format a little bit (storing a line
          number along with each index value), and therefore to change its
          format version from 2 to 3. Migration for users should be completely
          automatic. (Florent Rougon)
[DOC]     Add notes concerning the 'pkg_resources' Python 3 module to
          docs/INSTALL/INSTALL_en. Users might need to install this module in
          somewhat unusual situations. (Florent Rougon)

1.9.0
[FEATURE] Use the new airport chooser (widgets.AirportChooser) for the airport
          list in the main window. The airport list in the main window used to
          be a simple list; replace it with a real multicolumn widget (Ttk
          Treeview), reusing the logic already implemented in
          widgets.AirportChooser. This fixes small alignment problems in the
          previous implementation (due to the ICAO codes not having the same
          display width), allows one to sort the airport list by ICAO code or
          airport name, in ascending or descending order, with a simple click
          on the relevant column header, and brings the nice logic from
          widgets.AirportChooser to the main window airport list (such as
          preferring an exact match on ICAO code when there are also substring
          matches on airport names for a given search string).

          The airport chooser has also been modified to better handle
          navigation keys (Up and Down arrows, Page Up and Page Down, Home and
          End). Most notably, holding down one of the first four mentioned
          here should work as expected (this might need some tuning, because
          the thing is to delay the time-consuming task of updating everything
          that depends on the selected airport enough so that Tk has
          sufficient time between two consecutive “arrow-pressed” keyboard
          events to refresh the GUI---please report if that doesn't work for
          you in an airport list [the aircraft list still has this little
          problem when an arrow key is held down, I know]). (Florent Rougon)
[FEATURE] New GPS Tool dialog allowing one to find the distance, initial and
          final bearings for the shortest path between two given airports.
          This dialog should be more convenient than the Airport Finder dialog
          for the cases where you already know the start and destination
          airports you are interested in, and you just want to get the results
          for these airports. Or you want to check several pairs of airports,
          and you know precisely *which* ones you want the calculations to be
          done for.

          The dialog also computes the flight duration for a given ground
          speed, and vice versa. It reuses the AirportChooser widget already
          used in FFGo's main window and in the Airport Finder dialog.
          (Florent Rougon)
[FEATURE] New setting: "Automatically scroll the Output Window". Add a
          checkbox to the Miscellaneous tab of the Preferences dialog to
          control whether FFGo should automatically scroll the FlightGear
          Output Window to the end whenever new text is received from
          FlightGear's stdout or stderr stream. This corresponds to the config
          file parameter AUTOSCROLL_FG_OUTPUT. (Florent Rougon, feature
          request by pommesschranke/d-laser)
[FEATURE] Add option to translate --parkpos into --lat, --lon and --heading.
          This option can be enabled using the “Fake the --parkpos option”
          checkbox found in the Miscellaneous tab of the Preferences dialog.
          It is useful when --parkpos is broken in FlightGear (which is
          currently the case in the 'next' branch of FlightGear's Git
          repository). (Florent Rougon)
[BUGFIX]  Fix bug preventing FFGo from starting when there was no translation
          file for the current locale (thanks to legoboyvdlp for the report).
          (Florent Rougon)
[BUGFIX]  Add missing 'tkinter.messagebox' import for 'showerror' in
          ffgo/fgdata/parking.py. The problematic code could only be reached
          when FFGo opens an erroneous groundnet file. Problem was: the error
          reporting could not be done properly. (Florent Rougon)
[BUGFIX]  Fix two options from the Preferences dialog whose lastest-updated
          values were used by FFGo even if the dialog was closed with Cancel.
          These are the 'Remember the main window position' and 'Automatically
          scroll the Output Window' options. (Florent Rougon)
[BUGFIX]  Airport Finder: display an explanatory error message when the user
          chooses an airport that is not present in FFGo's main window due to
          the fact that the “Show installed airports only” option (from the
          Settings menu) has been enabled. (Florent Rougon)
[BUGFIX]  Hide item-specific tooltips when the underlying List or Treeview is
          scrolled. Once a list or Treeview is scrolled, item-specific
          tooltips are likely not to match the item under the mouse pointer
          anymore. For this reason, hide the item-specific tooltip whenever
          each of the following Lists or Treeviews is scrolled: aircraft and
          airport lists in FFGo's main window; “reference airport” chooser and
          results table in the Airport Finder dialog (the GPS Tool dialog has
          never had this little problem AFAICT). (Florent Rougon)
[USABILITY] Main window: set the initial focus in the airport search entry. I
          think this is the most useful thing to do in general.
          (Florent Rougon)
[USABILITY] Add a colored, disabled (i.e., not clickable) and empty header to
          the carrier popup menu. This makes it more visible, visually similar
          to the runway and parking popup menus, and avoids it disappearing in
          a flash with the first entry being accidentally selected (i.e.,
          'carrier = None', return to airport mode) if the user just clicked
          without holding the left mouse button down. (Florent Rougon)
[FEATURE] Update the German translation. (chris_blues)

1.9.1
[FEATURE] Installing on Windows should create an ffgo-noconsole.exe executable
          (typically in C:\PythonXY\Scripts) that doesn't open any terminal
          window (“console”) when run. (Florent Rougon)
[BUGFIX]  Fix a bug in the Airport Finder: if the airport search text in
          FFGo's main window was non-empty, the “Choose selected airport”
          button of the Airport Finder dialog could fail to find the chosen
          airport. (Florent Rougon)
[BUGFIX]  Fix the “Open Log Directory” feature to hopefully work on Windows
          and MacOS X (in addition to Unix-like systems, of course).
          (Florent Rougon)
[FEATURE] Update the German translation. (chris_blues)

1.10.0rc1
[MAINT]   Rebase widgets.AirportChooser on a generic, abstract class:
          widgets.IncrementalChooser. (Florent Rougon)
[FEATURE] Reimplement the aircraft chooser using widgets.IncrementalChooser.
          This improves its behavior in several respects:
            - smarter automatic selection of an aircraft when the search query
              is changed, based on the new search query and the previous
              selection;
            - better handling of navigation keys (up and down arrows, Page Up
              and Page Down, Home and End; most notably, holding down one of
              the first four of these, and pressing one of the last two should
              have the expected effect);
            - ability to display several proper columns of data and sort by
              clicking on a column header;
            - short delay before starting to search after the search query is
              modified, in order to allow smooth typing in the search field.
          (Florent Rougon)
[FEATURE] Aircraft chooser: approximate matching of aircraft names

          * With this commit, you don't have to remember that the 'f-14b'
            aircraft has a hyphen, the 'EC-137D' also, but not the 'ec130b4'
            nor the 'ec135p2'. Characters in the following string are simply
            ignored during the first phase (filtering) of an aircraft search:
            ' -_.,;:!?' (the list starts with a space). This means that an
            aircraft search query can find an aircraft even if it has hyphens,
            underscores, etc. missing or in excess compared to the actual
            aircraft name.

          * Note that this only concerns the aircraft list *filtering*. Given
            a set of aircrafts that match the search query, one of them may be
            automatically selected after the aircraft list is filtered if:
              - it is either an exact (case-insensitive) match of the search
                query (and for this purpose, characters such as hyphens and
                underscores are *not* ignored: autoselection requires an exact
                match);
              - or it is the previously-selected aircraft (option only taken
                if the first one couldn't be satisfied, and of course if the
                previously-selected aircraft is in the just-updated, filtered
                list).

          * As said, both types of matching are case-insensitive:
              1) the approximate matching process used to determine which
                 aircrafts will be displayed in the aircraft list after a
                 change to the search field;
              2) the exact matching process used to autoselect the “best”
                 among the matches found in 1), falling back to the first one
                 if none of these fulfills any of the two conditions given in
                 the previous paragraph.
          (Florent Rougon)
[FEATURE] Airport and aircraft statistics (“use counts” / “visit counts” for
          customizable periods)

          * New classes AirportStatsManager and AircraftStatsManager that are
            used to maintain lists of dates when each airport was visited
            (resp. each aircraft used).

            Old data is automatically expired (new config file parameters
            AIRPORT_STATS_EXPIRY_PERIOD and AIRCRAFT_STATS_EXPIRY_PERIOD).
            Counts of how many days in a chosen period (new parameters
            AIRPORT_STATS_SHOW_PERIOD and AIRCRAFT_STATS_SHOW_PERIOD) each
            airport has been visited or each aircraft used are stored in
            memory and maintained by the AirportStatsManager and
            AircraftStatsManager classes. These counts are obtained from the
            dates of visit/use of each airport/aircraft by counting the dates
            selected with AIRPORT_STATS_SHOW_PERIOD and
            AIRCRAFT_STATS_SHOW_PERIOD.

          * All this data is loaded from $USER_DATA_DIR/Stats/airports.json.gz
            and $USER_DATA_DIR/Stats/aircrafts.json.gz when FFGo is started,
            and saved to the same files when it is quit. It is also saved just
            before the airports/aircrafts set is possibly changed and reloaded
            afterwards in order to avoid losing data stored in the .json.gz
            files if it can't be applied to the current airports/aircrafts
            set.

          * Add a new column to the aircraft list showing how many days each
            aircraft has been used at least once (“use count”) during the
            period defined by AIRCRAFT_STATS_SHOW_PERIOD (which is interpreted
            as a number of days). Similarly, add a column to the airport list
            showing how many days each airport has been visited at least once
            during the period defined by AIRPORT_STATS_SHOW_PERIOD (again,
            number of days). The use (resp. visit) count for an aircraft
            (resp. airport) is incremented whenever FlightGear is started from
            FFGo with this aircraft (resp. at that airport). This is only done
            in memory until $USER_DATA_DIR/Stats/airports.json.gz and
            $USER_DATA_DIR/Stats/aircrafts.json.gz are saved, as mentioned
            above.

          * By default, these two .json.gz files are stored in the most
            possible compact format (no space or newline to separate
            syntactical elements in the uncompressed data stream). For users
            who would like to examine or even modify these files (for
            instance, in order to keep aircrafts use counts despite having
            changed one's aircraft paths), FFGo supports a new command-line
            option: '--save-stats-in-pretty-form' (pretty long, but I surmise
            it should not be needed often). Start FFGo with this option, then
            either do a reset (“Reload config file”) or quit FFGo; at this
            point, both .json.gz files should be in human-readable form.

          * AIRPORT_STATS_EXPIRY_PERIOD and AIRCRAFT_STATS_EXPIRY_PERIOD
            default to 3652 days (ten years). AIRPORT_STATS_SHOW_PERIOD and
            AIRCRAFT_STATS_SHOW_PERIOD default to 365 days (one year).

          * The Preferences dialog has a new “Statistics” tab allowing to
            configure these four parameters.

          * This feature was presented in this message on the FlightGear
            forum (maybe it has better/different explanations...):

              http://forum.flightgear.org/viewtopic.php?f=18&t=27054&p=275923#p275774
          (Florent Rougon)
[FEATURE] Change the initial sorting of the aircraft and airport lists. These
          two lists in FFGo's main window are now initially sorted:
            - primarily, by decreasing use/visit count;
            - secondarily, by aircraft or airport name for aircrafts/airports
              having the same use/visit count.

          Note that this only concerns the initial sorting at FFGo startup; it
          is always possible to click on a column header to change the sort
          order.
          (Florent Rougon)
[BUGFIX]  Fix loading of aircraft thumbnails:
            - fix a long-standing little bug (present in FGo!): aircraft
              thumbnails that don't have 171×128 dimensions are now displayed
              correctly (appropriately scaled to fit in the 171×128 space
              reserved for that). For maximum performance, this is bypassed
              for aircraft thumbnails that already have the desired
              dimensions.
            - replace the catch-all “except:” clause with a more specific
              “except OSError:” one. If another type of error is raised in
              that place, it should be fixed where the actual problem belongs,
              instead of sweeping the whole thing under the rug.
          (Florent Rougon)
[BUGFIX]  Fix detection of FlightGear version: debug builds of FlightGear have
          a different 'fgfs --version' output than normal builds, and that
          extented output wasn't properly recognized by FFGo. (Florent Rougon)
[BUGFIX]  Pass --fg-root when running 'fgfs --version' to avoid the new popup.
          FlightGear 2016.1.0 (from February 2016) can spawn an annoying popup
          dialog when 'fgfs --version' is run, which is very confusing for
          FFGo users and broke FFGo's detection of the FlightGear version
          (this popup is apparently meant to let the user graphically choose
          the FG_ROOT path to use in the built-in Qt lancher). Pass the
          --fg-root option as well (assuming Config.FG_root is non-empty,
          otherwise FlightGear version detection is not attempted) to work
          around this new behavior of 'fgfs --version'. (Florent Rougon)
[BUGFIX]  Run 'fgfs --fg-root=... --version' in the directory defined by
          FG_WORKING_DIR (which can be configured from the Settings dialog).
          This is a good idea, as FlightGear has a nasty tendency to leave
          core files around, even when just trying to print the version...
          (Florent Rougon)
[MAINT]   Preferences dialog: use a Ttk Notebook widget instead of the
          home-made one. This will be better for maintainability, and
          hopefully is also an improvement regarding ergonomy and appearance
          on various OSes. (Florent Rougon)
[MAINT]   Preferences dialog: reimplement the whole dialog layout using the
          grid() layout manager instead of pack(). This allows to have proper
          horizontal and vertical alignments in the new “Statistics” tab. This
          should also make it easier to add things or make changes to the
          dialog in the future. Also replace Tk widgets with Ttk ones whenever
          there is a Ttk equivalent, and get rid of the
          'from tkinter import *' wildcard import. (Florent Rougon)
[USABILITY] Enable automatic line wrapping in the About box. Otherwise, the
          box can get very large depending on the text we display inside...
          (Florent Rougon)
[USABILITY] Update the translated template config files
          ffgo/data/config/config_<language-code>.

          * Remove the --multiplay option from all templates: nowadays, most
            people should connect using the in-sim menu when they are ready
            (not on a runway, not on someone else's aircraft, and ready to
            answer to an eventual ATC operator, for a start). Other people can
            find the option on the FlightGear wiki or forum, as well as in the
            output of 'fgfs --help' anyway.

          * Update the French template: it should now be up-to-date except for
            --terrasync-dir which is not mentioned (the option may cause
            problems due to new permission restrictions in current FlightGear
            from Git 'next', but this is still in flux so, for now, this is
            not translated).
          (Florent Rougon)
