The Eclipse Scout 9.0 version was released as part of the Eclipse 2019-03 Simultaneous Release (release schedule) on March 20, 2019.
The latest version of this release is: 9.0.0.018_Simrel_2019_06
You can see the detailed change log on GitHub.
Scout 9.0 will continue to be maintained for a while and a new build may be released from time to time, following the Simultaneous Release Cycle. Beside bugfixes, these service releases may even contain some minor features.
The following enhancements were made after the initial 9.0 release.
Scout RT artifacts are distributed via Maven:
Usage example in the parent POM of your Scout application:
<dependency> <groupId>org.eclipse.scout.rt</groupId> <artifactId>org.eclipse.scout.rt</artifactId> <version>9.0.0.018_Simrel_2019_06</version> <type>pom</type> <scope>import</scope> </dependency>
You can download the complete Eclipse IDE with Scout SDK included (EPP) here:
Eclipse for Scout Developers Simrel 2019-06
To install the Scout SDK into your existing Eclipse IDE, use this update site:
The demo applications for this version can be found on the features/version/9.0.0.018_Simrel_2019_06 branch of our docs repository on GitHub.
If you just want to play around with them without looking at the source code, you can always use the deployed versions:
So far Scout only supported Java 8. In addition to the Java 8 support Scout 9 officially supports OpenJDK 11 too!
Please note that Java 9 and 10 are not supported and that Oracle only provides free Java 8 updates for commercial use until end of January 2019. Therefore it is recommended to use OpenJDK 11.0.1 or newer. Please refer to the Migration guide for instructions how to migrate.
In the future Scout plans to support each LTS (long term support) version of Java. After Java 11 the next supported version might by Java 17. Please note that these plans may change at a future release.
However there are some limitations when using Java 11:
For Red Hat based Linux Distributions: Red Hat builds its own JDK with some modifications. One modification is that it contains a drastically reduced set of Elliptic Curves (3 instead of the 60+ that OpenJDK contains). Unfortunately the one that Scout uses by default is not part of the Red Hat selection. For more details see 1, 2, 3 and 4. Therefore Red Hat JDK builds are not supported out of the box. However Scout can be configured to work with such JDKs by using a curve that is available in a Red Hat JDK. This can be done by replacing the bean
org.eclipse.scout.rt.platform.security.SunSecurityProviderand overwriting the method
getEllipticCurveName(). You can choose a curve that is available on your Red Hat installation. Please note that you need to generate a new key pair for your modified curve using
org.eclipse.scout.rt.platform.security.SecurityUtility.main(String)and insert the keys in your config.properties files. Alternatively it is also possible to download an unmodified JDK from the official download page.
If you are using the SVG support of Scout: There might by compile errors stating that
org.w3c.dom.Elementor similar cannot be resolved. This is a bug in the current Batik version. Batik is the framework Scout uses for SVG support. For more details and how to address it please see Bug 543573.
Add a menu entry
Search for duplicate @ClassId Values to manually trigger a search for duplicate class ids in the workspace.
Enter the dark side… and use the new dark theme of Scout!
Scout now provides a dark theme in addition to the default theme. You can either activate it by default by setting the property
dark in the
config.properties, or let the user choose what he likes more.
In order to change the theme during runtime you can use the method
setTheme of the desktop (Scout Classic and Scout JS). The chosen theme will be stored in a cookie and activated again on the next visit.
Scout group boxes will react reduced widths by transforming its contents to allow better readability. There are three responsive states. The default state is the 'normal' state. In this state no transformations will be applied. In the 'condensed' state, all the label positions will be set to 'TOP'. In the 'compact' state, a one column layout will be enforced. This last state is only available in a Scout-JS application.
Once a group box becomes smaller than its preferred width it will transform its internal fields to increase readability. For more information consult the technical guide.
Before Scout 9 the
ServerRunContextFilter was used to create Scout server contexts for REST APIs. This filter used a user based TTL cache that was not bound to the HTTP session.
Starting with Scout 9 there are two new filters available:
HttpRunContextFilter: Creates a Scout run-context without HTTP- and server sessions for stateless REST backends. It supports subject, correlationId, locale, transaction, etc.
HttpServerRunContextFilter: Creates a Scout server-run-context that additionally has a user-agent and an optional Scout server session.
To improve this, a Script File Watcher can now be activated which watches all the JS and Less files and triggers a rebuild only if a file changes. This means the files are not always rebuilt on every page reload anymore but only if a relevant file changes. In order to activate the watcher, you need to set the property
scout.dev.scriptfile.rebuild to false.
The widget ModeSelector was added. It has similar functionality as the RadioButtonGroup but with another design.
It is actually not really a new widget, since it has been used by Scout itself for some other widgets like
ContextMenu. What’s new on this release is that you can use it as Scout developer, for Scout JS as well as Scout Classic. The
Popup has the following features:
Take any widget you like and open it in a
Popupby using the
Use any widget you like as anchor and align the
Decide whether you want to point the
Popupto the anchor by using the property
Control the behavior of what should happen if there is not enough space to display the whole
Popupusing various properties.
Choose how the popup should react when the user clicks on the outside or on the anchor.
Check out these features and more in the widget apps!
Label is a very basic widget to display text. The difference to the existing
LabelField is that it doesn’t extend the
FormField but the
Widget. This has the advantage that it is easier to use without the overhead of the
FormField meaning it is more lightweight. But you cannot use it on regular forms since a form only accepts form fields.
Until Scout 8.0 a Close- or Cancel-Button ignored the enabled-granted property to ensure the form can be closed even if the full form has been disabled using
setEnabledGranted(false). This was confusing because the same convenience was not available for all other enabled dimensions.
Since Scout 9.0 Close- and Cancel-Buttons can be disabled like any other form field. But one special handling is still present: The method
isEnabledIncludingParents ignores the enabled state of the parents and always returns the state of the button only.
So if a Form or GroupBox is disabled using
setEnabledGranted(false) or any other dimension, the full form gets disabled except the Close- and Cancel-Buttons. As soon as the button is disabled explicitly (e.g. by calling
setEnabled(false) on the button itself or by propagating to the button using
setEnabled(false, false, true) on a parent composite) it will be disabled and the form cannot be closed anymore.
The layout structure of the scrollbar comes now with an additional div, and the positioning of the scollbar uses now padding instead of margin.
With this change, the usability of the scout scrollbar has improved. The thumb is now easier to catch, especially when positioned at the very edge of the screen.
The wizard progress has a new design.
Wizard steps can now be marked as finished, in this case they will be displayed with a check mark icon in the wizard progress.
The API to work with Pages (
PageWithNodes) has been improved. It is now possible to declare child pages in the static JSON model of outlines and the table within a
PageWithTable has a default reload handler installed.
Now the method
_loadTableData (which is responsible for fetching data for a
PageWithTable) also gets an optional argument
searchFilter holding the exported data of the first form that is attached to the table using a
FormTableControl (typically the SearchForm). This makes it easier to use the values from a search form by e.g. passing them to a REST backend to limit the results returned from the server.
TreeNode (and therefore all pages because they are tree nodes) get a method
_jsonModel to declare the static JSON model that belongs to that tree node or page. This works the same way as with all other widgets now.
All fields having lookup calls (ListBox, RadioButtonGroup, SmartField, TagField) now fire a new event
'lookupCallDone' always when a lookup call has been executed and the result was processed by the field.
The Scout properties are now resolved in a slightly different order (Bug 541099). The environment variables are now resolved before the
Config properties file
Default value of property
Using environment variables, it is now possible to override values in the configuration file, as is already possible using system properties (
-D flags on JVM command line). This change should simplify the usage of Scout in environments where the application should be static (example: Kubernetes, Docker), but still allow a degree of flexibility.
Since environment variables are not allowed to contain dots/periods (
.), the new lookup also searches for an equivalent environment variable by replacing periods with underscores (
_) and converting the property to uppercase.
For both Table and Tree a new CheckableStyle was added. With the CHECKBOX_TABLE_ROW/CHECKBOX_TREE_NODE style it’s possible to check/uncheck a row or node by clicking basically anywhere on the row or node. This new CheckableStyle is now the default in AbstractTree and AbstractListBox. With this CheckableStyle active, expansion on double click is not supported for enabled rows/nodes, since it interferes with the checking/unchecking action.
Scout now enables the
NaturalCollatorProvider by default. When comparing text using a collator (e.g. via StringUtility), strings are now sorted more "naturally". Unlike with the JVM default, spaces (
" “) and hyphens (”-") are no longer ignored.
This is an old bug fix that was finally made permanent.
[ "The dogs bark", "The dog barks", "The dog sleeps" ]
The dog barks The dogs bark The dog sleeps
The dog barks The dog sleeps The dogs bark
Projects that wish to keep the existing behavior can do so by providing their own
CollatorProvider (see migration guide).
There are several new properties added to adapt the design of the MenuBar.
GroupBoxes can now define the position of the MenuBar inside the GroupBox, the three possibilities are:
The default value is
MENU_BAR_POSITION_AUTO, which corresponds to the old behavior.
GroupBoxes can define the position of the ellipsis dropdown menu inside the MenuBar. The possible values are:
The default value is
MENU_BAR_ELLIPSIS_POSITION_RIGHT, as it was in earlier releases.
Menus and buttons can define if they are shrinkable or not. When there is not enough space for all menus/buttons in the MenuBar, only the configured Icon of the shrinkable menu/button will be displayed, without text/label. By default the menus/buttons are not shrinkable.
Now not only menus but also buttons can define if they are stackable or not. When after shrinking there is still not enough space in the MenuBar to display all menus/buttons, the stackable menus/buttons will be stacked in the ellipsis dropdown menu. By default the menus/buttons are stackable.
When the ellipsis position inside the MenuBar is
MENU_BAR_ELLIPSIS_POSITION_RIGHT, the ellipsis menu is placed after the last visible, stackable menu/button. When the ellipsis position is
MENU_BAR_ELLIPSIS_POSITION_LEFT, the ellipsis menu is placed before the first visible, stackable menu/button.
The URI Action
OpenUriAction.POPUP_WINDOW is added. The existing URI Action
NEW_WINDOW leaves it to the browser whether a new tab or a new window is opened. Using the new URI Action
POPUP_WINDOW, the URI will always be opened in a new window.
The new property defines if the column can be considered as a candidate for the node column. The node column is used to display the control to expand and collapse rows in a hierarchical table. If
false the column will be skipped when scanning for the node column and the next suitable column will be chosen as node column.
The new interface
org.eclipse.scout.rt.mom.jms.IJmsMessageHandler adds suport for incoming and outgoing JMS message handling. The default implementation
org.eclipse.scout.rt.mom.jms.LogJmsMessageHandler logs all messages on level DEBUG.
Now the HtmlEnvironment fires a
propertyChange Event when it gets (re)initialized. All Layouts or other Components that depend on the HtmlEnvironment’s properties should listen to that event and handle it appropriately.
This new display mode is targeted at users working on laptops or other small screens. It reduces the whitespace between elements to display more content on the available screen size.
Activate the dense mode by setting
IDesktop.setDense(true). An additional less file
displaystyle-dense.less contains all necessary styling changes.
MessageBox widget now supports the OS specific copy to clipboard key-shortcut. When pressed, all text of the MessageBox, including the hiddenText property, is copied to the clipboard.
NlsResourceBundle does not use any built features of
java.util.ResourceBundle, it does no longer depend on
scout.resourceBundle.checkContainsKey was removed as it is now obsolete.
It is now possible to define a custom widget as group header instead of only the title/suffix texts. This allows for example to add input-fields or buttons to group headers. This can be achieved by overriding the method
getConfiguredHeader and returning a widget class or
createHeader and returning the widget instance.
collapseStyle was extended by the style
bottom which displays a bottom border for the group and (if the group is collapsible) a collapse-arrow centered in the middle of the bottom-border.
visible in the Java model was migrated from a
boolean to a
byte type to achieve multiple dimension support for the visibility of a group (see also https://eclipsescout.github.io/9.0/technical-guide.html#multiple-dimensions-support).
The Data Object base class
DoEntity was extended with a generic
hashCode() implementation considering all attributes of a data object for equality. A data object is equals to another data object, if the Java class of both data objects is identical and the attribute maps (including their nested values) of both data objects are equals.
For futher details see:
|Do you want to improve this document? Have a look at the sources on GitHub.|