3.0.0.0

3.0.0.M7

3.0.0.M6

3.0.0.M5

Instead of the two arrow buttons below the navigation a vertical scroll bar can be used. Therefore the new Look&Feel constant LnfKeyConstants.NAVIGATION_SCROLL_BAR exists. Default value is "false".

You can define the thickness of the marker around a table row. New Look&Feel constant LnfKeyConstants.ROW_ERROR_MARKER_BORDER_THICKNESS exists. Default value is "1".

The Riena Look&Feel is also used for message-boxes (RienaMessageDialog).

Client Monitoring

The LogServiceCollector can now be configured to attach synchronously to the LogReaderService. This can be achieved with the new optional initialization parameter async. For more information see Riena Wiki LogServiceCollector.

The SimpleStore had in some cases problems reloading stored items which have been stored zipped (GZIP) and encoded. The mysterious error that came up was a IOException: Not in GZIP format. The same problem had been reported here. After following their advice (replacing GZIP with Inflater/Deflater-streams) the problem vanished. However, with this change old store files can no longer be read. But they will be deleted automatically.

The InfoFlyoutRidget now works under RAP.

New Riena Look&Feel constants to define the color(s) of the border around a module group; regardless of the color(s) of embedded borders. (In the default Riena Look&Feel theme the border colors are equal.)

2.0.0.RC4

2.0.0.RC3

2.0.0.RC2

As announced on our mailing list and in bug 313701 we had to change the API of RienaDefaultLnf to improve the speed of the LnfUpdater:

Prior to the API change the themes (implementing ILnfTheme) customized the L&F (RienaDefaultLnf and/or sub classes of it) by modifying internal data structures of the RienaDefaultLnf. The themes were given access to this data via void addCustomColors(Map<String, ILnfResource> table) et al.

This has been replaced by introducing a new interface ILnfCustomizer. It is implemented by the RienaDefaultLnf and it is passed to theme. They can now customize the L&F without drilling down into the internal data structures.The required changes are not structural and the most of it can be performed with Find/Replace.

To set a theme on a L&F was only possible via a void setTheme(ILnfTheme newTheme).

This has been extended such that it is now possible to set the theme with the constructor of the L&F. While it is still possible to use setTheme for experimental stuff the new constructor shall foster the correct usage.There are no code changes required but the new method is recommended.

2.0.0.RC1

2.0.0.M7

New LnF Constant for MandatoryOutput marked fields

The new constant MANDATORY_OUTPUT_MARKER_BACKGROUND has been added to the LnFKeyConstants. This color is used to mark fields that are marked with both, mandatory and output markers.

The old default color (defined in SharedColors) for this case RGB(242, 243, 210) was changed to RGB(255, 249, 216) and a default value was added to the RienaDefaultTheme.

Collapsed parent inside a tree of the Riena Navigation displays also the markers (e.g. Error or Mandatory) of its child nodes.

expanded parent without marker

collapsed parent with marker

With the new annotation @IgnoreLnFUpdater you can prevent that the LnFUpdater overwrites the value of a given property. Add this annotation in front of your custom widget class. The parameter of @IgnoreLnFUpdater is the name of one property or an array of property names.

Now you can react on NavigationArgument changes by overriding INavigationNodeController#navigationArgumentChanged(NavigationArgument argument)

A new Riena Look&Feel setting (SUB_MODULE_TREE_SHOW_ONE_SUB_TREE) defines if always one sub-tree with sub-module is expanded in the navigation and all others are collapsed. If the user selects (activates) a sub-module in the navigation, only this will be expanded, all other siblings will be collapsed. This only works for the tree-nodes and not if the user selects the triangle symbol (vista) or the plus/minus symbol in front of the node. In the default Riena Look&Feel theme (RienaDefaultTheme) this feature is turned off.

splash login view has now no border by default

The splash login view has now no border by default (for details see Login support). If a border is needed method hasLoginCompositeBorder() of class AbstractLoginSplashHandler has to be overridden in the handlers subclass.

2.0.0.M6

Preparation of sub-module

In some cases it can be useful that a controller of a sub-module is already created before the sub-module is active. This is possible with Riena 2.0. For that the NavigationNode has the additional state State.PREPARED.
The Riena application developer can enforce the preparation of sub-modules in three different ways:

The element submodule of the extension point "org.eclipse.riena.navigation.assemblies" has an additional attribute: requiresPreparation.

IWorkareaDefinition has the additional property requiresPreparation.

NavigationArgument, which is (for example) used in the method navigate of the class INavigationNode, has the additional property prepareAll.

The creation of a sub-module controller is not possible without the creation of the sub-module view. Because the method configureRidgets of the controller expects that the Ridgets are already injected and Ridget injection without a view is not possible. So if a sub-module controller is created also the sub-module view is created. Keep this in mind according to the performance of your application.

The preparation includes (among others) that the methods configureRidgets and afterBind of the sub-module controller are called. It is very similar to the activation. Only the sub-module view is not displayed in the working area and the events like beforeActivated or afterActivated are not fired.

UIProcess

UIProcess now interprets work progress(IProgressMonitor.worked(int work) as unit based. You can switch back to cummulative. Have a look at UIProcess.setProgresStrategy

assemblies2

The extension point to define the navigation model of a Riena application was refactored. Unused elements (e.g. foreach) or redundant attributes (e.g. name and label) are removed. With the new extension point ("org.eclipse.riena.navigation.assemblies2") it is now possible to add more than one root node (same type of node).

The old extension point "org.eclipse.riena.navigation.assemblies" is still supported. Only the foreach element and the reference to an assembly is not longer possible.

2.0.0.M5

NavigationNode has now implemented equals() and hashCode() methods. Calling equals() on a NavigationNode compares the NavigationNodeId and the content of the label. So be aware that it is not possible anymore to add two different instances of a NavigationNode as a child of another NavigationNode, if the NavigationNodeId and the displayed label are the same. This affects all kinds of NavigationNodes (ApplicationNode, ModuleNode, SubModuleNode ect.) which now need to have application wide unique NavigationNodeIds.

Controller testing support: it ist now possible to test your controllers without having UIControls bound to the ridgets. To do so there are some points that have to be considered:

The ridgets in the conrollers have to be instantiated with the new method getRidget(Class<R> ridgetClazz, String id). This method creates the instance of the ridget if no view is bound.

Tests have to extend the class AbstractSubModuleControllerTest. This class sets up the rudimentary controls needed for the test and calls the configureRidgets() and afterBind() methods on the controller.

Navigation can be tested by using EasyMock. A mockNavigationProcessor is added to the NavigationNode by default and can be accessed with getMockNavigationProcessor().

For examples look at the controller tests in the org.eclipse.riena.client.controller.test package of the Riena testproject (org.eclipse.riena.tests).

ImageButton is a new widget with only an image (no border, no background) and acts like a push button. The ImageButton can have a set of images. According to the state of the button (e.g. pressed, over, foused) another image is displayed. The ImageButtonRidget sets the images depending on the icon ID. With the help of the icon ID and an IIconManager the Ridget can set all images for every state. The IIconManager defines a naming schema for all image files. The IIconManager considers the states and the sizes.

Riena Look&Feel settings can be overwritten by Riena System Properties. The name of a Look&Feel System Properties starts with "riena.lnf.setting." and ends with the name of the Look&Feel key (see org.eclipse.riena.ui.swt.lnf.LnfKeyConstants). Example: -Driena.lnf.setting.statusline.height=25

The Riena Look&Feel selects the MarkerSupport. Riena can provide a number of different MarkerSupports. At the moment Riena has the two different MarkerSupports: MarkerSupports and BorderMarkerSupports. Every MarkerSupport has an ID. The ID and the MarkerSupport are defined in an extension (extension point: org.eclipse.riena.ui.swt.markerSupport). The Riena Look&Feel key "markerSupport.id" (see LnfKeyConstants.MARKER_SUPPORT_ID) defines which MarkerSupport will be used.

Similar to the ControlDecoration of JFace Riena provides a BorderControlDecoration. Instead of an image near to the control the BorderControlDecoration paints a border around the control. The BorderMarkerSupport uses this to paint the error markers. You can influence the appearance of border with the two Riena Look&Feel keys: LnfKeyConstants.ERROR_MARKER_BORDER_WIDTH and LnfKeyConstants.ERROR_MARKER_BORDER_COLOR

MasterDetailComposite API improvements:

On removal of an entry, it is not possible to ask the user for confirmation and/or veto the removal. See confirmRemove(Object item) for details.

It is now possible to set the top/bottom and left/right margins - widget.setMargins(int, int)

It is now possible to change the horizonal and vertical spacing within the widget - widget.setSpacing(int, int)

the default margins have been changed to (0, 0) from (5,5) to make it easier to align the MasterDetailsComposite with other widgets

the default spacing has been changed to (0, 5) from (5, 5) to move the button area closer to the table.

UI polish: the border around the table now includes the buttons area. Also a separator is drawn between the table and the buttons.

IMasterDetailsRidget API improvements:

added a ridget.suggestNewEntry(entry) method to 'suggest' a new entry. The entry will be placed in the details area and 'Apply' will enable. If the user hits apply, the entry is added.

'Apply' now automatically invokes 'New' (if 'New' is available). This will improve usability when adding multiple new entries.

It is now possible to trigger an update of the Apply-Button's enablement status by invoking ridget.updateApplyButton()

It is now possible to enable the apply button only, if no active mandatory markers are present in the detail area. See ridget.setApplyRequiresNoMandatories(boolean)

IMasterDetailsDelegate API improvements:

We have added several new methods. It is recommended to subclass the default implementation AbstractMasterDetailsDelegate, which will remain compatible with future changes

Added several optional lifecycle methods, which are invoked when an item is created, removed, applied or selected. They can be overriden to participate at these lifecycle events. See prepareItemSelected(Object newSelection), itemSelected(Object newSelection), itemCreated(Object newItem), itemRemoved(Object oldItem), itemApplied(Object changedItem) for details

hessian 3.2.0 is incompatible with hessian 3.1.3

we are delivering a new version of hessian with this milestone of Riena, we have heard from people using early builds that hessian 3.2.0 on the client does not work with hessian 3.1.3 on the server. So if you upgrade to this milestone on the client and for some reason you just have an arbitrary hessian remote service on the server make sure that the hessian lib has the same version. The problem shows up on the client as a HTTP response code 501 Not implemented.

one other trap with hessian 3.2.0 we have found is that hessian now transfers data in chunks by default. We changed the default to false. To enable it again, you have to call "RienaHessianProxyFactory.setTransferDataChunked(true);"

SubModuleController: added API to support multiple default actions per controller - addDefaultAction(IRidget focusRidget, IActionRidget action). See the javadoc for this method and the 'Default Button' example in the Playground for more details.

1.2.0

1.2.0.RC1

added tracing support for NavigationProcessor and WidgetIdentificationSupport

Now you can switch on tracing for the two in the launch configuration by enabling tracing for o.e.r.navigation or o.e.r.ui.swt and enabling the respective tracing option (NaviProc.debug or WidgetIndentSupport.debug) NavigationProcessor tracing shows activate and deactivate processing for all nodes involved WidgetIdentificationSupport shows how labels are associated with a widget so that the label also gets disabled if the widget is disabled

improved the rendering of the disabled state of controls. You can disable a Ridget by adding a DisabledMarker to it. The rendering can be configured using the Look And Feel. There are 3 new constants:

LnfKeyConstants.DISABLED_MARKER_BACKGROUND: The background for the disabled state rendering.LnfKeyConstants.
DISABLED_MARKER_STANDARD_ALPHA: The Alpha-Value of the disabled state rendering for simple Controls(Buttons, Labels, ...).
LnfKeyConstants.DISABLED_MARKER_COMPLEX_ALPHA: The Alpha-Value of the disabled state rendering for more complex Controls(List, Table, Tree ...)

1.2.0.M3

AttentionMarker: Riena provides a new marker (IMarker). This marker should be used to visualize that a sub module was not visited by the user. After the sub module was visited (activated) the AttentionMarker should be removed. The marker is displayed in the navigation tree. The marker is drawn in front of the image of the node.

Adding and removing the AttentionMarker is not a automatism of the Riena framework.
The application developer must add and remove the AttentionMarker to/from the navigation node (INavigationNode.addMarker/INavigationNode.removeMarker). For example the AttentionMarker can be added when the model of the navigation is created and the SubModuleController can remove the marker after the node was activated (ISimpleNavigationNodeListener.afterActivated).

Not only AttentionMarkers can be added to a navigation node also other self-defined markers can be added. And the appication can add a Mandatory and/or an ErrorMarker.
All markers that implements the interface IIconizableMarker will be displayed in the navigation tree. So a situation can be exist that not all markers can be drawn in front of the tree node icon. To manage this situation markers have a priority (Priority.VERY_LOW, Priority.LOW, Priority.NORMAL, Priority.HIGH, Priority.VERY_HIGH). The marker with the highest priority is always in the foreground.

Using the LnfKeyConstant SUB_MODULE_TREE_MARKER_HIERARCHIC_ORDER_POSITION it is now possible to priorize the painting of only one Marker. Combined with the priorities explained above only the Marker with the highest Priority is painted in the SubModuleTree at the specified MarkerPosition. Example usage: table.put(LnfKeyConstants.SUB_MODULE_TREE_MARKER_HIERARCHIC_ORDER_POSITION, IIconizableMarker.MarkerPosition.BOTTOM_RIGHT); in the RienaTheme.

Tree ridgets can now have custom node AND leave icons. Each node can have it's own open / close icon. Each leave can also have it's own icon. (snippet)

Ridget now adjust number of TableColumns in a Table or Tree automatically. If your Table or Tree does not have the right number of columns, the ridget will now create the right number of columns automatically. This is supported by the TableRidget, TreeTableRidget and MasterDetailsRidget. This is great if you don't know how many columns you need when creating the UI in your views. (snippet #1, snippet #2)

Ridget now have API for adjusting the column widths of a Tree or Table. Both absolute (pixel) and relative widths (weights) are supported. API has been added to the ITableRidget, ITreeTableRidget and IMasterDetailsRidget. (snippet #1, snippet #2)

1.2.0.M2

New Ridgets: ITraverseRidget for the SWT Slider, Scale and Spinner controls (snippets)

MasterDetailsRidget: hitting 'New' or changing the row when the details area is 'dirty' (i.e. contains changes), will now ask the user for confirmation. This can be customized or turned off by overriding the confirmDiscardChanges() method of a MasterDetailsComposite.

MasterDetailsRidget: an 'auto apply' mode has been added. This will cause the table to be updated automatically, just as the details area is edited. To enable invoke: masterDetailrDidget.setDirectWriting(true). (snippet)

Disable/Enable a LabelRidget when its corresponding Ridget enabled-State changes. This is accomplished by a convention that searches for a ILabelRidget with a specific prefix like 'label' and connects the two Ridgets so the ILabelRidget reflects the enabled-State of the source Ridget.

Added Support for CCombo-Widget that will be mapped to a IComboRidget exactly like the default Combo-Widget.

Riena now defines it's own key binding scheme via the org.eclipse.ui.bindings extension point. Read how to best use on the Riena Key Bindings page.

Moving between views using up/down arrows in the Navigation Tree got faster (asynchronous).

The Command Framework uses expressions to enable or disable handlers (enabledWhen/activeWhen). The <with/> element can be used to evaluate variables. Riena adds the following variables to the existing list of variables (see):

1.1.0.M7

Bug 269851: Extensionpoint org.eclipse.riena.navigation.ui.swt.moduleView and org.eclipse.riena.navigation.ui.swt.moduleGroupView were modified to not only allow you to supply a class for the view but also for the controller in the navigation. We had to rename a few existing attributes to make that look nice in the extensionpoint definition. So existing extension definitions need to be modified. The custom view classes remain unchanged. The added controller classes are optional.

DialogView was moved from org.eclipse.navigation.ui.swt.views to org.eclipse.ui.ridgets.swt.views.

Additional to org.eclipse.riena.client, we have also added org.eclipse.riena.client.communication and org.eclipse.riena.client.ridgets which export all the required packages for clients that only wish to use communication or only use ridgets (without navigation and communication). org.eclipse.riena.client still exports all packages necessary for a Riena client.

Master/Detail example with the details area on top and custom buttons added to Playground

Implemented a DateTimeRidget the works with SWT's DateTime control (view snippets)

The CompositeTableRidget now supports clearing the selection programmatically.

ICompositeTableRidget ridget;
ridget.clearSelection();

The boolean system property "riena.defaultlogging" has been abandoned. It has been replaced with a more general boolean system property "riena.development" that may also be used by other components to behave more development friendly. This boolean system property must be set explicitly to false to switch into non-development mode. Currently it controls:

Default logging

Cleanup of the client monitoring store on application start-up

The Ridget hierarchie got refactored a bit concerning markers

The IActionRidget now extends IRidget instead of IMarkableRidget. This means it loses methods like setErrorMarked(boolean), setMandatory(boolean), setOutputOnly(boolean) and addMarker(IMarker). A Ridget of the type IActionRidget is created for Buttons (excluding those with style CHECK, TOGGLE and RADIO - for those an IToggleButtonRidget is created), MenuItems and ToolItems. For these click-only widgets markers like the OutputMarker did not make sense (bug 271760)

The methods isEnabled and setEnabled(boolean) were moved from IMarkableRidget to IRidget. So 'marking as disabled' is still available for Buttons

Using the UIFilter concept it is still possible to added markers to widgets that don't make sense for them. Like an OutputMarker for an ILableRidget or an IActionRidget. These markers are now ignored by the Ridgets i.e. they do not change the widget (bug 270210)

For Ridgets with a selection like the ListRidget or the TableRidget only a single PropertyChangeEvent is fired when the selection changes (bug 268897). The old and the new value of this event is a list - both for SelectionType MULTI and SINGLE.

INavigationArgumentListener changed to IUpdateListener. It is a multipurpose listener that can be used between navigation nodes to communicate changes in the common data objects.

now the NavigationNode context only contains the NavigationArgument and no longer the paramter from the NavigationArgument

NavigationNode.getNavigationArgument() will either retrieve the argument from that node or if it doesnt have one, start a recursion to get the navigationArgument from the parent (until it reaches root=application)

using the context to retrieve the NavigationArgument parameter does not work anymore (navigationNode.getContext(NavigationArgument.CONTEXT_KEY_PARAMETER). use navigationNode().getNavigationArgument().getParameter() instead

Some unused code has been removed from the class org.eclipse.riena.core.exception.Failure including three constructors. This affects all Riena specific exceptions. In case you get compile errors please note that:

If you create a Riena specific exception and use a constructor that no longer exists you can use the constructor with the two parameters String msg, Throwable cause. All other arguments were ignored in the past.

If you are using the setters/getters for clientMsg, serverMsg and nativeErrorCode that no longer exist please include any relevant information in the message you pass to the constructor instead.

If you are calling other getters of a Riena specific exception that no longer exists you can just remove the calls because they used to return meaningless default values.

Ridgets and UIControlsFactory are now compatible with the SWT Designer Tool

1.1.0.M6

ICompositeTableRidget: support for sorting per column. The sort order can be predefined. The user can modify it, by clicking on column headers. To enable sorting for a column you must install a comparator (snippet)

ImageUtils is replace with ImageStore. The ImageStore loads and caches images. It also can load images from other bundles. The bundles must export there image folder (e.g. icons) with the extension point "org.eclipse.riena.ui.swt.imagepath".

If you want to use your own implementation of the interface org.eclipse.riena.navigation.INavigationNodeProvider you can configure it now by adding an extension for the extension point "org.eclipse.riena.navigation.navigationNodeProvider" with a priority higher than the default (-100). The old way of overriding it by registering a service with a higher ranking in an Activator is no longer supported. The timing and sequence when bundles are started and Activators invoked could not be sufficiently defined.

ICompositeTableRidget: added a ridget to allow creating tables with several ridgets in each row. It is based on Nebula's Composite Table. Here's a snippet.

IMasterDetailsRidget: this ridget automatically binds a table ("master" area) to a set of widget ("details" area). See screenshot below. A prototype is included with this milestone. Development will continue in the next milestone.

Package renaming

Organize imports should be sufficient.

In bundle org.eclipse.riena.core the injector packages have been renamed:

L&F for Views

If the system property riena.lnf.update.view=true is set, every UI control of the sub-module is updated according to the setting in the current Look&Feel (theme).

After a view is created the class LnFUpdater looks for every UI control and property if an according setting in the L&F exists. In this case the value of the L&F is set for the property.

The property value isn't changed, if the current value of the property diverge form the default property value.

In the first picture all widgets of the SubModuleView has the colors and the fonts of your system.

In the second all widgets of the SubModuleView has the colors and the fonts of the current Look&Feel. (Excpetion Windows: the foreground color of buttons can't be changed)

Note: The color of the two labels "Person" and "Address" does not change, because the foreground was already set.

1.0.0

fixed some missing plugins launch files of sample projects

fixed 262026. This required some refactoring of the class org.eclipse.riena.navigation.ui.swt.views.SubModuleView during which two methods were removed: activate(ISubModuleNode) was called when any submodule node was activated - if you need this use your own ISubModuleNodeListener - and setController(SubModuleController) which was obsolete because the controller was already set on the navigation node.

RC2

Improved validation of the navigation tree configuration. E.g. if 'assembly' extensions contain two 'submodule' elements with the same 'typeId' but different views or controllers and exception is now thrown when the application starts.

fixed problem with DateTextRidget 261291 with the border looking strange on OS X

fixed problem with the unregister method for Remote Service Proxies which did not work properly 261507 and which also did not unregister properly when the bundle for the proxy was stopped

fixed problem for publisher where services that were registered before the protocol specific publisher (i.e.) hessian was active were simply not published later on. in some cases it did not know that it had the publish later and others a ConcurrentModificationException stopped the Remote Service publisher from doing it. All those problems were solved.

changed the Riena Demo Server/Client which is in a demoable but unfinished state that all views are now in english (previously german)

RC1

All methods in RemoteServiceFactory() that actually registers a remote service proxy now also require a BundleContext. The old syntax without anything or with a hostId is gone. i.e. new RemoteServiceFactory().createAndRegisterProxy(IPingPongService.class, "http://localhost/hessian/IPongPongWS", "hessian", context);

New exception ProxyAlreadyRegisteredFailure if a Remote Service Proxy for that URL already exists.

The protocols (like hessian) that have to implement IRemoteServiceFactory are no longer found using OSGi Service but using Extensions. The reason is that OSGi Service sometimes didnt start fast enough and especially in Unittests the invoke to a remote service would be issued before the protocol factory was registered. With extension that cannot happen.

Two new system properties to set the initial width and the initial height of a Riena application: riena.application.width, riena.application.height

Look and Feel settings for the border and title bar of dialogs

UI-Filters: With the help of the UI filters some restrictions can be added to UI elements of a Riena application. E.g. add a validator to a text field or hide a sub module in the navigation.

The @deprecated class org.eclipse.riena.ui.ridgets.IValueProvider has been removed. It was a legacy class from a past project. The data binding of Ridgets is based on IObservableValue (see org.eclipse.riena.ui.ridgets.IValueRidget).

All bundles export now all packages and all internal packages are marked with x-internal:=true

Login support ( → Details): There is the possibility in Riena to provide an application with an login dialog/view. In this dialog authenication information (i.e. user, password) may be requested from the user. By configuration this dialog appears before the application starts and additionally in case there is no user activity for some specified time while the application is running.

This feature is supported in two different ways:

Login via some dialog view and

Login via the eclipse splash view.

The feature is demonstrated in the Riena example (SWT ExampleApplication) using the second alternative.

Example for a login dialog view:

Example for a splash login view:

M6

Navigation

The extension points "org.eclipse.riena.navigation.navigationNode" and "org.eclipse.riena.navigation.subModule" have been replaced by the new extension point "org.eclipse.riena.navigation.assemblies" that combines their functionality

It is now possible to use a hierarchical structure for modulegroup↔module↔submodule definitions within an assembly extension element reflecting the structure of the resulting navigation tree

There is a GenericNavigationAssembler that is able to create a sub tree from this description eliminating the need for custom INavigationAssembler (formerly INavigationNodeBuilder) implementations in most cases

So you not only see the service "CustomerWS" but also the called method "loadCustomer" and a unique requestId "RID-e5n70jkb". The requestId can be used to track calls through your infrastructure (say you have logs in your loadbalancer, apache, tomcat whatever you can be sure to always find the correlated entries in the individual access.log files.

DialogView

Used to build dialogs that use the Riena concept of views and controllers (see also riena snippets).

Global Exception Handling

Riena now includes a global exception handler manager which is called if an exception occurs and is caught by the framework. You can register one or multiple Exception Handler through an extension like this:

An Exception has a name (for documentation and reference), a class (that has to implement IExceptionHandler) and a before attribute. "before" references the name of any other exceptionhandler before this exception handler must be called. a blank or null value puts the exceptionhandler at the end.
The framework currently makes these calls in server tier when calling the remote service and in the ui thread. The global exception handler has a chance to handle the exception and acknowledge that it did by returning OK:

returnAction.Ok;

If it didnt handle this exception than it should return

returnAction.NotHandled

After the exceptionhandler is called the exception still thrown. Exception Handlers are intended to allow logging or display of a message dialog or any kind of notification as appropriate. They don't make exception handling in general unnecessary.

Client Monitoring

Client monitoring is similar to the Eclipse Usage Data Collector [1], i.e. both collect data on the client and transfer this data to a server for further processing. Riena's client monitoring is capable of collecting data from various sources (e.g. logs, custom logs, usage data of course too, ..) and is of course extensible.

Riena clients are typically used for business applications. For this type of application it is viable for operators (better word here!) to be informed of problems or failures before users stumble upon them. This can be achieved with the client monitoring. This automatically generated information is often more precise than bug reports.

You can have a brief look at this feature within our example client application (Bundle: org.eclipse.riena.example.client, Launch configuration: SWT ExampleApplication.launch). To activate the monitoring you have to add the bundle org.eclipse.riena.monitor.client to the launch configuration and modify the plugin.xml. Within the plugin.xml search for "org.eclipse.riena.monitor.collector". There are two extensions in comments. Remove the comments. Now the example is ready to run. Before you do this, start the Riena Sample App Server (Bundle: org.eclipse.riena.sample.app.server, Launch configuration: Riena Sample App Server.launch).
When the example client is up navigate to "Playground" >> "LogCollector". Here it is possible to create log and custom log events. If you create a log event with level warn or error all collected events up to this time will be transferred to the server. The server will print the received log events to the console.

A more in depth "Getting started" will follow soon.

M5

Made Riena View Parts (i.e. subclasses of SubModuleView) usable in RCP. The necessary steps are described in bug 247102.

[Marker] Lock the selection in Tree and Table ridgets that are output only (bug 245632)

Added a NumericTextRidget. It supports an arbitrary number of digits. Grouping can be turned on or off. Negative numbers can be allowed or blocked. It can automatically mark negative numbers red (can be disabled). See INumericValueTextFieldRidget for more info.

IServicePublisher modified unpublish method: It used to get a path as parameter which was enough for Hessian and some SOAP implementation but not flexible enough. Now it receives the full RemoteServiceDescription Object which contains among other things the path

GenericObjectCache has a few tests now and supports generics for key and value

Riena's security is changing to no longer be based on JAAS directly but on Equinox Security

first step is to base the authentication process on Equinox Security's model with extension points for login module, callbackhandler etc.

some refactoring for authorization were done

Until there is a need expressed we will stop doing extensive testing using the java SecurityManager because its pretty uncommon that Equinox Container run within a SecurityManager environment

removed all dependencies to ConfigurationAdmin. Now all configuration for URLs (i.e. hostname) is done using core.variables

Nodes of the navigation (e.g. module or sub-application) can be disabled or hidden. (At the moment disabled or hidden sub-module are not displayed correct)

M4

ability to create an "Attachment" object (a java object from Riena) from a URL, InputStream or File and pass it as parameter or return it from a method call

the Attachment can read on the target as if it where a local container

improved Exception handling for remote services

calls to remote services no longer return RemoteFailure with the real exception nested inside but they return the actually exception. we check that this exception is actually allowed by the method signature so the client isnt "surprised", we also let RuntimeExceptions go through. For checked exceptions like IOExceptions Riena nicely wraps them in a RemoteFailure

Ridgets for Trees and Trees with columns.

Menu Bar and Tool Bar (Cool Bar) below sub-application switcher

Status Line (with message, number, date and time)

Resizing of shell (without OS-Shell-Border)

After adding / removing validation rules from an IEditableRidget you can now invoke revalidate() to update the ridget's validation state:

The TableRidget and TreeTableRidget will automatically show checkbox images on columns that contain a boolean value.

The TreeTableRidget now supports "grouping" for tree nodes. Enabling grouping, will hide the column values for rows that contain a tree node that has children. See IGroupedTreeTableRidget for details.

TreeTableRidget ridget;
ridget.setGroupingEnabled(true);

SingleChoiceRidget and MultipleChoiceRidget have been implemented.

ITreeRidget.setRootsVisible(boolean) can be used to hide / show the root node in a ITreeRidget

two new extension points added to configure navigation targets in the tree-like Riena UI application model

INavigationNodeId added to identify nodes

the interface INavigationNode was extended with a new method getNodeId() that returns an INavigationNodeId

an INavigationNodeId has a 'type' part and an 'instance' part both being arbitrary Strings. It is suggested to use a package-like naming for the typeId to ensure uniqueness across an application

the typeId defines the type of a node like 'com.acme.banking.bankingSubApplication' or 'com.acme.banking.accountModule'

the instanceId is used to distinguish between nodes of the same type like multiple account nodes with different account numbers. The instanceId is optional and may be null for nodes of which only one instance can exist.

INavigationNode.navigate(INavigationNodeId) method added to navigate to another node

if a node with the specified ID exists it is activated

if no node is found a new instance is created first

INavigationNode.create(INavigationNodeId) only creates nodes without activating them and may be used for initialization

extension point "org.eclipse.riena.navigation.navigationNodeType"

defines how to create nodes of a given typeId

an implementation of the interface INavigationNodeBuilder returns a single navigation node or the root of a new subtree in the application model

parentTypeId sets where to place the new node in the application model. If the parent node does not exist it will be created too

the class of the parent node must be the one required for the created node e.g. an ISubApplicationNode for an IModuleGroupNode

extension point "org.eclipse.riena.navigation.subModuleType"

defines how to represent a sub module in the work area. A sub module is the only navigation node in the Riena UI that does not come with a default presentation

view refers to an "org.eclipse.ui.view" extension

controller must be a subclass of IController. An instance is created for every submodule node and equiped with a set of Ridgets that is bound to the UI-widgets in the view

Error and mandatory marker are displayed in the navigation tree for these sub modules that have marked widgets.

Riena now supports sending Attachments (binary large chunks) as parameter or returnvalues in remote service calls, data is transferred in the remote service call.

Modular Riena - New RCP example: The project org.eclipse.riena.sample.client.rcpmail shows how to use Ridgets in a regular RCP application/ViewPart, without using the rest of Riena. This may be interesting for developers that want to utilize Riena's Ridget concept without fully migrating their RCP application to Riena.

Code Snippets: Created a wiki page with code samples that teach you how to use Ridgets. We'll keep adding more examples as the project progresses.

Output markers: Ridgets with an output marker are "read only". Their content cannot be changed by the user.

ITextFieldRidget ridget;
ridget.setOutputOnly(true);

Mandatory markers: Ridgets with a mandatory marker must be filled out by the user.