PhotoGrok Changes

2.83 04/15/2024
   * Removed the information dialog that appears when selecting the 
     dynamic thumbnail checkbox in prefrences. Instead, any displayed
     thumbnails will be refreshed when Preferences dialog is closed.
   * Fixed (harmless) "Context" exception in graal.js when applying 
     script changes after a painter has been set.
   * "Image Not Found" message not displayed when buffering turned off
     in preferences (and image missing from storage).
   * BufferedPainter now wraps painter names with "BUFFERED" label.

2.82 04/04/2024
   * Added "Fullscreen Settings" to the "Tools" menu. Choose which monitor
     and resolution to display fullscreen images and slideshows. Make
     sure your gfx drivers are up to date if using this feature. The main
     interface is disabled until slideshows are ended via key/mouse press.
   * Added option to present a warning if opening a tree node exceeding
     a user-defined number of thumbnails. Default is 10,000 thumbnails.
     This helps prevent performance degradation when loading a large number
     of thumbnails under a single folder. User is presented with an option
     to continue loading thumbnails or stopping at the defined limit.
     This only affects the presentation of thumbnails. All information is
     still present in the tree. A good value is dependent on available
     memory. See "Advanced" tab in preferences.
   * Added an option to dynamically load/unload thumbnail images while the
     thumbnail screen is actively being scrolled. This allows for a extremely
     large number of thumbnails to be loaded (many tens of thousands when
     PhotoGrok is running in 2gb of memory - the default on an 8gb machine).
     See "Advanced" tab in preferences. Off by default.
   * Fix for rare but annoying "stuck" scrollbar bug.
   * Fixed Filler filter to support zooming. Added a slider to control
     vertical line spacing in the Squint Ascii Art plugin.     

2.81 03/28/2024
   * Fixed regression where windows and linux users could use native
     file dialogs (directory selection not possible). Back to Mac only.
   * Added "Miscellaneous" and "Advanced" tabs to preferences. Some
     reorganization of existing preferences.
   * Added option to turn off image caching in "Advanced' tab. Replaces
     photogrok.nocache property and --nocache program argument. Slower
     performance but may help in low memory/high megapixel situations.
   * Renamed "ExifTool" pane to "Metadata" as it displays more than just
     ExifTool tags.
   * Added option to display catalog tags in the "Metadata" pane. This
     includes all tags saved in the catalog for a selected image (when
     viewing images from a catalog tree).
   * Shortcut keys can be defined for fullscreen/slideshows. See "anim.js"
     code for examples.
   * No longer show error dialogs when an image isn't found - for example,
     unattached storage. Displays message on image pane instead.
   * All setPainter() script calls are queued into event dispatch thread
     for more reliable scheduling.
   * Timer now returns a TimerTask object so specific tasks can be
     canceled (in addition to Timer.cancel). See Java's Timer/TimerTask APIs
     or "anim.js" for examples.
   * Rewrote "anim.js" plugin to display more advanced filter animations.
     Toggle via menu or shortcut keys. Some animations require a fast
     computer for good performance.
   * A setPainter() call in a top-level script would not fire an 
     "onPainterChanged" event registered in the same script.
   * "Continuously Scan Folders" always searched subdirectories ignoring the
     current setting in Folder Manager.
   * Added "Stamp" and "Quantize/Dither" filters to "Filters" and "Thumbnail
     Fiters" User menus (via jhlabs.js plugin).

2.80 03/24/2024
   * Interactive ascii art plugin "squint.js" and simple animation
     plugin "anim.js" added. See plugins.
   * Most plugins have been refactored to make use of new functionality
     and allow better interoperability.
   * Added "photogrok.nocache" property for low-memory environments.
     "-Dphotogrok.nocache=true" will turn off image caching. Can also
     be activated with "--nocache" program argument.
   * Added "photogrok.maximgsize=[width]x[height]" property for low-memory
     environments like 1gb Raspberry Pi. Can also be activated with
     "--maximgsize=[width]x[height]" program argument. Using this forces
     PhotoGrok to scale images as they're read in. For example, if
     "--maximgsize=1920x1080", then high megapixel images are read in
     at a maximum size of 1920x1080 pixels. There can be quality loss and
     exporting images will use this lower resolution.
   * Drop down session history for "Evaluate JS" dialog added.
   * Painters are now named and can be retrieved in scripts with getName().
     Calling setPainter(painter, id) will assign id as name. Painters
     retrieved from JSI.getPainter() will always be named. To name a painter in
     your script before it is used, use the returned painter from  
     JSI.namedPainter(painter, id). This feature is backwards compatible
     so if a painter isn't named, PhotoGrok will make one based on hashcode.
   * eval functions in "graaljs" are now cached for increased performance.
   * Added Timer to create thread safe timers for executing functions after a
     delay or repeatedly on a set interval. Timers are automatically cancelled
     when a script context is re-evaluated. See "anim.js" plugin. There are
     two functions on a Timer: schedule(function, long) to run a function once
     after waiting x milliseconds and schedule(function, long, long) to
     run a function repeatedly after waiting.
   * Removed "jdkrhino" engine. Anyone still using Java 6 or 7 should just use
     the included "rhino" instead.
   * onPainterChanged callback now returns the new painter as third argument so
     function onPainterChanged(name, isnull, painter). Redundant but backwards
     compatible.
   * Shortcut keys can now be assigned to functions using 
     JSI.addShortcut(function, int, int). See "squint.js" or "tone.js" plugins.
     See Java doc for more details on KeyCode and Modifier ints.
   * About dialog now shows script engine and current painter.
   * When not explicitely configured, the default script engine is selected in
     the following order: graal.js, nashorn and rhino (depending on availability).
     

2.79 03/11/2024 - the javascript update
   * Updated Rhino js engine to latest version.
   * Scripts and plugins no longer need to wrap Graphics2D
     objects in Gfx(). Existing plugins adjusted.
   * Performance boost in Rhino by compiling user scripts.
   * 'graal.js' engine no longer needs to run in nashorn-compat
     mode. The reason for keeping both 'graal.js' and 'graaljs'
     scripting is that 'graaljs' offers more config options and
     'graal.js' can be faster in certain scenarios.
   * 'graal.js' engine now accepts @graalopts. See scripts.txt.

2.78 03/08/2024
   * New graal.js scripting now supported. See scripts.txt
     for details. Plugins have been updated.
   * Changed System.err output color in the console.
   * Keyboard shortcuts could stop working in some
     macOS setups.
   * Canceling a file system tree operation would cause an
     error in windows.
   * SwingRequest function now takes a function that returns
     a JComponent instead of a JComponent for proper thread
     control. See tone.js for an example.

2.77 03/04/2024
   * Added showBrowser(url) javascript function.
   * Improved quality of GraphicsMagick conversions.
   * Removed outdated Jimi conversion library. Replaced
     with TwelveMonkeys imageIO for tiff, webp and psd.
     Install GraphicsMagick and add TIFF, WEBP, PSD, etc
     to GraphicsMagick in preferences for fastest display.
   * Path to GraphicsMagick not found in full installs.
     
2.76 02/27/2024
   * Allow full installs to find plugins directory.
   * Workaround for slow tree performance on some platforms.
   * Changed labels to more clearly differentiate file
     system from catalog (database) operations.

2.75 10/31/2023
   * Use default web browser to display maps if JavaFX
     browser not available.
   * Full screen fix for some non-oracle Mac JVMs.

2.74 10/30/2023
   * Memory optimization to mitigate some graalvm issues.

2.73 10/27/2023
   * Restore console menu item.
   * Fix problem that was breaking scripts.

2.72 08/15/2023
   * Unlimited named user tabs. Existing settings with
     "User 1" and "User 2" tabs are preserved. Right-click
     on tags in the exif pane and select "Add To New Tab".
   * Plugins are automatically loaded with new installs.
     Edit or remove loading code with CTRL+SHIFT+J.
   * The thumbnail frame background can be set from a
     script using new "frameColor" property in PainterProps.
     See "framer.js" plugin for an example.
   * Change mouse wheel zoom scroll increment.
   * Support for webp images. Add "webp-imageio-0.1.6.jar"
     from internet to PhotoGrok's "lib" directory to enable.
     Default jar works with Windows, Linux and Mac amd64. 
     There is a dynalib for Mac arm available if you dig.
   * Fixed some scrollbar oddities on Mac OS X.
   * Added checkbox to disable rollover images to preferences.
   * Added "framer.js" and "datefilter.js" to plugins. Added 
     "setOverlayPainter" function to "filler.js" plugin. See
     Help->Plugins menu.
   * Added photogrok_version variable for scripts. 

2.71 04/30/2023
   * Fixed 'loadTree' (with non-null function argument)
     and 'background' functions when using graal.js.
   * Added sizer.js to calculate tree, node and file sizes.

2.70 04/11/2023
   * Dialogs can be created from scripts. See tone.js.
   * Optimize multi-tab filters.
   * Compile js code for graal.js and nashorn - big
     performance boost in graal.
   * Sort custom tags displayed in Exif Pane.
   * getPainter() calls in example plugins no longer
     return buffered images. Use BufferedPainter in util.js.
   * New example plugins: tone.js and film.js. Algorithms
     created using chatGPT.

2.69 12/07/2022
   * When in full screen view mode, ctrl+c will copy
     the current image to the clipboard including 
     any crop, positioning and filters for apps
     and systems that support it. It's a simple way to
     make desktop backgrounds (for example).
   * Changed behavior for caching xz files. xz files
     are now decompressed to photogrok's tmp folder
     when opening in the tree. (Be sure you have the disk
     space). These tmp files are deleted when PhotoGrok 
     exits. There may be file name collisions and unusual
     behavior if opening multiple xz files with the same
     name. The goal is to speed up operation. Comments on
     this change are welcome - assuming anyone uses it.
   * onLoadSettings scripting function is now executed
     when PhotoGrok starts.
   * Support for add-on nashorn for JVMs that no longer
     include Nashorn. The modules to include when
     launching PhotoGrok will be documented online.

2.68 05/19/2020
   * Fixed issue validating custom tags which could
     prevent new tags from being saved.

2.67 04/10/2020
   * Custom tags are now saved in a single json file
     instead of being included in each setting file.
     Tags defined in setting files are migrated when
     first loaded. Duplicate tag names with different
     contents are migrated with _1, _2, etc appended
     to the name. This change is to reduce confusion
     of having different tag sets in different
     setting files. Previously it was difficult to
     keep custom tags consistent across setttings.
   * Changes to js image caching. See ComboPainter
     and BufferedPainter functions in Util.js for
     simplified image caching in script.
     BufferedPainter allows Buffering any Painter
     without additional complex logic:
     setPainter(new BufferedPainter(myPainter))
   

2.66 09/12/2019
   * request() without callback broken since
     version 2.64.
   * Minor updates to plugins.

2.65 09/11/2019
   * Added an "Evaluate JS" dialog to the Tools
     menu. Enter JS code that runs in the current
     context. Example: "showMessage('hello')". 
     Useful for calling functions on plugins.
   * addMenuCommand did not work on graal.js.
   * Problem script evals now return "Script Error"
     instead of throwing exceptions.
   * Script initialization is now a part of the
     startup dialog sequence.
   * Updated documentation and new plugins. See
     scripts.txt for more information.
   * The newer version of rhino included is now the
     default script engine on older jvms.

2.64 09/06/2019
   * Now runs in Java 11+. On Java 11+, JavaFX
     must be configured manually in order for
     maps and scripts using JavaFX to work.
   * PhotoGrok can use graal.js for JavaScript when
     available (specify "@scriptengine graal.js").
     See scripts.txt for information on changes.
   * elapsedTime function added to jdk rhino for
     Java 6 and Java 7.

2.63 08/26/2019
   * Write thumbnails as png files instead of jpg
     for better compatibility with some open jdk
     distributions.
   * Improve verbiage of ElapsedTime tag.
   * Added elapsedTime(date1, date2) script function.

2.62 05/18/2018
   * Scripts are now initialized at startup instead
     of when building a tree.
   * readFromURL function didn't work on JDK 6.
   * Show error dialog and quit tree build if JS
     custom tag or filter fails with syntax error.
   * @rhinoopts directive was being ignored.
   * addTreeFilter, removeTreeFilter and
     registerCallback functions added for future
     plugin support.
   * Script context wasn't being reset when switching
     from a setting with a script to one without.
   * Fixed launch warning on OS X when using the 
     platform neutral bash file.
   * addUserCommand menus with submenu param "Help"
     appear under the Help->Plugins menu.
   * Allow the same custom tag to be used multiple
     times in tree.
	
2.61 04/09/2018
   * PhotoGrok sessions without a script were unable
     to build a tree. Bug introduced in 2.60 fixed.

2.60 04/05/2018
   * Allow Java 6 and 7 to run in the java default
     script engine (pre 2.59 behavior). To use the
     more recent mozilla rhino on those jvms, use 
     the '@scriptengine rhino' directive. See the
     included scripts.txt file.
   * Fixed performance issue when using javascript
     filters with mozilla rhino.

2.59 04/04/2018
   * setScanDirs script function was broken in 2.58.
   * Updated mozilla rhino script engine for older
     Java installations. Users on Java 8 and higher
     can optionally run rhino or nashorn.
   * Added script preprocessing directives to select
     script engine and more. See scripts.txt.
   * Added the following callback methods:
     onImageChanged(), onImageResized(), onImageDragged()
     and onImageZoomed(). See scripting page.
   * Do not paint gray background rect if no viewer tags.
   * Fixed multiple console dialog display bug.
   * script_engine_name property returns engine name.
   * Added getPanelImageProps to retrieve position and
     view information for non-painter screen updates.
     See tesseract example.
   * Added updateStatus callback allowing non-painter
     webview scripts to send notification messages.
     See tesseract example.

2.58 03/26/2018
   * Fixed issues with Java 10 version check in startup
     scripts and main program.
   * Fixed nashorn scope issue in Java 10.
   * Added NOTTHREADSAFE directive for scripts creating
     thumbnail painters that aren't thread safe.
   * Set Nashorn --scripting flag to allow Nashorn
     specific extensions like load() and readFully().
   * Added scripting API to access embedded browser. This
     allows browser-based js libraries to manipulate 
     and query images. See face detection example.
   * Introduced new painter classes for browser dom
     access and object caching. See examples.
   * Partially implemented HTML5 Canvas in Java 2D.
   * Reduced paint calls to main image panel.
   * Separated nashorn and rhino initialization for
     easier maintenance.
   * Added readFromURL function to load remote scripts
     from the web.

2.57 02/25/2018
   * Implemented a proper JavaScript code editor!
   * Added script editor and console items to Tools menu.
   * Anti-alias text now rendered in preview painter.
   * Created default set of catalog tags when none has 
     been defined. This will vastly improve performance
     when cataloging a large image set.
   * Added backwards compatible change to addMenuCommand
     and addUserCommand script functions. These can now
     accept two optional parameters, "menu" and "submenu"
     that represent the calling menu items respectively.
   * Create thumbnails and preview images with image type 
     ARGB when a corresponding painter is set. This allows
     filters requiring an ARGB image to complete.
   * Fixed z-order of non-native file chooser on Custom
     Tag Manager dialog on Mac.
   * Console dialog is now non-modal.
   * Added additional doc and license files to distribution.

2.56 02/21/2018
   * Allow optional native file chooser on all systems.
   * Added console to output text from scripts and java
     errors when they occur. Open with: CTRL+SHIFT+C
   * Added JHLabs image filters. Currently only accessible
     from scripts. See scripting examples.
   * JavaScript API additions and enhancements. Most notable
     is the ability to add a top-level "User" menu from
     scripts. See scripting documentation and new examples.
   * Changed version check for upcoming Java 10 and beyond.

2.55 01/14/2018
   * Add a separate painter for rollover previews. Use 
     setPreviewPainter (similar to setThumbnailPainter)
     to change the popup preview image from JavaScript.
   * Fixed issues with the max number of allowed settings.
   * Clear custom tags when loading a setting without
     any custom tags.
   * Fixed dialog z-order. In some circumstances a dialog
     would open behind an open dialog.
   * Fixed bug with when using native mac file chooser.

2.54 01/11/2018
   * Workaround found for Mac OS X menu bar issues. Mac
     users on High Sierra should make sure they have the
     10.13.1 update in order to see the application menu.
   * Restored original font for OS X users.

2.53 01/09/2018
   * Mac OS X menu items fail on Java 9. As a workaround,
     menus on Mac Java 9 have been moved to traditional
     java window-based menus until this bug is fixed. 
     Mac users should use Java 8 for native menus. 
   * Changed Mac menu shortcut accelerator keys to use the
     Mac command key. Some keyboard shortcuts have changed.
   * Use different font for Apple Java to accomodate 
     command key characters in menus.

2.52 01/08/2018
   * PhotoGrok would not start on Mac Java 9.0.1.
   * copyTree JavaScript function prints in progress 
     file names to status bar.

2.51 10/04/2017
   * Fixed Mac specific menu behavior on Java 9.
   * Moved Settings to it's own menu for faster access.

2.50 10/03/2017
   * Changes to work in Java 9. Currently, Mac users 
     on Java 9 will experience some menu limitations. 
     Notably preferences are located under 'Tools' and
     no fullscreen option is available. This is under
     development.

2.49 07/04/2017
   * Sort bar chart in tree node order.

2.48 07/31/2016
   * Show warning if Windows user selects exiftool(-k).exe.
     Must be renamed to exiftool.exe per ExifTool doc.
   * Improve caching when traversing tree to view images.
   * Scroll thumbnail screen to current image when parent
     node is selected in tree.
   * Updated ExifTool to version 10.20. It may be necessary
     to re-index catalog if tag indexes don't match.

2.47 03/22/2016
   * Do not timeout "Catalog Modified" status message.
   * Extend timeout on "Low Memory" status message.
   * 'Copy Value' option on EXIF pane now only appears when
     one item selected.
   * Improve memory settings for Mac and Windows
     distributions (and Mac/Linux standalone launch script).
     PhotoGrok works best with a 64-bit JVM and at least
     4GB of system memory. Windows users running a 32-bit
     JVM may want to use the platform agnostic version and
     tweak photogrok.bat for optimal memory allocation.

2.46 12/31/2015
   * ctrl+m zoom to mouse pointer works in single image
     fullscreen mode.
   * Sort tags on custom tag manager.
   * Editable filter combo box shows all ExifTool tags.
   * Additional rollover help on preferences dialog.
   * Added option to continuosly scan folders for
     catalog changes.
   * Text fields now have cut/copy/paste popup menu.
   * Added set button to catalog importer. This allows
     the required tags to be set without importing.
   * Added "Copy Value" option to exif popup menu.
   * Fixed custom tag error related to invalid JavaScript.

2.45 11/22/2015
   * ctrl+m zooms to mouse pointer location when viewing
     images (same as middle mouse button).
   * refreshFile script function now removes any cached
     thumbnail image.
   * Improved thumbnail scrolling speed on OS X and Linux.
   * Sorting non-catalog tree by DateTimeOriginal (see
     preferences) now works with multiple directories.
   * JavaScript execCommand now returns an object with
     'returnCode' and 'response' string array. See scripting
     page for details.

2.44 11/09/2015
   * Numeric tags like ISO are no longer sorted as strings.
   * Fixed issue with the refreshFile JavaScript function.
   * Removed Java 7 specific builds. PhotoGrok still works
     in Java 6 and 7 but Java 8 is required to show maps.

2.43 11/04/2015
   * Option to sort tree by DateTimeOriginal in non-catalog
     (real time) mode.
   * Support for '*' extension wildcard in catalog mode.
   * Fixed shift arrow on advanced catalog import dialog to
     include ExifTool tags required by any custom tags.
   * Support for viewing files compressed in .xz format.
   * Many new scripting functions including support for
     running programs, executing ExifTool, adding custom
     popup menu options and xz compression (great for Sony
     uncompressed raws). See the scripting.html page for a 
     complete a list of all changes.
   * Verbiage changes related to catalog import.

2.42 10/14/2015
   * Added ability to set a painter function for
     thumbnails - setThumbnailPainter(painter).
   * Added "Apply Painter" checkbox to allow exporting
     images manipulated by a painter function.
   * Added getImageRect(BufferedImage) function to
     PainterProps to return a Rectangle containing only
     the visible bounds of an image. Useful optimization 
     for magnified images. See 'psychedelic' script.
   * Renamed Catalog Manager to Catalog Importer.
   * Optimized catalog import process for small speedup.
   * Many miscellaneous bug fixes.

2.41 07/13/2015
   * Enhancements to scripting API including ability to
     automate functions and draw on the display (see the
     histogram example on scripting page).
   * Changes to script execution to support new functions.
     Scripts are evaluated when loading settings, saving 
     scripts and building trees/catalogs. Most scripts 
     should be backward compatible but some may need to be
     modified by placing logic in onBuildTree function. See
     scripting page for details.
   * Changed link to point to new FAQ url.

2.40 06/05/2015
   * Added a popup menu to delete files. Confirmation is
     required. If the tree was built from a catalog, the
     image is also removed from that catalog.
   * Recent settings menu now shows the last twenty entries.
   * If "Original Size" and "Include EXIF Data" is checked
     in export preferences, PhotoGrok will now do a straight
     file copy. This is also a workaround to exporting non-
     image files.
   * Updated ExifTool to version 9.90. As always, you can
     configure to use any version of ExifTool on your system.

2.39 02/03/2015
   * Images with ascii tag values greater than 4k were not
     not recorded in a catalog.
   * Binary tags like ThumbnailImage can be exported to a
     file. Right-click tag in exif list and "Export Data".
   * Improved mouse wheel zoom speed.
   * Clicking the center mouse button will toggle max zoom
     to the current cursor location.

2.38 12/24/2014
   * Previously, files of the same name and size were ignored
     in a copy operation. PhotoGrok now does a byte-level
     comparison if the sizes match. Files with the same name
     that are not identical are copied with an  _1, _2, etc.
     appended to the base file name. As before, no files are
     overwritten in a copy operation.

2.37 11/23/2014
   * Added a recent setting menu to the File menu. The last ten
     accessed settings are saved.
   * Ability to move tags from one user tab to the other.
   * Added Preferences backup mechanism.

2.36 09/24/2014
   * Fullscreen shortcut for selected image now CTRL+f. This was
     necessary because the tree and exif list can be searched
     by selected an item and typing. The previous shortcut key
     conflicted with this mechanism.
   * Added a second user tab for tracking tags.
   * Fixed a rare busy cursor bug.

2.35 08/26/2014
   * Pressing F will open a selected image in full screen mode.
   * Reverse slideshow (use left arrow) now loops correctly.
   * Zoom and scroll is now implemented in fullscreen image viewer.

2.34 08/15/2014
   * Added ability to copy images into other applications via the
     clipboard. Copied images can also be pasted into the file system
     on Windows and Ubuntu.

2.33 07/16/2014
   * Added a javascript accessible map for persisting script data
     between tree builds. The Ctrl+Shift+J JavaScript window now
     includes a button to clear the map. A scripting page will be
     added to the web site with useful examples for advanced users.
   * Attempt to fix a rare issue when running under Windows. The
     busy state is not correctly toggled.

2.32 04/24/2014
   * Minor resizing fix.

2.31 04/23/2014
   * Mouse wheel zoom now intelligently zooms to mouse location.
   * Additional Ctrl+Shift+J functions. For example, the following 
     code entered in the Ctrl+Shift+J JavaScript dialog requests 
     a value when a tree or catalog is built. After the operation 
     completes, the entered message is displayed:

     var msg = request("Enter Something");
     function done(){
          showMessage(msg);
     }

     Elapsed Time Example:

     var start = new Date().getTime();
     function done(){
         var elapsed = new Date().getTime() - start;
         showMessage('Elapsed Time: ' + elapsed); 
     }

2.30 04/17/2014
   * Added scripting interface. Ctrl+Shift+J opens dialog for
     entering JavaScript. Any code is executed when a tree is
     created or a catalog is updated. Script can contain 
     variables and functions accessible from JavaScript filters. 
     A simple API allows some interaction with PhotoGrok. The
     web site will be updated with details.

2.29 04/03/2014
   * Fix for js filters in Java 6 and 7.
   * JS optimization.

2.28 03/22/2014
   * Use Java's default js interpreter for filters and
     custom tags. Big speedup on Java 8.

2.27 03/20/2014
   * Accomodate change to Google Map api.
   * Fix for OS X launcher on Java 8.

2.26 03/11/2014
   * If tree is loaded from a catalog, that catalog will
     now be automatically updated if keywords are changed.

2.25 03/04/2014
   * Added "Create Playlist" to thumbnail multi-select.
   * Fixed problem adding keywords from thumbnail screen.

2.24 02/28/2014
   * OS X users now have the option to use native file
     chooser. Java 7 update 12 or higher required.
   * Update ExifTool to version 9.53.

2.23 02/26/2014
   * Fixed issues with spaces in directory names (windows).
   * Reset preferences if pref file can't be loaded.
   * Added ability to select multiple images on thumbnail
     screen via shift and control keys (command on Mac).
   * Under some circumstances a file chooser operation 
     would not correctly cancel.

2.22 01/26/2014
   * Alphabetize user exif tab.
   * Save "Apply Filter" setting.
   * Option to export images at original size.
   * Fixed inaccurate process count message.

2.21 12/08/2013
   * Fixed file locking bug that prevented keyword updates
     under some circumstances.
   * Updated to ExifTool 9.43 to fix problem viewing some
     images with unusual file names.

2.20 10/27/2013
   * Removed address bubble from map.
   * Fixed default directory behavior.
   * Minor UI fixes.

2.19 10/23/2013
   * Maps for geotagged images. Right-click on an image
     or tree node and select "Map" from popup menu.
     Java 7 Update 6 or higher required.
   * Changed tree click behavior for switching out of
     maps and charts.

2.18 09/26/2013
   * Verbiage changes including 'index' to 'catalog'.
   * Multiple catalogs can be created in Preferences.
   * Filters can now be applied to catalog creation.
   * Removed unnecessary ExifTool version check.
   * Pressing the shift key while moving tags on the
     Catalog Manager (advanced mode) will only move
     tags used by the current configuration. Good for
     creating a compact and high performance catalog.

2.17 09/19/2013
   * Rollover preview of portrait RAW files not rotated.
   * Minor optimization to javascript filter compiler.

2.16 09/06/2013
   * Rollover preview of small images could hang the
     application.

2.15 09/05/2013
   * Substantial optimization when using custom tags.

2.14 09/05/2013
   * Rollover image not rotating based on Orientation tag.

2.13 09/04/2013
   * Multi-monitor slideshow fix.
   * Added rollover image preview.

2.12 08/31/2013
   * Under certain circumstances tags could be ignored when
     importing settings.
   * Added default directories for custom tags and settings.
   * Cleaned up shortcut keys.
   * Fixed icon in the windows launcher zip.
   * Stop a background tree build when importing new settings.

2.11 08/19/2013
   * Added ability to use a javascript expression to create a 
     composite or calculated tree node label. FAQ help coming.

2.10 08/18/2013
   * Key presses were being lost during slide show on Oracle's
     OS X JVM.
   * Added "View" option to image popup menu.

2.09 08/15/2013
   * Switched to java-image-scaling library for improved quality.
   * Keywords (tags in Picasa) can be updated for a single image or
     all images/sub-images of a tree node. Since this functionality
     calls ExifTool's write operations, it must first be activated on the
     Preferences dialog. Please make sure your images are backed up.
   * Minor UI and verbiage updates.

2.08 08/12/2013
   * Multiple tags can now be passed into a javascript filter via a
     comma delimited string. For example, to see all images taken
     in portrait mode, enter "ImageWidth,ImageHeight" in the first filter
     column, choose "Javascript Expression" for the operation and enter
     the following in the third column: "ImageHeight > ImageWidth". 

2.07 08/11/2013
   * Tags selected for display in the "User" tab were not restored 
     with settings import.

2.06 08/10/2013
   * Fullscreen slideshow for Mac OS X.
   * Slideshow now cycles.

2.05 08/08/2013
   * Removed "num" javascript helper function (use "parseInt").
   * Restored "dec" javascript function.
   * Added convertDate helper javascript function.
   * Added version check code for forthcoming stand-alone version.

2.04 08/07/2013
   * Under certain conditions, filters weren't loading with
     with imported settings.

2.03 08/05/2013
   * Removed native Macintosh menu bar when running under
     Oracle Mac JVM because of a Look and Feel bug in Java
     Web Start. Mac users are encouraged to use Apple's JVM
     for a better experience. 

2.02 08/05/2013
   * Added ability to import/export settings. This covers
     all preferences, filters, tags and image folders.

2.01 08/04/2013
   * Added a "Reset" button to the filter dialog.
   * "Copy Tree" and tree "Export" no longer allowed during a
     tree build. A dialog will notify the user.
   * Prevent "locked" progress indicator when canceling a tree
     build on a large database.
   * Minor verbiage changes.
   * Save default export and copy tree directories.

2.00 08/02/2013
   * Further javascript optimizations.

1.99 08/02/2013
   * Compile javascript filters for substantial speed increase.

1.98 08/01/2013
   * Added bar charting.

1.97 07/28/2013
   * Fixed filter cancel applying changes (introduced in 1.96).

1.96 07/27/2013
   * Added optional ability to save filters.
   * Changed preferences layout.

1.95 05/04/2013
   * Zoom images with mouse wheel.
   * Scroll zoomed images by clicking and dragging.

1.94 04/10/2013
   * New icons.
   * Added FAQ menu item to help menu.

1.93 04/06/2013
   * Default image folder is now "Pictures" in the user's home
     folder (or the user's home dir if "Pictures" doesn't exist).
   * Added javascript helper functions "num" and "dec". See FAQ.

1.92 04/02/2013
   * Simplified Index Manager dialog.
   * Minor ui fixes.

1.91 03/31/2013
   * PhotoGrok is no longer blocked by a progress dialog when
     building a tree. This means images can be examined even
     as the tree is being constructed. Some functions will 
     cancel a background tree build (with notification).
   * Added busy indicator to status bar for background processes.   

1.90 03/29/2013
   *  Version 1.89 failed to launch on Windows.
   *  Replaced progress bar with web 2.0-style busy indicator.
   *  Progress verbiage changes.

1.89 03/29/2013
   *  Rounded windows for Linux users.

1.88 03/26/2013
   *  Reverted update mechanism to "timeout".
   *  Stop loading thumbnail images if availble memory insufficient.
   *  Minor asethetic changes.

1.87 03/23/2013
   *  ExifTool is now included for Linux and Mac users. As usual, a
      different version of ExifTool can be configured in Preferences.
   *  Updated included ExifTool to Version 9.24.
   *  NOTE: If you're running an older version and PhotoGrok isn't
      automatically updating, you may need to run "javaws -viewer"
      and right-click on the PhotoGrok application and choose 
      "Run Online" to get the latest update.

1.86 03/21/2013
   *  Custom tags can now be used as viewer tags and are listed
      in the Exif pane for each image (see next).
   *  The "All Exif" tab list now displays a "PhotoGrok" section
      containing all custom tags and the special tag "ElapsedTime".
      Like all tags, these can be displayed the "User Exif" tab.
  
1.85 03/21/2013
   * Added "User Exif" and "All Exif" tabs to right Exif pane.
     Right-click on tags in the list(s) to add/remove entries
     on the user exif list. This makes frequently used tags
     easily visible at all times.

1.84 03/20/2013
   * Optimization for improved responsiveness.
   * Run update check in background for faster startup.

1.83 03/08/2013
    * No code update. Refactored to use versioned jars for faster
      startup. If PhotoGrok doesn't launch, remove all installed
      web start apps via the Java control panel or the 
      "javaws -viewer" command and re-install.

1.83 03/07/2013
    
    * Significant speed improvements when displaying thumbnails.

1.82 03/05/2013

    * Optimized tree load.
    * Code cleanup. Removed Java 5 specific code.
    * Improved error messages.

1.81 03/01/2013
    * Popup menu on EXIF pane added. Use to remove selected tags
      from future indexing operations (and optionally delete the
      tags from the current index). Removing unused tags can shrink 
      the index and increase performance when building a tree. 

1.80 02/26/2013
    * Dropped support for Java 5.
    * Improved tab appearance and operation.
    * Fixed some layout and font issues.

1.79 02/21/2013
    * Custom font for uniform appearance across platforms.

1.78 02/07/2013
    * Users can optionally select which tags are indexed. Excluding
      tags that aren't needed improves indexing performance.

1.77 01/18/2013
    * Added ability to cancel construction of indexed tree.

1.76 01/16/2013
    * Custom tags can be used in filters for other custom tags.
      Recursive conditions are reported when tree is built.

1.75 01/16/2013
    * Custom tags can be used in filters.

1.74 01/15/2013
    * Added ability to import/export custom tags.

1.73 12/14/2012
    * Fixed left arrow tree traversal on OS X.

1.72 10/12/2012
    * Added a Window menu for OS X.

1.71 10/11/2012
    * Create custom tree tags based on a filter. New tags can be created
      and existing tags can be modified.

1.70 10/08/2012
    * Application size, position and tool bar orientation are saved.

1.69 10/06/2012
    * "Copy Tree" and "Export" will now skip files if PhotoGrok detects a 
      duplicate file (same name and size) in the destination directory. If
      two files have the same name but different sizes, the copy will append
      a _1, _2, etc. to the destination file name (extensions are preserved).
      This behavior is useful for incremental backups, etc.

1.68 10/01/2012
    * OS X specific enhancements and fixes.

1.67 09/30/2012
    * Allow PhotoGrok to "Export" and "Copy Tree" to a non-empty folder.
      This is more useful. If there are duplicate files in the destination
      folder, PhotoGrok will append an underscore 1, 2 etc to the file name.
    * Faster image copy for "Copy Tree".
    * Fixed problem with jpeg extension appended to file names when copying.

1.66 09/20/2012
    * UI changes for OS X. Moved menu from application to desktop.
    * Fixed "Open" and "Open Folder" on OS X.

1.65 09/17/2012
    * Under some circumstances PhotoGrok would not correctly detect a new
      version of ExifTool when building an index.

1.64 09/05/2012
    * Added ability to export M3U playlist file from tree popup-menu.

1.63 08/14/2012
    * Multi-threaded image loading for fast tree traversal using arrow keys.

1.62 08/02/2012
    * Focus change for easier tree navigation (use arrow keys).
    * Changed "TimeSpan" tag to "ElapsedTime".

1.61 07/23/2012
    * Entering "TimeSpan" as a viewer tag displays the length of time since
      the image was created (uses DateTimeOriginal for calculation). This tag
      is specific to PhotoGrok.

1.60 07/15/2012
    * Added ability to use GraphicsMagick to decode image types with partial
      or no native support in PhotoGrok (TIFF, PICT etc). GraphicsMagick must
      be installed and in the path. FileTypes to be decoded by GraphicsMagick
      must be entered on the configuration screen.

1.59 07/14/2012
    * New application icons.
    * Minor memory optimization.

1.58 06/25/2012
    * Updated Substance look and feel.
    * Minor DB connection optimization.

1.57 06/24/2012
    * Tree right-click behavior more consistent with OS behavior.

1.56 06/22/2012
    * DB optimization substantially speeds up indexed searches. Either
      re-index your images or re-index a single folder to force the update.
      The first re-index could take longer than usual if you have a large
      image collection.

1.55 06/20/2012
    * Filter optimizations. Searches with filters should run much faster.

1.54 06/19/2012
    * Thumbnails intelligently render when scrolled into view.
    * Fixed minor layout bug.

1.53 06/17/2012
    * Added ability to view tree information as a pie chart. Right-click
      on a node with child folders (for example, the root node) and select
      "Chart" from the popup-menu.

1.52 06/15/2012
    * Changed preference mechanism for future enhancements. There are no
      longer limitations to the number of folders that can be scanned.
    * Switched to Rhino for Javascript filter operations. Faster. Javascript
      filters should now work fine on Java 5.
    * Add "Previous Filter Must Be True" checkbox to multiple filter tabs.
      This allows very complex AND/OR conditions when filtering data.

1.51 06/06/2012
    * On windows it was possible to see "duplicate" thumbnails if an index
      was rebuilt after the filename's case had changed. For example, 
      IMAGE.JPG was later re-saved as image.jpg. Simply re-index if this
      problem affected you.

1.50 05/25/2012
    * Index searches for specific extensions are now much faster. Requires
      a re-index. IMPORTANT CHANGE: The configuration screen now requires
      actual file extensions. (The field can still be left blank for all
      supported extensions). Previously ExifTool FileTypes were required
      for index operations and actual extensions for non-index searches. 
      This was a glaring inconsistency.

1.49 05/23/2012
    * Fixed sql error when running an index search with FileType as the
      only tag.

1.48 04/19/2012
    * Fixed index sync issue.

1.47 04/14/2012
    * When previously indexed folders are re-indexed, deleted images are
      removed from the index and changed images are updated. This requires
      pre-1.47 indexes to be rebuilt. Thumbnail images are also updated or
      deleted as appropriate. To guarantee thumbnails are in sync with 
      folder images, delete existing thumbnails and re-create.

Changes on 02/04/2012
    * No code changes. Updated H2 engine and ExifTool for Windows users.

1.46 08/31/2011
    * Multi-monitor bug fixes for application and slideshow
    * Ability to export images with or without EXIF data. Set the exported
      image width and height on the configuration screen (downscale only).
      As always, the original image is not affected.

1.45 02/06/2011
    * Added slideshow. Right-click on tree node and select "Slideshow". Set
      duration on configuration screen.

1.44 01/18/2011
    * Some cameras have a PreviewImage embedded in JPEGs. PhotoGrok was incorrectly
      displaying this low-resolution image instead of the full JPEG.

1.43 01/02/2011
    * Higher quality scaling algorithm.

1.42 10/18/2010
    * Updated H2 database for faster queries. This will require the image index
      to be rebuilt.      

1.41 09/19/2010
    * Fixed to run in Java 5 again.

Changes on 8/27/2010
    * No PhotoGrok changes. Version 8.29 of ExifTool for Windows users.

1.40 08/22/2010
    * Added ability to copy a tree structure with corresponding images/files
      to the filesystem. Useful for backing up images meeting specific EXIF criteria.
      See the FAQ for additional details.

1.39 08/15/2010
    * Added Javascript expressions to Filters. Example: to see all images
      taken between F2.0 and F4.0, select (or type) 'Aperture' into the first
      filter field, select "Javascript Expression" as the filter operation and
      enter "Aperture >= 2.0 && Aperture <= 4.0" into the third field. The
      expression must return true of false. Other Javascript functions like
      string and regular expressions should also work. Java 6 required.

1.38 01/30/2010
    * Added mnemonics and accelerator shortcuts
    * Updated ExifTool version for Windows users.

1.37 01/24/2010
    * Added menus
    * Verbiage changes (search to build tree, etc)

1.36 01/10/2010
    * Added date formatting to allow heirarchical ordering of images by date/time.
      See FAQ for details.

1.35 12/19/2009

    * Use Substance renderers for tree and lists (Java 6 and up).
    * Fixed tree double-click behavior.
    * Updated ExifTool version for Windows users.

1.34

    * Fix for Java 5 when no preview found.

1.33

    * UI fixes for multi-monitor setups. Other small UI tweaks.

1.32 12/09/2009

    * Double-click the preview image to open a file with the default OS action for that file type.

1.31 12/07/2009

    * Removed duplicate tags in results
    * UI changes for Java 5 users.

1.30 12/06/2009

    * Allow png and gif preview with Java 5 (time to update people).

1.29  12/04/2009

    * Added embedded database for (optional) indexing and fast tag searches

1.28 11/30/2009

    * Added option to not search subfolders.

1.27 11/29/2009

    * Support for searching multiple folders

1.26 11/27/2009

    * Do not scale up images for previewing.
    * Save memory by using embedded images for preview.
    * Do not cache images from the thumbnail cache folder.

1.25 11/26/2009

    * Memory optimization. Release main image before loading new image.

1.24 11/25/2009

    * Minor verbiage change

1.23 11/22/2009

    * Increased mouse wheel scroll speed on thumbnail screen.
    * Added ability to select recognized ExifTool file extensions.

1.22 11/21/2009

    * Validate tag from exif detail pane.
    * Code clean-up and minor UI changes.

1.21 11/19/2009

    * Added ability to configure tags on the image viewer screen.
    * Made image viewer tags more readable.

1.20 11/18/2009

    * Implemented optional disk-based thumbnail cache (off by default). This creates a .photogrok folder
      in the user's home directory. Thumbnail images are saved as they are previewed for faster performance later.

1.19 11/16/2009

    * Memory-sensitive cache for thumbnail images.

1.18 11/14/2009

    * Added license notice for Substance Look and Feel
    * Tree was sizing incorrectly on Linux.

1.17 11/14/2009

    * Added tag selector screen
    * Limited tag search to ten tags

1.16 11/12/2009

    * Image viewer wasn't working in Java 5.

1.15 11/10/2009

    * Removed preview popup image for performance reasons.

1.14 11/10/2009

    * Image scaling optimizations
    * Double-click root node to start search

1.13 11/10/2009

    * Image rollover effect for preview images.

1.12 11/09/2009

    * Ignore corrupted images when loading preview pane.

1.11 11/09/2009

    * Viewer support for some TIF and PSD files.

1.10 11/08/2009

    * Preview pane displays thumbnails of a tree node's children. Double-click thumbnail to open.

1.09 11/07/2009

    * Converted to Java Web Start app and new domain
    * Bundled ExifTool.exe with the Windows version
    * Substance Look and Feel for Java 6
    * UI and minor bug fixes

1.08 11/01/2009

    * Show busy dialog when loading valid tags (at startup and exiftool.exe selection)
    * Added popup menu to images in tree and viewer

1.07 10/31/2009

    * Only valid ExifTool tags can be entered
    * Filters can now search any tag (and not just tags used to build the tree)
    * Setting tree tags, image folder and filter no longer triggers refresh (use toolbar refresh button)

1.06 10/16/2009

    * Added filters - search for specific tag values
    * A few UI tweaks.

1.05 10/14/2009

    * Minor UI change

1.04 10/12/2009

    * Optimization in loading images
    * UI changes

1.03 10/09/2009

    * Support for image preview on all supported Java types (gif, bmp, etc).
    * Added configuration screen.

1.02 10/09/2009

    * Memory enhancements.

1.01 10/08/2009

    * Dynamic Tree - The tag tree can have as many levels as there are tags. Simply enter a comma-delimited tag list.
      If you want to see images grouped by lens and then ISO, enter LensType,ISO in the tag dialog.
