Riena/New And Noteworthy

From Eclipsepedia

< Riena
Revision as of 06:43, 12 June 2012 by Christian.campo.compeople.de (Talk | contribs)

(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

Riena ▶ New and Noteworthy ▶






  • View items resolved in this milestone
  • 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.)



  • API change: Method removeMarker() of class IMarkable has now a boolean result.
 * Removes a marker from the markable object.
 * @param marker
 *               the marker to remove.
 * @return true, if marker is removed, else false.
 boolean removeMarker(IMarker marker);
  • API change: Method getRidget(String id) of interface IRidgetContainer has now a generic return type. This avoids the need of type casting.
 * Returns the ridget with the given id from this ridget container.
 * @param id
 *            the ridget id.
 * @return the ridget instance or null, if no ridget with this id was found.
 * @since 3.0
<R extends IRidget> R getRidget(String id);




  • View items resolved in this milestone
  • 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.


  • View items resolved in this milestone
  • some minor API changes for NumericTextRidget and BrowserRidget


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.
public class TextButtonComposite extends Composite {
  public TextButtonComposite(Composite parent, String buttonText) {
    super(parent, SWT.None);
  • There is a new API on the INavigationNode to jump from a node to another and back
INavigationNode node = ..;
node.jump(NavigationNodeId targetId)
node.jump(NavigationNodeId targetId, NavigationArgument argument)
node.addJumpTargetListener(IJumpTargetListener listener)
  • 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.


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 now interprets work progress(IProgressMonitor.worked(int work) as unit based. You can switch back to cummulative. Have a look at UIProcess.setProgresStrategy


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.


  • View items resolved in this milestone
  • 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 image button.png

  • 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.

Riena master details border.png

  • 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.
    • added a ridget.getDelegate() method to return the delegate instance (for testing)
    • '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);"
  • ITreeRidget: added API to refresh a single tree element - refresh(Object node)
  • 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.

Riena default buttons.png



  • 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 ...)


  • View items resolved in this milestone
  • 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)
ITableRidget tableRidget = (ITableRidget) SwtRidgetFactory.createRidget(table);
// set the widths
ColumnLayoutData[] widths = {
 new ColumnPixelData(100, false), 
 new ColumnWeightData(2, false),
 new ColumnWeightData(2, false) };
  • It is now possible to trigger a full re-layout from your controller by invoking SubModuleController#layout(). This is useful if the UI has changed a lot from the controller. (example)


  • View items resolved in this milestone
  • Riena Look&Feel with (simple) styling for SWT widgets (see)
  • New ridgets: ILinkRidget (snippets) and IBrowserRidget (snippets)

Riena link browser.png

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

Riena traverse ridgets.png

  • 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.

Riena master details confirm.png

  • 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)

Riena master details auto apply.png

  • 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.

Riena labelfinderstrategy.png

  • 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):
Name Type Description
activeSubApplicationNodeId java.lang.String The ID of the active sub-application
activeModuleGroupNodeId java.lang.String The ID of the active module-group
activeModuleNodeId java.lang.String The ID of the active module
activeSubModuleNodeId java.lang.String The ID of the active sub-module


  • View items resolved in this milestone
  • Riena Keyboard Navigation
    • Next SubApplication - Ctrl-PgDn
    • Previous SubApplication - Ctrl-PgUp
    • Focus on Navigation Tree - F6
    • Focus on Workarea - F7
    • Focus on Window Menu - F10 (windows only)
    • Focus on Window Toolbar - F10; Tab (windows only)
    • Close Module - Ctrl+W
    • Close Module Group - Ctrl+Shift+W
    • Next Module/ModuleGroup - Ctrl+Down
    • Prev Module/ModuleGroup - Ctrl+Up
    • Next/Previous navigation element: Arrow Down / Arrow Up. This will move to the next available SubModule / Module or Module Group.
    • Quit Application - Alt+F4 (windows only)
  • When using F7 to focus on the workarea, the view will now automatically focus on the widget that was LAST focused.
  • When hitting ESC in the Window Menu or Window Toolbar the focus will be restored to the widget that was LAST focused.
  • Improved scrolling algorithm for navigation - selected submodule / module / group is now scrolled into focus
  • An ISelectionListener can be added to the following ridgets: TableRidget, ListRidget, TreeRidget, TreeTableRidget, SingleChoiceRidget, MultipleChoiceRidget
tableRidget.addSelectionListener(new ISelectionListener() {
  public void ridgetSelected(SelectionEvent event) {
    System.out.println("SelectionEvent: " + event);	
  • Created IListRidget as a simplification of ITableRidget. This adds simpler bindToModel(...) methods that are specific to the List widget (snippet)
IListRidget listRidget = (IListRidget) SwtRidgetFactory.createRidget(list);
List<MyNode> input = createInput();
listRidget.bindToModel(new WritableList(input, MyNode.class), MyNode.class, "english");
  • Mnemonics (i.e. alt + letter) for switching between Sub-applications

Riena mnemonics subapps.png

  • TextRidgets handle multiple validation rules and multiple validation messages correctly:

Riena message viewer.png

textRidget.addValidationRule(validator, ValidationTime.ON_UI_CONTROL_EDIT);
textRidget.addValidationMessage("This is a validation message", validator);
textRidget.addValidationMessage("This is another validation message"); 
TooltipMessageMarkerViewer messageViewer = new TooltipMessageMarkerViewer();





  • View items resolved in this milestone
  • Stabilized support for Detached Views that was added in M7. These views can be shown / hidden at will; typically when a certain node in the navigation tree is selected. (snippet, documentation)

Riena detached views.png


  • 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

Riena master details 003.png

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

Riena date time.png

  • The CompositeTableRidget now supports clearing the selection programmatically.
ICompositeTableRidget ridget;
  • 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.
  • Some extensions to Riena´s approach for injection of services and extensions. Read more here: Getting Started with Wiring
  • Ridgets and UIControlsFactory are now compatible with the SWT Designer Tool


  • 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)
ridget.setComparator(0, new FirstNameComparator());


  • Text ridgets and subclasses (date/numeric/decimal) now support ridget.setText(null);. This clears the text in the ridget
  • Fixed Riena issues with 3.5.x databinding


  • API tweaks
  • Added a snippet
  • The details area will now enable / disable automatically

Riena master details 002.png

  • Added support for validation. See IMasterDetailsDelegate.isValid(...)
private static final class PersonDelegate implements IMasterDetailsDelegate {
  public String isValid(IRidgetContainer container) {
    ITextRidget txtLast = (ITextRidget) container.getRidget("txtLast"); //$NON-NLS-1$
    if (txtLast.isErrorMarked()) {
      return "'Last Name' is not valid."; //$NON-NLS-1$
    return null;

Package renaming

Organize imports should be sufficient.

  • In bundle org.eclipse.riena.communication.core the SSL configuration package has been renamed:
    • org.eclipse.riena.communication.core.ssl -> org.eclipse.riena.internal.communication.core.ssl

Use Custom Ridgets

  • The possibility to use custom ridget in an application ( → Details).


  • Riena is now based on Eclipse 3.5.
  • Icons of sub-modules (only leaves) are showing in the navigation tree (#255528)


  • The SubModuleView adds every widget with the property "binding_property" to the list of UI controls that will be binded.
    • It is not necessary to call for every widget the method addUIControl. You must only set the binding_property.
    • Every widget is added only once.
  • Now Remote Service Proxies can also (alternativly to RemoteServiceFactory) be created using a Fluent API (similar to Publish.service(....).....) here an Example:
  • 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.

Riena compositetable ridget.png

  • ITableRidget: added support for custom formatting (text, image, foreground, background, font) per column.
// DateColumnFormatter is an IColumnFormatter
tableRidget.setColumnFormatter(1, new DateColumnFormatter("MM/dd/yyyy") { //$NON-NLS-1$
  protected Date getDate(Object element) {
    return ((Holiday) element).getDate();

TableRidget ColumnFormatter.png

  • 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.

Riena master details.png

Package renaming

Organize imports should be sufficient.

  • In bundle org.eclipse.riena.core the injector packages have been renamed:
    • org.eclipse.riena.core.extension -> org.eclipse.riena.core.injector.extension
    • org.eclipse.riena.core.service -> org.eclipse.riena.core.injector.service
  • In bundle org.eclipse.riena.core the internal cache package has been renamed:
    • org.eclipse.riena.core.cache.internal -> org.eclipse.riena.internal.core.cache
  • In bundle org.eclipse.riena.ui.filter a package has been renamed:
    • org.eclipse.riena.internal.ui -> org.eclipse.riena.internal.ui.filter

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.


  • 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.


  • 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.
  • Disabled asynchronous programmatic navigation which was not fully implemented yet by removing the method org.eclipse.riena.navigation.NavigationArgument#setNavigateAsync(boolean). See https://bugs.eclipse.org/bugs/show_bug.cgi?id=261832
  • 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)


  • HessianRienaDispatcherServlet renamed to RienaHessianDispatcherServlet
  • 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.

→ Details

  • Some methods marked as @deprecated have been removed:
    • org.eclipse.riena.core.extension.ExtensionInjector.bind(String) - use update(String) instead
    • org.eclipse.riena.core.extension.ExtensionInjector.doNotTrack() - just remove when used in fluent code
    • org.eclipse.riena.ui.ridgets.IComboRidget.getSelectionObservable() - use BeansObservables.observeValue(this,IComboRidget.PROPERTY_SELECTION) instead
    • org.eclipse.riena.ui.ridgets.IComboRidget.isEditable() - use isReadonly() instead (inverse value!)
    • org.eclipse.riena.ui.ridgets.IComboRidget.setEditable(boolean) - use setReadonly(boolean) instead (inverse value!)
    • org.eclipse.riena.ui.ridgets.ISingleChoiceRidget.getSelectionObservable() - use BeansObservables.observeValue(this,IChoiceRidget.PROPERTY_SELECTION) instead
    • org.eclipse.riena.ui.ridgets.IValueRidget.getRidgetObservable() - use BeansObservables.observeValue(bean, propertyName) instead
  • 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
  • The Client Monitoring feature has now a Getting Started
  • 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:

  1. Login via some dialog view and
  2. 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:

Riena Login Dialog.PNG

Example for a splash login view:

Riena Login Splash.PNG



  • 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

→ Details

The module "UIProcess" from the Riena example client eg is completely defined declarative (except for the view and controller implementation, of course):

Riena Cient UIProcess.PNG


Labels and other string value attributes may contain variables that are automatically replaced by their values upon node creation. → Details

   label="Customer ${riena.navigation.nodeid:instanceId}"

Multiple instances of the same submodule may be created depending on the number of objects in a collection or array. → Details

<foreach element="account" in="${riena.navigation.parameter:accounts}">
         label="Account ${riena.navigation.nodecontext:account.accountNo}"


Riena messagebox example.png

  • First create control in the view:
// Create MessageBox control in view:
MessageBox messageBox = UIControlsFactory.createMessageBox(parent);
addUIControl(messageBox, "messageBox");

and obtain ridget in controller:

// Obtain MessageBoxRidget in controller:
IMessageBoxRidget messageBoxRidget = (IMessageBoxRidget) getRidget("messageBox");
  • Then configure ridget MessageBoxRidget:
// Configure MessageBoxRidget:
messageBox.setText("What is your favourite colour?");
// Set options
IMessageBoxRidget.MessageBoxOption[] customOptions = new IMessageBoxRidget.MessageBoxOption[] {
new IMessageBoxRidget.MessageBoxOption("Blue"),
new IMessageBoxRidget.MessageBoxOption("Yellow")};
  • And show message box:
// Show MessageBoxRidget and get result:
IMessageBoxRidget.MessageBoxOption selectedOption = messageBox.show();

Disable Items in Tree

  • Items in a tree ridget can be disabled, by binding to a boolean property of the model element.
MyModel[] roots = { root1 };
MyModel element = ...;
// bind MyModel.isEnabled() or MyModel.getEnabled() to the enablement of a tree item
treeRidget.bindToModel(roots, MyModel.class, "children", "parent", "value", "enabled", null);
element.setEnabled(false); // will disable the 'element' item in the tree

Riena tree ridget with disabled items.png

  • Items in a tree ridget can be hidden, by binding to a boolean property of the model element.
MyModel[] roots = { root1 };
MyModel element = ...;
// bind MyModel.isAvailable() or MyModel.getAvailable() to the visibility of a tree item
treeRidget.bindToModel(roots, MyModel.class, "children", "parent", "value", null, "available");
element.setAvailable(false); // will hide 'element' item in the tree


Riena communication now attaches the called method name and a request id to the URL of each remote service call. So if you check your access log you see something like

yourhost - 2008-11-22 13:15:12 POST /demo/hessian/CustomerWS?loadCustomer&RID-e5n70jkb HTTP/1.1 200

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.


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

Riena dialogView.png

  • Provide the view for the example dialog:
 * The view for the example dialog.
public class MyDialogView extends DialogView {
	public MyDialogView() {
                // specify null as parent composite here (default is the workbench shell)
	protected AbstractWindowController createController() {
		return new MyDialogController();
	protected Control buildView(Composite parent) {
		Composite composite = new Composite(parent, SWT.NONE);
		composite.setLayout(new GridLayout(2, false));
		UIControlsFactory.createLabel(composite, "Input"); //$NON-NLS-1$
		Text input = UIControlsFactory.createText(composite);
		addUIControl(input, MyDialogController.RIDGET_ID_INPUT);
		Button okButton = UIControlsFactory.createButton(composite);
		okButton.setText("Ok"); //$NON-NLS-1$
		addUIControl(okButton, MyDialogController.RIDGET_ID_OK);
  • Provide the controller for the example dialog:
 * The controller for example dialog.
public class MyDialogController extends AbstractWindowController {
	public static final String RIDGET_ID_INPUT = "input"; //$NON-NLS-1$
	public static final String RIDGET_ID_OK = "okButton"; //$NON-NLS-1$
	public void configureRidgets() {
		getWindowRidget().setTitle("My Dialog"); //$NON-NLS-1$
		ITextRidget input = (ITextRidget) getRidget(RIDGET_ID_INPUT);
		input.setText("Input please"); //$NON-NLS-1$
		IActionRidget okAction = (IActionRidget) getRidget(RIDGET_ID_OK);
		okAction.addListener(new IActionListener() {
			public void callback() {
  • Build and open the example dialog:
	new HelloDialogView().build();

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:

            name="Simple riena core handler">

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:

return Action.Ok;

If it didnt handle this exception than it should return

return Action.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.


  • Made Riena View Parts (i.e. subclasses of SubModuleView) usable in RCP. The necessary steps are described in bug 247102.
  • [Marker] Disabled fields should show no content (feature request) (bug 245630)
// Disabling a ridget
ISingleChoiceRidget ridget;

Riena disabled ridget.png

  • [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.
// Create special SWT Text widget in view:
Text text = UIControlsFactory.createTextNumeric(parent), "txtInteger");
addUIControl(text, "txtInteger");
// Obtain NumericTextRidget in controller:
INumericValueTextFieldRidget numericTextRidget = (INumericValueTextFieldRidget) getRidget("txtInteger");

Riena numeric text ridget.png

  • Added a DecimalTextRidget. It has a fixed number of decimal and fraction digits. Grouping can be turned on or off. See IDecimalValueTextFieldRidget for more info.
// Create special SWT Text widget in view:
Text text = UIControlsFactory.createTextDecimal(parent), "txtDecimal");
addUIControl(text, "txtDecimal");
// Obtain DecimalTextRidget in controller:
IDecimalValueTextFieldRidget decimalTextRidget = (IDecimalValueTextFieldRidget) getRidget("txtDecimal");

Riena decimal text ridget.png

  • Added a DateTextRidget. It supports structured editing of a formatted date/time/date-time String, according to a predefined formatter pattern. See IDateTextFieldRidget for more info.
// Create special SWT Text widget in view:
Text text = UIControlsFactory.createTextDecimal(parent), "txtDate");
addUIControl(text, "txtDate");
// Obtain DecimalTextRidget in controller:
IDateTextFieldRidget  dateTextRidget = (IDateTextFieldRidget  ) getRidget("txtDate");

Riena date text ridget.png

  • 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)
    Image 1: All modules are enabled and visible
    Image 2: Module "Module 1.1.2" is disabled
    Image 3: Module "Module 1.1.2" is hidden
public interface INavigationNode extends IMarkable {
	void setVisible(boolean visible);
	boolean isVisible();
	void setEnabled(boolean enabled);
	boolean isEnabled();


Collection Information about New and Noteworthy for M4

  • support Attachments (binary blobs) in Remote Service calls
    • 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.

Riena treetable.png

  • 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:
IEditableRidget ridget;
  • The TableRidget and TreeTableRidget will automatically show checkbox images on columns that contain a boolean value. Riena table with checkbox.png
  • 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;

Riena grouped tree table.png

  • SingleChoiceRidget and MultipleChoiceRidget have been implemented.

Riena choice ridgets.png

  • 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
<extension point="org.eclipse.riena.navigation.navigationNodeType">
         parentTypeId="com.acme.example.fooModuleGroup" />
<extension point="org.eclipse.riena.navigation.subModuleType">
         controller="com.acme.example.BazSubModuleController" />
  • Riena now provides UIProcesses for easy synchronization and visualization of parallel jobs
    • Based on eclipse jobs API
    • Integration of exisiting eclipse jobs
    • Dialog visualizing activity and progress
    • Support for visual contexts (describing under which circumstances an UIProcess is visualized)
    • Thread-Serialized callback methods (initialUpdateUi, updateUi, finalUpdateUi)


  • Markers in navigation tree

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;
  • Mandatory markers: Ridgets with a mandatory marker must be filled out by the user.

Riena mandatory.png

ITextFieldRidget ridget;