JGoodies Application Release Notes CHANGES IN 3.0.1 ------------------------------------------------------- o Improved internal implementation. CHANGES IN 3.0.0 ------------------------------------------------------- o Overhauled and simplified the @Action method lookup: - removed unused and obsolete code, - reduced memory consumption, - faster method lookup. CHANGES IN 2.16.1 ------------------------------------------------------- o Improved sources: removed redundant type information. CHANGES IN 2.16.0 ------------------------------------------------------- o Recompiled against JGoodies Common 1.30. CHANGES IN 2.15.0 ------------------------------------------------------- o FIX: ResourceMap's DefaultEvaluator fails with escaped variable. o The deprecated handler package has been removed. CHANGES IN 2.14.1 ------------------------------------------------------- o All classes in the handler package have been marked as deprecated. Use pure Swing event handling code instead. CHANGES IN 2.14.0 ------------------------------------------------------- o Added Application#getResourceMap(). o Moved the internal class EDTBean to JGoodies Common. o Fixed a broken JavaDoc reference. o Improved ExitListener docs. CHANGES IN 2.13.2 ------------------------------------------------------- o Improved Application#exit implementation. CHANGES IN 2.13.1 ------------------------------------------------------- o FIX: @Action annotation with invalid accelerator text does not throw the expected ActionAnnotationValueException. o Added tests for invalid accelerators (annotation and resource). o Source code improvements. CHANGES IN 2.13.0 ------------------------------------------------------- o Changed the application exit API from the VetoableEvent callback to Promise. Promise chaining can significantly reduce the effort required to implement subsequent actions on the computed results. See Promise#thenApply, #thenAccept, #thenRun, #thenCompose. o ExitListener#applicationExiting has now a default implementation that lets the exit process proceed. o The JavaDocs for ExitListener#applicationExiting(EventObject) and Application#exit(EventObject) describe the behavior more precisely. o Application#exit() uses an event object that has the app's root frame as event source. o Added and improved tests for the exit process. o Added package infos. CHANGES IN 2.12.0 ------------------------------------------------------- o Compiled against JGoodies Common 1.24 (VetoableEvent API changes). CHANGES IN 2.11.1 ------------------------------------------------------- o FIX: Application exits even if an ExitListener vetoes against it. o Added JavaDocs. CHANGES IN 2.11.0 ------------------------------------------------------- o Overhauled the application exit process and listeners to allow exit listeners that cannot veto against the exit immediately, for example if the app waits until modified data has been saved in a background process. The new API is now consistent with other APIs in JGoodies Fluent and Navigation, where a tab, document, or page is requested to be "closed". See also the class comment in VetoableEvent for an introduction to the new mechanism. ExitListener interface changes: 1) boolean applicationExitAllowed(EventObject) turned into void applicationExiting(VetoableEvent). The old method required an immediate boolean result; the new method requires to accept or reject the VetoableEvent immediately or later. 2) #applicationExit has been renamed to #applicationExited. 3) #applicationExited is now a default method that does nothing. 4) Added a default method #applicationExitCancelled to be able to handle the case where a listener vetoed against the exit. The default implementation does nothing. Application API changes: 5) boolean exitAllowed(EventObject) has been removed, because the boolean result cannot be provided immediately. Use ExitListener#applicationExit and #applicationExitCancelled instead. 6) boolean exit() -> void exit() 7) boolean exit(EventObject) -> void exit(EventObject) Other changes: 8) Removed class ExitAdapter. 9) The PlaceholderApplication used by Application#launchTest() does not call System.exit(0) to let tests proceed after an application exit. o Migration of existing implementations: public boolean applicationExitAllowed(EventObject evt) { return ; } becomes public void applicationExiting(VetoableEvent event) { if () { event.accept(); } else { event.reject(); } } or shorter public void applicationExiting(VetoableEvent event) { event.accept(); } o Added tests for the application exit process and notifications. o Source cleanup. CHANGES IN 2.10.0 ------------------------------------------------------- o Removed the @Action lookup via method references and a tricky byte code instrumentation using ByteBuddy. CHANGES IN 2.9.1 ------------------------------------------------------- o Updated ByteBuddy to version 1.10.4. CHANGES IN 2.9.0 ------------------------------------------------------- o Moved internal code to JGoodies Common 1.21. o Migrated tests to JUnit 5. CHANGES IN 2.8.1 ------------------------------------------------------- o Updated ByteBuddy to version 1.9.12. CHANGES IN 2.8.0 ------------------------------------------------------- o Moved internal code to JGoodies Common. o Updated ByteBuddy to version 1.9.6. CHANGES IN 2.7.0 ------------------------------------------------------- o Updated ByteBuddy to version 1.8.17. o Added ResourceMap#getLocalDate. o Added a default conversion for LocalDate, see ResourceConverters. o Updated the @Action JavaDoc. o Updated the pom.xml. o Started a new mechanism for the ResourcMap resource bundle access that is compatible with Java modules as introduced with Java 9. If used with Java 9 or later these are your options: 1) put jgoodies-application in the classpath, 2a) put jgoodies-application in the module path and grant jgoodies-application the right to create resource bundles for every module that provides resources. See class ResourceBundle for details on how to specify this. 2b) put jgoodies-application in the module path and use a custom ResourceManager implementation that manages resource bundles created by their host module. CHANGES IN 2.6.1 ------------------------------------------------------- o Updated ByteBuddy to version 1.7.9. CHANGES IN 2.6.0 ------------------------------------------------------- o Moved the Listeners class to JGoodies Common. o Moved Listeners#setAllowsCustomNamingConventions to class ListenerMethods. o Simplified implementation. CHANGES IN 2.5.3 ------------------------------------------------------- o Updated ByteBuddy to version 1.7.5. CHANGES IN 2.5.2 ------------------------------------------------------- o Implementation uses more method references. o Updated ByteBuddy to version 1.7.1. CHANGES IN 2.5.1 ------------------------------------------------------- o Fixed accelerator handling in @Actions where the accelerator is defined directly by the annotation. CHANGES IN 2.5.0 ------------------------------------------------------- o Fixed TaskBuilder#progressDeterminate duplicate call exception. o Added Listeners#hyperlinkActivated. CHANGES IN 2.4.0 ------------------------------------------------------- o Added a feature for accessing scaled resources via the special variable $scale that refers to a ScaleFactor as provided by the ScreenScaling class. The currently supported factors are: 100% and 200%. An example line in a resource definition could be: help.icon=images/metro/help.scale-${$scale}.png that would resolve to "images/metro/help.scale-100.png" or "images/metro/help.scale-200.png" depending on the scale factor. o As seen in the above example, the special variables $laf, $os, and $scale are now allowed as variables, whereas previous versions evaluated them as variable options only. Old style (offers different resource names help.png vs. help.gif): ShowHelp.Action.icon=${ShowHelp.Action.icon.[$os]} ShowHelp.Action.icon.default=images/default/help.png ShowHelp.Action.icon.win=images/win/help.png ShowHelp.Action.icon.mac=images/mac/help.gif New style: ShowHelp.Action.icon=images/${$os}/help.png Updated ByteBuddy to version 1.6.13. CHANGES IN 2.3.1 ------------------------------------------------------- o Updated ByteBuddy to version 1.6.9. o TaskBuilder rejects invalid duplicate calls. CHANGES IN 2.3.0 ------------------------------------------------------- o Removed all deprecated annotations, classes, and methods. o Adjusted tests. o TaskBuilder changes: - Added fallback code if no custom operation is specified for cancelled, failed. - Rejects tasks without background operation. - Added #block(Action), #blockWindow, #blockApplication, and #blockNothing. o Added Task#setAction. o Added Listeners#hierarchyShown. o Added a few more Listeners methods. o Added JavaDocs for TaskBuilder and TableBuilder. CHANGES IN 2.2.1 ------------------------------------------------------- o Removed the final marker from DefaultApplicationAction. o Renamed TaskBuilder#blocking to #block. CHANGES IN 2.2.0 ------------------------------------------------------- o Fixed a bug in an exception for invalid method signatures. o Temporarily restored an optional feature for annotated methods: - @Action annotated methods may return Task o Temporarily added (deprecated) Listeners configuration methods #getAllowsOptionalReturnType #setAllowsOptionalReturnType o Updated ByteBuddy to version 1.4.22. CHANGES IN 2.1.1 ------------------------------------------------------- o Implementation uses streams. o Updated ByteBuddy to version 1.4.13. CHANGES IN 2.1.0 ------------------------------------------------------- o Improved the text of the illegal argument exception for invalid modifier texts when creating a listener with the Listeners class. o Fixed JavaDocs for modifier text examples. o Updated ByteBuddy to version 1.3.19. o Extended the TaskBuilder API. CHANGES IN 2.0.0 (Java 8) ---------------------------------------------- o Moved to Java 8. o Added the TaskBuilder that can replace Task implementations. o Added Listeners method that convert a lambda into a listener. o Extended the Handlers API for lambdas. o Removed optional features for annotated methods: - all @Action annotated methods must return void now - all @Action annotated methods must have ActionEvent as parameter - all annotated methods must have the parameter type of its associated listener type, e.g. ChangeEvent for ChangeListener o Removed Listeners configuration methods #getAllowsAssignableActionParameterType #setAllowsAssignableActionParameterType #getAllowsOptionalParameter #setAllowsOptionalParameter #getAllowsOptionalReturnType #setAllowsOptionalReturnType o Removed unused and duplicate code in ListenerFactory. o Implicitly created KeyListeners, MouseListeners, and MouseMotionListeners do nothing if the event is consumed. o Marked Java 6/7 mechanisms as deprecated: - all method annotations except @Action - Listeners#add*Listener - Listeners#create*Listener o Distribution ships a Java agent that is required if @Action annotated methods are referred by method references. CHANGES IN 1.10.1 ------------------------------------------------------ o Fixed ActionMethodLookupTest#acceptActionEventParameterAlways. CHANGES IN 1.10.0 ------------------------------------------------------ o Added Application#hasInstance. o Improved ListenerMethods implementation for efficiency. o Fixed a bug in the conversion of Type1 fonts. CHANGES IN 1.9.1 ------------------------------------------------------ o Task#checkValidBlocking message better describes the Task. CHANGES IN 1.9.0 ------------------------------------------------------ o Fixed bug in resource conversion exception on null ResourceMap. o Icons can be specified in the @Action annotation. o Fixed many JavaDoc issues. CHANGES IN 1.8.0 ------------------------------------------------------ o Moved the basic handlers from Sandbox to this library. CHANGES IN 1.7.1 ------------------------------------------------------ o By default, custom names in annotated methods are now prohibited. To switch back to the old behavior, call: Listeners.setAllowsCustomNamingConventions(true); o Fixed test typos. CHANGES IN 1.7.0 (Java 7) --------------------------------------------- o Moved to Java 7. CHANGES IN 1.6.0 ------------------------------------------------------ o Removed the deprecated @DoubleClickListener and @PopupListener, and all associated methods in the Listeners class. CHANGES IN 1.5.0 ------------------------------------------------------ o Added the @DocumentListener annotation and the support methods in the Listeners class. o ResourceMap extends the JGoodies Common internal interfaces StringResourceAccessor and IconResourceAccessor. o Requires JGoodies Common 1.8. o Task#done fires a property change event for an intermediate state where #doInBackground has completed, but #done is executed. o TaskMonitor fires a new state property change named "backgroundDone" that is useful to stop progress displays if the Task execution is back on the EDT. o TaskService removes Tasks from its Task list also if Task#isCancelled returns true. o EDTBean uses SwingPropertyChangeSupport. o Fixed JavaDocs. o Source style improvements. CHANGES IN 1.4.1 ------------------------------------------------------ o Slightly modified the DefaultResourceManager to enable subclasses to use and extend its caching mechanism. CHANGES IN 1.4.0 ------------------------------------------------------ o New method annotations for frequently used event types: - @KeyPressedListener - @KeyRelasedListener - @KeyTypedListener - @ListIntervalAddedListener - @ListIntervalRemovedListener - @ListContentsChangedListener - @MouseClickedListener - @MouseDoubleClickedListener - @MouseDraggedListener - @MouseEnteredListener - @MouseExitedListener - @MouseMovedListener - @MousePressedListener - @MouseReleasedListener o @DoubleClickListener is deprecated. It's been replaced by @MouseDoubleClickedListener. o @PopupListener is deprecated. It's been replaced by @ContextMenuListener. o The new key and mouse listener annotations provide an optional feature for event filtering. You can specify modifiers that are checked before the annotated method is invoked. Modifiers are: "shift", "shift ctrl", "button1", "alt button2", etc. o Added tests. o Improved docs. CHANGES IN 1.3.1 ------------------------------------------------------ o Fixed a bug where a Task created from a non-EDT could call InputBlocker#unblock before it has called InputBlocker#block. CHANGES IN 1.3.0 ----------------------------------------------------- o Changed Listeners#addPropertyChangeListener to accept general bound beans where it accepted before only ObservableBean2 and Component. o Added @FocusGainedListener and @FocusLostListener annotations. o Fixed @Action accelerator comment. o Improved performance of internal BeanUtils. o Improved exception message for invalid @Action accelerator. o Improved resource converter's messages for invalid key strokes. o Application#exit returns whether the exit was allowed or not. CHANGES IN 1.2.0 ----------------------------------------------------- As of version 1.2 several strict checks for annotated methods are enabled by default: parameters are mandatory, return types are forbidden, and @Action methods must use ActionEvent as parameter type. The old behavior can be configured by: Listeners.setAllowsOptionalParameter(true); Listeners.setAllowsOptionalReturnTypes(true); Listeners.setAllowsAssignableActionParameterType(true); o Completed JavaDocs for the Listeners class. o Compiled against the JGoodies Common 1.5. o Fixed tests. o Source code cleanup. o Fixed and extended the pom.xml: - added schema - fixed scope for dependencies - added build data CHANGES IN 1.1.0 ----------------------------------------------------- o ResourceMap extends the JGoodies Common StringLocalizer interface. This way, ResourceMaps can be directly used by builder classes in the JGoodies Forms. o DefaultActionManager#createAction has a new parameter actionId making it easier to log an Action with its id. o DefaultResourceManager#createApplicationMap(Class) and #createApplicationMap(ResourceMap, Class) are protected. o Added AbstractInputBlocker#getBlockingCounter(Object target). o Added @ListDataListener and the supporting Listeners methods. o Fixed JavaDocs for all listener annotations. o Improved cache memory usage in DefaultResourceMap. o The action configuration logs action texts that end with "..." instead of the single ellipsis character '\u2026'. o Added Listeners#setAllowsCustomNamingConventions to require that the names of annotated methods follow the naming convention defined by the annotation. For example @Action annotated method shall follow the "on*Performed" convention. o Added Listeners#setAllowsOptionalReturnType to allow or prohibit return types other than void. This affects methods annotated with @Action and @PopupListener. Optional return types are discouraged. It is recommended to rewrite the old style @Action public Task onSavePerformed(ActionEvent e) { ... return new SaveTask(); } to the new form @Action public void onSavePerformed(ActionEvent e) { ... Application.execute(e, new SaveTask()); } And the old style @PopupListener public JPopupMenu onPopupTriggered(MouseEvent e) { PopupMenuBuilder builder = ... ... return builder.getPopupMenu(); } to the new form @PopupListener public void onPopupTriggered(MouseEvent e) { PopupMenuBuilder builder = ... ... builder.show(e); } CHANGES IN 1.0.1 ----------------------------------------------------- o Changed the DefaultApplicationContext constructor signature to accept an optional TaskService instance. o Added tests for @TableModelListener. o DefaultApplicationContext and DefaultResourceManager do not extend AbstractEDTBean anymore. o Source code cleanup. o The javadocs, main and test sources are delivered as JARs. CHANGES IN 1.0.0 ----------------------------------------------------- o Requires and uses Java 6. o DefaultResourceMap value lookup avoids MissingResourceExceptions. o Added TaskService constructor with custom ExecutorService. o Overhauled the ListenerMethods processing: - processor cleanup - introduced a customizable ListenerFactory - easier customization of processors and method listeners - added support for TableModelListeners o Merged Application and Application-Basic libs; removed classes: BasicApplication, BasicApplicationContext, BasicActionManager. CHANGES IN 0.9.25 ----------------------------------------------------- o Fixed typos in the listener annotation documentation. CHANGES IN 0.9.24 ----------------------------------------------------- o INCOMPATIBLE CHANGE: As of 0.9.24 methods annotated with a listener annotation (@PropertyChangeEvent, @ListSelectionListener, etc.) must use the event parameter type of the associated listener interface; previous versions allowed super types too. For example a method annotated with @PropertyChangeListener must use PropertyChangeEvent where you could also use EventObject in previous versions. o Added Listeners#setAllowsOptionalParameter to configure whether methods annotated with a listener annotation require a parameter or may omit it. By default parameters are optional. o Added Listeners#setAllowsAssignableActionParameterType to allow ActionEvent super types in methods annotated with @Action. By default it is allowed to use ActionEvent and its super types EventObject, etc. o All Listeners#addXXXListener methods return the created listener. o Added the @ChangeListener method annotation and the associated Listeners factory and registration methods. o Added tests for the @ChangeListener annotation. o Incompatible change (that will likely not affect you): Overhauled the lookup for annotated methods. MethodLookupExceptions and MethodNotFoundException are now thrown if an absent/invalid method is requested. The previous lookup reported problems during the lookup. A request for an @Action annotated method could throw exceptions for invalid @PropertyChangeListeners in the same class. o Overhauled the set of exceptions involved during the lookup and construction of listeners for annotated listener methods. CHANGES IN 0.9.23 ----------------------------------------------------- o Improved source code style. CHANGES IN 0.9.22 ----------------------------------------------------- o Added support for annotated listener methods via the Listeners class plus annotations: @PropertyChangeListener, @DoubleClickListener, @PopupListener, @TreeSelectionListener, and @ActionListener. o Fixed broken listener id for @TreeSelectionListener methods. o Improved exception messages in the Listeners class. o Improved @Action method lookup using a class-based method cache. o Minor improvement in an exception message. o Source improvements. o Added tests for the listener framework. o Added an optional setting for the DefaultResourceMap. If the system property "DefaultResourceMap.detailedMissingResourceExceptions" is set to "enabled" or "on", the MissingResourceExceptions describe the resource map chain and bundle base names. CHANGES IN 0.9.21 ----------------------------------------------------- o Added support for the new @Action method name pattern. The default action id for a method #onXyzPerformed is "Xyz". o Improved exception handling during the application exit. o Exceptions caught during the application exit process use #handleException. o Added the log level to Application#handleException. The signature is now #handleException(Throwable, String, Level). CHANGES IN 0.9.20 o Fixed the DefaultActionManager constructor signature to accept ActionManager instead of BasicActionManager. o BasicApplicationAction is public. o Introduced AbstractResourceMap. o Source code improvements. CHANGES IN 0.9.19 o Added Application#launchTest(Application) that is performed in the current thread, not the EDT. Changed #launchTest() to invoke #launchTest(Application) with a PlaceHolderApplication. o DefaultActionManager$ApplicationAction constructor is protected. o Simplified [Basic]ApplicationAction references and structure. o Changed DefaultActionManager#createApplication signature. o Fixed tests. CHANGES IN 0.9.18 o Removed the deprecated @Action.name that has been replaced by 'id' in version 0.9.16. o Fixed DefaultResourceMap bug with cached non-String null values. o Easier customization of the default action/resource management: - DefaultResourceManager constructor is public - ApplicationActionMap is public - Added ApplicationActionMap#getTarget o DefaultResourceMap#getString wraps IllegalFormatException and provides details about the bundle, key and value used. o Rejects @Action methods that declare exceptions to be thrown. o Improved handling and sources for formatting exception messages. o Overhauled the code organization for exceptions. o Application#getInstance throws an IllegalStateException, if the Application has not been launched before. This avoids changes in the ResourceMap chain building before and after the application is launched that have confused developers in the past. o Added Application#launchTest() that launches a placeholder app. CHANGES IN 0.9.17 o Improved caching in DefaultResourceMap. o DefaultResourceManager creates and caches significantly shorter ResourceMap chains by leaving out ResourceMaps that do not have a bundle. o Removed template resources for the Application class that shall be overridden by resources in the concrete Application, e.g. "application.name", "application.version", etc. o DefaultApplicationContext has a public constructor. o Added tests for caching in DefaultResourceMap chains. o Added tests for the ResourceMap chains, created, cached, and returned by the DefaultResourceManager. CHANGES IN 0.9.16 o Separated several interfaces from their default implementations. o Reorganized and simplified dependencies. o Moved from setter injection to constructor injection. The ApplicationContext configuration has been moved to Application#createContext where you can setup its ResourceManager and ActionManager. o Introduced the Evaluator interface for the DefaultResourceMap. o Introduced an ActionManager that describes the formerly internal lookup and creation of ActionMaps from objects with @Action annotated methods. o Removed the deprecated class util.ActionReader that has been replaced by the Actions class. o Removed the Actions code to set the mnemonic index from the value of the .Action.displayedMnemonicIndex key suffix. o Added keys to the Actions class and handling code for reading an accessible name and accessible description. o Replaced @Action 'name' by 'id'. o Added @Action properties for: - text (a marked text that can contain a mnemonic marker) - accelerator - shortDescription - longDescription - accessibleName - accessibleDescription - command o Added check for empty or whitespace @Action texts. o More custom exceptions for the Action configuration and @Action method lookup. o Added URI conversion to ResourceMap and ResourceConverters. o Resource conversion for byte, int, long, and short uses the more flexible #decode instead of #parseXXX. Hence, you can encode bytes, etc. using the standard hexadecimal and octal formats, i.e. 0xFF is 255, #FF is 255, and 010 is 8. o Added conversion tests for Dimension, EmptyBorder, Insets, Rectangle, Point, URI, and the new number conversions. CHANGES IN 0.9.15 This version has a dependency to the JGoodies Common library. Utility and internal classes have been replaced by common classes. o AbstractBean has been turned into the internal AbstractEDTBean that extends AbstractBean from Common. o MnemonicUtils has been replaced by the Common MnemonicUtils. o SystemUtils has been replaced by the Common SystemUtils. o Uses the Common Preconditions to check method state and parameters. o Removed ActionKeys. o Removed Application#execute(Action, EventObject) that has been replaced by #execute(EventObject, Action) before. o Removed ApplicationContext#getActionMap(Object). o Removed ApplicationContext#getActionMap(Object, ResourceMap). o Removed ApplicationContext#clearActionMap(). o ResourceMap rejects unbound option variables. o TaskMonitor fires events where the source is the monitor not the foreground task. o Added a few JavaDocs. o Added tests. CHANGES IN 0.9.14 o AbstractInputBlocker does not throw an IllegalStateException, if a Window shall be unblocked that has not been blocked before. See AbstractInputBlocker#decreaseBlockingCounter(Object). o The ActionMap returned by Application#createActionMap now throws an ActionNotFoundException, if ActionMap#get(key) is invoked with a key that is not mapped to an Action in the ActionMap chain. The exception provides useful information for finding the error. o Added ResourceMap#getURLAsStream(String). o Added a new default Font resource conversion from , to a Font, for example my.font=TrueType,georgia.ttf See ResourceMap#getFont for details and examples. CHANGES IN 0.9.13 o @Action annotated methods now accept the parameter types ActionEvent, AWTEvent, EventObject, and Object. This makes it easier to invoke those methods from code that handles other events, for example (double click) MouseEvents. o ActionReader honors custom mnemonic and mnemonic index. This allows to set a mnemonic, even if there's no text. If specified, they override a mnemonic marked in the text. Examples: test1.Action.text=A Text == A &Text test1.Action.mnemonic=T test2.Action.text=A Text == A &Text test2.Action.displayedMnemonicIndex=2 test3.Action.text=&A Text == A &Text test3.Action.mnemonic=T CHANGES IN 0.9.12 o Removed the deprecated methods Application#getActionMap, #getAction, and #clearActionmap. o Added Application#execute(EventObject, Task) that sets the given EventObject to the executed Task, which is necessary for the blocking scopes Window and Component. It is recommended to use the execute method with EventObject. o Added Application#execute(EventObject, Action) which replaces #execute(Action, EventObject). o Source code style improvements. o Removed duplicate Error handling in Task#failed. The same behavior remains in Application#handleException. CHANGES IN 0.9.11 o Removed unused logging. o KeyStroke resource conversion checks for valid formats and throws ResourceConversionException if necessary. o Source code improvements in ActionReader. o Added KeyStroke resource conversion tests. o Fixed the build so the resource conversion tests pass. CHANGES IN 0.9.10 o Added Application#createActionMap(Object target) that does not register the created ActionMap. Also added the associated methods to class ApplicationContext. These methods avoid memory leaks compared to the older method set #getActionMap and #getAction. o Tasks start blocking always in the EDT. o Improved JavaDocs. CHANGES IN 0.9.9 o Task blocking is now performed before the Task is executed. Previous versions performed it when the Task started. Moved the blocking code from Task$StateHandler#taskStarted to Task#queued that is invoked by TaskService#execute. o Overhauled the ResourceMap string expansion: - Fixed broken ResourceMap variable expansion. - Fixed broken indirect access to null values. - Rejects and reports cycles. - Added access to system properties, e.g. ${$user.name} or ${$java.version}. - Added a mechanism to express options with fallback. Basically this feature brings to all ResourceMap resources, what the ActionReader had offered for Action values before. The new feature is key-specific, where the ActionReader checked all keys for operating system variants before. Also the ResourceMap options can vary with the operating system, look&feel, or a system property, as shown here: // Operating system prefs.Action.text=${pref.Action.text.[$os]} prefs.Action.text.default=&Preferences\u2026 prefs.Action.text.mac=Preferences\u2026 prefs.Action.text.win=&Options // Look&Feel background=${background.[$laf]} background.default=#000000 background.aqua=#111122 background.windows=#131313 // Java version variableName=${variableName.[$java.specification.version]} variableName.default=Unknown Java version variableName.1.5=This is Java 5 variableName.1.6=This is Java 6 - Exceptions include the ResourceMap's bundle base name. - Reports undefined variables. - Added tests. o Removed the ActionReader platform specific access feature. It has been replaced by the more general ResourceMap feature. o Resource conversion exceptions include the bundle base name. o ResourceConverter#convert(String, String, Class, ResourceMap) has been changed to #convert(ResourceMap, String, String, Class). overridden in different ResourceBundles in the chain. o ResourceMap#getObject returns only non-primitive types. o Improved error message for invalid @Action method signature. DIFFERENCES TO THE JSR 296 PRE-EARLY DRAFT PROTOTYPE o ResourceMap chain is class, package, Application hierarchy. o Missing resources throw exceptions. o No resource injection o Verbose warning and error messages for frequent mistakes. o Different code organization. o Default InputBlocker and shared blocker. o Task requires a BlockingScope. o Preferences as backing store instead of LocalStorage and SessionStorage. o Flexible views, but no predefined views. o Rich predefined Application subclasses. CHANGES IN 0.9.8 o Added Application#end. o Added Application#clearActionMap(Object target) to avoid memory leaks. CHANGES IN 0.9.7 o ResourceManager clears caches if the default Locale changes. o Added a test case for ResourceManager cache invalidation. o Tasks unblock as soon as #done is invoked, where previous versions unblocked after #done has been performed. o Minor source code improvements. CHANGES IN 0.9.6 o ResourceMap construction requires now a Locale where it used the default Locale before. The ResourceManager API and tests have been adjusted to reflect this change. o Renamed ResourceMap#getBundleBaseName to #getBaseName. o Source improvements in the Actions class. CHANGES IN 0.9.5 o Prevents #remove, #put, #clear on Application ActionMaps. o Overhauled internal Action implementation: - removed obsolete reference to ResourceMap - removed reference to Task CHANGES IN 0.9.4 o Overhauled ResourceMap creation and management. Applications can set a custom ResourceManager to change the way how the ResourceMaps are created, and how the chain of ResourceMaps is computed. - added a ResourceManager that looks up and returns ResourceMaps, - added ApplicationContext#setResourceManager, - ResourceMap can be extended, - added ResourceMap#findBundle, - overhauled ResourceMap constructor set - added static ResourceManager#defaultClassBundleBaseName(Class). o TaskService#execute(Task) throws an explicit NPE if task is null. o Documented that Application#execute and TaskService#execute throw an NPE if Task is null. o Task's StateHandler is static. o Renamed Model to AbstractBean. o Improved ResourceMap logging. o Removed ResourceManager logging. CHANGES IN 0.9.3 o Fixes a potential concurrent modification in TaskMonitor. CHANGES IN 0.9.2 o All preferences node names are now in lower case. o ApplicationContext#getApplicationPreferencesNodeName has been moved to class Application. CHANGES IN 0.9.1 o Resource conversion trims trailing blanks in values. o Icon and ImageIcon conversion keeps animated GIFs animated. This conversion uses the older Toolkit#getImage that is limited to GIF, JPEG, and PNG. The default Image converter can convert all image types supported by the newer ImageIO. CHANGES IN 0.9.0 o ApplicationContext is now referred from the Application, and ApplicationContext.getInstance() has been replaced by Application.getInstance().getContext(). o New static Application convenience methods: #getResourceMap(Class), #getActionMap(Object), #getAction(Object, String), #execute(Task). o Removed ApplicationContext#getAction. CHANGES IN 0.8.15 o AbstractInputBlocker uses static counters. o Throws an IllegalStateException if a Task is started with BlockingScope ACTION that has no Action object set. o Application#execute keeps the time stamp and modifiers of the given EventObject, if its an InputEvent. CHANGES IN 0.8.14 o Overhauled blocking. The application wide blocking has been replaced by per-Task blocking. Each Task has an InputBlocker that is set to a default blocker provided by the Application. In other words, the default InputBlocker can be overridden per Task. There's an AbstractInputBlocker that reduces the effort required to implement InputBlockers. To migrate existing code, implement InputBlocker and move your Application#block and #unblock methods to this blocker. You may extend AbstractInputBlocker. o Application#launch prints the stack trace if #startup fails. o Added Application#execute(Action, EventObject). o Application Actions throw an IllegalStateException if #actionPerformed is invoked in disabled state. CHANGES IN 0.8.13 o Action resources use new key suffixes: .Action.text, .Action.accelerator, .Action.command, .Action.icon, .Action.smallIcon, .Action.largeIcon, .Action.shortDescription, .Action.longDescription o Added com.jgoodies.application.util.MnemonicUtils. o Minor source code improvements. o Fixed JavaDoc typos. CHANGES IN 0.8.12 o ResourceMap#getString uses String#format, not MessageFormat o Source code improvements. o Corrected broken JavaDoc links and tags. CHANGES IN 0.8.11 o Fixed an NPE during Action lookup failure message construction. CHANGES IN 0.8.10 o Added default converters for Point, Rectangle, EmptyBorder. CHANGES IN 0.8.9 o Fixed JavaDoc typos. CHANGES IN 0.8.8 o Added Application#ready(). o Source code improvements. CHANGES IN 0.8.7 o Invalidates ResourceMap caches if the default locale changes. o Invalidates ActionMap cache if the default locale changes. o Tasks look up and set the component and window as soon as the event object is set. CHANGES IN 0.8.6 o Fixed potential NPE in Application#block and #unblock. o Source code improvements. o Added and improved some JavaDocs. o Task accepts missing description and message. o Added Task#getComponent and #getWindow that return the component or window associated with the tasks's event object source. Useful to block and unblock a component or window in Application#block/#unblock. o Task#failed hands over exceptions to Application#handleException. o Tasks warn if the blocking scope is COMPONENT or WINDOW, and the event object has not been set, or lacks a source component. o Added Application#handleException that logs the exception. o Action invocation throws Errors that are wrapped by InvocationTargetExceptions. CHANGES IN 0.8.5 o Task#failed logs RuntimeException and doesn't throw them. o ResourceMap cache uses a concurrent hash map. o ApplicationContext uses synchronized maps. o Extracted error messages from long method ResourceMap#getObject. o Improved image conversion exception if path is blank. o Added image conversion tests. CHANGES IN 0.8.4 o Task#setEventObject is public. o Updated the SwingWorker backport to version 1.1. o Fixed ResourceMap caching for different types. o Improved ResourceMap string evaluation caching. o Added tests for the ResourceMap caching. o Color converter accepts more formats: #RRGGBB #AARRGGBB R, G, B and R, G, B, A CHANGES IN 0.8.3 o Overhauled the blocking concept: - Tasks now require a blocking scope, - Tasks can be used without the Action lookup, - Removed the blocking scope from the @Action annotation, - Simplified the Application blocking methods signatures to #block(Task) and #unblock(Task). o Moved Actions#getAction to ApplicationContext. o Added Task#message(String keySuffix, Object... args) o Actions is now package visible only. CHANGES IN 0.8.2 o Task with resource maps require a title. o Task now logs exceptions thrown during the background execution. o Task can change the indeterminate state during the execution. o Throws an ActionLookupException if two action methods shall be registered for the same name. o Added tests for duplicate compatible and incompatible methods. o Improved Actions implementation. o Source code improvements: - removed unused imports - added type information CHANGES IN 0.8.1 o Fixed potential ClassCastException in ActionReader. o Overhauled the background task management: - Introduced Tasks that add features to the SwingWorker - Asynchronous actions return a Task, not a SwingWorker - Replaced Application#startBlocking and #endBlocking by #block and #unblock that have more parameters. - TaskService executes Tasks - TaskMonitor provides bound properties for task changes o Fixed broken ImageIcon resource conversion. o Added variable expansion to ResourceMap. o Improved resource caching.